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}