killbill-memoizeit

analytics: remove complexity The complexity is now in invoice

4/24/2013 8:56:06 PM

Changes

osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/factory/AdjustedCBAInvoiceItem.java 132(+0 -132)

osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/factory/BusinessInvoiceItemFactory.java 28(+0 -28)

osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessInvoiceAndInvoicePaymentDao.java 197(+0 -197)

Details

diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceAndInvoicePaymentDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceAndInvoicePaymentDao.java
index b8a74ac..a08bcd8 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceAndInvoicePaymentDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceAndInvoicePaymentDao.java
@@ -16,7 +16,6 @@
 
 package com.ning.billing.osgi.bundles.analytics.dao;
 
-import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -33,7 +32,6 @@ import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessAccountModelDao
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceModelDao;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoicePaymentBaseModelDao;
-import com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillAPI;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillDataSource;
@@ -98,11 +96,10 @@ public class BusinessInvoiceAndInvoicePaymentDao extends BusinessAnalyticsDaoBas
                              final Multimap<UUID, BusinessInvoiceItemBaseModelDao> invoiceItems,
                              final Multimap<UUID, BusinessInvoicePaymentBaseModelDao> invoicePayments,
                              final CallContext context) throws AnalyticsRefreshException {
-        // Recompute all invoices and invoice items. Invoices will have their denormalized payment fields missing,
-        // and items won't have neither invoice nor payment denormalized fields populated
+        // Recompute all invoices and invoice items
         final Map<BusinessInvoiceModelDao, Collection<BusinessInvoiceItemBaseModelDao>> businessInvoices = binFactory.createBusinessInvoicesAndInvoiceItems(accountId, context);
 
-        // Recompute all invoice payments (without denormalized payment fields populated)
+        // Recompute all invoice payments
         final Collection<BusinessInvoicePaymentBaseModelDao> businessInvoicePayments = bipFactory.createBusinessInvoicePayments(accountId, context);
 
         // Transform the results
@@ -113,43 +110,6 @@ public class BusinessInvoiceAndInvoicePaymentDao extends BusinessAnalyticsDaoBas
         for (final BusinessInvoicePaymentBaseModelDao businessInvoicePayment : businessInvoicePayments) {
             invoicePayments.get(businessInvoicePayment.getInvoiceId()).add(businessInvoicePayment);
         }
-
-        // Populate missing fields
-        populatedMissingDenormalizedFields(invoices, invoiceItems, invoicePayments);
-    }
-
-    private void populatedMissingDenormalizedFields(final Map<UUID, BusinessInvoiceModelDao> businessInvoices,
-                                                    final Multimap<UUID, BusinessInvoiceItemBaseModelDao> businessInvoiceItems,
-                                                    final Multimap<UUID, BusinessInvoicePaymentBaseModelDao> businessInvoicePayments) {
-        // First, populated missing payment fields in invoice
-        for (final BusinessInvoiceModelDao businessInvoice : businessInvoices.values()) {
-            final BigDecimal balance = BusinessInvoiceUtils.computeInvoiceBalance(businessInvoiceItems.get(businessInvoice.getInvoiceId()),
-                                                                                  businessInvoicePayments.get(businessInvoice.getInvoiceId()));
-            businessInvoice.setBalance(balance);
-
-            final BigDecimal amountPaid = BusinessInvoiceUtils.computeInvoiceAmountPaid(businessInvoicePayments.get(businessInvoice.getInvoiceId()));
-            businessInvoice.setAmountPaid(amountPaid);
-
-            final BigDecimal amountRefunded = BusinessInvoiceUtils.computeInvoiceAmountRefunded(businessInvoicePayments.get(businessInvoice.getInvoiceId()));
-            businessInvoice.setAmountRefunded(amountRefunded);
-        }
-
-        // At this point, all of the invoice objects are fully populated. Use them to update the invoice items and payment objects
-        for (final UUID invoiceId : businessInvoices.keySet()) {
-            final Collection<BusinessInvoiceItemBaseModelDao> invoiceItemsForInvoice = businessInvoiceItems.get(invoiceId);
-            if (invoiceItemsForInvoice != null) {
-                for (final BusinessInvoiceItemBaseModelDao businessInvoiceItem : invoiceItemsForInvoice) {
-                    businessInvoiceItem.populateDenormalizedInvoiceFields(businessInvoices.get(invoiceId));
-                }
-            }
-
-            final Collection<BusinessInvoicePaymentBaseModelDao> invoicePaymentsForInvoice = businessInvoicePayments.get(invoiceId);
-            if (invoicePaymentsForInvoice != null) {
-                for (final BusinessInvoicePaymentBaseModelDao businessInvoicePayment : invoicePaymentsForInvoice) {
-                    businessInvoicePayment.populateDenormalizedInvoiceFields(businessInvoices.get(invoiceId));
-                }
-            }
-        }
     }
 
     /**
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/factory/BusinessInvoiceFactory.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/factory/BusinessInvoiceFactory.java
index 7ad8cd4..48ec4ce 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/factory/BusinessInvoiceFactory.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/factory/BusinessInvoiceFactory.java
@@ -16,34 +16,25 @@
 
 package com.ning.billing.osgi.bundles.analytics.dao.factory;
 
-import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.Map;
-import java.util.Set;
 import java.util.UUID;
 
 import javax.annotation.Nullable;
 
-import org.osgi.service.log.LogService;
-
 import com.ning.billing.account.api.Account;
-import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 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.osgi.bundles.analytics.AnalyticsRefreshException;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao.BusinessInvoiceItemType;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceModelDao;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessModelDaoBase.ReportGroup;
-import com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils;
 import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.TenantContext;
@@ -62,7 +53,6 @@ import static com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils
 import static com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils.isCharge;
 import static com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils.isInvoiceAdjustmentItem;
 import static com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils.isInvoiceItemAdjustmentItem;
-import static com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils.isRepareeItemForRepairedItem;
 import static com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils.isRevenueRecognizable;
 
 public class BusinessInvoiceFactory extends BusinessFactoryBase {
@@ -74,9 +64,6 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
 
     /**
      * Create current business invoices and invoice items.
-     * <p/>
-     * Note that these POJOs are incomplete (denormalized payment fields have not yet been populated, and denormalized
-     * invoice fields in business invoice items have not been populated either).
      *
      * @param accountId current accountId refreshed
      * @param context   call context
@@ -103,17 +90,11 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
             allInvoiceItems.get(invoice.getId()).addAll(invoice.getInvoiceItems());
         }
 
-        // *** MAGIC HAPPENS HERE ***
-        // Sanitize (cherry-pick, merge) the items
-        final Collection<InvoiceItem> sanitizedInvoiceItems = sanitizeInvoiceItems(allInvoiceItems);
-        // *** MAGIC HAPPENS HERE ***
-
-        // Create the business invoice items. These are incomplete: the denormalized invoice fields can't be computed yet,
-        // since we need all business invoice items to do it.
+        // Create the business invoice items
         final Multimap<UUID, BusinessInvoiceItemBaseModelDao> businessInvoiceItemsForInvoiceId = ArrayListMultimap.<UUID, BusinessInvoiceItemBaseModelDao>create();
-        for (final InvoiceItem invoiceItem : sanitizedInvoiceItems) {
+        for (final InvoiceItem invoiceItem : allInvoiceItems.values()) {
             final Invoice invoice = invoiceIdToInvoiceMappings.get(invoiceItem.getInvoiceId());
-            final Collection<InvoiceItem> otherInvoiceItems = Collections2.filter(sanitizedInvoiceItems,
+            final Collection<InvoiceItem> otherInvoiceItems = Collections2.filter(allInvoiceItems.values(),
                                                                                   new Predicate<InvoiceItem>() {
                                                                                       @Override
                                                                                       public boolean apply(final InvoiceItem input) {
@@ -133,9 +114,7 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
             }
         }
 
-        // Now, create the business invoices. We needed the final business invoice items to compute the various invoice amounts. At this point,
-        // we could go back and populate the denormalized invoice amounts in the various items, but since we need to do a second pass later
-        // to populate the denormalized payment fields, we'll hold off for now.
+        // Now, create the business invoices
         final Map<BusinessInvoiceModelDao, Collection<BusinessInvoiceItemBaseModelDao>> businessRecords = new HashMap<BusinessInvoiceModelDao, Collection<BusinessInvoiceItemBaseModelDao>>();
         for (final Invoice invoice : invoices) {
             final Collection<BusinessInvoiceItemBaseModelDao> businessInvoiceItems = businessInvoiceItemsForInvoiceId.get(invoice.getId());
@@ -145,7 +124,6 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
 
             final BusinessInvoiceModelDao businessInvoice = createBusinessInvoice(account,
                                                                                   invoice,
-                                                                                  businessInvoiceItems,
                                                                                   accountRecordId,
                                                                                   tenantRecordId,
                                                                                   reportGroup,
@@ -158,7 +136,6 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
 
     private BusinessInvoiceModelDao createBusinessInvoice(final Account account,
                                                           final Invoice invoice,
-                                                          final Collection<BusinessInvoiceItemBaseModelDao> businessInvoiceItems,
                                                           final Long accountRecordId,
                                                           final Long tenantRecordId,
                                                           @Nullable final ReportGroup reportGroup,
@@ -166,16 +143,9 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
         final Long invoiceRecordId = getInvoiceRecordId(invoice.getId(), context);
         final AuditLog creationAuditLog = getInvoiceCreationAuditLog(invoice.getId(), context);
 
-        final BigDecimal amountCharged = BusinessInvoiceUtils.computeInvoiceAmountCharged(businessInvoiceItems);
-        final BigDecimal originalAmountCharged = BusinessInvoiceUtils.computeInvoiceOriginalAmountCharged(businessInvoiceItems);
-        final BigDecimal amountCredited = BusinessInvoiceUtils.computeInvoiceAmountCredited(businessInvoiceItems);
-
         return new BusinessInvoiceModelDao(account,
                                            accountRecordId,
                                            invoice,
-                                           amountCharged,
-                                           originalAmountCharged,
-                                           amountCredited,
                                            invoiceRecordId,
                                            creationAuditLog,
                                            tenantRecordId,
@@ -237,8 +207,7 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
                                          creationAuditLog,
                                          accountRecordId,
                                          tenantRecordId,
-                                         reportGroup,
-                                         context);
+                                         reportGroup);
     }
 
     @VisibleForTesting
@@ -253,8 +222,7 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
                                                               final AuditLog creationAuditLog,
                                                               final Long accountRecordId,
                                                               final Long tenantRecordId,
-                                                              final ReportGroup reportGroup,
-                                                              final TenantContext context) throws AnalyticsRefreshException {
+                                                              final ReportGroup reportGroup) throws AnalyticsRefreshException {
         final BusinessInvoiceItemType businessInvoiceItemType;
         if (isCharge(invoiceItem)) {
             businessInvoiceItemType = BusinessInvoiceItemType.CHARGE;
@@ -271,12 +239,8 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
 
         final Boolean revenueRecognizable = isRevenueRecognizable(invoiceItem, otherInvoiceItems);
 
-        final Long secondInvoiceItemRecordId;
-        if (invoiceItem instanceof AdjustmentInvoiceItemForRepair) {
-            secondInvoiceItemRecordId = getInvoiceItemRecordId(((AdjustmentInvoiceItemForRepair) invoiceItem).getSecondId(), context);
-        } else {
-            secondInvoiceItemRecordId = null;
-        }
+        // Unused for now
+        final Long secondInvoiceItemRecordId = null;
 
         return BusinessInvoiceItemBaseModelDao.create(account,
                                                       accountRecordId,
@@ -293,197 +257,4 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
                                                       tenantRecordId,
                                                       reportGroup);
     }
-
-    /**
-     * Filter and transform the original invoice items for Analytics purposes. We mainly
-     * merge REPAIR_ADJ items with reparation items (reparees) to create item adjustments
-     * and merge CBA items.
-     *
-     * @param allInvoiceItems all items for the current account
-     * @return invoice items interesting for Analytics purposes
-     */
-    @VisibleForTesting
-    Collection<InvoiceItem> sanitizeInvoiceItems(final Multimap<UUID, InvoiceItem> allInvoiceItems) {
-        // First, find all reparee items, to be able to merge REPAIR_ADJ and reparee items into ITEM_ADJ items
-        final Map<InvoiceItem, InvoiceItem> repareeInvoiceItemToRepairItemMappings = findRepareeInvoiceItems(allInvoiceItems.values());
-
-        // Second, since we are going to rebalance some items (the reparee items are going to be on a previous invoice),
-        // we need to rebalance CBA_ADJ items. In order to simplify the process, we merge all items per invoice and revenueRecognizable
-        // status (this information should be enough for financial and analytics reporting purposes).
-        final Collection<AdjustedCBAInvoiceItem> mergedCBAItems = buildMergedCBAItems(allInvoiceItems, repareeInvoiceItemToRepairItemMappings);
-
-        // Filter the invoice items for analytics
-        final Collection<InvoiceItem> invoiceItemsForAnalytics = new LinkedList<InvoiceItem>();
-        for (final InvoiceItem invoiceItem : allInvoiceItems.values()) {
-            if (InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType())) {
-                // We don't care, we'll merge them on all invoices
-            } else if (InvoiceItemType.REPAIR_ADJ.equals(invoiceItem.getInvoiceItemType())) {
-                // We don't care, we'll create a special item for it below
-            } else if (repareeInvoiceItemToRepairItemMappings.keySet().contains(invoiceItem)) {
-                // We do care - this is a reparation item. Create an item adjustment for it
-                final InvoiceItem repairInvoiceItem = repareeInvoiceItemToRepairItemMappings.get(invoiceItem);
-                final InvoiceItem repareeInvoiceItem = invoiceItem;
-                invoiceItemsForAnalytics.add(new AdjustmentInvoiceItemForRepair(repairInvoiceItem, repareeInvoiceItem));
-            } else {
-                invoiceItemsForAnalytics.add(invoiceItem);
-            }
-        }
-        invoiceItemsForAnalytics.addAll(mergedCBAItems);
-
-        return invoiceItemsForAnalytics;
-    }
-
-    /**
-     * Find all reparee items
-     *
-     * @param allInvoiceItems all invoice items, across all invoices
-     * @return a mapping reparee invoice item id to REPAIR_ADJ item
-     */
-    @VisibleForTesting
-    Map<InvoiceItem, InvoiceItem> findRepareeInvoiceItems(final Collection<InvoiceItem> allInvoiceItems) {
-        // Build a convenience mapping between items -> repair_adj items (inverse of linkedItemId)
-        final Map<UUID, InvoiceItem> repairedInvoiceItemIdToRepairInvoiceItemMappings = new HashMap<UUID, InvoiceItem>();
-        for (final InvoiceItem invoiceItem : allInvoiceItems) {
-            if (InvoiceItemType.REPAIR_ADJ.equals(invoiceItem.getInvoiceItemType())) {
-                repairedInvoiceItemIdToRepairInvoiceItemMappings.put(invoiceItem.getLinkedItemId(), invoiceItem);
-            }
-        }
-
-        // Now find the "reparee" items, i.e. the ones which correspond to the repaired items
-        final Map<InvoiceItem, InvoiceItem> repareeInvoiceItemToRepairItemMappings = new LinkedHashMap<InvoiceItem, InvoiceItem>();
-        for (final InvoiceItem repairedInvoiceItem : allInvoiceItems) {
-            // Skip non-repaired items
-            if (!repairedInvoiceItemIdToRepairInvoiceItemMappings.keySet().contains(repairedInvoiceItem.getId())) {
-                continue;
-            }
-
-            InvoiceItem repareeItem = null;
-            for (final InvoiceItem invoiceItem : allInvoiceItems) {
-                // Try to find the matching "reparee" item
-                if (isRepareeItemForRepairedItem(repairedInvoiceItem, invoiceItem)) {
-                    if (repareeItem == null) {
-                        repareeItem = invoiceItem;
-                    } else {
-                        logService.log(LogService.LOG_ERROR, "Found multiple reparee items matching the repair item id " + repairedInvoiceItem.getId() + " - this should never happen!");
-                    }
-                }
-            }
-
-            if (repareeItem != null) {
-                repareeInvoiceItemToRepairItemMappings.put(repareeItem, repairedInvoiceItemIdToRepairInvoiceItemMappings.get(repairedInvoiceItem.getId()));
-            } else {
-                logService.log(LogService.LOG_ERROR, "Could not find the reparee item for the repair item id " + repairedInvoiceItem.getId() + " - this should never happen!");
-            }
-        }
-
-        return repareeInvoiceItemToRepairItemMappings;
-    }
-
-    @VisibleForTesting
-    Collection<AdjustedCBAInvoiceItem> buildMergedCBAItems(final Multimap<UUID, InvoiceItem> allInvoiceItems,
-                                                           final Map<InvoiceItem, InvoiceItem> repareeInvoiceItemToRepairItemMappings) {
-        // Build a black list of invoices for which we should not adjust the CBA when rebalancing the reparee item.
-        final Set<UUID> repairInvoiceBlackList = new HashSet<UUID>();
-        for (final InvoiceItem repairInvoiceItem : repareeInvoiceItemToRepairItemMappings.values()) {
-            boolean shouldBlackList = true;
-            // Only adjust CBA items on invoices having CBA already. Otherwise, don't do anything (e.g. for unpaid repaired invoices).
-            for (final InvoiceItem invoiceItem : allInvoiceItems.get(repairInvoiceItem.getInvoiceId())) {
-                if (invoiceItem.getInvoiceItemType().equals(InvoiceItemType.CBA_ADJ) &&
-                    invoiceItem.getAmount().compareTo(repairInvoiceItem.getAmount().negate()) == 0) {
-                    shouldBlackList = false;
-                }
-            }
-            if (shouldBlackList) {
-                // We can't blacklist the reparee invoice because it might have been repaired...
-                repairInvoiceBlackList.add(repairInvoiceItem.getInvoiceId());
-            }
-        }
-
-        final Map<UUID, BigDecimal> cbaAdjustmentPerInvoice = new HashMap<UUID, BigDecimal>();
-
-        // Adjust the CBAs in case of repair.
-        // On the original invoice (with the repair item), we need to substract the amount of the reparee to the CBA amount.
-        // On the new invoice (with the reparee item), we need to add the amount of the reparee to the CBA amount.
-        for (final InvoiceItem repareeInvoiceItem : repareeInvoiceItemToRepairItemMappings.keySet()) {
-            // The repair item was on the original invoice
-            final InvoiceItem repairInvoiceItem = repareeInvoiceItemToRepairItemMappings.get(repareeInvoiceItem);
-            if (repairInvoiceBlackList.contains(repairInvoiceItem.getInvoiceId())) {
-                continue;
-            }
-
-            if (cbaAdjustmentPerInvoice.get(repairInvoiceItem.getInvoiceId()) == null) {
-                cbaAdjustmentPerInvoice.put(repairInvoiceItem.getInvoiceId(), BigDecimal.ZERO);
-            }
-            final BigDecimal currentCBAForOriginalInvoice = cbaAdjustmentPerInvoice.get(repairInvoiceItem.getInvoiceId());
-            final BigDecimal adjustedCBAForOriginalInvoice = currentCBAForOriginalInvoice.add(repareeInvoiceItem.getAmount().negate());
-            cbaAdjustmentPerInvoice.put(repairInvoiceItem.getInvoiceId(), adjustedCBAForOriginalInvoice);
-
-            // The reparee item was on a new invoice
-            if (cbaAdjustmentPerInvoice.get(repareeInvoiceItem.getInvoiceId()) == null) {
-                cbaAdjustmentPerInvoice.put(repareeInvoiceItem.getInvoiceId(), BigDecimal.ZERO);
-            }
-            final BigDecimal currentCBAForNewInvoice = cbaAdjustmentPerInvoice.get(repareeInvoiceItem.getInvoiceId());
-            final BigDecimal adjustedCBAForNewInvoice = currentCBAForNewInvoice.add(repareeInvoiceItem.getAmount());
-            cbaAdjustmentPerInvoice.put(repareeInvoiceItem.getInvoiceId(), adjustedCBAForNewInvoice);
-        }
-
-        // Now, we just combine the other CBA items
-        final Collection<AdjustedCBAInvoiceItem> mergedCBAs = new LinkedList<AdjustedCBAInvoiceItem>();
-        for (final UUID invoiceId : allInvoiceItems.keySet()) {
-            if (allInvoiceItems.get(invoiceId) == null) {
-                continue;
-            }
-
-            final Collection<InvoiceItem> cbaItemsForInvoice = Collections2.filter(allInvoiceItems.get(invoiceId), new Predicate<InvoiceItem>() {
-                @Override
-                public boolean apply(final InvoiceItem invoiceItem) {
-                    return InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType());
-                }
-            });
-            if (cbaItemsForInvoice.size() == 0) {
-                continue;
-            }
-
-            BigDecimal revenueRecognizableCBA = cbaAdjustmentPerInvoice.get(invoiceId);
-            if (revenueRecognizableCBA == null) {
-                revenueRecognizableCBA = BigDecimal.ZERO;
-            }
-            BigDecimal nonRevenueRecognizableCBA = BigDecimal.ZERO;
-
-            UUID accountId = null;
-            Currency currency = null;
-            for (final InvoiceItem invoiceItem : cbaItemsForInvoice) {
-                final Collection<InvoiceItem> otherInvoiceItems = Collections2.filter(allInvoiceItems.values(),
-                                                                                      new Predicate<InvoiceItem>() {
-                                                                                          @Override
-                                                                                          public boolean apply(final InvoiceItem input) {
-                                                                                              return !input.getId().equals(invoiceItem.getId());
-                                                                                          }
-                                                                                      });
-                final Boolean isRevenueRecognizable = isRevenueRecognizable(invoiceItem, otherInvoiceItems);
-                if (isRevenueRecognizable) {
-                    revenueRecognizableCBA = revenueRecognizableCBA.add(invoiceItem.getAmount());
-                } else {
-                    nonRevenueRecognizableCBA = nonRevenueRecognizableCBA.add(invoiceItem.getAmount());
-                }
-
-                // These should be the same across all items
-                if (accountId == null) {
-                    accountId = invoiceItem.getAccountId();
-                }
-                if (currency == null) {
-                    currency = invoiceItem.getCurrency();
-                }
-            }
-
-            if (revenueRecognizableCBA.compareTo(BigDecimal.ZERO) != 0) {
-                mergedCBAs.add(new AdjustedCBAInvoiceItem(invoiceId, accountId, revenueRecognizableCBA, currency));
-            }
-            if (nonRevenueRecognizableCBA.compareTo(BigDecimal.ZERO) != 0) {
-                mergedCBAs.add(new AdjustedCBAInvoiceItem(invoiceId, accountId, nonRevenueRecognizableCBA, currency));
-            }
-        }
-
-        return mergedCBAs;
-    }
 }
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemBaseModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemBaseModelDao.java
index 75e5643..e8d90ec 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemBaseModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemBaseModelDao.java
@@ -167,6 +167,12 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                            final LocalDate invoiceDate,
                                            final LocalDate invoiceTargetDate,
                                            final String invoiceCurrency,
