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.XmlRootElement;
025import javax.xml.bind.annotation.XmlTransient;
026
027@XmlRootElement(name = "add_on")
028public class AddOn extends AbstractAddOn {
029
030    @XmlTransient
031    public static final String ADDONS_RESOURCE = "/add_ons";
032
033    @XmlElement(name = "name")
034    private String name;
035
036    @XmlElement(name = "display_quantity_on_hosted_page")
037    private Boolean displayQuantityOnHostedPage;
038
039    @XmlElement(name = "default_quantity")
040    private Integer defaultQuantity;
041
042    @XmlElement(name = "unit_amount_in_cents")
043    private RecurlyUnitCurrency unitAmountInCents;
044
045    @XmlElement(name = "created_at")
046    private DateTime createdAt;
047
048    @XmlElement(name = "updated_at")
049    private DateTime updatedAt;
050
051    @XmlElement(name = "measured_unit")
052    private MeasuredUnit measuredUnit;
053
054    @XmlElement(name = "add_on_type")
055    private String addOnType;
056
057    @XmlElement(name = "tax_code")
058    private String taxCode;
059
060    @XmlElement(name = "accounting_code")
061    private String accountingCode;
062
063    @XmlElement(name = "optional")
064    private Boolean optional;
065
066    public String getName() {
067        return name;
068    }
069
070    public void setName(final Object name) {
071        this.name = stringOrNull(name);
072    }
073
074    public Boolean getDisplayQuantityOnHostedPage() {
075        return displayQuantityOnHostedPage;
076    }
077
078    public void setDisplayQuantityOnHostedPage(final Object displayQuantityOnHostedPage) {
079        this.displayQuantityOnHostedPage = booleanOrNull(displayQuantityOnHostedPage);
080    }
081
082    public Integer getDefaultQuantity() {
083        return defaultQuantity;
084    }
085
086    public void setDefaultQuantity(final Object defaultQuantity) {
087        this.defaultQuantity = integerOrNull(defaultQuantity);
088    }
089
090    public RecurlyUnitCurrency getUnitAmountInCents() {
091        return unitAmountInCents;
092    }
093
094    public void setUnitAmountInCents(final RecurlyUnitCurrency unitAmountInCents) {
095        this.unitAmountInCents = unitAmountInCents;
096    }
097
098    public DateTime getCreatedAt() {
099        return createdAt;
100    }
101
102    public void setCreatedAt(final Object createdAt) {
103        this.createdAt = dateTimeOrNull(createdAt);
104    }
105
106    public DateTime getUpdatedAt() {
107        return updatedAt;
108    }
109
110    public void setUpdatedAt(final Object updatedAt) {
111        this.updatedAt = dateTimeOrNull(updatedAt);
112    }
113
114    public MeasuredUnit getMeasuredUnit() {
115        if (measuredUnit != null && measuredUnit.getHref() != null && !measuredUnit.getHref().isEmpty()) {
116            measuredUnit = fetch(measuredUnit, MeasuredUnit.class);
117        }
118        return measuredUnit;
119    }
120
121    public void setMeasuredUnit(final MeasuredUnit measuredUnit) {
122        this.measuredUnit = measuredUnit;
123    }
124
125    public String getAddOnType() {
126        return addOnType;
127    }
128
129    public void setAddOnType(final Object addOnType) {
130        this.addOnType = stringOrNull(addOnType);
131    }
132
133    public String getTaxCode() {
134        return taxCode;
135    }
136
137    public void setTaxCode(final Object taxCode) {
138        this.taxCode = stringOrNull(taxCode);
139    }
140
141    public String getAccountingCode() {
142        return accountingCode;
143    }
144
145    public void setAccountingCode(final Object accountingCode) {
146        this.accountingCode = stringOrNull(accountingCode);
147    }
148
149    public Boolean getOptional() {
150        return optional;
151    }
152
153    public void setOptional(final Object optional) {
154        this.optional = booleanOrNull(optional);
155    }
156
157    @Override
158    public String toString() {
159        final StringBuilder sb = new StringBuilder("AddOn{");
160        sb.append("name='").append(name).append('\'');
161        sb.append(", measuredUnit='").append(measuredUnit).append('\'');
162        sb.append(", addOnType='").append(addOnType).append('\'');
163        sb.append(", displayQuantityOnHostedPage=").append(displayQuantityOnHostedPage);
164        sb.append(", defaultQuantity=").append(defaultQuantity);
165        sb.append(", unitAmountInCents=").append(unitAmountInCents);
166        sb.append(", createdAt=").append(createdAt);
167        sb.append(", updatedAt=").append(updatedAt);
168        sb.append(", taxCode=").append(taxCode);
169        sb.append(", accountingCode=").append(accountingCode);
170        sb.append(", optional=").append(optional);
171        sb.append('}');
172        return sb.toString();
173    }
174
175    @Override
176    public boolean equals(final Object o) {
177        if (this == o) return true;
178        if (o == null || getClass() != o.getClass()) return false;
179
180        final AddOn addOn = (AddOn) o;
181
182        if (createdAt != null ? createdAt.compareTo(addOn.createdAt) != 0 : addOn.createdAt != null) {
183            return false;
184        }
185        if (measuredUnit != null ? !measuredUnit.equals(addOn.measuredUnit) : addOn.measuredUnit != null) {
186            return false;
187        }
188        if (addOnType != null ? !addOnType.equals(addOn.addOnType) : addOn.addOnType != null) {
189            return false;
190        }
191        if (updatedAt != null ? updatedAt.compareTo(addOn.updatedAt) != 0 : addOn.updatedAt != null) {
192            return false;
193        }
194        if (defaultQuantity != null ? !defaultQuantity.equals(addOn.defaultQuantity) : addOn.defaultQuantity != null) {
195            return false;
196        }
197        if (displayQuantityOnHostedPage != null ? !displayQuantityOnHostedPage.equals(addOn.displayQuantityOnHostedPage) : addOn.displayQuantityOnHostedPage != null) {
198            return false;
199        }
200        if (name != null ? !name.equals(addOn.name) : addOn.name != null) {
201            return false;
202        }
203        if (unitAmountInCents != null ? !unitAmountInCents.equals(addOn.unitAmountInCents) : addOn.unitAmountInCents != null) {
204            return false;
205        }
206        if (taxCode != null ? !taxCode.equals(addOn.taxCode) : addOn.taxCode != null) {
207            return false;
208        }
209        if (accountingCode != null ? !accountingCode.equals(addOn.accountingCode) : addOn.accountingCode != null) {
210            return false;
211        }
212        if (optional != null ? !optional.equals(addOn.optional) : addOn.optional != null) {
213            return false;
214        }
215
216        return true;
217    }
218
219    @Override
220    public int hashCode() {
221        return Objects.hashCode(
222                name,
223                measuredUnit,
224                addOnType,
225                displayQuantityOnHostedPage,
226                defaultQuantity,
227                unitAmountInCents,
228                createdAt,
229                updatedAt,
230                taxCode,
231                accountingCode,
232                optional
233        );
234    }
235}