001/*
002 * Copyright 2010-2014 Ning, Inc.
003 * Copyright 2014-2015 The Billing Project, LLC
004 *
005 * The Billing Project licenses this file to you under the Apache License, version 2.0
006 * (the "License"); you may not use this file except in compliance with the
007 * License.  You may obtain a copy of the License at:
008 *
009 *    http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
013 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
014 * License for the specific language governing permissions and limitations
015 * under the License.
016 */
017
018package com.ning.billing.recurly.model;
019
020import com.google.common.base.Objects;
021import org.joda.time.DateTime;
022
023import javax.xml.bind.annotation.XmlElement;
024import javax.xml.bind.annotation.XmlElementWrapper;
025import javax.xml.bind.annotation.XmlRootElement;
026import javax.xml.bind.annotation.XmlTransient;
027
028@XmlRootElement(name = "add_on")
029public class AddOn extends AbstractAddOn {
030
031    @XmlTransient
032    public static final String ADDONS_RESOURCE = "/add_ons";
033
034    @XmlElement(name = "name")
035    private String name;
036
037    @XmlElement(name = "item_code")
038    private String itemCode;
039
040    @XmlElement(name = "item_state")
041    private String itemState;
042
043    @XmlElement(name = "external_sku")
044    private String externalSku;
045
046    @XmlElement(name = "display_quantity_on_hosted_page")
047    private Boolean displayQuantityOnHostedPage;
048
049    @XmlElement(name = "default_quantity")
050    private Integer defaultQuantity;
051
052    @XmlElement(name = "unit_amount_in_cents")
053    private RecurlyUnitCurrency unitAmountInCents;
054
055    @XmlElement(name = "created_at")
056    private DateTime createdAt;
057
058    @XmlElement(name = "updated_at")
059    private DateTime updatedAt;
060
061    @XmlElement(name = "measured_unit")
062    private MeasuredUnit measuredUnit;
063
064    @XmlElement(name = "add_on_type")
065    private String addOnType;
066
067    @XmlElement(name = "tax_code")
068    private String taxCode;
069
070    @XmlElement(name = "accounting_code")
071    private String accountingCode;
072
073    @XmlElement(name = "optional")
074    private Boolean optional;
075
076    @XmlElement(name = "tier_type")
077    private String tierType;
078
079    public String getName() {
080        return name;
081    }
082
083    public void setName(final Object name) {
084        this.name = stringOrNull(name);
085    }
086
087    public String getItemCode() {
088        return itemCode;
089    }
090
091    public void setItemCode(final Object itemCode) {
092        this.itemCode = stringOrNull(itemCode);
093    }
094
095    public String getItemState() {
096        return itemState;
097    }
098
099    public void setItemState(final Object itemState) {
100        this.itemState = stringOrNull(itemState);
101    }
102
103    public String getExternalSku() {
104        return externalSku;
105    }
106
107    public void setExternalSku(final Object externalSku) {
108        this.externalSku = stringOrNull(externalSku);
109    }
110
111    public Boolean getDisplayQuantityOnHostedPage() {
112        return displayQuantityOnHostedPage;
113    }
114
115    public void setDisplayQuantityOnHostedPage(final Object displayQuantityOnHostedPage) {
116        this.displayQuantityOnHostedPage = booleanOrNull(displayQuantityOnHostedPage);
117    }
118
119    public Integer getDefaultQuantity() {
120        return defaultQuantity;
121    }
122
123    public void setDefaultQuantity(final Object defaultQuantity) {
124        this.defaultQuantity = integerOrNull(defaultQuantity);
125    }
126
127    public RecurlyUnitCurrency getUnitAmountInCents() {
128        return unitAmountInCents;
129    }
130
131    public void setUnitAmountInCents(final Object unitAmountInCents) {
132        this.unitAmountInCents = RecurlyUnitCurrency.build(unitAmountInCents);
133    }
134
135    public DateTime getCreatedAt() {
136        return createdAt;
137    }
138
139    public void setCreatedAt(final Object createdAt) {
140        this.createdAt = dateTimeOrNull(createdAt);
141    }
142
143    public DateTime getUpdatedAt() {
144        return updatedAt;
145    }
146
147    public void setUpdatedAt(final Object updatedAt) {
148        this.updatedAt = dateTimeOrNull(updatedAt);
149    }
150
151    public MeasuredUnit getMeasuredUnit() {
152        if (measuredUnit != null && measuredUnit.getHref() != null && !measuredUnit.getHref().isEmpty()) {
153            measuredUnit = fetch(measuredUnit, MeasuredUnit.class);
154        }
155        return measuredUnit;
156    }
157
158    public void setMeasuredUnit(final MeasuredUnit measuredUnit) {
159        this.measuredUnit = measuredUnit;
160    }
161
162    public String getAddOnType() {
163        return addOnType;
164    }
165
166    public void setAddOnType(final Object addOnType) {
167        this.addOnType = stringOrNull(addOnType);
168    }
169
170    public String getTaxCode() {
171        return taxCode;
172    }
173
174    public void setTaxCode(final Object taxCode) {
175        this.taxCode = stringOrNull(taxCode);
176    }
177
178    public String getAccountingCode() {
179        return accountingCode;
180    }
181
182    public void setAccountingCode(final Object accountingCode) {
183        this.accountingCode = stringOrNull(accountingCode);
184    }
185
186    public Boolean getOptional() {
187        return optional;
188    }
189
190    public void setOptional(final Object optional) {
191        this.optional = booleanOrNull(optional);
192    }
193
194    public String getTierType() {
195        return tierType;
196    }
197
198    public void setTierType(final Object tierType) {
199        this.tierType = stringOrNull(tierType);
200    }
201
202    @Override
203    public String toString() {
204        final StringBuilder sb = new StringBuilder("AddOn{");
205        sb.append("name='").append(name).append('\'');
206        sb.append(", itemCode='").append(itemCode).append('\'');
207        sb.append(", itemState='").append(itemState).append('\'');
208        sb.append(", externalSku='").append(externalSku).append('\'');
209        sb.append(", measuredUnit='").append(measuredUnit).append('\'');
210        sb.append(", addOnType='").append(addOnType).append('\'');
211        sb.append(", displayQuantityOnHostedPage=").append(displayQuantityOnHostedPage);
212        sb.append(", defaultQuantity=").append(defaultQuantity);
213        sb.append(", unitAmountInCents=").append(unitAmountInCents);
214        sb.append(", createdAt=").append(createdAt);
215        sb.append(", updatedAt=").append(updatedAt);
216        sb.append(", taxCode=").append(taxCode);
217        sb.append(", accountingCode=").append(accountingCode);
218        sb.append(", optional=").append(optional);
219        sb.append(", tierType=").append(tierType);
220        sb.append('}');
221        return sb.toString();
222    }
223
224    @Override
225    public boolean equals(final Object o) {
226        if (this == o) return true;
227        if (o == null || getClass() != o.getClass()) return false;
228
229        final AddOn addOn = (AddOn) o;
230
231        if (createdAt != null ? createdAt.compareTo(addOn.createdAt) != 0 : addOn.createdAt != null) {
232            return false;
233        }
234        if (measuredUnit != null ? !measuredUnit.equals(addOn.measuredUnit) : addOn.measuredUnit != null) {
235            return false;
236        }
237        if (addOnType != null ? !addOnType.equals(addOn.addOnType) : addOn.addOnType != null) {
238            return false;
239        }
240        if (updatedAt != null ? updatedAt.compareTo(addOn.updatedAt) != 0 : addOn.updatedAt != null) {
241            return false;
242        }
243        if (defaultQuantity != null ? !defaultQuantity.equals(addOn.defaultQuantity) : addOn.defaultQuantity != null) {
244            return false;
245        }
246        if (displayQuantityOnHostedPage != null ? !displayQuantityOnHostedPage.equals(addOn.displayQuantityOnHostedPage) : addOn.displayQuantityOnHostedPage != null) {
247            return false;
248        }
249        if (name != null ? !name.equals(addOn.name) : addOn.name != null) {
250            return false;
251        }
252        if (unitAmountInCents != null ? !unitAmountInCents.equals(addOn.unitAmountInCents) : addOn.unitAmountInCents != null) {
253            return false;
254        }
255        if (taxCode != null ? !taxCode.equals(addOn.taxCode) : addOn.taxCode != null) {
256            return false;
257        }
258        if (accountingCode != null ? !accountingCode.equals(addOn.accountingCode) : addOn.accountingCode != null) {
259            return false;
260        }
261        if (optional != null ? !optional.equals(addOn.optional) : addOn.optional != null) {
262            return false;
263        }
264        if (itemCode != null ? !itemCode.equals(addOn.itemCode) : addOn.itemCode != null) {
265            return false;
266        }
267        if (itemState != null ? !itemState.equals(addOn.itemState) : addOn.itemState != null) {
268            return false;
269        }  
270        if (externalSku != null ? !externalSku.equals(addOn.externalSku) : addOn.externalSku != null) {
271            return false;
272        }
273        if (tierType != null ? !tierType.equals(addOn.tierType) : addOn.tierType != null) {
274            return false;
275        }
276
277        return true;
278    }
279
280    @Override
281    public int hashCode() {
282        return Objects.hashCode(
283                name,
284                itemCode,
285                itemState,
286                externalSku,
287                measuredUnit,
288                addOnType,
289                displayQuantityOnHostedPage,
290                defaultQuantity,
291                unitAmountInCents,
292                createdAt,
293                updatedAt,
294                taxCode,
295                accountingCode,
296                optional,
297                tierType
298        );
299    }
300}