+                                           final BigDecimal invoiceBalance,
+                                           final BigDecimal invoiceAmountPaid,
+                                           final BigDecimal invoiceAmountCharged,
+                                           final BigDecimal invoiceOriginalAmountCharged,
+                                           final BigDecimal invoiceAmountCredited,
+                                           final BigDecimal invoiceAmountRefunded,
                                            final String itemType,
                                            final Boolean revenueRecognizable,
                                            final String bundleExternalKey,
@@ -210,6 +216,12 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         this.invoiceDate = invoiceDate;
         this.invoiceTargetDate = invoiceTargetDate;
         this.invoiceCurrency = invoiceCurrency;
+        this.invoiceBalance = invoiceBalance;
+        this.invoiceAmountPaid = invoiceAmountPaid;
+        this.invoiceAmountCharged = invoiceAmountCharged;
+        this.invoiceOriginalAmountCharged = invoiceOriginalAmountCharged;
+        this.invoiceAmountCredited = invoiceAmountCredited;
+        this.invoiceAmountRefunded = invoiceAmountRefunded;
         this.itemType = itemType;
         this.revenueRecognizable = revenueRecognizable;
         this.bundleExternalKey = bundleExternalKey;
@@ -248,6 +260,12 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
              invoice.getInvoiceDate(),
              invoice.getTargetDate(),
              invoice.getCurrency() == null ? null : invoice.getCurrency().toString(),
