killbill-memoizeit

invoice: small tweaks to CBA soft deletion * Link to original

9/19/2012 11:18:05 PM

Details

diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
index a048f24..91bfa27 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
@@ -71,6 +71,7 @@ import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableMap.Builder;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 public class AuditedInvoiceDao implements InvoiceDao {
@@ -702,7 +703,7 @@ public class AuditedInvoiceDao implements InvoiceDao {
 
                 // First, adjust the same invoice with the CBA amount to "delete"
                 final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(),
-                                                                               cbaItem.getAmount().negate(), cbaItem.getCurrency());
+                                                                               cbaItem.getId(), cbaItem.getAmount().negate(), cbaItem.getCurrency());
                 invoiceItemSqlDao.create(cbaAdjItem, context);
 
                 // If there is more account credit than CBA we adjusted, we're done.
@@ -727,7 +728,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
                         // Add a single adjustment per invoice
                         BigDecimal positiveCBAAdjItemAmount = BigDecimal.ZERO;
 
-                        for (final InvoiceItem cbaUsed : invoiceFollowing.getInvoiceItems()) {
+                        // Start with the most recent invoice to limit the impact on overdue
+                        for (final InvoiceItem cbaUsed : Lists.reverse(invoiceFollowing.getInvoiceItems())) {
                             // Ignore non CBA items or credits (CBA >= 0)
                             if (!InvoiceItemType.CBA_ADJ.equals(cbaUsed.getInvoiceItemType()) ||
                                 cbaUsed.getAmount().compareTo(BigDecimal.ZERO) >= 0) {
@@ -752,7 +754,7 @@ public class AuditedInvoiceDao implements InvoiceDao {
 
                         // Add the adjustment on that invoice
                         final InvoiceItem nextCBAAdjItem = new CreditBalanceAdjInvoiceItem(invoiceFollowing.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(),
-                                                                                           positiveCBAAdjItemAmount, cbaItem.getCurrency());
+                                                                                           cbaItem.getId(), positiveCBAAdjItemAmount, cbaItem.getCurrency());
                         invoiceItemSqlDao.create(nextCBAAdjItem, context);
                         if (positiveRemainderToAdjust.compareTo(BigDecimal.ZERO) == 0) {
                             break;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
index 2391bc9..b990922 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
@@ -143,7 +143,7 @@ public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
                     item = new RecurringInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
                     break;
                 case CBA_ADJ:
-                    item = new CreditBalanceAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
+                    item = new CreditBalanceAdjInvoiceItem(id, invoiceId, accountId, startDate, linkedItemId, amount, currency);
                     break;
                 case CREDIT_ADJ:
                     item = new CreditAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
index 2c4c72e..588a650 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
@@ -32,8 +32,14 @@ public class CreditBalanceAdjInvoiceItem extends AdjInvoiceItem {
     }
 
     public CreditBalanceAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId,
-                                       final LocalDate date, final BigDecimal amount, final Currency currency) {
-        super(id, invoiceId, accountId, date, date, amount, currency);
+                                       final LocalDate date, final UUID linkedInvoiceItemId,
+                                       final BigDecimal amount, final Currency currency) {
+        super(id, invoiceId, accountId, date, date, amount, currency, linkedInvoiceItemId);
+    }
+
+    public CreditBalanceAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date, final UUID linkedInvoiceItemId,
+                                       final BigDecimal amount, final Currency currency) {
+        super(invoiceId, accountId, date, date, amount, currency, linkedInvoiceItemId);
     }
 
     @Override