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    @XmlElement(name = "allow_any_item_on_subscriptions")
120    private Boolean allowAnyItemOnSubscriptions;
121
122    public String getPlanCode() {
123        return planCode;
124    }
125
126    public void setPlanCode(final Object planCode) {
127        this.planCode = stringOrNull(planCode);
128    }
129
130    public String getName() {
131        return name;
132    }
133
134    public void setName(final Object name) {
135        this.name = stringOrNull(name);
136    }
137
138    public String getDescription() {
139        return description;
140    }
141
142    public void setDescription(final Object description) {
143        this.description = stringOrNull(description);
144    }
145
146    public String getSuccessLink() {
147        return successLink;
148    }
149
150    public void setSuccessLink(final Object link) {
151        this.successLink = stringOrNull(link);
152    }
153
154    public String getCancelLink() {
155        return cancelLink;
156    }
157
158    public void setCancelLink(final Object link) {
159        this.cancelLink = stringOrNull(link);
160    }
161
162    public Boolean getDisplayDonationAmounts() {
163        return displayDonationAmounts;
164    }
165
166    public void setDisplayDonationAmounts(final Object displayAmounts) {
167        this.displayDonationAmounts = booleanOrNull(displayAmounts);
168    }
169
170    public Boolean getDisplayQuantity() {
171        return displayQuantity;
172    }
173
174    public void setDisplayQuantity(final Object displayQuantity) {
175        this.displayQuantity = booleanOrNull(displayQuantity);
176    }
177
178    public Boolean getDisplayPhoneNumber() {
179        return displayPhoneNumber;
180    }
181
182    public void setDisplayPhoneNumber(final Object displayPhoneNumber) {
183        this.displayPhoneNumber = booleanOrNull(displayPhoneNumber);
184    }
185
186    public Boolean getBypassHostedConfirmation() {
187        return bypassHostedConfirmation;
188    }
189
190    public void setBypassHostedConfirmation(final Object bypassHostedConfirmation) {
191        this.bypassHostedConfirmation = booleanOrNull(bypassHostedConfirmation);
192    }
193
194    public String getUnitName() {
195        return unitName;
196    }
197
198    public void setUnitName(final Object unitName) {
199        this.unitName = stringOrNull(unitName);
200    }
201
202    public String getPlanIntervalUnit() {
203        return planIntervalUnit;
204    }
205
206    public void setPlanIntervalUnit(final Object planIntervalUnit) {
207        this.planIntervalUnit = stringOrNull(planIntervalUnit);
208    }
209
210    public Integer getPlanIntervalLength() {
211        return planIntervalLength;
212    }
213
214    public void setPlanIntervalLength(final Object planIntervalLength) {
215        this.planIntervalLength = integerOrNull(planIntervalLength);
216    }
217
218    public String getTrialIntervalUnit() {
219        return trialIntervalUnit;
220    }
221
222    public void setTrialIntervalUnit(final Object trialIntervalUnit) {
223        this.trialIntervalUnit = stringOrNull(trialIntervalUnit);
224    }
225
226    public Integer getTotalBillingCycles() {
227        return totalBillingCycles;
228    }
229
230    public void setTotalBillingCycles(final Object totalBillingCycles) {
231        this.totalBillingCycles = integerOrNull(totalBillingCycles);
232    }
233
234    public Boolean getTrialRequiresBillingInfo() {
235        return this.trialRequiresBillingInfo;
236    }
237
238    public void setTrialRequiresBillingInfo(final Object trialRequiresBillingInfo) {
239        this.trialRequiresBillingInfo = booleanOrNull(trialRequiresBillingInfo);
240    }
241
242    public Integer getTrialIntervalLength() {
243        return trialIntervalLength;
244    }
245
246    public void setTrialIntervalLength(final Object trialIntervalLength) {
247        this.trialIntervalLength = integerOrNull(trialIntervalLength);
248    }
249
250    public String getAccountingCode() {
251        return accountingCode;
252    }
253
254    public void setAccountingCode(final Object accountingCode) {
255        this.accountingCode = stringOrNull(accountingCode);
256    }
257
258    public String getSetupFeeAccountingCode() {
259        return setupFeeAccountingCode;
260    }
261
262    public void setSetupFeeAccountingCode(final Object setupFeeAccountingCode) {
263        this.setupFeeAccountingCode = stringOrNull(setupFeeAccountingCode);
264    }
265
266    public DateTime getCreatedAt() {
267        return createdAt;
268    }
269
270    public void setCreatedAt(final Object createdAt) {
271        this.createdAt = dateTimeOrNull(createdAt);
272    }
273
274    public DateTime getUpdatedAt() {
275        return updatedAt;
276    }
277
278    public void setUpdatedAt(final Object updatedAt) {
279        this.updatedAt = dateTimeOrNull(updatedAt);
280    }
281
282    public RecurlyUnitCurrency getUnitAmountInCents() {
283        return unitAmountInCents;
284    }
285
286    public void setUnitAmountInCents(final Object unitAmountInCents) {
287        this.unitAmountInCents = RecurlyUnitCurrency.build(unitAmountInCents);
288    }
289
290    public RecurlyUnitCurrency getSetupFeeInCents() {
291        return setupFeeInCents;
292    }
293
294    public void setSetupFeeInCents(final Object setupFeeInCents) {
295        this.setupFeeInCents = RecurlyUnitCurrency.build(setupFeeInCents);
296    }
297
298    public AddOns getAddOns() {
299        return this.addOns;
300    }
301
302    public void setAddOns(final AddOns addOns) {
303        this.addOns = addOns;
304    }
305
306    public RevenueScheduleType getSetupFeeRevenueScheduleType() {
307        return setupFeeRevenueScheduleType;
308    }
309
310    public void setSetupFeeRevenueScheduleType(final Object setupFeeRevenueScheduleType) {
311        this.setupFeeRevenueScheduleType = enumOrNull(RevenueScheduleType.class, setupFeeRevenueScheduleType, true);
312    }
313
314    public RevenueScheduleType getRevenueScheduleType() {
315        return revenueScheduleType;
316    }
317
318    public void setRevenueScheduleType(final Object revenueScheduleType) {
319        this.revenueScheduleType = enumOrNull(RevenueScheduleType.class, revenueScheduleType, true);
320    }
321
322    public Boolean getAutoRenew() {
323        return this.autoRenew;
324    }
325
326    public void setAutoRenew(final Object autoRenew) {
327        this.autoRenew = booleanOrNull(autoRenew);
328    }
329
330    public Boolean getTaxExempt() {
331        return this.taxExempt;
332    }
333
334    public void setTaxExempt(final Object taxExempt) {
335        this.taxExempt = booleanOrNull(taxExempt);
336    }
337
338    public String getTaxCode() {
339        return this.taxCode;
340    }
341
342    public void setTaxCode(final Object taxCode) {
343        this.taxCode = stringOrNull(taxCode);
344    }
345
346    public Boolean getAllowAnyItemOnSubscriptions() {
347        return this.allowAnyItemOnSubscriptions;
348    }
349
350    public void setAllowAnyItemOnSubscriptions(final Object allowAnyItemOnSubscriptions) {
351        this.allowAnyItemOnSubscriptions = booleanOrNull(allowAnyItemOnSubscriptions);
352    }
353
354    @Override
355    public String toString() {
356        final StringBuilder sb = new StringBuilder();
357        sb.append("Plan");
358        sb.append("{addOns=").append(addOns);
359        sb.append(", planCode='").append(planCode).append('\'');
360        sb.append(", name='").append(name).append('\'');
361        sb.append(", description='").append(description).append('\'');
362        sb.append(", successLink='").append(successLink).append('\'');
363        sb.append(", cancelLink='").append(cancelLink).append('\'');
364        sb.append(", displayDonationAmounts=").append(displayDonationAmounts);
365        sb.append(", displayQuantity=").append(displayQuantity);
366        sb.append(", displayPhoneNumber=").append(displayPhoneNumber);
367        sb.append(", bypassHostedConfirmation=").append(bypassHostedConfirmation);
368        sb.append(", unitName='").append(unitName).append('\'');
369        sb.append(", planIntervalUnit='").append(planIntervalUnit).append('\'');
370        sb.append(", planIntervalLength=").append(planIntervalLength);
371        sb.append(", trialIntervalLength=").append(trialIntervalLength);
372        sb.append(", trialIntervalUnit='").append(trialIntervalUnit).append('\'');
373        sb.append(", totalBillingCycles").append(totalBillingCycles);
374        sb.append(", trialRequiresBillingInfo='").append(trialRequiresBillingInfo).append('\'');
375        sb.append(", accountingCode='").append(accountingCode).append('\'');
376        sb.append(", setupFeeAccountingCode='").append(setupFeeAccountingCode).append('\'');
377        sb.append(", createdAt=").append(createdAt);
378        sb.append(", updatedAt=").append(updatedAt);
379        sb.append(", unitAmountInCents=").append(unitAmountInCents);
380        sb.append(", setupFeeInCents=").append(setupFeeInCents);
381        sb.append(", revenueScheduleType=").append(revenueScheduleType);
382        sb.append(", setupFeeRevenueScheduleType=").append(setupFeeRevenueScheduleType);
383        sb.append(", autoRenew=").append(autoRenew);
384        sb.append(", taxExempt=").append(taxExempt);
385        sb.append(", taxCode=").append(taxCode);
386        sb.append(", allowAnyItemOnSubscriptions=").append(allowAnyItemOnSubscriptions);
387        sb.append('}');
388        return sb.toString();
389    }
390
391    @Override
392    public boolean equals(final Object o) {
393        if (this == o) return true;
394        if (o == null || getClass() != o.getClass()) return false;
395
396        final Plan plan = (Plan) o;
397
398        if (bypassHostedConfirmation != plan.bypassHostedConfirmation) {
399            return false;
400        }
401        if (displayPhoneNumber != plan.displayPhoneNumber) {
402            return false;
403        }
404        if (accountingCode != null ? !accountingCode.equals(plan.accountingCode) : plan.accountingCode != null) {
405            return false;
406        }
407        if (addOns != null ? !addOns.equals(plan.addOns) : plan.addOns != null) {
408            return false;
409        }
410        if (autoRenew != null ? !autoRenew.equals(plan.autoRenew) : plan.autoRenew != null) {
411            return false;
412        }
413        if (cancelLink != null ? !cancelLink.equals(plan.cancelLink) : plan.cancelLink != null) {
414            return false;
415        }
416        if (createdAt != null ? createdAt.compareTo(plan.createdAt) != 0: plan.createdAt != null) {
417            return false;
418        }
419        if (description != null ? !description.equals(plan.description) : plan.description != null) {
420            return false;
421        }
422        if (displayDonationAmounts != null ? !displayDonationAmounts.equals(plan.displayDonationAmounts) : plan.displayDonationAmounts != null) {
423            return false;
424        }
425        if (displayQuantity != null ? !displayQuantity.equals(plan.displayQuantity) : plan.displayQuantity != null) {
426            return false;
427        }
428        if (name != null ? !name.equals(plan.name) : plan.name != null) {
429            return false;
430        }
431        if (planCode != null ? !planCode.equals(plan.planCode) : plan.planCode != null) {
432            return false;
433        }
434        if (planIntervalLength != null ? !planIntervalLength.equals(plan.planIntervalLength) : plan.planIntervalLength != null) {
435            return false;
436        }
437        if (planIntervalUnit != null ? !planIntervalUnit.equals(plan.planIntervalUnit) : plan.planIntervalUnit != null) {
438            return false;
439        }
440        if (revenueScheduleType != null ? !revenueScheduleType.equals(plan.revenueScheduleType) : plan.revenueScheduleType != null) {
441            return false;
442        }
443        if (setupFeeInCents != null ? !setupFeeInCents.equals(plan.setupFeeInCents) : plan.setupFeeInCents != null) {
444            return false;
445        }
446        if (setupFeeRevenueScheduleType != null ? !setupFeeRevenueScheduleType.equals(plan.setupFeeRevenueScheduleType) : plan.setupFeeRevenueScheduleType != null) {
447            return false;
448        }
449        if (successLink != null ? !successLink.equals(plan.successLink) : plan.successLink != null) {
450            return false;
451        }
452        if (trialIntervalLength != null ? !trialIntervalLength.equals(plan.trialIntervalLength) : plan.trialIntervalLength != null) {
453            return false;
454        }
455        if (trialIntervalUnit != null ? !trialIntervalUnit.equals(plan.trialIntervalUnit) : plan.trialIntervalUnit != null) {
456            return false;
457        }
458        if (trialRequiresBillingInfo != null ? !trialRequiresBillingInfo.equals(plan.trialRequiresBillingInfo) : plan.trialRequiresBillingInfo != null) {
459            return false;
460        }
461        if (unitAmountInCents != null ? !unitAmountInCents.equals(plan.unitAmountInCents) : plan.unitAmountInCents != null) {
462            return false;
463        }
464        if (unitName != null ? !unitName.equals(plan.unitName) : plan.unitName != null) {
465            return false;
466        }
467        if (updatedAt != null ? updatedAt.compareTo(plan.updatedAt) != 0: plan.updatedAt != null) {
468            return false;
469        }
470        if (totalBillingCycles != null ? totalBillingCycles.compareTo(plan.totalBillingCycles) != 0: plan.totalBillingCycles != null) {
471            return false;
472        }
473        if (setupFeeAccountingCode != null ? setupFeeAccountingCode.compareTo(plan.setupFeeAccountingCode) != 0: plan.setupFeeAccountingCode != null) {
474            return false;
475        }
476        if (taxExempt != null ? taxExempt.compareTo(plan.taxExempt) != 0: plan.taxExempt != null) {
477            return false;
478        }
479        if (taxCode != null ? taxCode.compareTo(plan.taxCode) != 0: plan.taxCode != null) {
480            return false;
481        }
482        if (allowAnyItemOnSubscriptions != null ? allowAnyItemOnSubscriptions.compareTo(plan.allowAnyItemOnSubscriptions) != 0: plan.allowAnyItemOnSubscriptions != null) {
483            return false;
484        }
485
486        return true;
487    }
488
489    @Override
490    public int hashCode() {
491        return Objects.hashCode(
492                addOns,
493                planCode,
494                name,
495                description,
496                successLink,
497                cancelLink,
498                displayDonationAmounts,
499                displayQuantity,
500                displayPhoneNumber,
501                bypassHostedConfirmation,
502                unitName,
503                planIntervalUnit,
504                planIntervalLength,
505                trialIntervalUnit,
506                trialIntervalLength,
507                totalBillingCycles,
508                accountingCode,
509                setupFeeAccountingCode,
510                createdAt,
511                updatedAt,
512                unitAmountInCents,
513                setupFeeInCents,
514                revenueScheduleType,
515                setupFeeRevenueScheduleType,
516                trialRequiresBillingInfo,
517                autoRenew,
518                taxExempt,
519                taxCode,
520                allowAnyItemOnSubscriptions
521        );
522    }
523}