+             invoice.getBalance(),
+             invoice.getPaidAmount(),
+             invoice.getChargedAmount(),
+             invoice.getOriginalChargedAmount(),
+             invoice.getCreditedAmount(),
+             invoice.getRefundedAmount(),
              invoiceItem.getInvoiceItemType().toString(),
              revenueRecognizable,
              bundle == null ? null : bundle.getExternalKey(),
@@ -275,15 +293,6 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
              reportGroup);
     }
 
-    public void populateDenormalizedInvoiceFields(final BusinessInvoiceModelDao businessInvoice) {
-        invoiceBalance = businessInvoice.getBalance();
-        invoiceAmountPaid = businessInvoice.getAmountPaid();
-        invoiceAmountCharged = businessInvoice.getAmountCharged();
-        invoiceOriginalAmountCharged = businessInvoice.getOriginalAmountCharged();
-        invoiceAmountCredited = businessInvoice.getAmountCredited();
-        invoiceAmountRefunded = businessInvoice.getAmountRefunded();
-    }
-
     public Long getInvoiceItemRecordId() {
         return invoiceItemRecordId;
     }
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceModelDao.java
index 6aa8a9f..5d069e5 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceModelDao.java
@@ -53,9 +53,12 @@ public class BusinessInvoiceModelDao extends BusinessModelDaoBase {
                                    final LocalDate invoiceDate,
                                    final LocalDate targetDate,
                                    final String currency,
+                                   final BigDecimal balance,
+                                   final BigDecimal amountPaid,
                                    final BigDecimal amountCharged,
                                    final BigDecimal originalAmountCharged,
                                    final BigDecimal amountCredited,
+                                   final BigDecimal amountRefunded,
                                    final DateTime createdDate,
                                    final String createdBy,
                                    final String createdReasonCode,
@@ -82,17 +85,17 @@ public class BusinessInvoiceModelDao extends BusinessModelDaoBase {
         this.invoiceDate = invoiceDate;
         this.targetDate = targetDate;
         this.currency = currency;
+        this.balance = balance;
+        this.amountPaid = amountPaid;
         this.amountCharged = amountCharged;
         this.originalAmountCharged = originalAmountCharged;
         this.amountCredited = amountCredited;
+        this.amountRefunded = amountRefunded;
     }
 
     public BusinessInvoiceModelDao(final Account account,
                                    final Long accountRecordId,
                                    final Invoice invoice,
-                                   final BigDecimal amountCharged,
-                                   final BigDecimal originalAmountCharged,
-                                   final BigDecimal amountCredited,
                                    final Long invoiceRecordId,
                                    @Nullable final AuditLog creationAuditLog,
                                    final Long tenantRecordId,
@@ -103,9 +106,12 @@ public class BusinessInvoiceModelDao extends BusinessModelDaoBase {
              invoice.getInvoiceDate(),
              invoice.getTargetDate(),
              invoice.getCurrency() == null ? null : invoice.getCurrency().toString(),
-             amountCharged,
-             originalAmountCharged,
-             amountCredited,
+             invoice.getBalance(),
+             invoice.getPaidAmount(),
+             invoice.getChargedAmount(),
+             invoice.getOriginalChargedAmount(),
+             invoice.getCreditedAmount(),
+             invoice.getRefundedAmount(),
              invoice.getCreatedDate(),
              creationAuditLog != null ? creationAuditLog.getUserName() : null,
              creationAuditLog != null ? creationAuditLog.getReasonCode() : null,
@@ -118,21 +124,6 @@ public class BusinessInvoiceModelDao extends BusinessModelDaoBase {
              reportGroup);
     }
 
-    // Denormalized payment field
-    public void setBalance(final BigDecimal balance) {
-        this.balance = balance;
-    }
-
-    // Denormalized payment field
-    public void setAmountPaid(final BigDecimal amountPaid) {
-        this.amountPaid = amountPaid;
-    }
-
-    // Denormalized payment field
-    public void setAmountRefunded(final BigDecimal amountRefunded) {
-        this.amountRefunded = amountRefunded;
-    }
-
     @Override
     public String getTableName() {
         return INVOICES_TABLE_NAME;
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoicePaymentBaseModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoicePaymentBaseModelDao.java
index b542755..5b1021d 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoicePaymentBaseModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoicePaymentBaseModelDao.java
@@ -157,6 +157,12 @@ public abstract class BusinessInvoicePaymentBaseModelDao extends BusinessModelDa
                                               final UUID linkedInvoicePaymentId,
                                               final BigDecimal amount,
                                               final String currency,
+                                              final BigDecimal invoiceBalance,
+                                              final BigDecimal invoiceAmountPaid,
+                                              final BigDecimal invoiceAmountCharged,
+                                              final BigDecimal invoiceOriginalAmountCharged,
+                                              final BigDecimal invoiceAmountCredited,
+                                              final BigDecimal invoiceAmountRefunded,
                                               final String pluginName,
                                               final DateTime pluginCreatedDate,
                                               final DateTime pluginEffectiveDate,
@@ -207,6 +213,12 @@ public abstract class BusinessInvoicePaymentBaseModelDao extends BusinessModelDa
         this.invoiceDate = invoiceDate;
         this.invoiceTargetDate = invoiceTargetDate;
         this.invoiceCurrency = invoiceCurrency;
+        this.invoiceBalance = invoiceBalance;
+        this.invoiceAmountPaid = invoiceAmountPaid;
+        this.invoiceAmountCharged = invoiceAmountCharged;
+        this.invoiceOriginalAmountCharged = invoiceOriginalAmountCharged;
+        this.invoiceAmountCredited = invoiceAmountCredited;
+        this.invoiceAmountRefunded = invoiceAmountRefunded;
         this.invoicePaymentType = invoicePaymentType;
         this.paymentId = paymentId;
         this.refundId = refundId;
@@ -264,6 +276,12 @@ public abstract class BusinessInvoicePaymentBaseModelDao extends BusinessModelDa
              invoicePayment.getLinkedInvoicePaymentId(),
              invoicePayment.getAmount(),
              invoicePayment.getCurrency() == null ? null : invoicePayment.getCurrency().toString(),
+             invoice.getBalance(),
+             invoice.getPaidAmount(),
+             invoice.getChargedAmount(),
+             invoice.getOriginalChargedAmount(),
+             invoice.getCreditedAmount(),
+             invoice.getRefundedAmount(),
              paymentMethod != null ? paymentMethod.getPluginName() : DEFAULT_PLUGIN_NAME,
              refund != null ? (refund.getPluginDetail() != null ? refund.getPluginDetail().getCreatedDate() : null) : (payment.getPaymentInfoPlugin() != null ? payment.getPaymentInfoPlugin().getCreatedDate() : null),
              refund != null ? (refund.getPluginDetail() != null ? refund.getPluginDetail().getEffectiveDate() : null) : (payment.getPaymentInfoPlugin() != null ? payment.getPaymentInfoPlugin().getEffectiveDate() : null),
@@ -298,15 +316,6 @@ public abstract class BusinessInvoicePaymentBaseModelDao extends BusinessModelDa
              reportGroup);
     }
 
-    public void populateDenormalizedInvoiceFields(final BusinessInvoiceModelDao businessInvoice) {
-        invoiceBalance = businessInvoice.getBalance();
-        invoiceAmountPaid = businessInvoice.getAmountPaid();
-        invoiceAmountCharged = businessInvoice.getAmountCharged();
-        invoiceOriginalAmountCharged = businessInvoice.getOriginalAmountCharged();
-        invoiceAmountCredited = businessInvoice.getAmountCredited();
-        invoiceAmountRefunded = businessInvoice.getAmountRefunded();
-    }
-
     public Long getInvoicePaymentRecordId() {
         return invoicePaymentRecordId;
     }
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/utils/BusinessInvoiceUtils.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/utils/BusinessInvoiceUtils.java
index 3651785..23f1f9b 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/utils/BusinessInvoiceUtils.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/utils/BusinessInvoiceUtils.java
@@ -16,33 +16,16 @@
 
 package com.ning.billing.osgi.bundles.analytics.utils;
 
-import java.math.BigDecimal;
 import java.util.Collection;
 
-import javax.annotation.Nullable;
-
 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.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao;
-import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao.BusinessInvoiceItemType;
-import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoicePaymentBaseModelDao;
 
 /**
  * Utilities to manipulate invoice and invoice items.
  */
 public class BusinessInvoiceUtils {
 
-    public static boolean isRepareeItemForRepairedItem(final InvoiceItem repairedInvoiceItem, final InvoiceItem invoiceItem) {
-        return repairedInvoiceItem.getInvoiceItemType().equals(invoiceItem.getInvoiceItemType()) &&
-               repairedInvoiceItem.getSubscriptionId().equals(invoiceItem.getSubscriptionId()) &&
-               repairedInvoiceItem.getStartDate().compareTo(invoiceItem.getStartDate()) == 0 &&
-               // FIXED items have a null end date
-               ((repairedInvoiceItem.getEndDate() == null && invoiceItem.getEndDate() == null) ||
-                (repairedInvoiceItem.getEndDate() != null && invoiceItem.getEndDate() != null && !repairedInvoiceItem.getEndDate().isBefore(invoiceItem.getEndDate()))) &&
-               !repairedInvoiceItem.getId().equals(invoiceItem.getId());
-    }
-
     public static boolean isRevenueRecognizable(final InvoiceItem invoiceItem, final Collection<InvoiceItem> otherInvoiceItems) {
         // All items are recognizable except user generated credit (CBA_ADJ and CREDIT_ADJ on their own invoice)
         return !(InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType()) &&
@@ -67,7 +50,7 @@ public class BusinessInvoiceUtils {
 
     // Item adjustments
     public static boolean isInvoiceItemAdjustmentItem(final InvoiceItem invoiceItem) {
-        return InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType());
+        return InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType()) || InvoiceItemType.REPAIR_ADJ.equals(invoiceItem.getInvoiceItemType());
     }
 
     // Account credits, gained or consumed
@@ -81,88 +64,4 @@ public class BusinessInvoiceUtils {
                InvoiceItemType.FIXED.equals(invoiceItem.getInvoiceItemType()) ||
                InvoiceItemType.RECURRING.equals(invoiceItem.getInvoiceItemType());
     }
-
-    public static BigDecimal computeInvoiceBalance(@Nullable final Iterable<BusinessInvoiceItemBaseModelDao> businessInvoiceItems,
-                                                   @Nullable final Iterable<BusinessInvoicePaymentBaseModelDao> businessInvoicePayments) {
-        return computeInvoiceAmountCharged(businessInvoiceItems)
-                .add(computeInvoiceAmountCredited(businessInvoiceItems))
-                .add(
-                        computeInvoiceAmountPaid(businessInvoicePayments).negate()
-                                .add(computeInvoiceAmountRefunded(businessInvoicePayments).negate())
-                    );
-    }
-
-    public static BigDecimal computeInvoiceAmountCharged(@Nullable final Iterable<BusinessInvoiceItemBaseModelDao> businessInvoiceItems) {
-        BigDecimal amountCharged = BigDecimal.ZERO;
-        if (businessInvoiceItems == null) {
-            return amountCharged;
-        }
-
-        for (final BusinessInvoiceItemBaseModelDao businessInvoiceItem : businessInvoiceItems) {
-            if (BusinessInvoiceItemType.CHARGE.equals(businessInvoiceItem.getBusinessInvoiceItemType()) ||
-                BusinessInvoiceItemType.INVOICE_ADJUSTMENT.equals(businessInvoiceItem.getBusinessInvoiceItemType()) ||
-                BusinessInvoiceItemType.INVOICE_ITEM_ADJUSTMENT.equals(businessInvoiceItem.getBusinessInvoiceItemType())) {
-                amountCharged = amountCharged.add(businessInvoiceItem.getAmount());
-            }
-        }
-        return amountCharged;
-    }
-
-    public static BigDecimal computeInvoiceOriginalAmountCharged(@Nullable final Iterable<BusinessInvoiceItemBaseModelDao> businessInvoiceItems) {
-        BigDecimal amountCharged = BigDecimal.ZERO;
-        if (businessInvoiceItems == null) {
-            return amountCharged;
-        }
-
-        for (final BusinessInvoiceItemBaseModelDao businessInvoiceItem : businessInvoiceItems) {
-            if (BusinessInvoiceItemType.CHARGE.equals(businessInvoiceItem.getBusinessInvoiceItemType()) &&
-                businessInvoiceItem.getCreatedDate().equals(businessInvoiceItem.getInvoiceCreatedDate())) {
-                amountCharged = amountCharged.add(businessInvoiceItem.getAmount());
-            }
-        }
-        return amountCharged;
-    }
-
-    public static BigDecimal computeInvoiceAmountCredited(@Nullable final Iterable<BusinessInvoiceItemBaseModelDao> businessInvoiceItems) {
-        BigDecimal amountCredited = BigDecimal.ZERO;
-        if (businessInvoiceItems == null) {
-            return amountCredited;
-        }
-
-        for (final BusinessInvoiceItemBaseModelDao businessInvoiceItem : businessInvoiceItems) {
-            if (BusinessInvoiceItemType.ACCOUNT_CREDIT.equals(businessInvoiceItem.getBusinessInvoiceItemType())) {
-                amountCredited = amountCredited.add(businessInvoiceItem.getAmount());
-            }
-        }
-        return amountCredited;
-    }
-
-    public static BigDecimal computeInvoiceAmountPaid(@Nullable final Iterable<BusinessInvoicePaymentBaseModelDao> businessInvoicePayments) {
-        BigDecimal amountPaid = BigDecimal.ZERO;
-        if (businessInvoicePayments == null) {
-            return amountPaid;
-        }
-
-        for (final BusinessInvoicePaymentBaseModelDao businessInvoicePayment : businessInvoicePayments) {
-            if (InvoicePaymentType.ATTEMPT.toString().equals(businessInvoicePayment.getInvoicePaymentType())) {
-                amountPaid = amountPaid.add(businessInvoicePayment.getAmount());
-            }
-        }
-        return amountPaid;
-    }
-
-    public static BigDecimal computeInvoiceAmountRefunded(@Nullable final Iterable<BusinessInvoicePaymentBaseModelDao> businessInvoicePayments) {
-        BigDecimal amountRefunded = BigDecimal.ZERO;
-        if (businessInvoicePayments == null) {
-            return amountRefunded;
-        }
-
-        for (final BusinessInvoicePaymentBaseModelDao businessInvoicePayment : businessInvoicePayments) {
-            if (InvoicePaymentType.REFUND.toString().equals(businessInvoicePayment.getInvoicePaymentType()) ||
-                InvoicePaymentType.CHARGED_BACK.toString().equals(businessInvoicePayment.getInvoicePaymentType())) {
-                amountRefunded = amountRefunded.add(businessInvoicePayment.getAmount());
-            }
-        }
-        return amountRefunded;
-    }
 }
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoice.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoice.java
index 39d0020..51fdbb1 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoice.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoice.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.osgi.bundles.analytics.api;
 
-import java.math.BigDecimal;
-
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -31,16 +29,9 @@ public class TestBusinessInvoice extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testConstructor() throws Exception {
-        final BigDecimal balance = BigDecimal.ONE;
-        final BigDecimal amountPaid = BigDecimal.TEN;
-        final BigDecimal amountCharged = BigDecimal.ZERO;
-        final BigDecimal originalAmountCharged = BigDecimal.ONE;
         final BusinessInvoiceModelDao invoiceModelDao = new BusinessInvoiceModelDao(account,
                                                                                     accountRecordId,
                                                                                     invoice,
-                                                                                    amountPaid,
-                                                                                    amountCharged,
-                                                                                    originalAmountCharged,
                                                                                     invoiceRecordId,
                                                                                     auditLog,
                                                                                     tenantRecordId,
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessSnapshot.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessSnapshot.java
index 349a3d0..1634b9d 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessSnapshot.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessSnapshot.java
@@ -71,9 +71,6 @@ public class TestBusinessSnapshot extends AnalyticsTestSuiteNoDB {
         final BusinessInvoiceModelDao invoiceModelDao = new BusinessInvoiceModelDao(account,
                                                                                     accountRecordId,
                                                                                     invoice,
-                                                                                    BigDecimal.ONE,
-                                                                                    BigDecimal.ONE,
-                                                                                    BigDecimal.ONE,
                                                                                     invoiceRecordId,
                                                                                     auditLog,
                                                                                     tenantRecordId,
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/factory/TestBusinessInvoiceFactory.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/factory/TestBusinessInvoiceFactory.java
index b1621aa..39d367e 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/factory/TestBusinessInvoiceFactory.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/factory/TestBusinessInvoiceFactory.java
@@ -18,12 +18,10 @@ package com.ning.billing.osgi.bundles.analytics.dao.factory;
 
 import java.math.BigDecimal;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.UUID;
 
 import javax.sql.DataSource;
 
-import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -39,10 +37,7 @@ import com.ning.billing.osgi.bundles.analytics.utils.BusinessInvoiceUtils;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillDataSource;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillLogService;
 
-import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Multimap;
 
 public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
 
@@ -86,8 +81,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                auditLog,
                                                                                                                accountRecordId,
                                                                                                                tenantRecordId,
-                                                                                                               reportGroup,
-                                                                                                               callContext);
+                                                                                                               reportGroup);
         // We ignore these
         Assert.assertNull(businessCreditAdjItem);
 
@@ -103,8 +97,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                             auditLog,
                                                                                                             accountRecordId,
                                                                                                             tenantRecordId,
-                                                                                                            reportGroup,
-                                                                                                            callContext);
+                                                                                                            reportGroup);
         // We treat these as NOT recognizable account credits
         Assert.assertEquals(businessCreditItem.getAmount().compareTo(new BigDecimal("10")), 0);
         Assert.assertEquals(businessCreditItem.getItemType(), InvoiceItemType.CBA_ADJ.toString());
@@ -122,8 +115,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                        auditLog,
                                                                                                                        accountRecordId,
                                                                                                                        tenantRecordId,
-                                                                                                                       reportGroup,
-                                                                                                                       callContext);
+                                                                                                                       reportGroup);
         Assert.assertEquals(businessInvoiceAdjustmentItem.getAmount().compareTo(new BigDecimal("-10")), 0);
         Assert.assertEquals(businessInvoiceAdjustmentItem.getItemType(), InvoiceItemType.CREDIT_ADJ.toString());
         // Recognizable by default
