killbill-memoizeit

invoice: use BCD to get notified Invoice should only be notified

7/7/2012 12:27:17 AM

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 405c431..c249f6a 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -225,7 +225,7 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
                 INVOICE_AMOUNT, ACCOUNT_CURRENCY);
         invoice.addInvoiceItem(invoiceItem);
 
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
         final List<Invoice> invoices = invoiceDao.getInvoicesByAccount(account.getId());
         Assert.assertEquals(invoices.size(), 1);
         Assert.assertEquals(invoices.get(0).getInvoiceItems().size(), 1);
diff --git a/api/src/main/java/com/ning/billing/glue/InvoiceModule.java b/api/src/main/java/com/ning/billing/glue/InvoiceModule.java
index 7e55895..f513edd 100644
--- a/api/src/main/java/com/ning/billing/glue/InvoiceModule.java
+++ b/api/src/main/java/com/ning/billing/glue/InvoiceModule.java
@@ -17,13 +17,9 @@
 package com.ning.billing.glue;
 
 public interface InvoiceModule {
-
     public abstract void installInvoiceUserApi();
 
     public abstract void installInvoicePaymentApi();
 
     public abstract void installInvoiceMigrationApi();
-
-    public abstract void installInvoiceTestApi();
-
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
index 9e9b95c..67d3c77 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -20,8 +20,13 @@ import java.math.BigDecimal;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -35,23 +40,35 @@ import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
 
 public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
+    private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceMigrationApi.class);
 
+    private final AccountUserApi accountUserApi;
     private final DefaultInvoiceDao dao;
     private final Clock clock;
 
     @Inject
