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