diff --git a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
index 6704b4d..7eb38af 100644
--- a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
@@ -221,11 +221,15 @@ public class DefaultAccount extends EntityBase implements Account {
throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account external key yet: this=%s, delegate=%s",
externalKey, delegate.getExternalKey()));
}
+
if (currency != null ? !currency.equals(delegate.getCurrency()) : delegate.getCurrency() != null) {
throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account currency yet: this=%s, delegate=%s",
currency, delegate.getCurrency()));
}
- if (billCycleDay != null ? !billCycleDay.equals(delegate.getBillCycleDay()) : delegate.getBillCycleDay() != null) {
+
+ // We can't just use .equals here as the BillCycleDay class might not have implemented it
+ if (billCycleDay != null ? !(billCycleDay.getDayOfMonthUTC() == delegate.getBillCycleDay().getDayOfMonthUTC() &&
+ billCycleDay.getDayOfMonthLocal() == delegate.getBillCycleDay().getDayOfMonthLocal()) : delegate.getBillCycleDay() != null) {
throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account BCD yet: this=%s, delegate=%s",
billCycleDay, delegate.getBillCycleDay()));
}
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
index fd82926..d5244d9 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
@@ -321,6 +321,37 @@ public class TestAccountDao extends AccountDaoTestBase {
}
@Test(groups = "slow")
+ public void testShouldBeAbleToHandleOtherBCDClass() throws Exception {
+ final Account account = createTestAccount();
+ accountDao.create(account, context);
+
+ final MutableAccountData otherAccount = account.toMutableAccountData();
+ otherAccount.setAddress1(UUID.randomUUID().toString());
+ otherAccount.setEmail(UUID.randomUUID().toString());
+ // Same BCD, but not .equals method
+ otherAccount.setBillCycleDay(new BillCycleDay() {
+ @Override
+ public int getDayOfMonthUTC() {
+ return account.getBillCycleDay().getDayOfMonthUTC();
+ }
+
+ @Override
+ public int getDayOfMonthLocal() {
+ return account.getBillCycleDay().getDayOfMonthLocal();
+ }
+ });
+
+ final DefaultAccount newAccount = new DefaultAccount(account.getId(), otherAccount);
+ accountDao.update(newAccount, context);
+
+ final Account newFetchedAccount = accountDao.getById(account.getId());
+ Assert.assertEquals(newFetchedAccount.getAddress1(), newAccount.getAddress1());
+ Assert.assertEquals(newFetchedAccount.getEmail(), newAccount.getEmail());
+ // Same BCD
+ Assert.assertEquals(newFetchedAccount.getBillCycleDay(), account.getBillCycleDay());
+ }
+
+ @Test(groups = "slow")
public void testAccountEmail() {
List<AccountEmail> emails = new ArrayList<AccountEmail>();