@@ -141,8 +133,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                              auditLog,
                                                                                                                              accountRecordId,
                                                                                                                              tenantRecordId,
-                                                                                                                             reportGroup,
-                                                                                                                             callContext);
+                                                                                                                             reportGroup);
         Assert.assertEquals(businessRefundInvoiceAdjustmentItem.getAmount().compareTo(new BigDecimal("-10")), 0);
         Assert.assertEquals(businessRefundInvoiceAdjustmentItem.getItemType(), InvoiceItemType.REFUND_ADJ.toString());
         // Recognizable by default
@@ -160,8 +151,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                            auditLog,
                                                                                                                            accountRecordId,
                                                                                                                            tenantRecordId,
-                                                                                                                           reportGroup,
-                                                                                                                           callContext);
+                                                                                                                           reportGroup);
         Assert.assertEquals(businessInvoiceItemAdjustmentItem.getAmount().compareTo(new BigDecimal("-10")), 0);
         Assert.assertEquals(businessInvoiceItemAdjustmentItem.getItemType(), InvoiceItemType.ITEM_ADJ.toString());
         // Recognizable by default
@@ -181,8 +171,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                          auditLog,
                                                                                                          accountRecordId,
                                                                                                          tenantRecordId,
-                                                                                                         reportGroup,
-                                                                                                         callContext);
+                                                                                                         reportGroup);
         Assert.assertEquals(businessCBAItem.getAmount().compareTo(new BigDecimal("10")), 0);
         Assert.assertEquals(businessCBAItem.getItemType(), InvoiceItemType.CBA_ADJ.toString());
         // Recognizable by default
