killbill-aplcache

analytics: implement revenue recognizable for items Signed-off-by:

4/11/2013 6:51:48 PM

Changes

Details

diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceDao.java
index 52432dc..d67189e 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessInvoiceDao.java
@@ -214,17 +214,19 @@ public class BusinessInvoiceDao extends BusinessAnalyticsDaoBase {
         final BusinessInvoiceItemType businessInvoiceItemType;
         if (isCharge(invoiceItem)) {
             businessInvoiceItemType = BusinessInvoiceItemType.CHARGE;
-        } else if (isAccountCreditItem(invoiceItem, otherInvoiceItemsOnInvoice)) {
+        } else if (isAccountCreditItem(invoiceItem)) {
             businessInvoiceItemType = BusinessInvoiceItemType.ACCOUNT_CREDIT;
-        } else if (isInvoiceItemAdjustementItem(invoiceItem)) {
+        } else if (isInvoiceItemAdjustmentItem(invoiceItem)) {
             businessInvoiceItemType = BusinessInvoiceItemType.INVOICE_ITEM_ADJUSTMENT;
-        } else if (isInvoiceAdjustementItem(invoiceItem, otherInvoiceItemsOnInvoice)) {
+        } else if (isInvoiceAdjustmentItem(invoiceItem, otherInvoiceItemsOnInvoice)) {
             businessInvoiceItemType = BusinessInvoiceItemType.INVOICE_ADJUSTMENT;
         } else {
             // We don't care
             return null;
         }
 
+        final Boolean revenueRecognizable = isRevenueRecognizable(invoiceItem);
+
         final Long secondInvoiceItemRecordId;
         if (invoiceItem instanceof AdjustmentInvoiceItemForRepair) {
             secondInvoiceItemRecordId = getInvoiceItemRecordId(((AdjustmentInvoiceItemForRepair) invoiceItem).getSecondId(), context);
@@ -236,6 +238,7 @@ public class BusinessInvoiceDao extends BusinessAnalyticsDaoBase {
                                                       accountRecordId,
                                                       invoice,
                                                       invoiceItem,
+                                                      revenueRecognizable,
                                                       businessInvoiceItemType,
                                                       invoiceItemRecordId,
                                                       secondInvoiceItemRecordId,
@@ -247,29 +250,33 @@ public class BusinessInvoiceDao extends BusinessAnalyticsDaoBase {
                                                       reportGroup);
     }
 
+    @VisibleForTesting
+    Boolean isRevenueRecognizable(final InvoiceItem invoiceItem) {
+        // REFUND_ADJ are recognizable because associated with a payment
+        return !InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType());
+    }
+
     // Invoice adjustments
-    private boolean isInvoiceAdjustementItem(final InvoiceItem invoiceItem, final Collection<InvoiceItem> otherInvoiceItemsOnInvoice) {
+    @VisibleForTesting
+    boolean isInvoiceAdjustmentItem(final InvoiceItem invoiceItem, final Collection<InvoiceItem> otherInvoiceItemsOnInvoice) {
         // Either REFUND_ADJ
         return InvoiceItemType.REFUND_ADJ.equals(invoiceItem.getInvoiceItemType()) ||
-               // Or invoice level credit
+               // Or invoice level credit, i.e. credit adj, but NOT on its on own invoice
+               // Note: the negative credit adj items (internal generation of account level credits) doesn't figure in analytics
                (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType()) &&
-                !isAccountCreditItem(invoiceItem, otherInvoiceItemsOnInvoice));
+                !(otherInvoiceItemsOnInvoice.size() == 1 &&
+                  InvoiceItemType.CBA_ADJ.equals(otherInvoiceItemsOnInvoice.iterator().next().getInvoiceItemType()) &&
+                  otherInvoiceItemsOnInvoice.iterator().next().getAmount().compareTo(invoiceItem.getAmount().negate()) == 0));
     }
 
     // Item adjustments
