killbill-aplcache

invoice: rework invoice amounts definitions These now behave

4/24/2013 8:20:29 PM

Changes

invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java 104(+0 -104)

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceModelDao.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceModelDao.java
index ad28afa..dae7887 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceModelDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceModelDao.java
@@ -60,7 +60,7 @@ public class BusinessInvoiceModelDao extends EntityBase {
     }
 
     public BusinessInvoiceModelDao(final String accountKey, final Invoice invoice) {
-        this(invoice.getAccountId(), accountKey, invoice.getChargedAmount(), invoice.getCreditAdjAmount(), invoice.getPaidAmount(), invoice.getBalance(),
+        this(invoice.getAccountId(), accountKey, invoice.getChargedAmount(), invoice.getCreditedAmount(), invoice.getPaidAmount(), invoice.getBalance(),
              invoice.getCreatedDate(), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getInvoiceNumber(), invoice.getTargetDate(),
              invoice.getUpdatedDate());
     }
diff --git a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
index 402ad8d..c6526a4 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
@@ -29,73 +29,62 @@ import com.ning.billing.util.entity.Entity;
 public interface Invoice extends Entity {
 
     /**
-     *
      * @param item the invoice ietm to add
      * @return true if successful
      */
     boolean addInvoiceItem(InvoiceItem item);
 
     /**
-     *
      * @param items the list of ietms to add
      * @return true is successful
      */
     boolean addInvoiceItems(Collection<InvoiceItem> items);
 
     /**
-     *
      * @return the list of items on that invoice
      */
     List<InvoiceItem> getInvoiceItems();
 
     /**
-     *
      * @param clazz the filter class for the items
      * @param <T>   a InvoiceItem type
-     * @return      the list of invoice ietms on that invoice for that type
+     * @return the list of invoice ietms on that invoice for that type
      */
     public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(Class<T> clazz);
 
     /**
-     *
      * @return the number of items on that invoice
      */
     int getNumberOfItems();
 
     /**
-     *
      * @param payment the successful payment for that invoice
-     * @return        true if we were able to add the payment
+     * @return true if we were able to add the payment
      */
     boolean addPayment(InvoicePayment payment);
 
     /**
-     *
-     * @param payments  the list of payments to add on that invoice
-     * @return          true if we were able to add the payments
+     * @param payments the list of payments to add on that invoice
+     * @return true if we were able to add the payments
      */
     boolean addPayments(Collection<InvoicePayment> payments);
 
     /**
-     *
      * @return the list of payments associated with that invoice
      */
     List<InvoicePayment> getPayments();
 
     /**
-     *
      * @return the number of payments on that invoice
      */
     int getNumberOfPayments();
 
     /**
-     *
      * @return the accountId
      */
     UUID getAccountId();
 
     /**
-     *
      * @return the invoice number
      */
     Integer getInvoiceNumber();
@@ -113,61 +102,41 @@ public interface Invoice extends Entity {
     LocalDate getTargetDate();
 
     /**
-     *
      * @return the currency associated with that invoice
      */
     Currency getCurrency();
 
     /**
-     *
-     * @return the amount that was paid on that invoice
+     * @return the sum of all successful payment amounts for that invoice
      */
     BigDecimal getPaidAmount();
 
     /**
-     *
-     * @return the original charged amount when the invoice was created
+     * @return the sum of all EXTERNAL_CHARGE, FIXED and RECURRING item amounts when the invoice was created
      */
     BigDecimal getOriginalChargedAmount();
 
     /**
-     *
-     * @return the current charged amount for that invoice
+     * @return the sum of all charges (EXTERNAL_CHARGE, FIXED, RECURRING) and adjustments (item or invoice adjustment) amounts
      */
     BigDecimal getChargedAmount();
 
     /**
-     *
-     * @return the amount of account credit on that invoice
+     * @return the sum of all CBA_ADJ items
      */
-    BigDecimal getCBAAmount();
+    BigDecimal getCreditedAmount();
 
     /**
-     *
-     * @return the total adjusted amount on that invoice
-     */
-    BigDecimal getTotalAdjAmount();
-
-    /**
-     *
-     * @return the total credit amount on that invoice
+     * @return the sum of all refunds and chargebacks for payments associated with that invoice
      */
-    BigDecimal getCreditAdjAmount();
+    BigDecimal getRefundedAmount();
 
     /**
-     *
-     * @return the total refunded amount on that invoice
-     */
-    BigDecimal getRefundAdjAmount();
-
-    /**
-     *
      * @return the current balance on that invoice
      */
     BigDecimal getBalance();
 
     /**
-     *
      * @return true if this is a migration invoice
      */
     boolean isMigrationInvoice();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/calculator/InvoiceCalculatorUtils.java b/invoice/src/main/java/com/ning/billing/invoice/calculator/InvoiceCalculatorUtils.java
new file mode 100644
index 0000000..99c9c02
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/calculator/InvoiceCalculatorUtils.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.calculator;
+
+import java.math.BigDecimal;
+
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoiceItemType;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
+import com.ning.billing.invoice.model.InvoicingConfiguration;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+public abstract class InvoiceCalculatorUtils {
+
+    private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
+    private static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
+
+    // Invoice adjustments
+    public static boolean isInvoiceAdjustmentItem(final InvoiceItem invoiceItem, final Iterable<InvoiceItem> otherInvoiceItems) {
+        // Either REFUND_ADJ
+        return InvoiceItemType.REFUND_ADJ.equals(invoiceItem.getInvoiceItemType()) ||
+               // Or invoice level credit, i.e. credit adj, but NOT on its on own invoice
+               (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType()) &&
+                !(Iterables.size(otherInvoiceItems) == 1 &&
+                  InvoiceItemType.CBA_ADJ.equals(otherInvoiceItems.iterator().next().getInvoiceItemType()) &&
+                  otherInvoiceItems.iterator().next().getInvoiceId().equals(invoiceItem.getInvoiceId()) &&
+                  otherInvoiceItems.iterator().next().getAmount().compareTo(invoiceItem.getAmount().negate()) == 0));
+    }
+
+    // Item adjustments
+    public static boolean isInvoiceItemAdjustmentItem(final InvoiceItem invoiceItem) {
+        return InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType()) || InvoiceItemType.REPAIR_ADJ.equals(invoiceItem.getInvoiceItemType());
+    }
+
+    // Account credits, gained or consumed
+    public static boolean isAccountCreditItem(final InvoiceItem invoiceItem) {
+        return InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType());
+    }
+
+    // Regular line item (charges)
+    public static boolean isCharge(final InvoiceItem invoiceItem) {
+        return InvoiceItemType.EXTERNAL_CHARGE.equals(invoiceItem.getInvoiceItemType()) ||
+               InvoiceItemType.FIXED.equals(invoiceItem.getInvoiceItemType()) ||
+               InvoiceItemType.RECURRING.equals(invoiceItem.getInvoiceItemType());
+    }
+
+    public static BigDecimal computeInvoiceBalance(@Nullable final Iterable<InvoiceItem> invoiceItems,
+                                                   @Nullable final Iterable<InvoicePayment> invoicePayments) {
+        return computeInvoiceAmountCharged(invoiceItems)
+                .add(computeInvoiceAmountCredited(invoiceItems))
+                .add(computeInvoiceAmountAdjustedForAccountCredit(invoiceItems))
+                .add(
+                        computeInvoiceAmountPaid(invoicePayments).negate()
+                                .add(
+                                        computeInvoiceAmountRefunded(invoicePayments).negate()
+                                    )
+                    )
+                .setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+
+    // Snowflake for the CREDIT_ADJ on its own invoice
+    private static BigDecimal computeInvoiceAmountAdjustedForAccountCredit(final Iterable<InvoiceItem> invoiceItems) {
+        BigDecimal amountAdjusted = BigDecimal.ZERO;
+        if (invoiceItems == null) {
+            return amountAdjusted;
+        }
+
+        for (final InvoiceItem invoiceItem : invoiceItems) {
+            final Iterable<InvoiceItem> otherInvoiceItems = Iterables.filter(invoiceItems, new Predicate<InvoiceItem>() {
+                @Override
+                public boolean apply(final InvoiceItem input) {
+                    return !input.getId().equals(invoiceItem.getId());
+                }
+            });
+
+            if (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType()) &&
+                (Iterables.size(otherInvoiceItems) == 1 &&
+                 InvoiceItemType.CBA_ADJ.equals(otherInvoiceItems.iterator().next().getInvoiceItemType()) &&
+                 otherInvoiceItems.iterator().next().getInvoiceId().equals(invoiceItem.getInvoiceId()) &&
+                 otherInvoiceItems.iterator().next().getAmount().compareTo(invoiceItem.getAmount().negate()) == 0)) {
+                amountAdjusted = amountAdjusted.add(invoiceItem.getAmount());
+            }
+        }
+        return amountAdjusted.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+
+    public static BigDecimal computeInvoiceAmountCharged(@Nullable final Iterable<InvoiceItem> invoiceItems) {
+        BigDecimal amountCharged = BigDecimal.ZERO;
+        if (invoiceItems == null) {
+            return amountCharged;
+        }
+
+        for (final InvoiceItem invoiceItem : invoiceItems) {
+            final Iterable<InvoiceItem> otherInvoiceItems = Iterables.filter(invoiceItems, new Predicate<InvoiceItem>() {
+                @Override
+                public boolean apply(final InvoiceItem input) {
+                    return !input.getId().equals(invoiceItem.getId());
+                }
+            });
+
+            if (isCharge(invoiceItem) ||
+                isInvoiceAdjustmentItem(invoiceItem, otherInvoiceItems) ||
+                isInvoiceItemAdjustmentItem(invoiceItem)) {
+                amountCharged = amountCharged.add(invoiceItem.getAmount());
+            }
+        }
+        return amountCharged.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+
+    public static BigDecimal computeInvoiceOriginalAmountCharged(final DateTime invoiceCreatedDate, @Nullable final Iterable<InvoiceItem> invoiceItems) {
+        BigDecimal amountCharged = BigDecimal.ZERO;
+        if (invoiceItems == null) {
+            return amountCharged;
+        }
+
+        for (final InvoiceItem invoiceItem : invoiceItems) {
+            if (isCharge(invoiceItem) &&
+                invoiceItem.getCreatedDate().equals(invoiceCreatedDate)) {
+                amountCharged = amountCharged.add(invoiceItem.getAmount());
+            }
+        }
+        return amountCharged.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+
+    public static BigDecimal computeInvoiceAmountCredited(@Nullable final Iterable<InvoiceItem> invoiceItems) {
+        BigDecimal amountCredited = BigDecimal.ZERO;
+        if (invoiceItems == null) {
+            return amountCredited;
+        }
+
+        for (final InvoiceItem invoiceItem : invoiceItems) {
+            if (isAccountCreditItem(invoiceItem)) {
+                amountCredited = amountCredited.add(invoiceItem.getAmount());
+            }
+        }
+        return amountCredited.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+
+    public static BigDecimal computeInvoiceAmountPaid(@Nullable final Iterable<InvoicePayment> invoicePayments) {
+        BigDecimal amountPaid = BigDecimal.ZERO;
+        if (invoicePayments == null) {
+            return amountPaid;
+        }
+
+        for (final InvoicePayment invoicePayment : invoicePayments) {
+            if (InvoicePaymentType.ATTEMPT.equals(invoicePayment.getType())) {
+                amountPaid = amountPaid.add(invoicePayment.getAmount());
+            }
+        }
+        return amountPaid.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+
+    public static BigDecimal computeInvoiceAmountRefunded(@Nullable final Iterable<InvoicePayment> invoicePayments) {
+        BigDecimal amountRefunded = BigDecimal.ZERO;
+        if (invoicePayments == null) {
+            return amountRefunded;
+        }
+
+        for (final InvoicePayment invoicePayment : invoicePayments) {
+            if (InvoicePaymentType.REFUND.equals(invoicePayment.getType()) ||
+                InvoicePaymentType.CHARGED_BACK.equals(invoicePayment.getType())) {
+                amountRefunded = amountRefunded.add(invoicePayment.getAmount());
+            }
+        }
+        return amountRefunded.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+    }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java
index e3d88c6..a4a8b9c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java
@@ -23,7 +23,6 @@ import java.util.UUID;
 
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
-import com.ning.billing.invoice.model.InvoiceItemList;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.entity.EntityPersistenceException;
@@ -51,8 +50,7 @@ public class CBADao {
     public BigDecimal getAccountCBAFromTransaction(final List<InvoiceModelDao> invoices) {
         BigDecimal cba = BigDecimal.ZERO;
         for (final InvoiceModelDao cur : invoices) {
-            final InvoiceItemList invoiceItems = new InvoiceItemList(cur.getInvoiceItems());
-            cba = cba.add(invoiceItems.getCBAAmount());
+            cba = cba.add(InvoiceModelDaoHelper.getCBAAmount(cur));
         }
         return cba;
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index dd614eb..36cc1be 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -17,9 +17,6 @@
 package com.ning.billing.invoice.dao;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -39,16 +36,12 @@ import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
 import com.ning.billing.invoice.api.user.DefaultInvoiceAdjustmentEvent;
-import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
-import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
-import com.ning.billing.invoice.model.InvoiceItemList;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.NonEntityDao;
-import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.entity.dao.EntityDaoBase;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
@@ -57,12 +50,6 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
 import com.ning.billing.util.svcsapi.bus.InternalBus;
 import com.ning.billing.util.svcsapi.bus.InternalBus.EventBusException;
 
-import com.google.common.annotations.VisibleForTesting;
-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.Ordering;
 import com.google.inject.Inject;
 
 public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, InvoiceApiException> implements InvoiceDao {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDaoHelper.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDaoHelper.java
index 18f2b50..8dedb42 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDaoHelper.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDaoHelper.java
@@ -18,36 +18,44 @@ package com.ning.billing.invoice.dao;
 
 import java.math.BigDecimal;
 
-import com.ning.billing.invoice.model.InvoiceItemList;
+import javax.annotation.Nullable;
+
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.calculator.InvoiceCalculatorUtils;
+import com.ning.billing.invoice.model.DefaultInvoicePayment;
+import com.ning.billing.invoice.model.InvoiceItemFactory;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
 
 public class InvoiceModelDaoHelper {
 
     private InvoiceModelDaoHelper() {}
 
     public static BigDecimal getBalance(final InvoiceModelDao invoiceModelDao) {
-        final InvoiceItemList invoiceItems = new InvoiceItemList(invoiceModelDao.getInvoiceItems());
-        return invoiceItems.getBalance(getPaidAmount(invoiceModelDao));
+        return InvoiceCalculatorUtils.computeInvoiceBalance(
+                Iterables.transform(invoiceModelDao.getInvoiceItems(), new Function<InvoiceItemModelDao, InvoiceItem>() {
+                    @Override
+                    public InvoiceItem apply(final InvoiceItemModelDao input) {
+                        return InvoiceItemFactory.fromModelDao(input);
+                    }
+                }),
+                Iterables.transform(invoiceModelDao.getInvoicePayments(), new Function<InvoicePaymentModelDao, InvoicePayment>() {
+                    @Nullable
+                    @Override
+                    public InvoicePayment apply(final InvoicePaymentModelDao input) {
+                        return new DefaultInvoicePayment(input);
+                    }
+                }));
     }
 
     public static BigDecimal getCBAAmount(final InvoiceModelDao invoiceModelDao) {
-        final InvoiceItemList invoiceItems = new InvoiceItemList(invoiceModelDao.getInvoiceItems());
-        return invoiceItems.getCBAAmount();
-    }
-
-    public static BigDecimal getPaidAmount(final InvoiceModelDao invoiceModelDao) {
-        // Compute payments
-        BigDecimal amountPaid = BigDecimal.ZERO;
-        for (final InvoicePaymentModelDao payment : invoiceModelDao.getInvoicePayments()) {
-            if (payment.getAmount() != null) {
-                amountPaid = amountPaid.add(payment.getAmount());
+        return InvoiceCalculatorUtils.computeInvoiceAmountCredited(Iterables.transform(invoiceModelDao.getInvoiceItems(), new Function<InvoiceItemModelDao, InvoiceItem>() {
+            @Override
+            public InvoiceItem apply(final InvoiceItemModelDao input) {
+                return InvoiceItemFactory.fromModelDao(input);
             }
-        }
-
-        return amountPaid;
-    }
-
-    public static BigDecimal getChargedAmount(final InvoiceModelDao invoiceModelDao) {
-        final InvoiceItemList invoiceItems = new InvoiceItemList(invoiceModelDao.getInvoiceItems());
-        return invoiceItems.getChargedAmount();
+        }));
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index ff015f5..dc4df00 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -31,6 +31,7 @@ import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.calculator.InvoiceCalculatorUtils;
 import com.ning.billing.invoice.dao.InvoiceItemModelDao;
 import com.ning.billing.invoice.dao.InvoiceModelDao;
 import com.ning.billing.invoice.dao.InvoicePaymentModelDao;
@@ -41,7 +42,7 @@ import com.google.common.collect.Collections2;
 
 public class DefaultInvoice extends EntityBase implements Invoice {
 
-    private final InvoiceItemList invoiceItems = new InvoiceItemList();
+    private final List<InvoiceItem> invoiceItems = new ArrayList<InvoiceItem>();
     private final List<InvoicePayment> payments = new ArrayList<InvoicePayment>();
     private final UUID accountId;
     private final Integer invoiceNumber;
@@ -179,48 +180,32 @@ public class DefaultInvoice extends EntityBase implements Invoice {
 
     @Override
     public BigDecimal getPaidAmount() {
-        BigDecimal amountPaid = BigDecimal.ZERO;
-        for (final InvoicePayment payment : payments) {
-            if (payment.getAmount() != null) {
-                amountPaid = amountPaid.add(payment.getAmount());
-            }
-        }
-        return amountPaid;
+        return InvoiceCalculatorUtils.computeInvoiceAmountPaid(payments);
     }
 
     @Override
     public BigDecimal getOriginalChargedAmount() {
-        return invoiceItems.getOriginalChargedAmount();
+        return InvoiceCalculatorUtils.computeInvoiceOriginalAmountCharged(createdDate, invoiceItems);
     }
 
     @Override
     public BigDecimal getChargedAmount() {
-        return invoiceItems.getChargedAmount();
-    }
-
-    @Override
-    public BigDecimal getCBAAmount() {
-        return invoiceItems.getCBAAmount();
-    }
-
-    @Override
-    public BigDecimal getTotalAdjAmount() {
-        return invoiceItems.getTotalAdjAmount();
+        return InvoiceCalculatorUtils.computeInvoiceAmountCharged(invoiceItems);
     }
 
     @Override
-    public BigDecimal getCreditAdjAmount() {
-        return invoiceItems.getCreditAdjAmount();
+    public BigDecimal getCreditedAmount() {
+        return InvoiceCalculatorUtils.computeInvoiceAmountCredited(invoiceItems);
     }
 
     @Override
-    public BigDecimal getRefundAdjAmount() {
-        return invoiceItems.getRefundAdjAmount();
+    public BigDecimal getRefundedAmount() {
+        return InvoiceCalculatorUtils.computeInvoiceAmountRefunded(payments);
     }
 
     @Override
     public BigDecimal getBalance() {
-        return invoiceItems.getBalance(getPaidAmount());
+        return InvoiceCalculatorUtils.computeInvoiceBalance(invoiceItems, payments);
     }
 
     @Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index f75197f..23bad28 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -188,11 +188,6 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
     }
 
     @Override
-    public BigDecimal getCBAAmount() {
-        return round(Objects.firstNonNull(invoice.getCBAAmount(), BigDecimal.ZERO));
-    }
-
-    @Override
     public BigDecimal getBalance() {
         return round(Objects.firstNonNull(invoice.getBalance(), BigDecimal.ZERO));
     }
@@ -287,17 +282,12 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
     }
 
     @Override
-    public BigDecimal getTotalAdjAmount() {
-        return round(Objects.firstNonNull(invoice.getTotalAdjAmount(), BigDecimal.ZERO));
-    }
-
-    @Override
-    public BigDecimal getCreditAdjAmount() {
-        return round(Objects.firstNonNull(invoice.getCreditAdjAmount(), BigDecimal.ZERO));
+    public BigDecimal getCreditedAmount() {
+        return round(Objects.firstNonNull(invoice.getCreditedAmount(), BigDecimal.ZERO));
     }
 
     @Override
-    public BigDecimal getRefundAdjAmount() {
-        return round(Objects.firstNonNull(invoice.getRefundAdjAmount(), BigDecimal.ZERO));
+    public BigDecimal getRefundedAmount() {
+        return round(Objects.firstNonNull(invoice.getRefundedAmount(), BigDecimal.ZERO));
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
index 5edcfa7..24a3618 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
@@ -238,7 +238,6 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
 
         // Verify the adjusted invoice balance
         final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
-        // Note! The invoice code will round (see InvoiceItemList)
         verifyAdjustedInvoiceBalance(invoiceBalance, creditAmount, adjustedInvoiceBalance);
 
         // Verify the adjusted account balance
@@ -282,7 +281,6 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
 
         // Verify the adjusted invoice balance
         final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
-        // Note! The invoice code will round (see InvoiceItemList)
         verifyAdjustedInvoiceBalance(invoiceBalance, invoiceItem.getAmount(), adjustedInvoiceBalance);
 
         // Verify the adjusted account balance
@@ -318,7 +316,6 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
 
         // Verify the adjusted invoice balance
         final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
-        // Note! The invoice code will round (see InvoiceItemList)
         verifyAdjustedInvoiceBalance(invoiceBalance, adjAmount, adjustedInvoiceBalance);
 
         // Verify the adjusted account balance
@@ -340,8 +337,7 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
     }
 
     private void verifyAdjustedInvoiceBalance(final BigDecimal invoiceBalance, final BigDecimal adjAmount, final BigDecimal adjustedInvoiceBalance) {
-        Assert.assertEquals(adjustedInvoiceBalance.compareTo(invoiceBalance.add(adjAmount.negate().setScale(InvoicingConfiguration.getNumberOfDecimals(),
-                                                                                                            InvoicingConfiguration.getRoundingMode()))
+        Assert.assertEquals(adjustedInvoiceBalance.compareTo(invoiceBalance.add(adjAmount.negate())
                                                                            .setScale(InvoicingConfiguration.getNumberOfDecimals(),
                                                                                      InvoicingConfiguration.getRoundingMode())), 0);
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index d1ed484..f4dc8fe 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.invoice.dao;
 
-import static com.ning.billing.invoice.TestInvoiceHelper.*;
-
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -69,6 +67,11 @@ import com.ning.billing.util.svcapi.junction.BillingModeType;
 
 import com.google.common.collect.ImmutableMap;
 
+import static com.ning.billing.invoice.TestInvoiceHelper.FIFTEEN;
+import static com.ning.billing.invoice.TestInvoiceHelper.FIVE;
+import static com.ning.billing.invoice.TestInvoiceHelper.TEN;
+import static com.ning.billing.invoice.TestInvoiceHelper.TWENTY;
+import static com.ning.billing.invoice.TestInvoiceHelper.ZERO;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
@@ -124,7 +127,6 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final InvoiceModelDao savedInvoice = invoiceDao.getById(invoiceId, internalCallContext);
         assertNotNull(savedInvoice);
         assertEquals(InvoiceModelDaoHelper.getBalance(savedInvoice).compareTo(new BigDecimal("21.00")), 0);
-        assertEquals(InvoiceModelDaoHelper.getPaidAmount(savedInvoice), BigDecimal.ZERO);
         assertEquals(savedInvoice.getInvoiceItems().size(), 1);
 
         final BigDecimal paymentAmount = new BigDecimal("11.00");
@@ -136,9 +138,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoiceId, internalCallContext);
         assertNotNull(retrievedInvoice);
         assertEquals(retrievedInvoice.getInvoiceItems().size(), 1);
-        assertEquals(InvoiceModelDaoHelper.getChargedAmount(retrievedInvoice).compareTo(new BigDecimal("21.00")), 0);
         assertEquals(InvoiceModelDaoHelper.getBalance(retrievedInvoice).compareTo(new BigDecimal("10.00")), 0);
-        assertEquals(InvoiceModelDaoHelper.getPaidAmount(retrievedInvoice).compareTo(new BigDecimal("11.00")), 0);
     }
 
     @Test(groups = "slow")
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index d7a337a..847d1a1 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -27,7 +27,6 @@ import java.util.UUID;
 import javax.annotation.Nullable;
 
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
@@ -52,8 +51,6 @@ import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
-import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
-import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
@@ -906,7 +903,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
         assertEquals(invoice2.getBalance().compareTo(ZERO), 0);
 
         // ensure that the account has a credit balance
-        final BigDecimal creditBalance = invoice1.getCBAAmount().add(invoice2.getCBAAmount());
+        final BigDecimal creditBalance = invoice1.getCreditedAmount().add(invoice2.getCreditedAmount());
         assertTrue(creditBalance.compareTo(FIVE) == 0);
     }
 
@@ -1008,9 +1005,9 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
     private void printDetailInvoice(final Invoice invoice) {
         log.info("--------------------  START DETAIL ----------------------");
         log.info("Invoice " + invoice.getId() + ": BALANCE = " + invoice.getBalance()
-                 + ", CBA = " + invoice.getCBAAmount()
+                 + ", CBA = " + invoice.getCreditedAmount()
                  + ", CHARGE_AMOUNT = " + invoice.getChargedAmount()
-                 + ", ADJ_AMOUNT = " + invoice.getCreditAdjAmount());
+                 + ", ADJ_AMOUNT = " + invoice.getCreditedAmount());
 
         for (final InvoiceItem cur : invoice.getInvoiceItems()) {
             log.info(cur.toString());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
index e97609d..b56a6d9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
@@ -29,7 +29,6 @@ import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
-import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java b/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java
index 2865b3f..d5fc03a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java
@@ -26,8 +26,6 @@ import org.testng.annotations.Test;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.InvoiceItemType;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
 
 public class TestExternalChargeInvoiceItem extends InvoiceTestSuiteNoDB {
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
index 7998d77..7b10ce6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
@@ -27,7 +27,6 @@ import org.joda.time.LocalDate;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
@@ -35,10 +34,12 @@ import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
+import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
 import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
 import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
 import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
 import com.ning.billing.invoice.model.DefaultInvoice;
+import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RefundAdjInvoiceItem;
 import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
@@ -80,7 +81,7 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
 
         // Check the scenario
         Assert.assertEquals(invoice.getBalance().doubleValue(), 10.00);
-        Assert.assertEquals(invoice.getCBAAmount().doubleValue(), 0.00);
+        Assert.assertEquals(invoice.getCreditedAmount().doubleValue(), 0.00);
 
         // Verify the merge
         final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US);
@@ -119,7 +120,7 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
                                                                                                          fixedItem.getCurrency());
         final RefundAdjInvoiceItem refundAdjInvoiceItem = new RefundAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(),
                                                                                    fixedItem.getStartDate(), BigDecimal.ONE.negate(), fixedItem.getCurrency());
-        final Invoice invoice = new DefaultInvoice(fixedItem.getInvoiceId(), fixedItem.getAccountId(), null,
+        final DefaultInvoice invoice = new DefaultInvoice(fixedItem.getInvoiceId(), fixedItem.getAccountId(), null,
                                                    new LocalDate(), new LocalDate(), Currency.USD, false);
         invoice.addInvoiceItem(fixedItem);
         invoice.addInvoiceItem(repairAdjInvoiceItem);
@@ -127,10 +128,12 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
         invoice.addInvoiceItem(creditAdjInvoiceItem);
         invoice.addInvoiceItem(creditBalanceAdjInvoiceItem2);
         invoice.addInvoiceItem(refundAdjInvoiceItem);
+        invoice.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice.getId(), clock.getUTCNow(), BigDecimal.TEN, Currency.USD));
+        invoice.addPayment(new DefaultInvoicePayment(InvoicePaymentType.REFUND, UUID.randomUUID(), invoice.getId(), clock.getUTCNow(), BigDecimal.ONE.negate(), Currency.USD));
         // Check the scenario
-        Assert.assertEquals(invoice.getBalance().doubleValue(), 9.00);
-        Assert.assertEquals(invoice.getCBAAmount().doubleValue(), 11.00);
-        Assert.assertEquals(invoice.getRefundAdjAmount().doubleValue(), -1.00);
+        Assert.assertEquals(invoice.getBalance().doubleValue(), 0.00);
+        Assert.assertEquals(invoice.getCreditedAmount().doubleValue(), 11.00);
+        Assert.assertEquals(invoice.getRefundedAmount().doubleValue(), -1.00);
 
         // Verify the merge
         final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
index ee87e8d..dce72c6 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
@@ -39,12 +39,10 @@ public class InvoiceJsonSimple extends JsonBase {
     private final BigDecimal balance;
     private final BigDecimal creditAdj;
     private final BigDecimal refundAdj;
-    private final BigDecimal cba;
     private final String accountId;
 
     @JsonCreator
     public InvoiceJsonSimple(@JsonProperty("amount") final BigDecimal amount,
-                             @JsonProperty("cba") final BigDecimal cba,
                              @JsonProperty("creditAdj") final BigDecimal creditAdj,
                              @JsonProperty("refundAdj") final BigDecimal refundAdj,
                              @JsonProperty("invoiceId") @Nullable final String invoiceId,
@@ -56,7 +54,6 @@ public class InvoiceJsonSimple extends JsonBase {
                              @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
         super(auditLogs);
         this.amount = amount;
-        this.cba = cba;
         this.creditAdj = creditAdj;
         this.refundAdj = refundAdj;
         this.invoiceId = invoiceId;
@@ -68,7 +65,7 @@ public class InvoiceJsonSimple extends JsonBase {
     }
 
     public InvoiceJsonSimple(final Invoice input, final List<AuditLog> auditLogs) {
-        this(input.getChargedAmount(), input.getCBAAmount(), input.getCreditAdjAmount(), input.getRefundAdjAmount(),
+        this(input.getChargedAmount(), input.getCreditedAmount(), input.getRefundedAmount(),
              input.getId().toString(), input.getInvoiceDate(), input.getTargetDate(), String.valueOf(input.getInvoiceNumber()),
              input.getBalance(), input.getAccountId().toString(), toAuditLogJson(auditLogs));
     }
@@ -81,10 +78,6 @@ public class InvoiceJsonSimple extends JsonBase {
         return amount;
     }
 
-    public BigDecimal getCBA() {
-        return cba;
-    }
-
     public BigDecimal getCreditAdj() {
         return creditAdj;
     }
@@ -139,10 +132,6 @@ public class InvoiceJsonSimple extends JsonBase {
               (balance != null && that.balance != null && balance.compareTo(that.balance) == 0))) {
             return false;
         }
-        if (!((cba == null && that.cba == null) ||
-              (cba != null && that.cba != null && cba.compareTo(that.cba) == 0))) {
-            return false;
-        }
         if (!((creditAdj == null && that.creditAdj == null) ||
               (creditAdj != null && that.creditAdj != null && creditAdj.compareTo(that.creditAdj) == 0))) {
             return false;
@@ -172,7 +161,6 @@ public class InvoiceJsonSimple extends JsonBase {
     @Override
     public int hashCode() {
         int result = amount != null ? amount.hashCode() : 0;
-        result = 31 * result + (cba != null ? cba.hashCode() : 0);
         result = 31 * result + (creditAdj != null ? creditAdj.hashCode() : 0);
         result = 31 * result + (refundAdj != null ? refundAdj.hashCode() : 0);
         result = 31 * result + (invoiceId != null ? invoiceId.hashCode() : 0);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
index e72decd..7483617 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
@@ -36,7 +36,6 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
 
     @JsonCreator
     public InvoiceJsonWithBundleKeys(@JsonProperty("amount") final BigDecimal amount,
-                                     @JsonProperty("cba") final BigDecimal cba,
                                      @JsonProperty("creditAdj") final BigDecimal creditAdj,
                                      @JsonProperty("refundAdj") final BigDecimal refundAdj,
                                      @JsonProperty("invoiceId") final String invoiceId,
@@ -48,7 +47,7 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
                                      @JsonProperty("externalBundleKeys") final String bundleKeys,
                                      @JsonProperty("credits") final List<CreditJson> credits,
                                      @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
-        super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId, auditLogs);
+        super(amount, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId, auditLogs);
         this.bundleKeys = bundleKeys;
         this.credits = credits;
     }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
index cea485e..0c343dd 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
@@ -37,7 +37,6 @@ public class InvoiceJsonWithItems extends InvoiceJsonSimple {
 
     @JsonCreator
     public InvoiceJsonWithItems(@JsonProperty("amount") final BigDecimal amount,
-                                @JsonProperty("cba") final BigDecimal cba,
                                 @JsonProperty("creditAdj") final BigDecimal creditAdj,
                                 @JsonProperty("refundAdj") final BigDecimal refundAdj,
                                 @JsonProperty("invoiceId") final String invoiceId,
@@ -48,7 +47,7 @@ public class InvoiceJsonWithItems extends InvoiceJsonSimple {
                                 @JsonProperty("accountId") final String accountId,
                                 @JsonProperty("items") final List<InvoiceItemJsonSimple> items,
                                 @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
-        super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId, auditLogs);
+        super(amount, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId, auditLogs);
         this.items = new ArrayList<InvoiceItemJsonSimple>(items);
     }
 
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
index a84fbbd..28199e1 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
@@ -88,7 +88,6 @@ public class TestBundleTimelineJson extends JaxrsTestSuiteNoDB {
         final UUID accountId = UUID.randomUUID();
         final UUID invoiceId = UUID.randomUUID();
         final BigDecimal invoiceAmount = BigDecimal.TEN;
-        final BigDecimal cba = BigDecimal.ONE;
         final BigDecimal creditAdj = BigDecimal.ONE;
         final BigDecimal refundAdj = BigDecimal.ONE;
         final LocalDate invoiceDate = clock.getUTCToday();
@@ -96,7 +95,7 @@ public class TestBundleTimelineJson extends JaxrsTestSuiteNoDB {
         final String invoiceNumber = UUID.randomUUID().toString();
         final BigDecimal balance = BigDecimal.ZERO;
 
-        return new InvoiceJsonSimple(invoiceAmount, cba, creditAdj, refundAdj, invoiceId.toString(), invoiceDate,
+        return new InvoiceJsonSimple(invoiceAmount, creditAdj, refundAdj, invoiceId.toString(), invoiceDate,
                                      targetDate, invoiceNumber, balance, accountId.toString(), null);
     }
 
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
index 2fe0eee..0d98220 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
@@ -35,7 +35,6 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuiteNoDB {
     @Test(groups = "fast")
     public void testJson() throws Exception {
         final BigDecimal amount = BigDecimal.TEN;
-        final BigDecimal cba = BigDecimal.ONE;
         final BigDecimal creditAdj = BigDecimal.ONE;
         final BigDecimal refundAdj = BigDecimal.ONE;
         final String invoiceId = UUID.randomUUID().toString();
@@ -45,10 +44,9 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuiteNoDB {
         final BigDecimal balance = BigDecimal.ZERO;
         final String accountId = UUID.randomUUID().toString();
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
-        final InvoiceJsonSimple invoiceJsonSimple = new InvoiceJsonSimple(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
+        final InvoiceJsonSimple invoiceJsonSimple = new InvoiceJsonSimple(amount, creditAdj, refundAdj, invoiceId, invoiceDate,
                                                                           targetDate, invoiceNumber, balance, accountId, auditLogs);
         Assert.assertEquals(invoiceJsonSimple.getAmount(), amount);
-        Assert.assertEquals(invoiceJsonSimple.getCBA(), cba);
         Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), creditAdj);
         Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), refundAdj);
         Assert.assertEquals(invoiceJsonSimple.getInvoiceId(), invoiceId);
@@ -68,9 +66,8 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuiteNoDB {
     public void testFromInvoice() throws Exception {
         final Invoice invoice = Mockito.mock(Invoice.class);
         Mockito.when(invoice.getChargedAmount()).thenReturn(BigDecimal.TEN);
-        Mockito.when(invoice.getCBAAmount()).thenReturn(BigDecimal.ONE);
-        Mockito.when(invoice.getCreditAdjAmount()).thenReturn(BigDecimal.ONE);
-        Mockito.when(invoice.getRefundAdjAmount()).thenReturn(BigDecimal.ONE);
+        Mockito.when(invoice.getCreditedAmount()).thenReturn(BigDecimal.ONE);
+        Mockito.when(invoice.getRefundedAmount()).thenReturn(BigDecimal.ONE);
         Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
         Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCToday());
         Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCToday());
@@ -80,9 +77,8 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuiteNoDB {
 
         final InvoiceJsonSimple invoiceJsonSimple = new InvoiceJsonSimple(invoice);
         Assert.assertEquals(invoiceJsonSimple.getAmount(), invoice.getChargedAmount());
-        Assert.assertEquals(invoiceJsonSimple.getCBA(), invoice.getCBAAmount());
-        Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), invoice.getCreditAdjAmount());
-        Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), invoice.getRefundAdjAmount());
+        Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), invoice.getCreditedAmount());
+        Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), invoice.getRefundedAmount());
         Assert.assertEquals(invoiceJsonSimple.getInvoiceId(), invoice.getId().toString());
         Assert.assertEquals(invoiceJsonSimple.getInvoiceDate(), invoice.getInvoiceDate());
         Assert.assertEquals(invoiceJsonSimple.getTargetDate(), invoice.getTargetDate());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
index 8e28b44..e071f7e 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
@@ -38,7 +38,6 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuiteNoDB {
     @Test(groups = "fast")
     public void testJson() throws Exception {
         final BigDecimal amount = BigDecimal.TEN;
-        final BigDecimal cba = BigDecimal.ONE;
         final BigDecimal creditAdj = BigDecimal.ONE;
         final BigDecimal refundAdj = BigDecimal.ONE;
         final String invoiceId = UUID.randomUUID().toString();
@@ -51,11 +50,10 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuiteNoDB {
         final CreditJson creditJson = createCreditJson();
         final List<CreditJson> credits = ImmutableList.<CreditJson>of(creditJson);
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
-        final InvoiceJsonWithBundleKeys invoiceJsonSimple = new InvoiceJsonWithBundleKeys(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
+        final InvoiceJsonWithBundleKeys invoiceJsonSimple = new InvoiceJsonWithBundleKeys(amount, creditAdj, refundAdj, invoiceId, invoiceDate,
                                                                                           targetDate, invoiceNumber, balance, accountId, bundleKeys,
                                                                                           credits, auditLogs);
         Assert.assertEquals(invoiceJsonSimple.getAmount(), amount);
-        Assert.assertEquals(invoiceJsonSimple.getCBA(), cba);
         Assert.assertEquals(invoiceJsonSimple.getCreditAdj(), creditAdj);
         Assert.assertEquals(invoiceJsonSimple.getRefundAdj(), refundAdj);
         Assert.assertEquals(invoiceJsonSimple.getInvoiceId(), invoiceId);
@@ -77,9 +75,8 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuiteNoDB {
     public void testFromInvoice() throws Exception {
         final Invoice invoice = Mockito.mock(Invoice.class);
         Mockito.when(invoice.getChargedAmount()).thenReturn(BigDecimal.TEN);
-        Mockito.when(invoice.getCBAAmount()).thenReturn(BigDecimal.ONE);
-        Mockito.when(invoice.getCreditAdjAmount()).thenReturn(BigDecimal.ONE);
-        Mockito.when(invoice.getRefundAdjAmount()).thenReturn(BigDecimal.ONE);
+        Mockito.when(invoice.getCreditedAmount()).thenReturn(BigDecimal.ONE);
+        Mockito.when(invoice.getRefundedAmount()).thenReturn(BigDecimal.ONE);
         Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
         Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCToday());
         Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCToday());
@@ -92,9 +89,8 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuiteNoDB {
 
         final InvoiceJsonWithBundleKeys invoiceJsonWithBundleKeys = new InvoiceJsonWithBundleKeys(invoice, bundleKeys, credits, null);
         Assert.assertEquals(invoiceJsonWithBundleKeys.getAmount(), invoice.getChargedAmount());
-        Assert.assertEquals(invoiceJsonWithBundleKeys.getCBA(), invoice.getCBAAmount());
-        Assert.assertEquals(invoiceJsonWithBundleKeys.getCreditAdj(), invoice.getCreditAdjAmount());
-        Assert.assertEquals(invoiceJsonWithBundleKeys.getRefundAdj(), invoice.getRefundAdjAmount());
+        Assert.assertEquals(invoiceJsonWithBundleKeys.getCreditAdj(), invoice.getCreditedAmount());
+        Assert.assertEquals(invoiceJsonWithBundleKeys.getRefundAdj(), invoice.getRefundedAmount());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getInvoiceId(), invoice.getId().toString());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getInvoiceDate(), invoice.getInvoiceDate());
         Assert.assertEquals(invoiceJsonWithBundleKeys.getTargetDate(), invoice.getTargetDate());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
index 22d19ee..1bfeb6d 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
@@ -39,7 +39,6 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuiteNoDB {
     @Test(groups = "fast")
     public void testJson() throws Exception {
         final BigDecimal amount = BigDecimal.TEN;
-        final BigDecimal cba = BigDecimal.ONE;
         final BigDecimal creditAdj = BigDecimal.ONE;
         final BigDecimal refundAdj = BigDecimal.ONE;
         final String invoiceId = UUID.randomUUID().toString();
@@ -50,11 +49,10 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuiteNoDB {
         final String accountId = UUID.randomUUID().toString();
         final InvoiceItemJsonSimple invoiceItemJsonSimple = createInvoiceItemJson();
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
-        final InvoiceJsonWithItems invoiceJsonWithItems = new InvoiceJsonWithItems(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate,
+        final InvoiceJsonWithItems invoiceJsonWithItems = new InvoiceJsonWithItems(amount, creditAdj, refundAdj, invoiceId, invoiceDate,
                                                                                    targetDate, invoiceNumber, balance, accountId,
                                                                                    ImmutableList.<InvoiceItemJsonSimple>of(invoiceItemJsonSimple), auditLogs);
         Assert.assertEquals(invoiceJsonWithItems.getAmount(), amount);
-        Assert.assertEquals(invoiceJsonWithItems.getCBA(), cba);
         Assert.assertEquals(invoiceJsonWithItems.getCreditAdj(), creditAdj);
         Assert.assertEquals(invoiceJsonWithItems.getRefundAdj(), refundAdj);
         Assert.assertEquals(invoiceJsonWithItems.getInvoiceId(), invoiceId);
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/AnalyticsTestSuiteNoDB.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/AnalyticsTestSuiteNoDB.java
index 9e079bd..a6630ea 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/AnalyticsTestSuiteNoDB.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/AnalyticsTestSuiteNoDB.java
@@ -159,10 +159,8 @@ public abstract class AnalyticsTestSuiteNoDB {
         Mockito.when(invoice.getPaidAmount()).thenReturn(BigDecimal.ZERO);
         Mockito.when(invoice.getOriginalChargedAmount()).thenReturn(new BigDecimal("1922"));
         Mockito.when(invoice.getChargedAmount()).thenReturn(new BigDecimal("100293"));
-        Mockito.when(invoice.getCBAAmount()).thenReturn(BigDecimal.TEN);
-        Mockito.when(invoice.getTotalAdjAmount()).thenReturn(new BigDecimal("192"));
-        Mockito.when(invoice.getCreditAdjAmount()).thenReturn(new BigDecimal("283"));
-        Mockito.when(invoice.getRefundAdjAmount()).thenReturn(new BigDecimal("384"));
+        Mockito.when(invoice.getCreditedAmount()).thenReturn(new BigDecimal("283"));
+        Mockito.when(invoice.getRefundedAmount()).thenReturn(new BigDecimal("384"));
         Mockito.when(invoice.getBalance()).thenReturn(new BigDecimal("18376"));
         Mockito.when(invoice.isMigrationInvoice()).thenReturn(false);
         Mockito.when(invoice.getCreatedDate()).thenReturn(INVOICE_CREATED_DATE);
@@ -353,10 +351,8 @@ public abstract class AnalyticsTestSuiteNoDB {
         Mockito.when(invoice.getPaidAmount()).thenReturn(BigDecimal.ZERO);
         Mockito.when(invoice.getOriginalChargedAmount()).thenReturn(new BigDecimal("1922"));
         Mockito.when(invoice.getChargedAmount()).thenReturn(new BigDecimal("100293"));
-        Mockito.when(invoice.getCBAAmount()).thenReturn(BigDecimal.TEN);
-        Mockito.when(invoice.getTotalAdjAmount()).thenReturn(new BigDecimal("192"));
-        Mockito.when(invoice.getCreditAdjAmount()).thenReturn(new BigDecimal("283"));
-        Mockito.when(invoice.getRefundAdjAmount()).thenReturn(new BigDecimal("384"));
+        Mockito.when(invoice.getCreditedAmount()).thenReturn(new BigDecimal("283"));
+        Mockito.when(invoice.getRefundedAmount()).thenReturn(new BigDecimal("384"));
         Mockito.when(invoice.getBalance()).thenReturn(new BigDecimal("18376"));
         Mockito.when(invoice.isMigrationInvoice()).thenReturn(false);
         Mockito.when(invoice.getCreatedDate()).thenReturn(INVOICE_CREATED_DATE);
diff --git a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
index 38dbecb..5d551b3 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
@@ -177,7 +177,7 @@ public class MockInvoice extends EntityBase implements Invoice {
 
 
     @Override
-    public BigDecimal getCreditAdjAmount() {
+    public BigDecimal getCreditedAmount() {
         BigDecimal result = BigDecimal.ZERO;
 
         for (final InvoiceItem i : invoiceItems) {
@@ -199,17 +199,7 @@ public class MockInvoice extends EntityBase implements Invoice {
     }
 
     @Override
-    public BigDecimal getCBAAmount() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public BigDecimal getTotalAdjAmount() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public BigDecimal getRefundAdjAmount() {
+    public BigDecimal getRefundedAmount() {
         throw new UnsupportedOperationException();
     }