killbill-aplcache

invoice: fix CTD computation Make sure the CTD is aligned

7/12/2012 12:05:10 AM

Details

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 1fdb6f7..4bcb2e0 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -44,6 +44,7 @@ import com.ning.billing.invoice.api.InvoiceNotifier;
 import com.ning.billing.invoice.api.user.DefaultNullInvoiceEvent;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
 import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.generator.InvoiceDateUtils;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
@@ -176,12 +177,11 @@ public class InvoiceDispatcher {
 
                     final List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
                     final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
-                    setChargedThroughDates(fixedPriceInvoiceItems, recurringInvoiceItems, context);
+                    setChargedThroughDates(account.getBillCycleDay(), fixedPriceInvoiceItems, recurringInvoiceItems, context);
 
                     final InvoiceCreationEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
                                                                                        invoice.getBalance(), invoice.getCurrency(),
-                                                                                       invoice.getInvoiceDate(),
-                                                                                       context.getUserToken());
+                                                                                       invoice.getInvoiceDate(), context.getUserToken());
 
                     postEvent(event, accountId);
                 }
@@ -198,12 +198,13 @@ public class InvoiceDispatcher {
         }
     }
 
-    private void setChargedThroughDates(final Collection<InvoiceItem> fixedPriceItems,
-                                        final Collection<InvoiceItem> recurringItems, final CallContext context) {
-
+    private void setChargedThroughDates(final int billCycleDay,
+                                        final Collection<InvoiceItem> fixedPriceItems,
+                                        final Collection<InvoiceItem> recurringItems,
+                                        final CallContext context) {
         final Map<UUID, DateTime> chargeThroughDates = new HashMap<UUID, DateTime>();
-        addInvoiceItemsToChargeThroughDates(chargeThroughDates, fixedPriceItems);
-        addInvoiceItemsToChargeThroughDates(chargeThroughDates, recurringItems);
+        addInvoiceItemsToChargeThroughDates(billCycleDay, chargeThroughDates, fixedPriceItems);
+        addInvoiceItemsToChargeThroughDates(billCycleDay, chargeThroughDates, recurringItems);
 
         for (final UUID subscriptionId : chargeThroughDates.keySet()) {
             if (subscriptionId != null) {
@@ -222,15 +223,18 @@ public class InvoiceDispatcher {
         }
     }
 
-
-    private void addInvoiceItemsToChargeThroughDates(final Map<UUID, DateTime> chargeThroughDates, final Collection<InvoiceItem> items) {
+    private void addInvoiceItemsToChargeThroughDates(final int billCycleDay,
+                                                     final Map<UUID, DateTime> chargeThroughDates,
+                                                     final Collection<InvoiceItem> items) {
         for (final InvoiceItem item : items) {
             final UUID subscriptionId = item.getSubscriptionId();
             final DateTime endDate = item.getEndDate();
 
             if (chargeThroughDates.containsKey(subscriptionId)) {
                 if (chargeThroughDates.get(subscriptionId).isBefore(endDate)) {
-                    chargeThroughDates.put(subscriptionId, endDate);
+                    // The CTD should always align with the BCD - note that the BCD is computed from UTC, hence we
+                    // can't use endDate as a CTD here
+                    chargeThroughDates.put(subscriptionId, InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(endDate, billCycleDay));
                 }
             } else {
                 chargeThroughDates.put(subscriptionId, endDate);