@@ -210,260 +199,4 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                        ImmutableList.<InvoiceItem>of(createInvoiceItem(invoiceId, InvoiceItemType.RECURRING),
                                                                                                      createInvoiceItem(invoiceId, InvoiceItemType.CBA_ADJ, creditAdj.getAmount().negate()))));
     }
-
-    @Test(groups = "fast")
-    public void testSanitization() throws Exception {
-        // One invoice, with two repairs and an external charge
-        final UUID subscriptionId1 = UUID.randomUUID();
-        final LocalDate startDate1 = new LocalDate(2013, 4, 1);
-        final LocalDate endDate1 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount1 = new BigDecimal("30");
-        final UUID originalInvoice1 = UUID.randomUUID();
-        final UUID reparationInvoice1 = UUID.randomUUID();
-        final InvoiceItem recurring1 = createInvoiceItem(originalInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, endDate1, amount1, null);
-        final InvoiceItem repair1 = createInvoiceItem(originalInvoice1, InvoiceItemType.REPAIR_ADJ, subscriptionId1, startDate1, endDate1, amount1.negate(), recurring1.getId());
-        final LocalDate reparationEndDate1 = new LocalDate(2013, 4, 10);
-        final BigDecimal reparationAmount1 = new BigDecimal("10");
-        final InvoiceItem reparation1 = createInvoiceItem(reparationInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, reparationEndDate1, reparationAmount1, null);
-
-        final UUID subscriptionId2 = UUID.randomUUID();
-        final LocalDate startDate2 = new LocalDate(2013, 4, 10);
-        final LocalDate endDate2 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount2 = new BigDecimal("20");
-        final UUID originalInvoice2 = UUID.randomUUID();
-        final UUID reparationInvoice2 = UUID.randomUUID();
-        final InvoiceItem recurring2 = createInvoiceItem(originalInvoice2, InvoiceItemType.RECURRING, subscriptionId2, startDate2, endDate2, amount2, null);
-        final InvoiceItem repair2 = createInvoiceItem(originalInvoice2, InvoiceItemType.REPAIR_ADJ, subscriptionId2, startDate2, endDate2, amount2.negate(), recurring2.getId());
-        final LocalDate reparationEndDate2 = new LocalDate(2013, 4, 15);
-        final BigDecimal reparationAmount2 = new BigDecimal("5");
-        final InvoiceItem reparation2 = createInvoiceItem(reparationInvoice2, InvoiceItemType.RECURRING, subscriptionId2, startDate2, reparationEndDate2, reparationAmount2, null);
-
-        final UUID externalChargeSubscriptionId = UUID.randomUUID();
-        final LocalDate externalStartDate = new LocalDate(2012, 1, 1);
-        final BigDecimal externalChargeAmount = BigDecimal.TEN;
-        final UUID otherInvoice3 = UUID.randomUUID();
-        final InvoiceItem externalCharge = createInvoiceItem(otherInvoice3, InvoiceItemType.EXTERNAL_CHARGE, externalChargeSubscriptionId, externalStartDate, null, externalChargeAmount, null);
-
-        final ArrayListMultimap<UUID, InvoiceItem> allInvoiceItems = ArrayListMultimap.<UUID, InvoiceItem>create();
-        allInvoiceItems.putAll(originalInvoice1, ImmutableList.<InvoiceItem>of(recurring1, repair1, reparation1));
-        allInvoiceItems.putAll(originalInvoice2, ImmutableList.<InvoiceItem>of(recurring2, repair2, reparation2));
-        allInvoiceItems.put(otherInvoice3, externalCharge);
-        final Collection<InvoiceItem> sanitizedInvoiceItems = invoiceFactory.sanitizeInvoiceItems(allInvoiceItems);
-        Assert.assertEquals(sanitizedInvoiceItems.size(), 2 + 2 + 1);
-        for (final InvoiceItem invoiceItem : sanitizedInvoiceItems) {
-            if (invoiceItem.getId().equals(recurring1.getId())) {
-                Assert.assertEquals(invoiceItem, recurring1);
-            } else if (invoiceItem.getId().equals(repair1.getId())) {
-                if (InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType()) && invoiceItem.getLinkedItemId().equals(recurring1.getId())) {
-                    Assert.assertEquals(invoiceItem.getAmount(), new BigDecimal("20").negate());
-                } else {
-                    Assert.fail("Repair item 1 shouldn't be in the sanitized elements");
-                }
-            } else if (invoiceItem.getId().equals(reparation1.getId())) {
-                Assert.fail("Reparation item 1 shouldn't be in the sanitized elements");
-            } else if (invoiceItem.getId().equals(recurring2.getId())) {
-                Assert.assertEquals(invoiceItem, recurring2);
-            } else if (invoiceItem.getId().equals(repair2.getId())) {
-                if (InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType()) && invoiceItem.getLinkedItemId().equals(recurring2.getId())) {
-                    Assert.assertEquals(invoiceItem.getAmount(), new BigDecimal("15").negate());
-                } else {
-                    Assert.fail("Repair item 2 shouldn't be in the sanitized elements");
-                }
-            } else if (invoiceItem.getId().equals(reparation2.getId())) {
-                Assert.fail("Reparation item 2 shouldn't be in the sanitized elements");
-            } else if (invoiceItem.getId().equals(externalCharge.getId())) {
-                Assert.assertEquals(invoiceItem, externalCharge);
-            } else {
-                Assert.fail("Shouldn't be in the sanitized elements: " + invoiceItem);
-            }
-        }
-    }
-
-    @Test(groups = "fast")
-    public void testFindReparee() throws Exception {
-        final UUID subscriptionId1 = UUID.randomUUID();
-        final LocalDate startDate1 = new LocalDate(2013, 4, 1);
-        final LocalDate endDate1 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount1 = new BigDecimal("30");
-        final UUID originalInvoice1 = UUID.randomUUID();
-        final InvoiceItem recurring1 = createInvoiceItem(originalInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, endDate1, amount1, null);
-        final InvoiceItem repair1 = createInvoiceItem(originalInvoice1, InvoiceItemType.REPAIR_ADJ, subscriptionId1, startDate1, endDate1, amount1.negate(), recurring1.getId());
-
-        final UUID repareeInvoice1 = UUID.randomUUID();
-        final LocalDate repareeEndDate1 = new LocalDate(2013, 4, 10);
-        final BigDecimal repareeAmount1 = new BigDecimal("10");
-        final InvoiceItem reparee1 = createInvoiceItem(repareeInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, repareeEndDate1, repareeAmount1, null);
-
-        Assert.assertEquals(invoiceFactory.findRepareeInvoiceItems(ImmutableList.<InvoiceItem>of(recurring1, repair1, reparee1)).size(), 1);
-        Assert.assertEquals(invoiceFactory.findRepareeInvoiceItems(ImmutableList.<InvoiceItem>of(recurring1, repair1, reparee1)).get(reparee1), repair1);
-    }
-
-    @Test(groups = "fast")
-    public void testCantFindRepareeWrongSubscription() throws Exception {
-        final UUID subscriptionId1 = UUID.randomUUID();
-        final LocalDate startDate1 = new LocalDate(2013, 4, 1);
-        final LocalDate endDate1 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount1 = new BigDecimal("30");
-        final UUID originalInvoice1 = UUID.randomUUID();
-        final InvoiceItem recurring1 = createInvoiceItem(originalInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, endDate1, amount1, null);
-        final InvoiceItem repair1 = createInvoiceItem(originalInvoice1, InvoiceItemType.REPAIR_ADJ, subscriptionId1, startDate1, endDate1, amount1.negate(), recurring1.getId());
-
-        final UUID repareeInvoice1 = UUID.randomUUID();
-        final LocalDate repareeEndDate1 = new LocalDate(2013, 4, 10);
-        final BigDecimal repareeAmount1 = new BigDecimal("10");
-        final InvoiceItem reparee1 = createInvoiceItem(repareeInvoice1, InvoiceItemType.RECURRING, UUID.randomUUID(), startDate1, repareeEndDate1, repareeAmount1, null);
-
-        Assert.assertEquals(invoiceFactory.findRepareeInvoiceItems(ImmutableList.<InvoiceItem>of(recurring1, repair1, reparee1)).size(), 0);
-    }
-
-    @Test(groups = "fast")
-    public void testCantFindRepareeWrongEndDate() throws Exception {
-        final UUID subscriptionId1 = UUID.randomUUID();
-        final LocalDate startDate1 = new LocalDate(2013, 4, 1);
-        final LocalDate endDate1 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount1 = new BigDecimal("30");
-        final UUID originalInvoice1 = UUID.randomUUID();
-        final InvoiceItem recurring1 = createInvoiceItem(originalInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, endDate1, amount1, null);
-        final InvoiceItem repair1 = createInvoiceItem(originalInvoice1, InvoiceItemType.REPAIR_ADJ, subscriptionId1, startDate1, endDate1, amount1.negate(), recurring1.getId());
-
-        final UUID repareeInvoice1 = UUID.randomUUID();
-        final LocalDate repareeEndDate1 = new LocalDate(2038, 4, 10);
-        final BigDecimal repareeAmount1 = new BigDecimal("10");
-        final InvoiceItem reparee1 = createInvoiceItem(repareeInvoice1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, repareeEndDate1, repareeAmount1, null);
-
-        Assert.assertEquals(invoiceFactory.findRepareeInvoiceItems(ImmutableList.<InvoiceItem>of(recurring1, repair1, reparee1)).size(), 0);
-    }
-
-    @Test(groups = "fast")
-    public void testMergeCBAsNormal() throws Exception {
-        final UUID invoiceId1 = UUID.randomUUID();
-        final InvoiceItem cba1 = createInvoiceItem(invoiceId1, InvoiceItemType.CBA_ADJ, BigDecimal.ONE);
-        final InvoiceItem cba2 = createInvoiceItem(invoiceId1, InvoiceItemType.CBA_ADJ, BigDecimal.TEN.negate());
-        final InvoiceItem charge = createInvoiceItem(invoiceId1, InvoiceItemType.EXTERNAL_CHARGE, new BigDecimal("9"));
-
-        final UUID invoiceId2 = UUID.randomUUID();
-        final InvoiceItem cba3 = createInvoiceItem(invoiceId2, InvoiceItemType.CBA_ADJ, BigDecimal.ONE);
-
-        final Multimap<UUID, InvoiceItem> allInvoiceItems = ArrayListMultimap.<UUID, InvoiceItem>create();
-        allInvoiceItems.put(invoiceId1, cba1);
-        allInvoiceItems.put(invoiceId1, cba2);
-        allInvoiceItems.put(invoiceId1, charge);
-        allInvoiceItems.put(invoiceId2, cba3);
-
-        final Collection<AdjustedCBAInvoiceItem> adjustedCBAInvoiceItems = invoiceFactory.buildMergedCBAItems(allInvoiceItems, ImmutableMap.<InvoiceItem, InvoiceItem>of());
-        Assert.assertEquals(adjustedCBAInvoiceItems.size(), 2);
-        for (final AdjustedCBAInvoiceItem item : adjustedCBAInvoiceItems) {
-            Assert.assertEquals(item.getAmount(), item.getInvoiceId().equals(invoiceId1) ? new BigDecimal("-9") : BigDecimal.ONE);
-        }
-    }
-
-    @Test(groups = "fast")
-    public void testMergeCBAsWithRepairAndPayment() throws Exception {
-        /*
-         * Scenario:
-         *  Recurring1: +30
-         *  Repair1:	-30
-         *  CBA:	    +30
-         */
-        final UUID subscriptionId1 = UUID.randomUUID();
-        final LocalDate startDate1 = new LocalDate(2013, 4, 1);
-        final LocalDate endDate1 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount1 = new BigDecimal("30");
-        final UUID invoiceId1 = UUID.randomUUID();
-        final InvoiceItem recurring1 = createInvoiceItem(invoiceId1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, endDate1, amount1, null);
-        final InvoiceItem repair1 = createInvoiceItem(invoiceId1, InvoiceItemType.REPAIR_ADJ, subscriptionId1, startDate1, endDate1, amount1.negate(), recurring1.getId());
-        final InvoiceItem cba1 = createInvoiceItem(invoiceId1, InvoiceItemType.CBA_ADJ, amount1);
-
-        /*
-         * Scenario:
-         *  Recurring1: +10
-         *  CBA use:	-10
-         *  Charge:     +9
-         *  CBA use:	-9
-         */
-        final UUID invoiceId2 = UUID.randomUUID();
-        final LocalDate repareeEndDate1 = new LocalDate(2013, 4, 10);
-        final BigDecimal repareeAmount1 = new BigDecimal("10");
-        final InvoiceItem reparee1 = createInvoiceItem(invoiceId2, InvoiceItemType.RECURRING, subscriptionId1, startDate1, repareeEndDate1, repareeAmount1, null);
-        final InvoiceItem cba2 = createInvoiceItem(invoiceId2, InvoiceItemType.CBA_ADJ, repareeAmount1.negate());
-        final InvoiceItem charge = createInvoiceItem(invoiceId2, InvoiceItemType.EXTERNAL_CHARGE, new BigDecimal("9"));
-        final InvoiceItem cba3 = createInvoiceItem(invoiceId2, InvoiceItemType.CBA_ADJ, new BigDecimal("-9"));
-
-        final Multimap<UUID, InvoiceItem> allInvoiceItems = ArrayListMultimap.<UUID, InvoiceItem>create();
-        allInvoiceItems.put(invoiceId1, recurring1);
-        allInvoiceItems.put(invoiceId1, repair1);
-        allInvoiceItems.put(invoiceId1, cba1);
-        allInvoiceItems.put(invoiceId2, reparee1);
-        allInvoiceItems.put(invoiceId2, cba2);
-        allInvoiceItems.put(invoiceId2, charge);
-        allInvoiceItems.put(invoiceId2, cba3);
-
-        /*
-         * Expected invoice 1:
-         *  Recurring1: +30
-         *  Adjustment:	-20
-         *  Recurring1: +10
-         *  CBA:        +20
-         *
-         * Expected invoice 2:
-         *  Charge:  +9
-         *  CBA use: -9
-         */
-        final Collection<AdjustedCBAInvoiceItem> adjustedCBAInvoiceItems = invoiceFactory.buildMergedCBAItems(allInvoiceItems, ImmutableMap.<InvoiceItem, InvoiceItem>of(reparee1, repair1));
-        Assert.assertEquals(adjustedCBAInvoiceItems.size(), 2);
-        for (final AdjustedCBAInvoiceItem item : adjustedCBAInvoiceItems) {
-            Assert.assertEquals(item.getAmount(), item.getInvoiceId().equals(invoiceId1) ? new BigDecimal("20") : new BigDecimal("-9"));
-        }
-    }
-
-    // TODO Should add the same test, but where the second invoice is repaired to check the blacklist stuff works as expected
-    @Test(groups = "fast")
-    public void testMergeCBAsWithRepairAndNoPayment() throws Exception {
-        /*
-         * Scenario:
-         *  Recurring1: +30
-         *  Repair1:	-30
-         */
-        final UUID subscriptionId1 = UUID.randomUUID();
-        final LocalDate startDate1 = new LocalDate(2013, 4, 1);
-        final LocalDate endDate1 = new LocalDate(2013, 4, 30);
-        final BigDecimal amount1 = new BigDecimal("30");
-        final UUID invoiceId1 = UUID.randomUUID();
-        final InvoiceItem recurring1 = createInvoiceItem(invoiceId1, InvoiceItemType.RECURRING, subscriptionId1, startDate1, endDate1, amount1, null);
-        final InvoiceItem repair1 = createInvoiceItem(invoiceId1, InvoiceItemType.REPAIR_ADJ, subscriptionId1, startDate1, endDate1, amount1.negate(), recurring1.getId());
-
-        /*
-         * Scenario (assume account has 9 credits):
-         *  Recurring1: +10
-         *  Charge:     +9
-         *  CBA use:    -9
-         */
-        final UUID invoiceId2 = UUID.randomUUID();
-        final LocalDate repareeEndDate1 = new LocalDate(2013, 4, 10);
-        final BigDecimal repareeAmount1 = new BigDecimal("10");
-        final InvoiceItem reparee1 = createInvoiceItem(invoiceId2, InvoiceItemType.RECURRING, subscriptionId1, startDate1, repareeEndDate1, repareeAmount1, null);
-        final InvoiceItem charge = createInvoiceItem(invoiceId2, InvoiceItemType.EXTERNAL_CHARGE, new BigDecimal("9"));
-        final InvoiceItem cba1 = createInvoiceItem(invoiceId2, InvoiceItemType.CBA_ADJ, new BigDecimal("-9"));
-
-        final Multimap<UUID, InvoiceItem> allInvoiceItems = ArrayListMultimap.<UUID, InvoiceItem>create();
-        allInvoiceItems.put(invoiceId1, recurring1);
-        allInvoiceItems.put(invoiceId1, repair1);
-        allInvoiceItems.put(invoiceId2, reparee1);
-        allInvoiceItems.put(invoiceId2, cba1);
-        allInvoiceItems.put(invoiceId2, charge);
-
-        /*
-         * Expected invoice 1:
-         *  Recurring1: +30
-         *  Adjustment:	-20
-         *  Recurring1: +10
-         *
-         * Expected invoice 2:
-         *  Charge:  +9
-         *  CBA use: -9
-         */
-        final Collection<AdjustedCBAInvoiceItem> adjustedCBAInvoiceItems = invoiceFactory.buildMergedCBAItems(allInvoiceItems, ImmutableMap.<InvoiceItem, InvoiceItem>of(reparee1, repair1));
-        Assert.assertEquals(adjustedCBAInvoiceItems.size(), 1);
-        Assert.assertEquals(adjustedCBAInvoiceItems.iterator().next().getAmount(), new BigDecimal("-9"));
-    }
 }
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceItemModelDao.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceItemModelDao.java
index cd2a065..2ba5730 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceItemModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceItemModelDao.java
@@ -85,12 +85,12 @@ public class TestBusinessInvoiceItemModelDao extends AnalyticsTestSuiteNoDB {
         Assert.assertEquals(invoiceItemModelDao.getInvoiceDate(), invoice.getInvoiceDate());
         Assert.assertEquals(invoiceItemModelDao.getInvoiceTargetDate(), invoice.getTargetDate());
         Assert.assertEquals(invoiceItemModelDao.getInvoiceCurrency(), invoice.getCurrency().toString());
-        Assert.assertNull(invoiceItemModelDao.getInvoiceBalance());
-        Assert.assertNull(invoiceItemModelDao.getInvoiceAmountPaid());
-        Assert.assertNull(invoiceItemModelDao.getInvoiceAmountCharged());
-        Assert.assertNull(invoiceItemModelDao.getInvoiceOriginalAmountCharged());
-        Assert.assertNull(invoiceItemModelDao.getInvoiceAmountCredited());
-        Assert.assertNull(invoiceItemModelDao.getInvoiceAmountRefunded());
+        Assert.assertEquals(invoiceItemModelDao.getInvoiceBalance(), invoice.getBalance());
+        Assert.assertEquals(invoiceItemModelDao.getInvoiceAmountPaid(), invoice.getPaidAmount());
+        Assert.assertEquals(invoiceItemModelDao.getInvoiceAmountCharged(), invoice.getChargedAmount());
+        Assert.assertEquals(invoiceItemModelDao.getInvoiceOriginalAmountCharged(), invoice.getOriginalChargedAmount());
+        Assert.assertEquals(invoiceItemModelDao.getInvoiceAmountCredited(), invoice.getCreditedAmount());
+        Assert.assertEquals(invoiceItemModelDao.getInvoiceAmountRefunded(), invoice.getRefundedAmount());
         Assert.assertEquals(invoiceItemModelDao.getItemType(), invoiceItem.getInvoiceItemType().toString());
         //Assert.assertEquals(invoiceItemModelDao.getRevenueRecognizable(), /* TODO */);
         Assert.assertEquals(invoiceItemModelDao.getStartDate(), invoiceItem.getStartDate());
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceModelDao.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceModelDao.java
index 906db0e..65a9c96 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoiceModelDao.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.osgi.bundles.analytics.dao.model;
 
-import java.math.BigDecimal;
-
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -27,17 +25,9 @@ public class TestBusinessInvoiceModelDao extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testConstructor() throws Exception {
-        final BigDecimal balance = BigDecimal.ONE;
-        final BigDecimal amountCharged = BigDecimal.ZERO;
-        final BigDecimal originalAmountCharged = BigDecimal.ONE;
-        final BigDecimal amountCredited = BigDecimal.TEN;
-
         final BusinessInvoiceModelDao invoiceModelDao = new BusinessInvoiceModelDao(account,
                                                                                     accountRecordId,
                                                                                     invoice,
-                                                                                    amountCharged,
-                                                                                    originalAmountCharged,
-                                                                                    amountCredited,
                                                                                     invoiceRecordId,
                                                                                     auditLog,
                                                                                     tenantRecordId,
@@ -51,11 +41,11 @@ public class TestBusinessInvoiceModelDao extends AnalyticsTestSuiteNoDB {
         Assert.assertEquals(invoiceModelDao.getInvoiceDate(), invoice.getInvoiceDate());
         Assert.assertEquals(invoiceModelDao.getTargetDate(), invoice.getTargetDate());
         Assert.assertEquals(invoiceModelDao.getCurrency(), invoice.getCurrency().toString());
-        Assert.assertEquals(invoiceModelDao.getAmountCharged(), amountCharged);
-        Assert.assertEquals(invoiceModelDao.getOriginalAmountCharged(), originalAmountCharged);
-        Assert.assertEquals(invoiceModelDao.getAmountCredited(), amountCredited);
-        Assert.assertNull(invoiceModelDao.getBalance());
-        Assert.assertNull(invoiceModelDao.getAmountPaid());
-        Assert.assertNull(invoiceModelDao.getAmountRefunded());
+        Assert.assertEquals(invoiceModelDao.getBalance(), invoice.getBalance());
+        Assert.assertEquals(invoiceModelDao.getAmountPaid(), invoice.getPaidAmount());
+        Assert.assertEquals(invoiceModelDao.getAmountCharged(), invoice.getChargedAmount());
+        Assert.assertEquals(invoiceModelDao.getOriginalAmountCharged(), invoice.getOriginalChargedAmount());
+        Assert.assertEquals(invoiceModelDao.getAmountCredited(), invoice.getCreditedAmount());
+        Assert.assertEquals(invoiceModelDao.getAmountRefunded(), invoice.getRefundedAmount());
     }
 }
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoicePaymentModelDao.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoicePaymentModelDao.java
index bcdac82..6f8ece7 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoicePaymentModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/model/TestBusinessInvoicePaymentModelDao.java
@@ -104,12 +104,12 @@ public class TestBusinessInvoicePaymentModelDao extends AnalyticsTestSuiteNoDB {
         Assert.assertEquals(invoicePaymentModelDao.getInvoiceDate(), invoice.getInvoiceDate());
         Assert.assertEquals(invoicePaymentModelDao.getInvoiceTargetDate(), invoice.getTargetDate());
         Assert.assertEquals(invoicePaymentModelDao.getInvoiceCurrency(), invoice.getCurrency().toString());
-        Assert.assertNull(invoicePaymentModelDao.getInvoiceBalance());
-        Assert.assertNull(invoicePaymentModelDao.getInvoiceAmountPaid());
-        Assert.assertNull(invoicePaymentModelDao.getInvoiceAmountCharged());
-        Assert.assertNull(invoicePaymentModelDao.getInvoiceOriginalAmountCharged());
-        Assert.assertNull(invoicePaymentModelDao.getInvoiceAmountCredited());
-        Assert.assertNull(invoicePaymentModelDao.getInvoiceAmountRefunded());
+        Assert.assertEquals(invoicePaymentModelDao.getInvoiceBalance(), invoice.getBalance());
+        Assert.assertEquals(invoicePaymentModelDao.getInvoiceAmountPaid(), invoice.getPaidAmount());
+        Assert.assertEquals(invoicePaymentModelDao.getInvoiceAmountCharged(), invoice.getChargedAmount());
+        Assert.assertEquals(invoicePaymentModelDao.getInvoiceOriginalAmountCharged(), invoice.getOriginalChargedAmount());
+        Assert.assertEquals(invoicePaymentModelDao.getInvoiceAmountCredited(), invoice.getCreditedAmount());
+        Assert.assertEquals(invoicePaymentModelDao.getInvoiceAmountRefunded(), invoice.getRefundedAmount());
         Assert.assertEquals(invoicePaymentModelDao.getInvoicePaymentType(), invoicePayment.getType().toString());
         Assert.assertEquals(invoicePaymentModelDao.getPaymentNumber(), (Long) payment.getPaymentNumber().longValue());
         Assert.assertEquals(invoicePaymentModelDao.getLinkedInvoicePaymentId(), invoicePayment.getLinkedInvoicePaymentId());
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessAnalyticsSqlDao.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessAnalyticsSqlDao.java
index 32d2f67..abd47c7 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessAnalyticsSqlDao.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessAnalyticsSqlDao.java
@@ -153,9 +153,6 @@ public class TestBusinessAnalyticsSqlDao extends AnalyticsTestSuiteWithEmbeddedD
         final BusinessInvoiceModelDao businessInvoiceModelDao = new BusinessInvoiceModelDao(account,
                                                                                             accountRecordId,
                                                                                             invoice,
-                                                                                            BigDecimal.ONE,
-                                                                                            BigDecimal.ONE,
-                                                                                            BigDecimal.ONE,
                                                                                             invoiceRecordId,
                                                                                             auditLog,
                                                                                             tenantRecordId,