killbill-memoizeit

analytics: update is_recognizable in bii* tables Switch

4/25/2013 6:51:34 PM

Changes

Details

diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/BusinessInvoiceItem.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/BusinessInvoiceItem.java
index ef5b517..f5d66ac 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/BusinessInvoiceItem.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/BusinessInvoiceItem.java
@@ -39,7 +39,7 @@ public class BusinessInvoiceItem extends BusinessEntityBase {
     private final BigDecimal invoiceOriginalAmountCharged;
     private final BigDecimal invoiceAmountCredited;
     private final String itemType;
-    private final Boolean recognizable;
+    private final String itemSource;
     private final String bundleExternalKey;
     private final String productName;
     private final String productType;
@@ -75,7 +75,7 @@ public class BusinessInvoiceItem extends BusinessEntityBase {
         this.invoiceOriginalAmountCharged = businessInvoiceItemBaseModelDao.getInvoiceOriginalAmountCharged();
         this.invoiceAmountCredited = businessInvoiceItemBaseModelDao.getInvoiceAmountCredited();
         this.itemType = businessInvoiceItemBaseModelDao.getItemType();
-        this.recognizable = businessInvoiceItemBaseModelDao.getRevenueRecognizable();
+        this.itemSource = businessInvoiceItemBaseModelDao.getItemSource();
         this.bundleExternalKey = businessInvoiceItemBaseModelDao.getBundleExternalKey();
         this.productName = businessInvoiceItemBaseModelDao.getProductName();
         this.productType = businessInvoiceItemBaseModelDao.getProductType();
@@ -142,8 +142,8 @@ public class BusinessInvoiceItem extends BusinessEntityBase {
         return itemType;
     }
 
-    public Boolean getRecognizable() {
-        return recognizable;
+    public String getItemSource() {
+        return itemSource;
     }
 
     public String getBundleExternalKey() {
@@ -211,7 +211,7 @@ public class BusinessInvoiceItem extends BusinessEntityBase {
         sb.append(", invoiceOriginalAmountCharged=").append(invoiceOriginalAmountCharged);
         sb.append(", invoiceAmountCredited=").append(invoiceAmountCredited);
         sb.append(", itemType='").append(itemType).append('\'');
-        sb.append(", recognizable=").append(recognizable);
+        sb.append(", itemSource=").append(itemSource);
         sb.append(", bundleExternalKey='").append(bundleExternalKey).append('\'');
         sb.append(", productName='").append(productName).append('\'');
         sb.append(", productType='").append(productType).append('\'');
@@ -311,7 +311,7 @@ public class BusinessInvoiceItem extends BusinessEntityBase {
         if (productType != null ? !productType.equals(that.productType) : that.productType != null) {
             return false;
         }
-        if (recognizable != null ? !recognizable.equals(that.recognizable) : that.recognizable != null) {
+        if (itemSource != null ? !itemSource.equals(that.itemSource) : that.itemSource != null) {
             return false;
         }
         if (slug != null ? !slug.equals(that.slug) : that.slug != null) {
@@ -340,7 +340,7 @@ public class BusinessInvoiceItem extends BusinessEntityBase {
         result = 31 * result + (invoiceOriginalAmountCharged != null ? invoiceOriginalAmountCharged.hashCode() : 0);
         result = 31 * result + (invoiceAmountCredited != null ? invoiceAmountCredited.hashCode() : 0);
         result = 31 * result + (itemType != null ? itemType.hashCode() : 0);
-        result = 31 * result + (recognizable != null ? recognizable.hashCode() : 0);
+        result = 31 * result + (itemSource != null ? itemSource.hashCode() : 0);
         result = 31 * result + (bundleExternalKey != null ? bundleExternalKey.hashCode() : 0);
         result = 31 * result + (productName != null ? productName.hashCode() : 0);
         result = 31 * result + (productType != null ? productType.hashCode() : 0);
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 48ec4ce..5dfcc22 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
@@ -30,9 +30,11 @@ 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.BusinessInvoiceItemBaseModelDao.ItemSource;
 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.util.audit.AuditLog;
@@ -237,7 +239,7 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
             return null;
         }
 
-        final Boolean revenueRecognizable = isRevenueRecognizable(invoiceItem, otherInvoiceItems);
+        final ItemSource itemSource = getItemSource(invoiceItem, otherInvoiceItems, businessInvoiceItemType);
 
         // Unused for now
         final Long secondInvoiceItemRecordId = null;
@@ -246,7 +248,7 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
                                                       accountRecordId,
                                                       invoice,
                                                       invoiceItem,
-                                                      revenueRecognizable,
+                                                      itemSource,
                                                       businessInvoiceItemType,
                                                       invoiceItemRecordId,
                                                       secondInvoiceItemRecordId,
@@ -257,4 +259,26 @@ public class BusinessInvoiceFactory extends BusinessFactoryBase {
                                                       tenantRecordId,
                                                       reportGroup);
     }
+
+    private ItemSource getItemSource(final InvoiceItem invoiceItem, final Collection<InvoiceItem> otherInvoiceItems, final BusinessInvoiceItemType businessInvoiceItemType) {
+        final ItemSource itemSource;
+        if (BusinessInvoiceItemType.ACCOUNT_CREDIT.equals(businessInvoiceItemType) && !isRevenueRecognizable(invoiceItem, otherInvoiceItems)) {
+            // Non recognizable account credits
+            itemSource = ItemSource.user;
+        } else if (BusinessInvoiceItemType.INVOICE_ADJUSTMENT.equals(businessInvoiceItemType)) {
+            // Invoice adjustments
+            itemSource = ItemSource.user;
+        } else if (BusinessInvoiceItemType.INVOICE_ITEM_ADJUSTMENT.equals(businessInvoiceItemType) && !InvoiceItemType.REPAIR_ADJ.equals(invoiceItem.getInvoiceItemType())) {
+            // Item adjustments (but not repairs)
+            itemSource = ItemSource.user;
+        } else if (BusinessInvoiceItemType.CHARGE.equals(businessInvoiceItemType) && InvoiceItemType.EXTERNAL_CHARGE.equals(invoiceItem.getInvoiceItemType())) {
+            // External charges
+            itemSource = ItemSource.user;
+        } else {
+            // System generated item
+            itemSource = null;
+        }
+
+        return itemSource;
+    }
 }
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 94d3063..5715f0b 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,7 +34,7 @@ public class BusinessInvoiceAdjustmentModelDao extends BusinessInvoiceItemBaseMo
                                              final Long accountRecordId,
                                              final Invoice invoice,
                                              final InvoiceItem invoiceItem,
-                                             final Boolean revenueRecognizable,
+                                             @Nullable final ItemSource itemSource,
                                              final Long invoiceItemRecordId,
                                              final Long secondInvoiceItemRecordId,
                                              @Nullable final SubscriptionBundle bundle,
@@ -47,7 +47,7 @@ public class BusinessInvoiceAdjustmentModelDao extends BusinessInvoiceItemBaseMo
               accountRecordId,
               invoice,
               invoiceItem,
-              revenueRecognizable,
+              itemSource,
               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 4a0e3f9..91f417d 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,7 +34,7 @@ public class BusinessInvoiceItemAdjustmentModelDao extends BusinessInvoiceItemBa
                                                  final Long accountRecordId,
                                                  final Invoice invoice,
                                                  final InvoiceItem invoiceItem,
-                                                 final Boolean revenueRecognizable,
+                                                 @Nullable final ItemSource itemSource,
                                                  final Long invoiceItemRecordId,
                                                  final Long secondInvoiceItemRecordId,
                                                  @Nullable final SubscriptionBundle bundle,
@@ -47,7 +47,7 @@ public class BusinessInvoiceItemAdjustmentModelDao extends BusinessInvoiceItemBa
               accountRecordId,
               invoice,
               invoiceItem,
-              revenueRecognizable,
+              itemSource,
               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 e8d90ec..16c22cb 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
@@ -32,6 +32,8 @@ import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.util.audit.AuditLog;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBase {
 
     protected static final String INVOICE_ADJUSTMENTS_TABLE_NAME = "bia";
@@ -57,7 +59,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
     private BigDecimal invoiceAmountCredited;
     private BigDecimal invoiceAmountRefunded;
     private String itemType;
-    private Boolean revenueRecognizable;
+    private String itemSource;
     private String bundleExternalKey;
     private String productName;
     private String productType;
@@ -78,13 +80,22 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         CHARGE
     }
 
+    // See ddl.sql
+    @VisibleForTesting
+    public static final String DEFAULT_ITEM_SOURCE = "system";
+
+    // See ddl.sql
+    public enum ItemSource {
+        user
+    }
+
     public abstract BusinessInvoiceItemType getBusinessInvoiceItemType();
 
     public static BusinessInvoiceItemBaseModelDao create(final Account account,
                                                          final Long accountRecordId,
                                                          final Invoice invoice,
                                                          final InvoiceItem invoiceItem,
-                                                         final Boolean revenueRecognizable,
+                                                         @Nullable final ItemSource itemSource,
                                                          final BusinessInvoiceItemType businessInvoiceItemType,
                                                          final Long invoiceItemRecordId,
                                                          final Long secondInvoiceItemRecordId,
@@ -99,7 +110,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                          accountRecordId,
                                                          invoice,
                                                          invoiceItem,
-                                                         revenueRecognizable,
+                                                         itemSource,
                                                          invoiceItemRecordId,
                                                          secondInvoiceItemRecordId,
                                                          bundle,
@@ -113,7 +124,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                    accountRecordId,
                                                    invoice,
                                                    invoiceItem,
-                                                   revenueRecognizable,
+                                                   itemSource,
                                                    invoiceItemRecordId,
                                                    secondInvoiceItemRecordId,
                                                    bundle,
@@ -127,7 +138,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                              accountRecordId,
                                                              invoice,
                                                              invoiceItem,
-                                                             revenueRecognizable,
+                                                             itemSource,
                                                              invoiceItemRecordId,
                                                              secondInvoiceItemRecordId,
                                                              bundle,
@@ -141,7 +152,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                                          accountRecordId,
                                                          invoice,
                                                          invoiceItem,
-                                                         revenueRecognizable,
+                                                         itemSource,
                                                          invoiceItemRecordId,
                                                          secondInvoiceItemRecordId,
                                                          bundle,
@@ -174,7 +185,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                            final BigDecimal invoiceAmountCredited,
                                            final BigDecimal invoiceAmountRefunded,
                                            final String itemType,
-                                           final Boolean revenueRecognizable,
+                                           @Nullable final ItemSource itemSource,
                                            final String bundleExternalKey,
                                            final String productName,
                                            final String productType,
@@ -223,7 +234,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         this.invoiceAmountCredited = invoiceAmountCredited;
         this.invoiceAmountRefunded = invoiceAmountRefunded;
         this.itemType = itemType;
-        this.revenueRecognizable = revenueRecognizable;
+        this.itemSource = itemSource == null ? DEFAULT_ITEM_SOURCE : itemSource.toString();
         this.bundleExternalKey = bundleExternalKey;
         this.productName = productName;
         this.productType = productType;
@@ -242,7 +253,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
                                            final Long accountRecordId,
                                            final Invoice invoice,
                                            final InvoiceItem invoiceItem,
-                                           final Boolean revenueRecognizable,
+                                           @Nullable final ItemSource itemSource,
                                            final Long invoiceItemRecordId,
                                            final Long secondInvoiceItemRecordId,
                                            @Nullable final SubscriptionBundle bundle,
@@ -267,7 +278,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
              invoice.getCreditedAmount(),
              invoice.getRefundedAmount(),
              invoiceItem.getInvoiceItemType().toString(),
-             revenueRecognizable,
+             itemSource,
              bundle == null ? null : bundle.getExternalKey(),
              (plan != null && plan.getProduct() != null) ? plan.getProduct().getName() : null,
              (plan != null && plan.getProduct() != null) ? plan.getProduct().getCatalogName() : null,
@@ -357,8 +368,8 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         return itemType;
     }
 
-    public Boolean getRevenueRecognizable() {
-        return revenueRecognizable;
+    public String getItemSource() {
+        return itemSource;
     }
 
     public String getBundleExternalKey() {
@@ -429,7 +440,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         sb.append(", invoiceAmountCredited=").append(invoiceAmountCredited);
         sb.append(", invoiceAmountRefunded=").append(invoiceAmountRefunded);
         sb.append(", itemType='").append(itemType).append('\'');
-        sb.append(", revenueRecognizable=").append(revenueRecognizable);
+        sb.append(", itemSource=").append(itemSource);
         sb.append(", bundleExternalKey='").append(bundleExternalKey).append('\'');
         sb.append(", productName='").append(productName).append('\'');
         sb.append(", productType='").append(productType).append('\'');
@@ -535,7 +546,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         if (productType != null ? !productType.equals(that.productType) : that.productType != null) {
             return false;
         }
-        if (revenueRecognizable != null ? !revenueRecognizable.equals(that.revenueRecognizable) : that.revenueRecognizable != null) {
+        if (itemSource != null ? !itemSource.equals(that.itemSource) : that.itemSource != null) {
             return false;
         }
         if (secondInvoiceItemRecordId != null ? !secondInvoiceItemRecordId.equals(that.secondInvoiceItemRecordId) : that.secondInvoiceItemRecordId != null) {
@@ -570,7 +581,7 @@ public abstract class BusinessInvoiceItemBaseModelDao extends BusinessModelDaoBa
         result = 31 * result + (invoiceAmountCredited != null ? invoiceAmountCredited.hashCode() : 0);
         result = 31 * result + (invoiceAmountRefunded != null ? invoiceAmountRefunded.hashCode() : 0);
         result = 31 * result + (itemType != null ? itemType.hashCode() : 0);
-        result = 31 * result + (revenueRecognizable != null ? revenueRecognizable.hashCode() : 0);
+        result = 31 * result + (itemSource != null ? itemSource.hashCode() : 0);
         result = 31 * result + (bundleExternalKey != null ? bundleExternalKey.hashCode() : 0);
         result = 31 * result + (productName != null ? productName.hashCode() : 0);
         result = 31 * result + (productType != null ? productType.hashCode() : 0);
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 b299b30..f49eed7 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,7 +34,7 @@ public class BusinessInvoiceItemCreditModelDao extends BusinessInvoiceItemBaseMo
                                              final Long accountRecordId,
                                              final Invoice invoice,
                                              final InvoiceItem invoiceItem,
-                                             final Boolean revenueRecognizable,
+                                             @Nullable final ItemSource itemSource,
                                              final Long invoiceItemRecordId,
                                              final Long secondInvoiceItemRecordId,
                                              @Nullable final SubscriptionBundle bundle,
@@ -47,7 +47,7 @@ public class BusinessInvoiceItemCreditModelDao extends BusinessInvoiceItemBaseMo
               accountRecordId,
               invoice,
               invoiceItem,
-              revenueRecognizable,
+              itemSource,
               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 753f979..42c01d7 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,7 +34,7 @@ public class BusinessInvoiceItemModelDao extends BusinessInvoiceItemBaseModelDao
                                        final Long accountRecordId,
                                        final Invoice invoice,
                                        final InvoiceItem invoiceItem,
-                                       final Boolean revenueRecognizable,
+                                       @Nullable final ItemSource itemSource,
                                        final Long invoiceItemRecordId,
                                        final Long secondInvoiceItemRecordId,
                                        @Nullable final SubscriptionBundle bundle,
@@ -47,7 +47,7 @@ public class BusinessInvoiceItemModelDao extends BusinessInvoiceItemBaseModelDao
               accountRecordId,
               invoice,
               invoiceItem,
-              revenueRecognizable,
+              itemSource,
               invoiceItemRecordId,
               secondInvoiceItemRecordId,
               bundle,
diff --git a/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/dao/BusinessAnalyticsSqlDao.sql.stg b/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/dao/BusinessAnalyticsSqlDao.sql.stg
index 11fa694..5207470 100644
--- a/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/dao/BusinessAnalyticsSqlDao.sql.stg
+++ b/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/dao/BusinessAnalyticsSqlDao.sql.stg
@@ -296,7 +296,7 @@ insert into bia (
 , invoice_amount_credited
 , invoice_amount_refunded
 , item_type
-, revenue_recognizable
+, item_source
 , bundle_external_key
 , product_name
 , product_type
@@ -336,7 +336,7 @@ insert into bia (
 , :invoiceAmountCredited
 , :invoiceAmountRefunded
 , :itemType
-, :revenueRecognizable
+, :itemSource
 , :bundleExternalKey
 , :productName
 , :productType
@@ -380,7 +380,7 @@ insert into bii (
 , invoice_amount_credited
 , invoice_amount_refunded
 , item_type
-, revenue_recognizable
+, item_source
 , bundle_external_key
 , product_name
 , product_type
@@ -420,7 +420,7 @@ insert into bii (
 , :invoiceAmountCredited
 , :invoiceAmountRefunded
 , :itemType
-, :revenueRecognizable
+, :itemSource
 , :bundleExternalKey
 , :productName
 , :productType
@@ -464,7 +464,7 @@ insert into biia (
 , invoice_amount_credited
 , invoice_amount_refunded
 , item_type
-, revenue_recognizable
+, item_source
 , bundle_external_key
 , product_name
 , product_type
@@ -504,7 +504,7 @@ insert into biia (
 , :invoiceAmountCredited
 , :invoiceAmountRefunded
 , :itemType
-, :revenueRecognizable
+, :itemSource
 , :bundleExternalKey
 , :productName
 , :productType
@@ -548,7 +548,7 @@ insert into biic (
 , invoice_amount_credited
 , invoice_amount_refunded
 , item_type
-, revenue_recognizable
+, item_source
 , bundle_external_key
 , product_name
 , product_type
@@ -588,7 +588,7 @@ insert into biic (
 , :invoiceAmountCredited
 , :invoiceAmountRefunded
 , :itemType
-, :revenueRecognizable
+, :itemSource
 , :bundleExternalKey
 , :productName
 , :productType
diff --git a/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/ddl.sql b/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/ddl.sql
index 5a57ac6..80273fa 100644
--- a/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/ddl.sql
+++ b/osgi-bundles/bundles/analytics/src/main/resources/com/ning/billing/osgi/bundles/analytics/ddl.sql
@@ -193,7 +193,7 @@ create table bia (
 , invoice_amount_credited numeric(10, 4) default 0
 , invoice_amount_refunded numeric(10, 4) default 0
 , item_type char(50) default null
-, revenue_recognizable bool default true
+, item_source enum('system', 'user') not null
 , bundle_external_key varchar(50) default null
 , product_name varchar(50) default null
 , product_type varchar(50) default null
@@ -244,7 +244,7 @@ create table bii (
 , invoice_amount_credited numeric(10, 4) default 0
 , invoice_amount_refunded numeric(10, 4) default 0
 , item_type char(50) default null
-, revenue_recognizable bool default true
+, item_source enum('system', 'user') not null
 , bundle_external_key varchar(50) default null
 , product_name varchar(50) default null
 , product_type varchar(50) default null
@@ -295,7 +295,7 @@ create table biia (
 , invoice_amount_credited numeric(10, 4) default 0
 , invoice_amount_refunded numeric(10, 4) default 0
 , item_type char(50) default null
-, revenue_recognizable bool default true
+, item_source enum('system', 'user') not null
 , bundle_external_key varchar(50) default null
 , product_name varchar(50) default null
 , product_type varchar(50) default null
@@ -346,7 +346,7 @@ create table biic (
 , invoice_amount_credited numeric(10, 4) default 0
 , invoice_amount_refunded numeric(10, 4) default 0
 , item_type char(50) default null
-, revenue_recognizable bool default true
+, item_source enum('system', 'user') not null
 , bundle_external_key varchar(50) default null
 , product_name varchar(50) default null
 , product_type varchar(50) default null
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 a6630ea..4197299 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
@@ -17,7 +17,6 @@
 package com.ning.billing.osgi.bundles.analytics;
 
 import java.math.BigDecimal;
-import java.util.List;
 import java.util.UUID;
 
 import javax.annotation.Nullable;
@@ -55,6 +54,7 @@ import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.osgi.bundles.analytics.api.BusinessEntityBase;
 import com.ning.billing.osgi.bundles.analytics.dao.TestCallContext;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao.BusinessInvoiceItemType;
+import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao.ItemSource;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessModelDaoBase;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessModelDaoBase.ReportGroup;
 import com.ning.billing.payment.api.Payment;
@@ -95,6 +95,7 @@ public abstract class AnalyticsTestSuiteNoDB {
 
     protected final ReportGroup reportGroup = ReportGroup.partner;
     protected final BusinessInvoiceItemType invoiceItemType = BusinessInvoiceItemType.INVOICE_ITEM_ADJUSTMENT;
+    protected final ItemSource itemSource = ItemSource.user;
 
     protected Account account;
     protected SubscriptionBundle bundle;
@@ -105,7 +106,6 @@ 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;
@@ -144,30 +144,6 @@ public abstract class AnalyticsTestSuiteNoDB {
         Assert.assertEquals(businessModelDaoBase.getReportGroup(), reportGroup.toString());
     }
 
-    protected Invoice createInvoice(final UUID invoiceId, final Integer invoiceNumber, final List<InvoiceItem> items) {
-        final Invoice invoice = Mockito.mock(Invoice.class);
-
-        Mockito.when(invoice.getId()).thenReturn(invoiceId);
-        Mockito.when(invoice.getNumberOfItems()).thenReturn(items.size());
-        Mockito.when(invoice.getInvoiceItems()).thenReturn(items);
-        Mockito.when(invoice.getNumberOfPayments()).thenReturn(0);
-        Mockito.when(invoice.getAccountId()).thenReturn(UUID.randomUUID());
-        Mockito.when(invoice.getInvoiceNumber()).thenReturn(invoiceNumber);
-        Mockito.when(invoice.getInvoiceDate()).thenReturn(new LocalDate(1954, 12, 1));
-        Mockito.when(invoice.getTargetDate()).thenReturn(new LocalDate(2017, 3, 4));
-        Mockito.when(invoice.getCurrency()).thenReturn(Currency.AUD);
-        Mockito.when(invoice.getPaidAmount()).thenReturn(BigDecimal.ZERO);
-        Mockito.when(invoice.getOriginalChargedAmount()).thenReturn(new BigDecimal("1922"));
-        Mockito.when(invoice.getChargedAmount()).thenReturn(new BigDecimal("100293"));
-        Mockito.when(invoice.getCreditedAmount()).thenReturn(new BigDecimal("283"));
-        Mockito.when(invoice.getRefundedAmount()).thenReturn(new BigDecimal("384"));
-        Mockito.when(invoice.getBalance()).thenReturn(new BigDecimal("18376"));
-        Mockito.when(invoice.isMigrationInvoice()).thenReturn(false);
-        Mockito.when(invoice.getCreatedDate()).thenReturn(INVOICE_CREATED_DATE);
-
-        return invoice;
-    }
-
     protected InvoiceItem createInvoiceItem(final UUID invoiceId, final InvoiceItemType type) {
         return createInvoiceItem(invoiceId, type, BigDecimal.TEN);
     }
@@ -178,13 +154,6 @@ public abstract class AnalyticsTestSuiteNoDB {
 
     protected InvoiceItem createInvoiceItem(final UUID invoiceId,
                                             final InvoiceItemType invoiceItemType,
-                                            final BigDecimal amount,
-                                            final UUID linkedItemId) {
-        return createInvoiceItem(invoiceId, invoiceItemType, UUID.randomUUID(), new LocalDate(2013, 1, 2), new LocalDate(2013, 2, 5), amount, linkedItemId);
-    }
-
-    protected InvoiceItem createInvoiceItem(final UUID invoiceId,
-                                            final InvoiceItemType invoiceItemType,
                                             final UUID subscriptionId,
                                             final LocalDate startDate,
                                             final LocalDate endDate,
@@ -320,8 +289,6 @@ 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 51fdbb1..64c7fa4 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,7 +40,7 @@ public class TestBusinessInvoice extends AnalyticsTestSuiteNoDB {
                                                                                                                accountRecordId,
                                                                                                                invoice,
                                                                                                                invoiceItem,
-                                                                                                               recognizable,
+                                                                                                               itemSource,
                                                                                                                invoiceItemType,
                                                                                                                invoiceItemRecordId,
                                                                                                                secondInvoiceItemRecordId,
@@ -82,7 +82,7 @@ public class TestBusinessInvoice extends AnalyticsTestSuiteNoDB {
         Assert.assertEquals(businessInvoiceItem.getInvoiceOriginalAmountCharged(), invoiceItemBaseModelDao.getInvoiceOriginalAmountCharged());
         Assert.assertEquals(businessInvoiceItem.getInvoiceAmountCredited(), invoiceItemBaseModelDao.getInvoiceAmountCredited());
         Assert.assertEquals(businessInvoiceItem.getItemType(), invoiceItemBaseModelDao.getItemType());
-        Assert.assertEquals(businessInvoiceItem.getRecognizable(), invoiceItemBaseModelDao.getRevenueRecognizable());
+        Assert.assertEquals(businessInvoiceItem.getItemSource(), invoiceItemBaseModelDao.getItemSource());
         Assert.assertEquals(businessInvoiceItem.getBundleExternalKey(), invoiceItemBaseModelDao.getBundleExternalKey());
         Assert.assertEquals(businessInvoiceItem.getProductName(), invoiceItemBaseModelDao.getProductName());
         Assert.assertEquals(businessInvoiceItem.getProductType(), invoiceItemBaseModelDao.getProductType());
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 c7c2c55..e6c0b9d 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,7 +30,7 @@ public class TestBusinessInvoiceItem extends AnalyticsTestSuiteNoDB {
                                                                                                                accountRecordId,
                                                                                                                invoice,
                                                                                                                invoiceItem,
-                                                                                                               recognizable,
+                                                                                                               itemSource,
                                                                                                                invoiceItemType,
                                                                                                                invoiceItemRecordId,
                                                                                                                secondInvoiceItemRecordId,
@@ -56,7 +56,7 @@ public class TestBusinessInvoiceItem extends AnalyticsTestSuiteNoDB {
         Assert.assertEquals(businessInvoiceItem.getInvoiceOriginalAmountCharged(), invoiceItemBaseModelDao.getInvoiceOriginalAmountCharged());
         Assert.assertEquals(businessInvoiceItem.getInvoiceAmountCredited(), invoiceItemBaseModelDao.getInvoiceAmountCredited());
         Assert.assertEquals(businessInvoiceItem.getItemType(), invoiceItemBaseModelDao.getItemType());
-        Assert.assertEquals(businessInvoiceItem.getRecognizable(), invoiceItemBaseModelDao.getRevenueRecognizable());
+        Assert.assertEquals(businessInvoiceItem.getItemSource(), invoiceItemBaseModelDao.getItemSource());
         Assert.assertEquals(businessInvoiceItem.getBundleExternalKey(), invoiceItemBaseModelDao.getBundleExternalKey());
         Assert.assertEquals(businessInvoiceItem.getProductName(), invoiceItemBaseModelDao.getProductName());
         Assert.assertEquals(businessInvoiceItem.getProductType(), invoiceItemBaseModelDao.getProductType());
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 1634b9d..1f731c4 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
@@ -79,7 +79,7 @@ public class TestBusinessSnapshot extends AnalyticsTestSuiteNoDB {
                                                                                                                accountRecordId,
                                                                                                                invoice,
                                                                                                                invoiceItem,
-                                                                                                               recognizable,
+                                                                                                               itemSource,
                                                                                                                invoiceItemType,
                                                                                                                invoiceItemRecordId,
                                                                                                                secondInvoiceItemRecordId,
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 39d367e..a153d52 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
@@ -33,6 +33,7 @@ import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.osgi.bundles.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao;
+import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoiceItemBaseModelDao.ItemSource;
 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;
@@ -101,7 +102,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
         // 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());
-        Assert.assertFalse(businessCreditItem.getRevenueRecognizable());
+        Assert.assertEquals(businessCreditItem.getItemSource(), ItemSource.user.toString());
 
         // Invoice adjustment, not to be mixed with credits!
         final BusinessInvoiceItemBaseModelDao businessInvoiceAdjustmentItem = invoiceFactory.createBusinessInvoiceItem(account,
@@ -118,8 +119,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                        reportGroup);
         Assert.assertEquals(businessInvoiceAdjustmentItem.getAmount().compareTo(new BigDecimal("-10")), 0);
         Assert.assertEquals(businessInvoiceAdjustmentItem.getItemType(), InvoiceItemType.CREDIT_ADJ.toString());
-        // Recognizable by default
-        Assert.assertTrue(businessInvoiceAdjustmentItem.getRevenueRecognizable());
+        Assert.assertEquals(businessInvoiceAdjustmentItem.getItemSource(), ItemSource.user.toString());
 
         // Invoice adjustment via refund
         final BusinessInvoiceItemBaseModelDao businessRefundInvoiceAdjustmentItem = invoiceFactory.createBusinessInvoiceItem(account,
@@ -136,8 +136,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                              reportGroup);
         Assert.assertEquals(businessRefundInvoiceAdjustmentItem.getAmount().compareTo(new BigDecimal("-10")), 0);
         Assert.assertEquals(businessRefundInvoiceAdjustmentItem.getItemType(), InvoiceItemType.REFUND_ADJ.toString());
-        // Recognizable by default
-        Assert.assertTrue(businessRefundInvoiceAdjustmentItem.getRevenueRecognizable());
+        Assert.assertEquals(businessRefundInvoiceAdjustmentItem.getItemSource(), ItemSource.user.toString());
 
         // Item adjustment
         final BusinessInvoiceItemBaseModelDao businessInvoiceItemAdjustmentItem = invoiceFactory.createBusinessInvoiceItem(account,
@@ -154,8 +153,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                                            reportGroup);
         Assert.assertEquals(businessInvoiceItemAdjustmentItem.getAmount().compareTo(new BigDecimal("-10")), 0);
         Assert.assertEquals(businessInvoiceItemAdjustmentItem.getItemType(), InvoiceItemType.ITEM_ADJ.toString());
-        // Recognizable by default
-        Assert.assertTrue(businessInvoiceItemAdjustmentItem.getRevenueRecognizable());
+        Assert.assertEquals(businessInvoiceItemAdjustmentItem.getItemSource(), ItemSource.user.toString());
 
         // System generated account credit
         final BusinessInvoiceItemBaseModelDao businessCBAItem = invoiceFactory.createBusinessInvoiceItem(account,
@@ -174,8 +172,7 @@ public class TestBusinessInvoiceFactory extends AnalyticsTestSuiteNoDB {
                                                                                                          reportGroup);
         Assert.assertEquals(businessCBAItem.getAmount().compareTo(new BigDecimal("10")), 0);
         Assert.assertEquals(businessCBAItem.getItemType(), InvoiceItemType.CBA_ADJ.toString());
-        // Recognizable by default
-        Assert.assertTrue(businessCBAItem.getRevenueRecognizable());
+        Assert.assertEquals(businessCBAItem.getItemSource(), BusinessInvoiceItemBaseModelDao.DEFAULT_ITEM_SOURCE);
     }
 
     @Test(groups = "fast")
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 2ba5730..63631e2 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,7 +29,7 @@ public class TestBusinessInvoiceItemModelDao extends AnalyticsTestSuiteNoDB {
                                                                                                 accountRecordId,
                                                                                                 invoice,
                                                                                                 invoiceItem,
-                                                                                                recognizable,
+                                                                                                itemSource,
                                                                                                 invoiceItemRecordId,
                                                                                                 secondInvoiceItemRecordId,
                                                                                                 null,
@@ -54,7 +54,7 @@ public class TestBusinessInvoiceItemModelDao extends AnalyticsTestSuiteNoDB {
                                                                                                 accountRecordId,
                                                                                                 invoice,
                                                                                                 invoiceItem,
-                                                                                                recognizable,
+                                                                                                itemSource,
                                                                                                 invoiceItemRecordId,
                                                                                                 secondInvoiceItemRecordId,
                                                                                                 bundle,
@@ -92,7 +92,6 @@ public class TestBusinessInvoiceItemModelDao extends AnalyticsTestSuiteNoDB {
         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());
         Assert.assertEquals(invoiceItemModelDao.getAmount(), invoiceItem.getAmount());
         Assert.assertEquals(invoiceItemModelDao.getCurrency(), invoiceItem.getCurrency().toString());
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 abd47c7..5d2e8e3 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
@@ -176,7 +176,7 @@ public class TestBusinessAnalyticsSqlDao extends AnalyticsTestSuiteWithEmbeddedD
                                                                                                                    accountRecordId,
                                                                                                                    invoice,
                                                                                                                    invoiceItem,
-                                                                                                                   recognizable,
+                                                                                                                   itemSource,
                                                                                                                    // ITEM_ADJ
                                                                                                                    invoiceItemType,
                                                                                                                    invoiceItemRecordId,