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;
027import java.util.regex.Matcher;
028import java.util.regex.Pattern;
029
030@XmlRootElement(name = "account")
031public class Account extends RecurlyObject {
032
033    @XmlTransient
034    public static final String ACCOUNT_RESOURCE = "/accounts";
035
036    @XmlTransient
037    public static final Pattern ACCOUNT_CODE_PATTERN = Pattern.compile(ACCOUNT_RESOURCE + "/(.+)$");
038
039    @XmlElement(name = "address")
040    private Address address;
041
042    @XmlElement(name = "parent_account_code")
043    private String parentAccountCode;
044
045    @XmlElementWrapper(name = "adjustments")
046    @XmlElement(name = "adjustment")
047    private Adjustments adjustments;
048
049    @XmlElementWrapper(name = "invoices")
050    @XmlElement(name = "invoice")
051    private Invoices invoices;
052
053    @XmlElementWrapper(name = "subscriptions")
054    @XmlElement(name = "subscription")
055    private Subscriptions subscriptions;
056
057    @XmlElementWrapper(name = "transactions")
058    @XmlElement(name = "transaction")
059    private Transactions transactions;
060
061    @XmlElement(name = "account_code")
062    private String accountCode;
063
064    @XmlElement(name = "state")
065    private String state;
066
067    @XmlElement(name = "username")
068    private String username;
069
070    @XmlElement(name = "email")
071    private String email;
072
073    @XmlElement(name = "cc_emails")
074    private String ccEmails;
075
076    @XmlElement(name = "first_name")
077    private String firstName;
078
079    @XmlElement(name = "last_name")
080    private String lastName;
081
082    @XmlElement(name = "company_name")
083    private String companyName;
084
085    // This property appears instead of "company_name" on some Account xml,
086    // such as when listing invoices:
087    // invoices -> invoice -> transactions -> transaction -> details -> account -> company
088    @XmlElement(name = "company")
089    private String company;
090
091    @XmlElement(name = "accept_language")
092    private String acceptLanguage;
093
094    @XmlElement(name = "hosted_login_token")
095    private String hostedLoginToken;
096
097    @XmlElement(name = "created_at")
098    private DateTime createdAt;
099
100    @XmlElement(name = "updated_at")
101    private DateTime updatedAt;
102
103    @XmlElement(name = "closed_at")
104    private DateTime closedAt;
105
106    @XmlElement(name = "billing_info")
107    private BillingInfo billingInfo;
108
109    @XmlElementWrapper(name = "billing_infos")
110    @XmlElement(name = "billing_info")
111    private BillingInfos billingInfos;
112
113    @XmlElement(name = "tax_exempt")
114    private Boolean taxExempt;
115
116    @XmlElement(name = "exemption_certificate")
117    private String exemptionCertificate;
118
119    @XmlElementWrapper(name = "shipping_addresses")
120    @XmlElement(name = "shipping_address")
121    private ShippingAddresses shippingAddresses;
122
123    @XmlElementWrapper(name = "custom_fields")
124    @XmlElement(name = "custom_field")
125    private CustomFields customFields;
126
127    @XmlElement(name = "has_live_subscription")
128    private Boolean hasLiveSubscription;
129
130    @XmlElement(name = "has_active_subscription")
131    private Boolean hasActiveSubscription;
132
133    @XmlElement(name = "has_future_subscription")
134    private Boolean hasFutureSubscription;
135
136    @XmlElement(name = "has_canceled_subscription")
137    private Boolean hasCanceledSubscription;
138
139    @XmlElement(name = "has_past_due_invoice")
140    private Boolean hasPastDueInvoice;
141
142    @XmlElement(name = "has_paused_subscription")
143    private Boolean hasPausedSubscription;
144
145    @XmlElement(name = "vat_number")
146    private String vatNumber;
147
148    @XmlElement(name = "account_acquisition")
149    private AccountAcquisition accountAcquisition;
150
151    @XmlElement(name = "preferred_locale")
152    private String preferredLocale;
153
154    @XmlElement(name = "transaction_type")
155    private String transactionType;
156
157    @Override
158    public void setHref(final Object href) {
159        super.setHref(href);
160
161        // If there was an href try to parse out the account code since
162        // Recurly doesn't currently provide it elsewhere.
163        if (this.href != null) {
164            final Matcher m = ACCOUNT_CODE_PATTERN.matcher(this.href);
165            if (m.find()) {
166                setAccountCode(m.group(1));
167            }
168        }
169    }
170
171    public Address getAddress() {
172        return address;
173    }
174
175    public void setAddress(final Address address) {
176        this.address = address;
177    }
178
179    public Adjustments getAdjustments() {
180        return adjustments;
181    }
182
183    public void setAdjustments(final Adjustments adjustments) {
184        this.adjustments = adjustments;
185    }
186
187    public Invoices getInvoices() {
188        return invoices;
189    }
190
191    public void setInvoices(final Invoices invoices) {
192        this.invoices = invoices;
193    }
194
195    public Subscriptions getSubscriptions() {
196        return subscriptions;
197    }
198
199    public void setSubscriptions(final Subscriptions subscriptions) {
200        this.subscriptions = subscriptions;
201    }
202
203    public Transactions getTransactions() {
204        return transactions;
205    }
206
207    public void setTransactions(final Transactions transactions) {
208        this.transactions = transactions;
209    }
210
211    public String getAccountCode() {
212        return accountCode;
213    }
214
215    public void setAccountCode(final Object accountCode) {
216        this.accountCode = stringOrNull(accountCode);
217    }
218
219    public String getParentAccountCode() {
220        return this.parentAccountCode;
221    }
222
223    public void setParentAccountCode(final Object parentAccountCode) {
224        this.parentAccountCode = stringOrNull(parentAccountCode);
225    }
226
227    public String getState() {
228        return state;
229    }
230
231    public void setState(final Object state) {
232        this.state = stringOrNull(state);
233    }
234
235    public String getUsername() {
236        return username;
237    }
238
239    public void setUsername(final Object username) {
240        this.username = stringOrNull(username);
241    }
242
243    public String getEmail() {
244        return email;
245    }
246
247    public void setEmail(final Object email) {
248        this.email = stringOrNull(email);
249    }
250
251    public String getCcEmails() {
252        return ccEmails;
253    }
254
255    public void setCcEmails(final Object ccEmails) {
256        this.ccEmails = stringOrNull(ccEmails);
257    }
258
259    public String getFirstName() {
260        return firstName;
261    }
262
263    public void setFirstName(final Object firstName) {
264        this.firstName = stringOrNull(firstName);
265    }
266
267    public String getLastName() {
268        return lastName;
269    }
270
271    public void setLastName(final Object lastName) {
272        this.lastName = stringOrNull(lastName);
273    }
274
275    public String getCompanyName() {
276        return companyName != null ? companyName : company;
277    }
278
279    public void setCompanyName(final Object companyName) {
280        this.companyName = stringOrNull(companyName);
281    }
282
283    public void setCompany(final Object company) {
284        this.company = stringOrNull(company);
285    }
286
287    public String getAcceptLanguage() {
288        return acceptLanguage;
289    }
290
291    public void setAcceptLanguage(final Object acceptLanguage) {
292        this.acceptLanguage = stringOrNull(acceptLanguage);
293    }
294
295    public String getHostedLoginToken() {
296        return hostedLoginToken;
297    }
298
299    public void setHostedLoginToken(final Object hostedLoginToken) {
300        this.hostedLoginToken = stringOrNull(hostedLoginToken);
301    }
302
303    public DateTime getCreatedAt() {
304        return createdAt;
305    }
306
307    public void setCreatedAt(final Object createdAt) {
308        this.createdAt = dateTimeOrNull(createdAt);
309    }
310
311    public DateTime getUpdatedAt() {
312        return updatedAt;
313    }
314
315    public void setUpdatedAt(final Object updatedAt) {
316        this.updatedAt = dateTimeOrNull(updatedAt);
317    }
318
319    public DateTime getClosedAt() {
320        return closedAt;
321    }
322
323    public void setClosedAt(final Object closedAt) {
324        this.closedAt = dateTimeOrNull(closedAt);
325    }
326
327    public BillingInfo getBillingInfo() {
328        return billingInfo;
329    }
330
331    public void setBillingInfo(final BillingInfo billingInfo) {
332        this.billingInfo = billingInfo;
333    }
334
335    public Boolean getTaxExempt() {
336        return taxExempt;
337    }
338
339    public void setTaxExempt(final Object taxExempt) {
340        this.taxExempt = booleanOrNull(taxExempt);
341    }
342
343    public String getExemptionCertificate() {
344        return exemptionCertificate;
345    }
346
347    public void setExemptionCertificate(final Object exemptionCertificate) {
348        this.exemptionCertificate = stringOrNull(exemptionCertificate);
349    }
350
351    public Boolean getHasLiveSubscription() {
352        return hasLiveSubscription;
353    }
354
355    protected void setHasLiveSubscription(final Object hasLiveSubscription) {
356        this.hasLiveSubscription = booleanOrNull(hasLiveSubscription);
357    }
358
359    public Boolean getHasActiveSubscription() {
360        return hasActiveSubscription;
361    }
362
363    protected void setHasActiveSubscription(final Object hasActiveSubscription) {
364        this.hasActiveSubscription = booleanOrNull(hasActiveSubscription);
365    }
366
367    public Boolean getHasFutureSubscription() {
368        return hasFutureSubscription;
369    }
370
371    protected void setHasFutureSubscription(final Object hasFutureSubscription) {
372        this.hasFutureSubscription = booleanOrNull(hasFutureSubscription);
373    }
374
375    public Boolean getHasCanceledSubscription() {
376        return hasCanceledSubscription;
377    }
378
379    protected void setHasCanceledSubscription(final Object hasCanceledSubscription) {
380        this.hasCanceledSubscription = booleanOrNull(hasCanceledSubscription);
381    }
382
383    public Boolean getHasPastDueInvoice() {
384        return hasPastDueInvoice;
385    }
386
387    protected void setHasPastDueInvoice(final Object hasPastDueInvoice) {
388        this.hasPastDueInvoice = booleanOrNull(hasPastDueInvoice);
389    }
390
391    public Boolean getHasPausedSubscription() {
392        return hasPausedSubscription;
393    }
394
395    protected void setHasPausedSubscription(final Object hasPausedSubscription) {
396        this.hasPausedSubscription = booleanOrNull(hasPausedSubscription);
397    }
398
399    public ShippingAddresses getShippingAddresses() {
400        return shippingAddresses;
401    }
402
403    public void setShippingAddresses(final ShippingAddresses shippingAddresses) {
404        this.shippingAddresses = shippingAddresses;
405    }
406
407    public CustomFields getCustomFields() {
408        return customFields;
409    }
410
411    public void setCustomFields(final CustomFields customFields) {
412        this.customFields = customFields;
413    }
414
415    public String getVatNumber() {
416        return vatNumber;
417    }
418
419    public void setVatNumber(final Object vatNumber) {
420        this.vatNumber = stringOrNull(vatNumber);
421    }
422
423    public AccountAcquisition getAccountAcquisition() {
424        return accountAcquisition;
425    }
426
427    public void setAccountAcquisition(final AccountAcquisition accountAcquisition) {
428        this.accountAcquisition = accountAcquisition;
429    }
430
431    public String getPreferredLocale() {
432        return preferredLocale;
433    }
434
435    public void setPreferredLocale(final Object preferredLocale) {
436        this.preferredLocale = stringOrNull(preferredLocale);
437    }
438
439    public String getTransactionType() {
440        return transactionType;
441    }
442
443    public void setTransactionType(final Object transactionType) {
444        this.transactionType = stringOrNull(transactionType);
445    }
446
447    @Override
448    public String toString() {
449        final StringBuilder sb = new StringBuilder("Account{");
450        sb.append("address=").append(address);
451        sb.append(", href=").append(href);
452        sb.append(", adjustments=").append(adjustments);
453        sb.append(", invoices=").append(invoices);
454        sb.append(", subscriptions=").append(subscriptions);
455        sb.append(", transactions=").append(transactions);
456        sb.append(", accountCode='").append(accountCode).append('\'');
457        sb.append(", parentAccountCode='").append(parentAccountCode).append('\'');
458        sb.append(", state='").append(state).append('\'');
459        sb.append(", username='").append(username).append('\'');
460        sb.append(", email='").append(email).append('\'');
461        sb.append(", ccEmails='").append(ccEmails).append('\'');
462        sb.append(", firstName='").append(firstName).append('\'');
463        sb.append(", lastName='").append(lastName).append('\'');
464        sb.append(", companyName='").append(this.getCompanyName()).append('\'');
465        sb.append(", acceptLanguage='").append(acceptLanguage).append('\'');
466        sb.append(", hostedLoginToken='").append(hostedLoginToken).append('\'');
467        sb.append(", createdAt=").append(createdAt);
468        sb.append(", updatedAt=").append(updatedAt);
469        sb.append(", closedAt=").append(closedAt);
470        sb.append(", billingInfo=").append(billingInfo);
471        sb.append(", billingInfos=").append(billingInfos);
472        sb.append(", taxExempt=").append(taxExempt);
473        sb.append(", exemptionCertificate='").append(exemptionCertificate).append('\'');
474        sb.append(", shippingAddresses=").append(shippingAddresses);
475        sb.append(", customFields=").append(customFields);
476        sb.append(", hasLiveSubscription=").append(hasLiveSubscription);
477        sb.append(", hasActiveSubscription=").append(hasActiveSubscription);
478        sb.append(", hasFutureSubscription=").append(hasFutureSubscription);
479        sb.append(", hasCanceledSubscription=").append(hasCanceledSubscription);
480        sb.append(", hasPastDueInvoice=").append(hasPastDueInvoice);
481        sb.append(", hasPausedSubscription=").append(hasPausedSubscription);
482        sb.append(", vatNumber=").append(vatNumber);
483        sb.append(", accountAcquisition=").append(accountAcquisition);
484        sb.append(", preferredLocale=").append(preferredLocale);
485        sb.append(", transactionType='").append(transactionType).append('\'');
486        sb.append('}');
487        return sb.toString();
488    }
489
490    @Override
491    public boolean equals(final Object o) {
492        if (this == o) return true;
493        if (o == null || getClass() != o.getClass()) return false;
494
495        final Account account = (Account) o;
496
497        if (acceptLanguage != null ? !acceptLanguage.equals(account.acceptLanguage) : account.acceptLanguage != null) {
498            return false;
499        }
500        if (accountAcquisition != null ? !accountAcquisition.equals(account.accountAcquisition) : account.accountAcquisition != null) {
501            return false;
502        }
503        if (accountCode != null ? !accountCode.equals(account.accountCode) : account.accountCode != null) {
504            return false;
505        }
506        if (parentAccountCode != null ? !parentAccountCode.equals(account.parentAccountCode) : account.parentAccountCode != null) {
507            return false;
508        }
509        if (address != null ? !address.equals(account.address) : account.address != null) {
510            return false;
511        }
512        if (adjustments != null ? !adjustments.equals(account.adjustments) : account.adjustments != null) {
513            return false;
514        }
515        if (billingInfo != null ? !billingInfo.equals(account.billingInfo) : account.billingInfo != null) {
516            return false;
517        }
518        if (billingInfos != null ? !billingInfos.equals(account.billingInfos) : account.billingInfos != null) {
519            return false;
520        }
521        if (closedAt != null ? closedAt.compareTo(account.closedAt) != 0 : account.closedAt != null) {
522            return false;
523        }
524        if (this.getCompanyName() != null ? !this.getCompanyName().equals(account.getCompanyName()) : account.getCompanyName() != null) {
525            return false;
526        }
527        if (createdAt != null ? createdAt.compareTo(account.createdAt) != 0 : account.createdAt != null) {
528            return false;
529        }
530        if (email != null ? !email.equals(account.email) : account.email != null) {
531            return false;
532        }
533        if (ccEmails != null ? !ccEmails.equals(account.ccEmails) : account.ccEmails != null) {
534            return false;
535        }
536        if (firstName != null ? !firstName.equals(account.firstName) : account.firstName != null) {
537            return false;
538        }
539        if (hasLiveSubscription != null ? !hasLiveSubscription.equals(account.hasLiveSubscription) : account.hasLiveSubscription != null) {
540            return false;
541        }
542        if (hasActiveSubscription != null ? !hasActiveSubscription.equals(account.hasActiveSubscription) : account.hasActiveSubscription != null) {
543            return false;
544        }
545        if (hasFutureSubscription != null ? !hasFutureSubscription.equals(account.hasFutureSubscription) : account.hasFutureSubscription != null) {
546            return false;
547        }
548        if (hasCanceledSubscription != null ? !hasCanceledSubscription.equals(account.hasCanceledSubscription) : account.hasCanceledSubscription != null) {
549            return false;
550        }
551        if (hasPausedSubscription != null ? !hasPausedSubscription.equals(account.hasPausedSubscription) : account.hasPausedSubscription != null) {
552            return false;
553        }
554        if (href != null ? !href.equals(account.href) : account.href != null) {
555            return false;
556        }
557        if (hostedLoginToken != null ? !hostedLoginToken.equals(account.hostedLoginToken) : account.hostedLoginToken != null) {
558            return false;
559        }
560        if (invoices != null ? !invoices.equals(account.invoices) : account.invoices != null) {
561            return false;
562        }
563        if (lastName != null ? !lastName.equals(account.lastName) : account.lastName != null) {
564            return false;
565        }
566        if (preferredLocale != null ? !preferredLocale.equals(account.preferredLocale) : account.preferredLocale != null) {
567            return false;
568        }
569        if (state != null ? !state.equals(account.state) : account.state != null) {
570            return false;
571        }
572        if (subscriptions != null ? !subscriptions.equals(account.subscriptions) : account.subscriptions != null) {
573            return false;
574        }
575        if (transactions != null ? !transactions.equals(account.transactions) : account.transactions != null) {
576            return false;
577        }
578        if (updatedAt != null ? updatedAt.compareTo(account.updatedAt) != 0 : account.updatedAt != null) {
579            return false;
580        }
581        if (username != null ? !username.equals(account.username) : account.username != null) {
582            return false;
583        }
584        if (taxExempt != null ? !taxExempt.equals(account.taxExempt) : account.taxExempt != null) {
585            return false;
586        }
587        if (exemptionCertificate != null ? !exemptionCertificate.equals(account.exemptionCertificate) : account.exemptionCertificate != null) {
588            return false;
589        }
590        if (shippingAddresses != null ? !shippingAddresses.equals(account.shippingAddresses) : account.shippingAddresses != null) {
591            return false;
592        }
593        if (customFields != null ? !customFields.equals(account.customFields) : account.customFields != null) {
594            return false;
595        }
596        if (vatNumber != null ? !vatNumber.equals(account.vatNumber) : account.vatNumber != null) {
597            return false;
598        }
599        if (transactionType != null ? !transactionType.equals(account.transactionType) : account.transactionType != null) {
600            return false;
601        }
602
603        return true;
604    }
605
606    @Override
607    public int hashCode() {
608        return Objects.hashCode(
609                address,
610                parentAccountCode,
611                href,
612                adjustments,
613                invoices,
614                subscriptions,
615                transactions,
616                accountCode,
617                state,
618                username,
619                email,
620                ccEmails,
621                firstName,
622                hasLiveSubscription,
623                hasActiveSubscription,
624                hasCanceledSubscription,
625                hasFutureSubscription,
626                hasPastDueInvoice,
627                hasPausedSubscription,
628                lastName,
629                this.getCompanyName(),
630                acceptLanguage,
631                hostedLoginToken,
632                createdAt,
633                billingInfo,
634                billingInfos,
635                updatedAt,
636                taxExempt,
637                exemptionCertificate,
638                shippingAddresses,
639                customFields,
640                vatNumber,
641                accountAcquisition,
642                preferredLocale,
643                closedAt,
644                transactionType
645        );
646    }
647}