killbill-aplcache

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java
index affb57c..8139872 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationParentInvoice.java
@@ -28,7 +28,6 @@ import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.entitlement.api.DefaultEntitlement;
-import org.killbill.billing.entitlement.api.Entitlement;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceItemType;
 import org.killbill.billing.invoice.api.InvoiceStatus;
@@ -345,7 +344,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // get last child invoice
         Invoice childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
 
         // Second Parent invoice over Recurring period
         assertEquals(parentInvoices.size(), 2);
@@ -369,7 +368,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         // ITEM_ADJ : $ -10
 
         childInvoice = invoiceUserApi.getInvoice(childInvoice.getId(), callContext);
-        assertEquals(childInvoice.getInvoiceItems().size(), 2);
+        assertEquals(childInvoice.getNumberOfItems(), 2);
         assertEquals(childInvoice.getBalance().compareTo(BigDecimal.valueOf(239.95)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING);
         assertEquals(childInvoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.ITEM_ADJ);
@@ -421,7 +420,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         
         // get last child invoice
         Invoice childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
 
         // Second Parent invoice over Recurring period
         assertEquals(parentInvoices.size(), 2);
@@ -434,7 +433,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         assertEquals(parentInvoice.getChargedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
 
         // issue a $10 adj in a paid invoice
-        busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT, NextEvent.INVOICE_ADJUSTMENT);
+        busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
         invoiceUserApi.insertInvoiceItemAdjustment(childAccount.getId(),
                                                    childInvoice.getId(),
                                                    childInvoice.getInvoiceItems().get(0).getId(),
@@ -444,12 +443,12 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         assertListenerStatus();
 
         // expected child invoice
-        // RECURRING : $ 20
+        // RECURRING : $ 249.95
         // ITEM_ADJ : $ -10
         // CBA_ADJ : $ +10
 
         childInvoice = invoiceUserApi.getInvoice(childInvoice.getId(), callContext);
-        assertEquals(childInvoice.getInvoiceItems().size(), 3);
+        assertEquals(childInvoice.getNumberOfItems(), 3);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING);
         assertEquals(childInvoice.getInvoiceItems().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.ITEM_ADJ);
@@ -459,11 +458,9 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
 
         // check parent invoices
         parentInvoice = invoiceUserApi.getInvoice(parentInvoice.getId(), callContext);
-        assertEquals(parentInvoice.getInvoiceItems().size(), 3);
+        assertEquals(parentInvoice.getNumberOfItems(), 1);
         assertEquals(parentInvoice.getPaidAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(parentInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.PARENT_SUMMARY);
-        assertEquals(parentInvoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.ITEM_ADJ);
-        assertEquals(parentInvoice.getInvoiceItems().get(2).getInvoiceItemType(), InvoiceItemType.CBA_ADJ);
 
     }
 
@@ -499,7 +496,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // get last child invoice
         Invoice childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
 
         // Second Parent invoice over Recurring period
         assertEquals(parentInvoices.size(), 2);
@@ -528,7 +525,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // invoice 1
         childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 2);
+        assertEquals(childInvoice.getNumberOfItems(), 2);
         assertEquals(childInvoice.getBalance().compareTo(BigDecimal.valueOf(16.66)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING);
         assertEquals(childInvoice.getInvoiceItems().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
@@ -537,7 +534,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
 
         // invoice 2
         childInvoice = childInvoices.get(2);
-        assertEquals(childInvoice.getInvoiceItems().size(), 2);
+        assertEquals(childInvoice.getNumberOfItems(), 2);
         assertEquals(childInvoice.getBalance().compareTo(BigDecimal.ZERO), 0);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.REPAIR_ADJ);
         assertEquals(childInvoice.getInvoiceItems().get(0).getAmount().compareTo(BigDecimal.valueOf(-233.29)), 0);
@@ -594,7 +591,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // get last child invoice
         Invoice childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
 
         // Second Parent invoice over Recurring period
         assertEquals(parentInvoices.size(), 2);
@@ -621,13 +618,13 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // invoice 1
         childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
         assertEquals(childInvoice.getChargedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING);
 
         // invoice 2
         childInvoice = childInvoices.get(2);
-        assertEquals(childInvoice.getInvoiceItems().size(), 2);
+        assertEquals(childInvoice.getNumberOfItems(), 2);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.REPAIR_ADJ);
         assertEquals(childInvoice.getInvoiceItems().get(0).getAmount().compareTo(BigDecimal.valueOf(-241.62)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.CBA_ADJ);
@@ -681,7 +678,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // get last child invoice
         Invoice childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
 
         // Second Parent invoice over Recurring period
         assertEquals(parentInvoices.size(), 2);
@@ -708,13 +705,13 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, callContext);
         // invoice 1
         childInvoice = childInvoices.get(1);