-    public DefaultInvoiceMigrationApi(final DefaultInvoiceDao dao, final Clock clock) {
+    public DefaultInvoiceMigrationApi(final AccountUserApi accountUserApi, final DefaultInvoiceDao dao, final Clock clock) {
+        this.accountUserApi = accountUserApi;
         this.dao = dao;
         this.clock = clock;
     }
 
     @Override
     public UUID createMigrationInvoice(final UUID accountId, final DateTime targetDate, final BigDecimal balance, final Currency currency) {
+        final Account account;
+        try {
+            account = accountUserApi.getAccountById(accountId);
+        } catch (AccountApiException e) {
+            log.warn("Unable to find account for id {}", accountId);
+            return null;
+        }
+
         final CallContext context = new DefaultCallContextFactory(clock).createMigrationCallContext("Migration", CallOrigin.INTERNAL, UserType.MIGRATION, clock.getUTCNow(), clock.getUTCNow());
         final Invoice migrationInvoice = new MigrationInvoice(accountId, clock.getUTCNow(), targetDate, currency);
         final InvoiceItem migrationInvoiceItem = new MigrationInvoiceItem(migrationInvoice.getId(), accountId, targetDate, balance, currency);
         migrationInvoice.addInvoiceItem(migrationInvoiceItem);
-        dao.create(migrationInvoice, context);
+
+        dao.create(migrationInvoice, account.getBillCycleDay(), context);
         return migrationInvoice.getId();
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 47f696c..75ef1aa 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -139,13 +139,11 @@ public class DefaultInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public void create(final Invoice invoice, final CallContext context) {
+    public void create(final Invoice invoice, final int billCycleDay, final CallContext context) {
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
-
                 final Invoice currentInvoice = transactional.getById(invoice.getId().toString());
-
                 if (currentInvoice == null) {
                     final List<EntityAudit> audits = new ArrayList<EntityAudit>();
 
@@ -163,7 +161,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
 
                     final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
 
-                    notifyOfFutureBillingEvents(transactional, recurringInvoiceItems);
+                    notifyOfFutureBillingEvents(transactional, invoice, recurringInvoiceItems, billCycleDay);
 
                     final List<InvoicePayment> invoicePayments = invoice.getPayments();
                     final InvoicePaymentSqlDao invoicePaymentSqlDao = transactional.become(InvoicePaymentSqlDao.class);
@@ -509,11 +507,10 @@ public class DefaultInvoiceDao implements InvoiceDao {
         invoice.addPayments(invoicePayments);
     }
 
-    private void notifyOfFutureBillingEvents(final InvoiceSqlDao dao, final List<InvoiceItem> invoiceItems) {
+    private void notifyOfFutureBillingEvents(final InvoiceSqlDao dao, final Invoice invoice, final List<InvoiceItem> invoiceItems, final int billCycleDay) {
         DateTime nextBCD = null;
         UUID subscriptionForNextBCD = null;
         for (final InvoiceItem item : invoiceItems) {
-
             if (item.getInvoiceItemType() == InvoiceItemType.RECURRING) {
                 final RecurringInvoiceItem recurringInvoiceItem = (RecurringInvoiceItem) item;
                 if ((recurringInvoiceItem.getEndDate() != null) &&
@@ -526,7 +523,15 @@ public class DefaultInvoiceDao implements InvoiceDao {
                 }
             }
         }
-        if (subscriptionForNextBCD != null) {
+
+        // We need to be notified if and only if the maximum end date of the invoiced recurring items is equal
+        // to the next bill cycle day.
+        // We take the maximum because we're guaranteed to have invoiced all subscriptions up until that date
+        // (and no further processing is needed).
+        // Also, we only need to get notified on the BDC. For other invoice events (e.g. phase changes),
+        // we'll be notified by entitlement.
+        if (subscriptionForNextBCD != null && nextBCD != null && nextBCD.getDayOfMonth() == billCycleDay) {
+            final UUID accountId = invoice.getAccountId();
             nextBillingDatePoster.insertNextBillingNotification(dao, subscriptionForNextBCD, nextBCD);
         }
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index 9c2403b..1812ed1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -31,7 +31,7 @@ import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.callcontext.CallContext;
 
 public interface InvoiceDao {
-    void create(Invoice invoice, CallContext context);
+    void create(final Invoice invoice, final int billCycleDay, final CallContext context);
 
     Invoice getById(final UUID id);
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
index 7ed75e1..1f2507b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
@@ -31,8 +31,6 @@ import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
 import com.ning.billing.invoice.api.invoice.DefaultInvoicePaymentApi;
 import com.ning.billing.invoice.api.migration.DefaultInvoiceMigrationApi;
-import com.ning.billing.invoice.api.test.DefaultInvoiceTestApi;
-import com.ning.billing.invoice.api.test.InvoiceTestApi;
 import com.ning.billing.invoice.api.user.DefaultInvoiceUserApi;
 import com.ning.billing.invoice.dao.DefaultInvoiceDao;
 import com.ning.billing.invoice.dao.InvoiceDao;
@@ -44,7 +42,6 @@ import com.ning.billing.invoice.notification.EmailInvoiceNotifier;
 import com.ning.billing.invoice.notification.NextBillingDateNotifier;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.invoice.notification.NullInvoiceNotifier;
-import com.ning.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
 public class DefaultInvoiceModule extends AbstractModule implements InvoiceModule {
@@ -60,11 +57,6 @@ public class DefaultInvoiceModule extends AbstractModule implements InvoiceModul
     }
 
     @Override
-    public void installInvoiceTestApi() {
-        bind(InvoiceTestApi.class).to(DefaultInvoiceTestApi.class).asEagerSingleton();
-    }
-
-    @Override
     public void installInvoicePaymentApi() {
         bind(InvoicePaymentApi.class).to(DefaultInvoicePaymentApi.class).asEagerSingleton();
     }
@@ -120,6 +112,5 @@ public class DefaultInvoiceModule extends AbstractModule implements InvoiceModul
         installInvoiceUserApi();
         installInvoicePaymentApi();
         installInvoiceMigrationApi();
-        installInvoiceTestApi();
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index 01948ba..1fdb6f7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -172,7 +172,7 @@ public class InvoiceDispatcher {
                 }
                 outputDebugData(billingEvents, invoices);
                 if (!dryRun) {
-                    invoiceDao.create(invoice, context);
+                    invoiceDao.create(invoice, account.getBillCycleDay(), context);
 
                     final List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
                     final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index 310b24b..a81485f 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -46,7 +46,7 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public void create(final Invoice invoice, final CallContext context) {
+    public void create(final Invoice invoice, final int billCycleDay, final CallContext context) {
         synchronized (monitor) {
             invoices.put(invoice.getId(), invoice);
         }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index 626cb2f..87978ab 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -76,7 +76,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
         final DateTime invoiceDate = invoice.getInvoiceDate();
 
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
 
         final List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
         assertNotNull(invoices);
@@ -102,7 +102,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
                 new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
 
         invoice.addInvoiceItem(invoiceItem);
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
 
         final Invoice savedInvoice = invoiceDao.getById(invoiceId);
         assertNotNull(savedInvoice);
@@ -139,7 +139,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final DateTime paymentDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
         final BigDecimal paymentAmount = new BigDecimal("14.0");
 
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
         invoiceDao.notifyOfPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice.getId(), paymentDate, paymentAmount, Currency.USD), context);
 
         invoice = invoiceDao.getById(invoice.getId());
@@ -156,7 +156,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final DateTime paymentDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
 
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
         invoiceDao.notifyOfPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice.getId(), paymentDate, invoice.getBalance(), Currency.USD), context);
         invoice = invoiceDao.getById(invoice.getId());
         assertEquals(invoice.getLastPaymentDate().compareTo(paymentDate), 0);
@@ -180,7 +180,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -205,7 +205,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -256,7 +256,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -281,7 +281,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -332,7 +332,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -373,7 +373,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -422,11 +422,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID accountId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime targetDate2 = new DateTime(2011, 12, 6, 0, 0, 0, 0);
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
 
         List<Invoice> invoices;
@@ -452,7 +452,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -483,7 +483,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -508,7 +508,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -533,7 +533,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID accountId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final BigDecimal payment1 = new BigDecimal("48.0");
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
@@ -559,7 +559,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -623,12 +623,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
 
     private void testAccountBalanceWithRefundAndCBAInternal(boolean withAdjustment, final BigDecimal refundAmount, final BigDecimal expectedFinalBalance) throws InvoiceApiException {
-
         final UUID accountId = UUID.randomUUID();
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -695,7 +694,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -760,7 +759,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // NEXT RECURRING on invoice 2
 
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1.plusMonths(1), Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
 
         final RecurringInvoiceItem nextItem = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test bla", startDate.plusMonths(1),
@@ -788,7 +787,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         final DateTime endDate = startDate.plusMonths(1);
@@ -818,7 +817,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final DateTime targetDate2 = new DateTime(2011, 7, 1, 0, 0, 0, 0);
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final DateTime startDate2 = new DateTime(2011, 6, 1, 0, 0, 0, 0);
         final DateTime endDate2 = startDate2.plusMonths(3);
@@ -888,8 +887,8 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         assertEquals(invoice2.getBalance(), FIVE);
         invoiceList.add(invoice2);
 
-        invoiceDao.create(invoice1, context);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final Invoice savedInvoice1 = invoiceDao.getById(invoice1.getId());
         assertEquals(savedInvoice1.getBalance(), ZERO);
@@ -963,7 +962,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
-        //invoiceDao.create(invoice1, context);
+        //invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
         final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
@@ -978,7 +977,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         invoiceList.add(invoice2);
 
-        //invoiceDao.create(invoice2, context);
+        //invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
         final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate3, Currency.USD);
@@ -986,7 +985,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         assertEquals(invoice3.getNumberOfItems(), 1);
         assertEquals(invoice3.getBalance().compareTo(cheapAmount), 0);
 
-        //invoiceDao.create(invoice3, context);
+        //invoiceDao.create(invoice3, invoice3.getTargetDate().getDayOfMonth(), context);
     }
 
     @Test(groups = {"slow"})
@@ -1031,7 +1030,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         assertEquals(invoice.getNumberOfItems(), 2);
         assertEquals(invoice.getBalance().compareTo(cheapAmount), 0);
 
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
         final Invoice savedInvoice = invoiceDao.getById(invoice.getId());
 
         assertNotNull(savedInvoice);
@@ -1067,7 +1066,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate1, Currency.USD);
         invoices.add(invoice1);
-        invoiceDao.create(invoice1, context);
+        invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
         invoice1 = invoiceDao.getById(invoice1.getId());
         assertNotNull(invoice1.getInvoiceNumber());
 
@@ -1077,7 +1076,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
                 "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
         events.add(event2);
         Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate2, Currency.USD);
-        invoiceDao.create(invoice2, context);
+        invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
         invoice2 = invoiceDao.getById(invoice2.getId());
         assertNotNull(invoice2.getInvoiceNumber());
     }
@@ -1104,7 +1103,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         events.add(event1);
 
         final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
         invoiceDao.setWrittenOff(invoice.getId(), context);
 
         final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
@@ -1135,7 +1134,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         events.add(event1);
 
         final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
         invoiceDao.setWrittenOff(invoice.getId(), context);
 
         final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
index 931d0ae..78bbdd6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
@@ -114,7 +114,7 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
         final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
         final DefaultInvoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
 
-        invoiceDao.create(invoice, context);
+        invoiceDao.create(invoice, targetDate.getDayOfMonth(), context);
 
         final UUID invoiceId = invoice.getId();
         final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index b46edc7..91c020b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -71,7 +71,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
 public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
-
     private static final Logger log = LoggerFactory.getLogger(TestDefaultInvoiceGenerator.class);
 
     private final Clock clock = new ClockMock();
@@ -79,8 +78,6 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
     private final InvoiceGenerator generator;
 
     public TestDefaultInvoiceGenerator() {
-        super();
-
         final Clock clock = new DefaultClock();
         final InvoiceConfig invoiceConfig = new InvoiceConfig() {
             @Override
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
index a317cad..e4bf810 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
@@ -25,8 +25,6 @@ import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.glue.CatalogModule;
 import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.invoice.api.InvoiceNotifier;
-import com.ning.billing.invoice.api.test.DefaultInvoiceTestApi;
-import com.ning.billing.invoice.api.test.InvoiceTestApi;
 import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
 import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
 import com.ning.billing.invoice.notification.MockNextBillingDateNotifier;
@@ -117,7 +115,6 @@ public class InvoiceModuleWithEmbeddedDb extends DefaultInvoiceModule {
 
         super.configure();
 
-        bind(InvoiceTestApi.class).to(DefaultInvoiceTestApi.class).asEagerSingleton();
         install(new BusModule());
         install(new TemplateModule());
 
diff --git a/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java b/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java
index 90e41c4..6fd3f57 100644
--- a/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java
+++ b/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java
@@ -21,11 +21,9 @@ import com.ning.billing.glue.InvoiceModule;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.invoice.api.InvoiceUserApi;
-import com.ning.billing.invoice.api.test.InvoiceTestApi;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 
 public class MockInvoiceModule extends AbstractModule implements InvoiceModule {
-
     @Override
     public void installInvoiceUserApi() {
         bind(InvoiceUserApi.class).toInstance(BrainDeadProxyFactory.createBrainDeadProxyFor(InvoiceUserApi.class));
@@ -42,15 +40,9 @@ public class MockInvoiceModule extends AbstractModule implements InvoiceModule {
     }
 
     @Override
-    public void installInvoiceTestApi() {
-        bind(InvoiceTestApi.class).toInstance(BrainDeadProxyFactory.createBrainDeadProxyFor(InvoiceTestApi.class));
-    }
-
-    @Override
     protected void configure() {
         installInvoiceUserApi();
         installInvoicePaymentApi();
         installInvoiceMigrationApi();
-        installInvoiceTestApi();
     }
 }