-    private boolean isInvoiceItemAdjustementItem(final InvoiceItem invoiceItem) {
+    private boolean isInvoiceItemAdjustmentItem(final InvoiceItem invoiceItem) {
         return InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType());
     }
 
     // Account credits, used or consumed
-    private boolean isAccountCreditItem(final InvoiceItem invoiceItem, final Collection<InvoiceItem> otherInvoiceItemsOnInvoice) {
-        // Either CBA (positive or negative, i.e. given or consumed)
-        return InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType()) ||
-               // Or credit adj on its on own invoice (credit adj is negative, hence the CBA item)
-               (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType()) &&
-                otherInvoiceItemsOnInvoice.size() == 1 &&
-                InvoiceItemType.CBA_ADJ.equals(otherInvoiceItemsOnInvoice.iterator().next().getInvoiceItemType()) &&
-                otherInvoiceItemsOnInvoice.iterator().next().getAmount().compareTo(invoiceItem.getAmount().negate()) == 0);
+    private boolean isAccountCreditItem(final InvoiceItem invoiceItem) {
+        return InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType());
     }
 
     // Regular line item (charges)
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceAdjustmentModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceAdjustmentModelDao.java
index a437645..2114226 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceAdjustmentModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceAdjustmentModelDao.java
@@ -34,6 +34,7 @@ public class BusinessInvoiceAdjustmentModelDao extends BusinessInvoiceItemBaseMo
                                              final Long accountRecordId,
                                              final Invoice invoice,
                                              final InvoiceItem invoiceItem,
+                                             final Boolean revenueRecognizable,
                                              final Long invoiceItemRecordId,
                                              final Long secondInvoiceItemRecordId,
                                              @Nullable final SubscriptionBundle bundle,
@@ -46,6 +47,7 @@ public class BusinessInvoiceAdjustmentModelDao extends BusinessInvoiceItemBaseMo
               accountRecordId,
               invoice,
               invoiceItem,
+              revenueRecognizable,
               invoiceItemRecordId,
               secondInvoiceItemRecordId,
               bundle,
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemAdjustmentModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemAdjustmentModelDao.java
index fab5ff4..bbc2af6 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemAdjustmentModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemAdjustmentModelDao.java
@@ -34,6 +34,7 @@ public class BusinessInvoiceItemAdjustmentModelDao extends BusinessInvoiceItemBa
                                                  final Long accountRecordId,
                                                  final Invoice invoice,
                                                  final InvoiceItem invoiceItem,
+                                                 final Boolean revenueRecognizable,
                                                  final Long invoiceItemRecordId,
                                                  final Long secondInvoiceItemRecordId,
                                                  @Nullable final SubscriptionBundle bundle,
@@ -46,6 +47,7 @@ public class BusinessInvoiceItemAdjustmentModelDao extends BusinessInvoiceItemBa
               accountRecordId,
               invoice,
               invoiceItem,
+              revenueRecognizable,
               invoiceItemRecordId,
               secondInvoiceItemRecordId,
               bundle,
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 5b29b03..b04fe8d 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
@@ -81,6 +81,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                          final Long accountRecordId,
                                                          final Invoice invoice,
                                                          final InvoiceItem invoiceItem,
+                                                         final Boolean revenueRecognizable,
                                                          final BusinessInvoiceItemType businessInvoiceItemType,
                                                          final Long invoiceItemRecordId,
                                                          final Long secondInvoiceItemRecordId,
@@ -95,6 +96,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                          accountRecordId,
                                                          invoice,
                                                          invoiceItem,
+                                                         revenueRecognizable,
                                                          invoiceItemRecordId,
                                                          secondInvoiceItemRecordId,
                                                          bundle,
@@ -108,6 +110,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                    accountRecordId,
                                                    invoice,
                                                    invoiceItem,
+                                                   revenueRecognizable,
                                                    invoiceItemRecordId,
                                                    secondInvoiceItemRecordId,
                                                    bundle,
@@ -121,6 +124,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                              accountRecordId,
                                                              invoice,
                                                              invoiceItem,