-        assertEquals(childInvoice.getInvoiceItems().size(), 1);
+        assertEquals(childInvoice.getNumberOfItems(), 1);
         assertEquals(childInvoice.getChargedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING);
 
         // invoice 2
         childInvoice = childInvoices.get(2);
-        assertEquals(childInvoice.getInvoiceItems().size(), 2);
+        assertEquals(childInvoice.getNumberOfItems(), 2);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.REPAIR_ADJ);
         assertEquals(childInvoice.getInvoiceItems().get(0).getAmount().compareTo(BigDecimal.valueOf(-241.62)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.CBA_ADJ);
@@ -748,7 +745,7 @@ public class TestIntegrationParentInvoice extends TestIntegrationBase {
         assertEquals(childInvoices.size(), 5);
 
         childInvoice = childInvoices.get(4);
-        assertEquals(childInvoice.getInvoiceItems().size(), 2);
+        assertEquals(childInvoice.getNumberOfItems(), 2);
         assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING);
         assertEquals(childInvoice.getInvoiceItems().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(childInvoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.CBA_ADJ);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
index 3efb715..6a5da4d 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
@@ -20,7 +20,6 @@ package org.killbill.billing.invoice;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -79,7 +78,6 @@ import org.killbill.billing.invoice.generator.InvoiceWithMetadata.SubscriptionFu
 import org.killbill.billing.invoice.model.DefaultInvoice;
 import org.killbill.billing.invoice.model.FixedPriceInvoiceItem;
 import org.killbill.billing.invoice.model.InvoiceItemFactory;
-import org.killbill.billing.invoice.model.ItemAdjInvoiceItem;
 import org.killbill.billing.invoice.model.ParentInvoiceItem;
 import org.killbill.billing.invoice.model.RecurringInvoiceItem;
 import org.killbill.billing.invoice.notification.DefaultNextBillingDateNotifier;
@@ -90,7 +88,6 @@ import org.killbill.billing.junction.BillingInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
 import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
-import org.killbill.billing.util.UUIDs;
 import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.TenantContext;
@@ -767,6 +764,9 @@ public class InvoiceDispatcher {
 
         if (parentInvoice == null) {
             throw new InvoiceApiException(ErrorCode.INVOICE_MISSING_PARENT_INVOICE, childInvoiceModelDao.getId());
+        } else if (parentInvoice.getStatus().equals(InvoiceStatus.COMMITTED)) {
+            // ignore parent invoice adjustment if it's in COMMITTED status.
+            return;
         }
 
         final InvoiceItemModelDao childInvoiceItemAdjustment = Iterables.find(childInvoiceModelDao.getInvoiceItems(), new Predicate<InvoiceItemModelDao>() {
@@ -790,25 +790,9 @@ public class InvoiceDispatcher {
             }
         });
 
-        if (parentInvoice.getStatus().equals(InvoiceStatus.DRAFT)) {
-            // update item amount
-            BigDecimal newParentInvoiceItemAmount = childInvoiceAdjustmentAmount.add(parentInvoiceItemForChild.getAmount());
-            invoiceDao.updateInvoiceItemAmount(parentInvoiceItemForChild.getId(), newParentInvoiceItemAmount, parentContext);
-        } else {
-            // add an item adjustment
-            final ItemAdjInvoiceItem parentInvoiceItemAdjustment = new ItemAdjInvoiceItem(UUIDs.randomUUID(),
-                                                                                          context.getCreatedDate(),
-                                                                                          parentInvoiceItemForChild.getInvoiceId(),
-                                                                                          parentInvoiceItemForChild.getAccountId(),
-                                                                                          context.getCreatedDate().toLocalDate(),
-                                                                                          description,
-                                                                                          childInvoiceAdjustmentAmount,
-                                                                                          account.getCurrency(),
-                                                                                          parentInvoiceItemForChild.getId());
-            parentInvoice.addInvoiceItem(new InvoiceItemModelDao(parentInvoiceItemAdjustment));
-            invoiceDao.createInvoices(Arrays.asList(parentInvoice), parentContext);
-        }
-
+        // update item amount
+        BigDecimal newParentInvoiceItemAmount = childInvoiceAdjustmentAmount.add(parentInvoiceItemForChild.getAmount());
+        invoiceDao.updateInvoiceItemAmount(parentInvoiceItemForChild.getId(), newParentInvoiceItemAmount, parentContext);
     }
 
 }