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}