killbill-uncached

invoice: @See #361. Previous fix b1790a85d8f3e64677f309ca03758a43eb597a29

9/12/2015 10:15:48 PM

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java b/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java
index 8f5f03f..be6c3d7 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java
@@ -165,7 +165,6 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator 
 
                     if (rate != null) {
                         final BigDecimal amount = KillBillMoney.of(itemDatum.getNumberOfCycles().multiply(rate), currency);
-                        if (BigDecimal.ZERO.compareTo(amount) != 0) {
                             final RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId,
                                                                                                 accountId,
                                                                                                 thisEvent.getSubscription().getBundleId(),
@@ -175,11 +174,11 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator 
                                                                                                 itemDatum.getStartDate(), itemDatum.getEndDate(),
                                                                                                 amount, rate, currency);
                             items.add(recurringItem);
-
-                        }
                     }
                 }
                 updatePerSubscriptionNextNotificationDate(thisEvent.getSubscription().getId(), itemDataWithNextBillingCycleDate.getNextBillingCycleDate(), items, billingMode, perSubscriptionFutureNotificationDate);
+                // Filtering $0 items needs to occur after we compute nextNotificationDate, because these items contain important date info for the case of IN_ADVANCE billing
+                remove0$RecurringItems(items);
             }
         }
 
@@ -193,6 +192,16 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator 
         return items;
     }
 
+    private void remove0$RecurringItems(final List<InvoiceItem> items) {
+        final Iterator<InvoiceItem> it = items.iterator();
+        while (it.hasNext()) {
+            final InvoiceItem item = it.next();
+            if (item.getAmount().compareTo(BigDecimal.ZERO) == 0) {
+                it.remove();
+            }
+        }
+    }
+
     private void updatePerSubscriptionNextNotificationDate(final UUID subscriptionId, final LocalDate nextBillingCycleDate, final List<InvoiceItem> newProposedItems, final BillingMode billingMode, final Map<UUID, SubscriptionFutureNotificationDates> perSubscriptionFutureNotificationDates) {
 
         LocalDate nextNotificationDate = null;