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