+                                                             revenueRecognizable,
                                                              invoiceItemRecordId,
                                                              secondInvoiceItemRecordId,
                                                              bundle,
@@ -134,6 +138,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                          accountRecordId,
                                                          invoice,
                                                          invoiceItem,
+                                                         revenueRecognizable,
                                                          invoiceItemRecordId,
                                                          secondInvoiceItemRecordId,
                                                          bundle,
@@ -232,6 +237,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                            final Long accountRecordId,
                                            final Invoice invoice,
                                            final InvoiceItem invoiceItem,
+                                           final Boolean revenueRecognizable,
                                            final Long invoiceItemRecordId,
                                            final Long secondInvoiceItemRecordId,
                                            @Nullable final SubscriptionBundle bundle,
@@ -255,7 +261,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
              invoice.getOriginalChargedAmount(),
              invoice.getCreditAdjAmount(),
              invoiceItem.getInvoiceItemType().toString(),
-             null /* TODO */,
+             revenueRecognizable,
              bundle == null ? null : bundle.getExternalKey(),
              plan != null ? plan.getProduct().getName() : null,
              plan != null ? plan.getProduct().getCatalogName() : null,
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemCreditModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemCreditModelDao.java
index 1d64378..bf26129 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemCreditModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemCreditModelDao.java
@@ -34,6 +34,7 @@ public class BusinessInvoiceItemCreditModelDao extends BusinessInvoiceItemBaseMo
                                              final Long accountRecordId,
                                              final Invoice invoice,
                                              final InvoiceItem invoiceItem,
+                                             final Boolean revenueRecognizable,
                                              final Long invoiceItemRecordId,
                                              final Long secondInvoiceItemRecordId,
                                              @Nullable final SubscriptionBundle bundle,
@@ -46,6 +47,7 @@ public class BusinessInvoiceItemCreditModelDao extends BusinessInvoiceItemBaseMo
               accountRecordId,
               invoice,
               invoiceItem,
+              revenueRecognizable,
               invoiceItemRecordId,
               secondInvoiceItemRecordId,
               bundle,
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemModelDao.java
index 3558946..1e5602a 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessInvoiceItemModelDao.java
@@ -34,6 +34,7 @@ public class BusinessInvoiceItemModelDao extends BusinessInvoiceItemBaseModelDao
                                        final Long accountRecordId,
                                        final Invoice invoice,
                                        final InvoiceItem invoiceItem,
+                                       final Boolean revenueRecognizable,
                                        final Long invoiceItemRecordId,
                                        final Long secondInvoiceItemRecordId,
                                        @Nullable final SubscriptionBundle bundle,
@@ -46,6 +47,7 @@ public class BusinessInvoiceItemModelDao extends BusinessInvoiceItemBaseModelDao
               accountRecordId,
               invoice,
               invoiceItem,
