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 = "plan")
029public class Plan extends RecurlyObject {
030
031    @XmlTransient
032    public static final String PLANS_RESOURCE = "/plans";
033
034    @XmlElementWrapper(name = "add_ons")
035    @XmlElement(name = "add_on")
036    private AddOns addOns;
037
038    @XmlElement(name = "plan_code")
039    private String planCode;
040
041    @XmlElement(name = "name")
042    private String name;
043
044    @XmlElement(name = "description")
045    private String description;
046
047    @XmlElement(name = "success_url")
048    private String successLink;
049
050    @XmlElement(name = "cancel_url")
051    private String cancelLink;
052
053    @XmlElement(name = "display_donation_amounts")
054    private Boolean displayDonationAmounts;
055
056    @XmlElement(name = "display_quantity")
057    private Boolean displayQuantity;
058
059    @XmlElement(name = "display_phone_number")
060    private Boolean displayPhoneNumber;
061
062    @XmlElement(name = "bypass_hosted_confirmation")
063    private Boolean bypassHostedConfirmation;
064
065    @XmlElement(name = "unit_name")
066    private String unitName;
067
068    @XmlElement(name = "plan_interval_unit")
069    private String planIntervalUnit;
070
071    @XmlElement(name = "plan_interval_length")
072    private Integer planIntervalLength;
073
074    @XmlElement(name = "trial_interval_length")
075    private Integer trialIntervalLength;
076
077    @XmlElement(name = "trial_interval_unit")
078    private String trialIntervalUnit;
079
080    @XmlElement(name = "total_billing_cycles")
081    private Integer totalBillingCycles;
082
083    @XmlElement(name = "trial_requires_billing_info")
084    private Boolean trialRequiresBillingInfo;
085
086    @XmlElement(name = "accounting_code")
087    private String accountingCode;
088
089    @XmlElement(name = "setup_fee_accounting_code")
090    private String setupFeeAccountingCode;
091
092    @XmlElement(name = "revenue_schedule_type")
093    private RevenueScheduleType revenueScheduleType;
094
095    @XmlElement(name = "setup_fee_revenue_schedule_type")
096    private RevenueScheduleType setupFeeRevenueScheduleType;
097
098    @XmlElement(name = "created_at")
099    private DateTime createdAt;
100
101    @XmlElement(name = "updated_at")
102    private DateTime updatedAt;
103
104    @XmlElement(name = "unit_amount_in_cents")
105    private RecurlyUnitCurrency unitAmountInCents;
106
107    @XmlElement(name = "setup_fee_in_cents")
108    private RecurlyUnitCurrency setupFeeInCents;
109
110    @XmlElement(name = "auto_renew")
111    private Boolean autoRenew;
112
113    @XmlElement(name = "tax_exempt")
114    private Boolean taxExempt;
115
116    @XmlElement(name = "tax_code")
117    private String taxCode;
118
119    public String getPlanCode() {
120        return planCode;
121    }
122
123    public void setPlanCode(final Object planCode) {
124        this.planCode = stringOrNull(planCode);
125    }
126
127    public String getName() {
128        return name;
129    }
130
131    public void setName(final Object name) {
132        this.name = stringOrNull(name);
133    }
134
135    public String getDescription() {
136        return description;
137    }
138
139    public void setDescription(final Object description) {
140        this.description = stringOrNull(description);
141    }
142
143    public String getSuccessLink() {
144        return successLink;
145    }
146
147    public void setSuccessLink(final Object link) {
148        this.successLink = stringOrNull(link);
149    }
150
151    public String getCancelLink() {
152        return cancelLink;
153    }
154
155    public void setCancelLink(final Object link) {
156        this.cancelLink = stringOrNull(link);
157    }
158
159    public Boolean getDisplayDonationAmounts() {
160        return displayDonationAmounts;
161    }
162
163    public void setDisplayDonationAmounts(final Object displayAmounts) {
164        this.displayDonationAmounts = booleanOrNull(displayAmounts);
165    }
166
167    public Boolean getDisplayQuantity() {
168        return displayQuantity;
169    }
170
171    public void setDisplayQuantity(final Object displayQuantity) {
172        this.displayQuantity = booleanOrNull(displayQuantity);
173    }
174
175    public Boolean getDisplayPhoneNumber() {
176        return displayPhoneNumber;
177    }
178
179    public void setDisplayPhoneNumber(final Object displayPhoneNumber) {
180        this.displayPhoneNumber = booleanOrNull(displayPhoneNumber);
181    }
182
183    public Boolean getBypassHostedConfirmation() {
184        return bypassHostedConfirmation;
185    }
186
187    public void setBypassHostedConfirmation(final Object bypassHostedConfirmation) {
188        this.bypassHostedConfirmation = booleanOrNull(bypassHostedConfirmation);
189    }
190
191    public String getUnitName() {
192        return unitName;
193    }
194
195    public void setUnitName(final Object unitName) {
196        this.unitName = stringOrNull(unitName);
197    }
198
199    public String getPlanIntervalUnit() {
200        return planIntervalUnit;
201    }
202
203    public void setPlanIntervalUnit(final Object planIntervalUnit) {
204        this.planIntervalUnit = stringOrNull(planIntervalUnit);
205    }
206
207    public Integer getPlanIntervalLength() {
208        return planIntervalLength;
209    }
210
211    public void setPlanIntervalLength(final Object planIntervalLength) {
212        this.planIntervalLength = integerOrNull(planIntervalLength);
213    }
214
215    public String getTrialIntervalUnit() {
216        return trialIntervalUnit;
217    }
218
219    public void setTrialIntervalUnit(final Object trialIntervalUnit) {
220        this.trialIntervalUnit = stringOrNull(trialIntervalUnit);
221    }
222
223    public Integer getTotalBillingCycles() {
224        return totalBillingCycles;
225    }
226
227    public void setTotalBillingCycles(final Object totalBillingCycles) {
228        this.totalBillingCycles = integerOrNull(totalBillingCycles);
229    }
230
231    public Boolean getTrialRequiresBillingInfo() {
232        return this.trialRequiresBillingInfo;
233    }
234
235    public void setTrialRequiresBillingInfo(final Object trialRequiresBillingInfo) {
236        this.trialRequiresBillingInfo = booleanOrNull(trialRequiresBillingInfo);
237    }
238
239    public Integer getTrialIntervalLength() {
240        return trialIntervalLength;
241    }
242
243    public void setTrialIntervalLength(final Object trialIntervalLength) {
244        this.trialIntervalLength = integerOrNull(trialIntervalLength);
245    }
246
247    public String getAccountingCode() {
248        return accountingCode;
249    }
250
251    public void setAccountingCode(final Object accountingCode) {
252        this.accountingCode = stringOrNull(accountingCode);
253    }
254
255    public String getSetupFeeAccountingCode() {
256        return setupFeeAccountingCode;
257    }
258
259    public void setSetupFeeAccountingCode(final Object setupFeeAccountingCode) {
260        this.setupFeeAccountingCode = stringOrNull(setupFeeAccountingCode);
261    }
262
263    public DateTime getCreatedAt() {
264        return createdAt;
265    }
266
267    public void setCreatedAt(final Object createdAt) {
268        this.createdAt = dateTimeOrNull(createdAt);
269    }
270
271    public DateTime getUpdatedAt() {
272        return updatedAt;
273    }
274
275    public void setUpdatedAt(final Object updatedAt) {
276        this.updatedAt = dateTimeOrNull(updatedAt);
277    }
278
279    public RecurlyUnitCurrency getUnitAmountInCents() {
280        return unitAmountInCents;
281    }
282
283    public void setUnitAmountInCents(final Object unitAmountInCents) {
284        this.unitAmountInCents = RecurlyUnitCurrency.build(unitAmountInCents);
285    }
286
287    public RecurlyUnitCurrency getSetupFeeInCents() {
288        return setupFeeInCents;
289    }
290
291    public void setSetupFeeInCents(final Object setupFeeInCents) {
292        this.setupFeeInCents = RecurlyUnitCurrency.build(setupFeeInCents);
293    }
294
295    public AddOns getAddOns() {
296        return this.addOns;
297    }
298
299    public void setAddOns(final AddOns addOns) {
300        this.addOns = addOns;
301    }
302
303    public RevenueScheduleType getSetupFeeRevenueScheduleType() {
304        return setupFeeRevenueScheduleType;
305    }
306
307    public void setSetupFeeRevenueScheduleType(final Object setupFeeRevenueScheduleType) {
308        this.setupFeeRevenueScheduleType = enumOrNull(RevenueScheduleType.class, setupFeeRevenueScheduleType, true);
309    }
310
311    public RevenueScheduleType getRevenueScheduleType() {
312        return revenueScheduleType;
313    }
314
315    public void setRevenueScheduleType(final Object revenueScheduleType) {
316        this.revenueScheduleType = enumOrNull(RevenueScheduleType.class, revenueScheduleType, true);
317    }
318
319    public Boolean getAutoRenew() {
320        return this.autoRenew;
321    }
322
323    public void setAutoRenew(final Object autoRenew) {
324        this.autoRenew = booleanOrNull(autoRenew);
325    }
326
327    public Boolean getTaxExempt() {
328        return this.taxExempt;
329    }
330
331    public void setTaxExempt(final Object taxExempt) {
332        this.taxExempt = booleanOrNull(taxExempt);
333    }
334
335    public String getTaxCode() {
336        return this.taxCode;
337    }
338
339    public void setTaxCode(final Object taxCode) {
340        this.taxCode = stringOrNull(taxCode);
341    }
342
343    @Override
344    public String toString() {
345        final StringBuilder sb = new StringBuilder();
346        sb.append("Plan");
347        sb.append("{addOns=").append(addOns);
348        sb.append(", planCode='").append(planCode).append('\'');
349        sb.append(", name='").append(name).append('\'');
350        sb.append(", description='").append(description).append('\'');
351        sb.append(", successLink='").append(successLink).append('\'');
352        sb.append(", cancelLink='").append(cancelLink).append('\'');
353        sb.append(", displayDonationAmounts=").append(displayDonationAmounts);
354        sb.append(", displayQuantity=").append(displayQuantity);
355        sb.append(", displayPhoneNumber=").append(displayPhoneNumber);
356        sb.append(", bypassHostedConfirmation=").append(bypassHostedConfirmation);
357        sb.append(", unitName='").append(unitName).append('\'');
358        sb.append(", planIntervalUnit='").append(planIntervalUnit).append('\'');
359        sb.append(", planIntervalLength=").append(planIntervalLength);
360        sb.append(", trialIntervalLength=").append(trialIntervalLength);
361        sb.append(", trialIntervalUnit='").append(trialIntervalUnit).append('\'');
362        sb.append(", totalBillingCycles").append(totalBillingCycles);
363        sb.append(", trialRequiresBillingInfo='").append(trialRequiresBillingInfo).append('\'');
364        sb.append(", accountingCode='").append(accountingCode).append('\'');
365        sb.append(", setupFeeAccountingCode='").append(setupFeeAccountingCode).append('\'');
366        sb.append(", createdAt=").append(createdAt);
367        sb.append(", updatedAt=").append(updatedAt);
368        sb.append(", unitAmountInCents=").append(unitAmountInCents);
369        sb.append(", setupFeeInCents=").append(setupFeeInCents);
370        sb.append(", revenueScheduleType=").append(revenueScheduleType);
371        sb.append(", setupFeeRevenueScheduleType=").append(setupFeeRevenueScheduleType);
372        sb.append(", autoRenew=").append(autoRenew);
373        sb.append(", taxExempt=").append(taxExempt);
374        sb.append(", taxCode=").append(taxCode);
375        sb.append('}');
376        return sb.toString();
377    }
378
379    @Override
380    public boolean equals(final Object o) {
381        if (this == o) return true;
382        if (o == null || getClass() != o.getClass()) return false;
383
384        final Plan plan = (Plan) o;
385
386        if (bypassHostedConfirmation != plan.bypassHostedConfirmation) {
387            return false;
388        }
389        if (displayPhoneNumber != plan.displayPhoneNumber) {
390            return false;
391        }
392        if (accountingCode != null ? !accountingCode.equals(plan.accountingCode) : plan.accountingCode != null) {
393            return false;
394        }
395        if (addOns != null ? !addOns.equals(plan.addOns) : plan.addOns != null) {
396            return false;
397        }
398        if (autoRenew != null ? !autoRenew.equals(plan.autoRenew) : plan.autoRenew != null) {
399            return false;
400        }
401        if (cancelLink != null ? !cancelLink.equals(plan.cancelLink) : plan.cancelLink != null) {
402            return false;
403        }
404        if (createdAt != null ? createdAt.compareTo(plan.createdAt) != 0: plan.createdAt != null) {
405            return false;
406        }
407        if (description != null ? !description.equals(plan.description) : plan.description != null) {
408            return false;
409        }
410        if (displayDonationAmounts != null ? !displayDonationAmounts.equals(plan.displayDonationAmounts) : plan.displayDonationAmounts != null) {
411            return false;
412        }
413        if (displayQuantity != null ? !displayQuantity.equals(plan.displayQuantity) : plan.displayQuantity != null) {
414            return false;
415        }
416        if (name != null ? !name.equals(plan.name) : plan.name != null) {
417            return false;
418        }
419        if (planCode != null ? !planCode.equals(plan.planCode) : plan.planCode != null) {
420            return false;
421        }
422        if (planIntervalLength != null ? !planIntervalLength.equals(plan.planIntervalLength) : plan.planIntervalLength != null) {
423            return false;
424        }
425        if (planIntervalUnit != null ? !planIntervalUnit.equals(plan.planIntervalUnit) : plan.planIntervalUnit != null) {
426            return false;
427        }
428        if (revenueScheduleType != null ? !revenueScheduleType.equals(plan.revenueScheduleType) : plan.revenueScheduleType != null) {
429            return false;
430        }
431        if (setupFeeInCents != null ? !setupFeeInCents.equals(plan.setupFeeInCents) : plan.setupFeeInCents != null) {
432            return false;
433        }
434        if (setupFeeRevenueScheduleType != null ? !setupFeeRevenueScheduleType.equals(plan.setupFeeRevenueScheduleType) : plan.setupFeeRevenueScheduleType != null) {
435            return false;
436        }
437        if (successLink != null ? !successLink.equals(plan.successLink) : plan.successLink != null) {
438            return false;
439        }
440        if (trialIntervalLength != null ? !trialIntervalLength.equals(plan.trialIntervalLength) : plan.trialIntervalLength != null) {
441            return false;
442        }
443        if (trialIntervalUnit != null ? !trialIntervalUnit.equals(plan.trialIntervalUnit) : plan.trialIntervalUnit != null) {
444            return false;
445        }
446        if (trialRequiresBillingInfo != null ? !trialRequiresBillingInfo.equals(plan.trialRequiresBillingInfo) : plan.trialRequiresBillingInfo != null) {
447            return false;
448        }
449        if (unitAmountInCents != null ? !unitAmountInCents.equals(plan.unitAmountInCents) : plan.unitAmountInCents != null) {
450            return false;
451        }
452        if (unitName != null ? !unitName.equals(plan.unitName) : plan.unitName != null) {
453            return false;
454        }
455        if (updatedAt != null ? updatedAt.compareTo(plan.updatedAt) != 0: plan.updatedAt != null) {
456            return false;
457        }
458        if (totalBillingCycles != null ? totalBillingCycles.compareTo(plan.totalBillingCycles) != 0: plan.totalBillingCycles != null) {
459            return false;
460        }
461        if (setupFeeAccountingCode != null ? setupFeeAccountingCode.compareTo(plan.setupFeeAccountingCode) != 0: plan.setupFeeAccountingCode != null) {
462            return false;
463        }
464        if (taxExempt != null ? taxExempt.compareTo(plan.taxExempt) != 0: plan.taxExempt != null) {
465            return false;
466        }
467        if (taxCode != null ? taxCode.compareTo(plan.taxCode) != 0: plan.taxCode != null) {
468            return false;
469        }
470
471        return true;
472    }
473
474    @Override
475    public int hashCode() {
476        return Objects.hashCode(
477                addOns,
478                planCode,
479                name,
480                description,
481                successLink,
482                cancelLink,
483                displayDonationAmounts,
484                displayQuantity,
485                displayPhoneNumber,
486                bypassHostedConfirmation,
487                unitName,
488                planIntervalUnit,
489                planIntervalLength,
490                trialIntervalUnit,
491                trialIntervalLength,
492                totalBillingCycles,
493                accountingCode,
494                setupFeeAccountingCode,
495                createdAt,
496                updatedAt,
497                unitAmountInCents,
498                setupFeeInCents,
499                revenueScheduleType,
500                setupFeeRevenueScheduleType,
501                trialRequiresBillingInfo,
502                autoRenew,
503                taxExempt,
504                taxCode
505        );
506    }
507}