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);
}
}