+              revenueRecognizable,
               invoiceItemRecordId,
               secondInvoiceItemRecordId,
               bundle,
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 532c579..fd1d2a3 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
@@ -100,6 +100,7 @@ public abstract class AnalyticsTestSuiteNoDB {
     protected BlockingState blockingState;
     protected Invoice invoice;
     protected InvoiceItem invoiceItem;
+    protected Boolean recognizable;
     protected InvoicePayment invoicePayment;
     protected PaymentAttempt paymentAttempt;
     protected PaymentMethod paymentMethod;
@@ -245,6 +246,8 @@ public abstract class AnalyticsTestSuiteNoDB {
         Mockito.when(invoiceItem.getCreatedDate()).thenReturn(new DateTime(2016, 1, 22, 10, 56, 51, DateTimeZone.UTC));
         final UUID invoiceItemId = invoiceItem.getId();
 
+        recognizable = false;
+
         final UUID invoiceId = UUID.randomUUID();
 
         invoicePayment = Mockito.mock(InvoicePayment.class);
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 098b4ca..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
@@ -40,6 +40,7 @@ public class TestBusinessInvoice extends AnalyticsTestSuiteNoDB {
                                                                                                                accountRecordId,
                                                                                                                invoice,
                                                                                                                invoiceItem,
+                                                                                                               recognizable,
                                                                                                                invoiceItemType,
                                                                                                                invoiceItemRecordId,
                                                                                                                secondInvoiceItemRecordId,
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoiceItem.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoiceItem.java
index 8008081..c7c2c55 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoiceItem.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/api/TestBusinessInvoiceItem.java
@@ -30,6 +30,7 @@ public class TestBusinessInvoiceItem extends AnalyticsTestSuiteNoDB {
                                                                                                                accountRecordId,
                                                                                                                invoice,
                                                                                                                invoiceItem,
+                                                                                                               recognizable,
                                                                                                                invoiceItemType,
                                                                                                                invoiceItemRecordId,
                                                                                                                secondInvoiceItemRecordId,
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 db2d2d8..b741810 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
@@ -78,6 +78,7 @@ public class TestBusinessSnapshot extends AnalyticsTestSuiteNoDB {
                                                                                                                accountRecordId,
                                                                                                                invoice,
                                                                                                                invoiceItem,
+                                                                                                               recognizable,
                                                                                                                invoiceItemType,
                                                                                                                invoiceItemRecordId,
                                                                                                                secondInvoiceItemRecordId,
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 bab0f9c..1d867e8 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
@@ -29,6 +29,7 @@ public class TestBusinessInvoiceItemModelDao extends AnalyticsTestSuiteNoDB {
                                                                                                 accountRecordId,
                                                                                                 invoice,
                                                                                                 invoiceItem,
+                                                                                                recognizable,
                                                                                                 invoiceItemRecordId,
                                                                                                 secondInvoiceItemRecordId,
                                                                                                 null,
@@ -53,6 +54,7 @@ public class TestBusinessInvoiceItemModelDao extends AnalyticsTestSuiteNoDB {
                                                                                                 accountRecordId,
                                                                                                 invoice,
                                                                                                 invoiceItem,
+                                                                                                recognizable,
                                                                                                 invoiceItemRecordId,
                                                                                                 secondInvoiceItemRecordId,
                                                                                                 bundle,
diff --git a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessInvoiceDao.java b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessInvoiceDao.java
index 7a17fbe..9576342 100644
--- a/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessInvoiceDao.java
+++ b/osgi-bundles/bundles/analytics/src/test/java/com/ning/billing/osgi/bundles/analytics/dao/TestBusinessInvoiceDao.java
@@ -49,20 +49,19 @@ public class TestBusinessInvoiceDao extends AnalyticsTestSuiteNoDB {
     private final UUID invoiceId = UUID.randomUUID();
     private final UUID bundleId = UUID.randomUUID();
 
-    private OSGIKillbillDataSource osgiKillbillDataSource;
-    private OSGIKillbillLogService osgiKillbillLogService;
+    private BusinessInvoiceDao invoiceDao;
 
     @Override
     @BeforeMethod
     public void setUp() throws Exception {
         super.setUp();
 
-        osgiKillbillDataSource = Mockito.mock(OSGIKillbillDataSource.class);
+        final OSGIKillbillDataSource osgiKillbillDataSource = Mockito.mock(OSGIKillbillDataSource.class);
 
         final DataSource dataSource = Mockito.mock(DataSource.class);
         Mockito.when(osgiKillbillDataSource.getDataSource()).thenReturn(dataSource);
 
-        osgiKillbillLogService = Mockito.mock(OSGIKillbillLogService.class);
+        final OSGIKillbillLogService osgiKillbillLogService = Mockito.mock(OSGIKillbillLogService.class);
         Mockito.doAnswer(new Answer() {
             @Override
             public Object answer(final InvocationOnMock invocation) throws Throwable {
@@ -70,6 +69,37 @@ public class TestBusinessInvoiceDao extends AnalyticsTestSuiteNoDB {
                 return null;
             }
         }).when(osgiKillbillLogService).log(Mockito.anyInt(), Mockito.anyString());
+
+        invoiceDao = new BusinessInvoiceDao(osgiKillbillLogService, null, osgiKillbillDataSource, null);
+    }
+
+    @Test(groups = "fast")
+    public void testRevenueRecognizable() throws Exception {
+        // All items but CREDIT_ADJ are recognizable by default
+        Assert.assertTrue(invoiceDao.isRevenueRecognizable(createInvoiceItem(InvoiceItemType.RECURRING)
+                                                          ));
+        Assert.assertFalse(invoiceDao.isRevenueRecognizable(createInvoiceItem(InvoiceItemType.CREDIT_ADJ)
+                                                           ));
+    }
+
+    @Test(groups = "fast")
+    public void testInvoiceAdjustment() throws Exception {
+        Assert.assertFalse(invoiceDao.isInvoiceAdjustmentItem(createInvoiceItem(InvoiceItemType.RECURRING),
+                                                              ImmutableList.<InvoiceItem>of()));
+        Assert.assertTrue(invoiceDao.isInvoiceAdjustmentItem(createInvoiceItem(InvoiceItemType.REFUND_ADJ),
+                                                             ImmutableList.<InvoiceItem>of()));
+
+        final InvoiceItem creditAdj = createInvoiceItem(InvoiceItemType.CREDIT_ADJ);
+
+        // Account credit
+        Assert.assertFalse(invoiceDao.isInvoiceAdjustmentItem(creditAdj,
+                                                              ImmutableList.<InvoiceItem>of(createInvoiceItem(InvoiceItemType.CBA_ADJ, creditAdj.getAmount().negate()))));
+
+        Assert.assertTrue(invoiceDao.isInvoiceAdjustmentItem(creditAdj,
+                                                             ImmutableList.<InvoiceItem>of(createInvoiceItem(InvoiceItemType.CBA_ADJ, creditAdj.getAmount().negate().add(BigDecimal.ONE)))));
+        Assert.assertTrue(invoiceDao.isInvoiceAdjustmentItem(creditAdj,
+                                                             ImmutableList.<InvoiceItem>of(createInvoiceItem(InvoiceItemType.RECURRING),
+                                                                                           createInvoiceItem(InvoiceItemType.CBA_ADJ, creditAdj.getAmount().negate()))));
     }
 
     @Test(groups = "fast")
@@ -100,7 +130,6 @@ public class TestBusinessInvoiceDao extends AnalyticsTestSuiteNoDB {
         final BigDecimal externalChargeAmount = BigDecimal.TEN;
         final InvoiceItem externalCharge = createInvoiceItem(InvoiceItemType.EXTERNAL_CHARGE, externalChargeSubscriptionId, externalStartDate, null, externalChargeAmount, null);
 
-        final BusinessInvoiceDao invoiceDao = new BusinessInvoiceDao(osgiKillbillLogService, null, osgiKillbillDataSource, null);
         final Collection<InvoiceItem> sanitizedInvoiceItems = invoiceDao.sanitizeInvoiceItems(ImmutableList.<InvoiceItem>of(recurring1, repair1, reparation1, recurring2, repair2, reparation2, externalCharge));
         Assert.assertEquals(sanitizedInvoiceItems.size(), 2 + 2 + 1);
         for (final InvoiceItem invoiceItem : sanitizedInvoiceItems) {
@@ -132,6 +161,14 @@ public class TestBusinessInvoiceDao extends AnalyticsTestSuiteNoDB {
         }
     }
 
+    private InvoiceItem createInvoiceItem(final InvoiceItemType type) {
+        return createInvoiceItem(type, BigDecimal.TEN);
+    }
+
+    private InvoiceItem createInvoiceItem(final InvoiceItemType type, final BigDecimal amount) {
+        return createInvoiceItem(type, UUID.randomUUID(), new LocalDate(2013, 1, 2), new LocalDate(2013, 2, 5), amount, null);
+    }
+
     private InvoiceItem createInvoiceItem(final InvoiceItemType invoiceItemType,
                                           final UUID subscriptionId,
                                           final LocalDate startDate,