killbill-memoizeit

invoice: Fix usage bug where we end up missing usage items The

9/11/2015 10:23:09 PM

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/generator/DefaultInvoiceGenerator.java b/invoice/src/main/java/org/killbill/billing/invoice/generator/DefaultInvoiceGenerator.java
index 1bc6c58..287e1f6 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/generator/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/generator/DefaultInvoiceGenerator.java
@@ -29,6 +29,8 @@ import java.util.UUID;
 
 import javax.annotation.Nullable;
 
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 import org.joda.time.Months;
 import org.killbill.billing.ErrorCode;
@@ -114,8 +116,21 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         return invoice.getInvoiceItems().size() != 0 ? invoice : null;
     }
 
+    private LocalDate getMinBillingEventDate(final BillingEventSet eventSet, final DateTimeZone accountTimeZone) {
+        DateTime minDate = null;
+        final Iterator<BillingEvent> events = eventSet.iterator();
+        while (events.hasNext()) {
+            final BillingEvent cur = events.next();
+            if (minDate == null || minDate.compareTo(cur.getEffectiveDate()) > 0) {
+                minDate = cur.getEffectiveDate();
+            }
+        }
+        return new LocalDate(minDate, accountTimeZone);
+    }
+
     private List<InvoiceItem> generateUsageConsumableInArrearItems(final Account account,
-                                                                   final UUID invoiceId, final BillingEventSet eventSet,
+                                                                   final UUID invoiceId,
+                                                                   final BillingEventSet eventSet,
                                                                    @Nullable final List<Invoice> existingInvoices, final LocalDate targetDate,
                                                                    final InternalCallContext internalCallContext) throws InvoiceApiException {
 
@@ -144,7 +159,8 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
                                     input.getBillingMode() == BillingMode.IN_ARREAR);
                         }
                     })) {
-                    rawUsageOptimizerResult = rawUsageOptimizer.getConsumableInArrearUsage(new LocalDate(event.getEffectiveDate(), account.getTimeZone()), targetDate, Iterables.concat(perSubscriptionConsumableInArrearUsageItems.values()), eventSet.getUsages(), internalCallContext);
+                    final LocalDate minBillingEventDate = getMinBillingEventDate(eventSet, account.getTimeZone());
+                    rawUsageOptimizerResult = rawUsageOptimizer.getConsumableInArrearUsage(minBillingEventDate, targetDate, Iterables.concat(perSubscriptionConsumableInArrearUsageItems.values()), eventSet.getUsages(), internalCallContext);
                 }
 
                 // None of the billing events report any usage (CONSUMABLE/IN_ARREAR) sections