killbill-memoizeit

analytics: respect createdDate and updatedDate from entities In

10/10/2012 9:13:28 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountDao.java
index b134a9e..56fb66e 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountDao.java
@@ -32,7 +32,6 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
 import com.ning.billing.analytics.model.BusinessAccount;
-import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.payment.api.Payment;
 import com.ning.billing.payment.api.PaymentApi;
@@ -91,12 +90,7 @@ public class BusinessAccountDao {
     }
 
     public BusinessAccount createBusinessAccountFromAccount(final Account account, final InternalTenantContext context) {
-        final BusinessAccount bac = new BusinessAccount(account.getId());
-
-        bac.setName(account.getName());
-        bac.setKey(account.getExternalKey());
-        final Currency currency = account.getCurrency();
-        bac.setCurrency(currency != null ? currency.toString() : bac.getCurrency());
+        final BusinessAccount bac = new BusinessAccount(account);
 
         try {
             LocalDate lastInvoiceDate = bac.getLastInvoiceDate();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentDao.java
index 9d3b7b2..fca6f3f 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentDao.java
@@ -21,6 +21,7 @@ import java.util.UUID;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 
+import org.joda.time.DateTime;
 import org.skife.jdbi.v2.Transaction;
 import org.skife.jdbi.v2.TransactionStatus;
 import org.slf4j.Logger;
@@ -129,12 +130,18 @@ public class BusinessInvoicePaymentDao {
         // invoicePayment may be null on payment failures
         final String invoicePaymentType;
         final UUID linkedInvoicePaymentId;
+        final DateTime createdDate;
+        final DateTime updatedDate;
         if (invoicePayment != null) {
             invoicePaymentType = invoicePayment.getType().toString();
             linkedInvoicePaymentId = invoicePayment.getLinkedInvoicePaymentId();
+            createdDate = invoicePayment.getCreatedDate();
+            updatedDate = invoicePayment.getUpdatedDate();
         } else {
             invoicePaymentType = null;
             linkedInvoicePaymentId = null;
+            createdDate = clock.getUTCNow();
+            updatedDate = createdDate;
         }
 
         final BusinessInvoicePayment businessInvoicePayment = new BusinessInvoicePayment(
@@ -144,7 +151,7 @@ public class BusinessInvoicePaymentDao {
                 extSecondPaymentRefId,
                 cardCountry,
                 cardType,
-                clock.getUTCNow(),
+                createdDate,
                 payment.getCurrency(),
                 payment.getEffectiveDate(),
                 payment.getInvoiceId(),
@@ -155,7 +162,7 @@ public class BusinessInvoicePaymentDao {
                 paymentMethod.getPluginName(),
                 payment.getPaymentStatus().toString(),
                 payment.getAmount(),
-                clock.getUTCNow(),
+                updatedDate,
                 invoicePaymentType,
                 linkedInvoicePaymentId);
 
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
index 7aff8db..5f062fa 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
@@ -47,7 +47,12 @@ public @interface BusinessAccountBinder {
                     } else {
                         q.bind("created_date", dateTimeNow.getMillis());
                     }
-                    q.bind("updated_date", dateTimeNow.getMillis());
+
+                    if (account.getUpdatedDt() != null) {
+                        q.bind("updated_date", account.getUpdatedDt().getMillis());
+                    } else {
+                        q.bind("updated_date", dateTimeNow.getMillis());
+                    }
 
                     q.bind("account_id", account.getAccountId().toString());
                     q.bind("account_key", account.getKey());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
index b9eaa54..4c48746 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
@@ -30,9 +30,10 @@ import com.ning.billing.analytics.model.BusinessAccount;
 import com.ning.billing.util.dao.MapperBase;
 
 public class BusinessAccountMapper extends MapperBase implements ResultSetMapper<BusinessAccount> {
+
     @Override
     public BusinessAccount map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
-        final BusinessAccount account = new BusinessAccount(
+        return new BusinessAccount(
                 UUID.fromString(r.getString(1)),
                 r.getString(2),
                 r.getString(6),
@@ -43,11 +44,9 @@ public class BusinessAccountMapper extends MapperBase implements ResultSetMapper
                 r.getString(10),
                 r.getString(11),
                 r.getString(12),
-                r.getString(13)
+                r.getString(13),
+                new DateTime(r.getLong(3), DateTimeZone.UTC),
+                new DateTime(r.getLong(4), DateTimeZone.UTC)
         );
-        account.setCreatedDt(new DateTime(r.getLong(3), DateTimeZone.UTC));
-        account.setUpdatedDt(new DateTime(r.getLong(4), DateTimeZone.UTC));
-
-        return account;
     }
 }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
index 66459f1..187b522 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
@@ -22,16 +22,13 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 
+import com.ning.billing.account.api.Account;
 import com.ning.billing.analytics.utils.Rounder;
 
 import com.google.common.base.Objects;
 
 public class BusinessAccount {
 
-    // Populated by the database
-    private DateTime createdDt = null;
-    private DateTime updatedDt = null;
-
     private final UUID accountId;
     private String key;
     private String name;
@@ -43,15 +40,13 @@ public class BusinessAccount {
     private String creditCardType;
     private String billingAddressCountry;
     private String currency;
-
-    public BusinessAccount(final UUID accountId) {
-        this.accountId = accountId;
-    }
+    private DateTime createdDt;
+    private DateTime updatedDt;
 
     public BusinessAccount(final UUID accountId, final String key, final String name, final BigDecimal balance,
                            final LocalDate lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus,
                            final String paymentMethod, final String creditCardType, final String billingAddressCountry,
-                           final String currency) {
+                           final String currency, final DateTime createdDt, final DateTime updatedDt) {
         this.accountId = accountId;
         this.key = key;
         this.balance = balance;
@@ -63,6 +58,19 @@ public class BusinessAccount {
         this.paymentMethod = paymentMethod;
         this.totalInvoiceBalance = totalInvoiceBalance;
         this.currency = currency;
+        this.createdDt = createdDt;
+        this.updatedDt = updatedDt;
+    }
+
+    public BusinessAccount(final Account account) {
+        this.accountId = account.getId();
+        this.name = account.getName();
+        this.key = account.getExternalKey();
+        if (account.getCurrency() != null) {
+            this.currency = account.getCurrency().toString();
+        }
+        this.createdDt = account.getCreatedDate();
+        this.updatedDt = account.getUpdatedDate();
     }
 
     public UUID getAccountId() {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
index 891ebcb..8becca2 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
@@ -20,7 +20,6 @@ import java.math.BigDecimal;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 
 import com.ning.billing.analytics.utils.Rounder;
@@ -28,6 +27,7 @@ import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 
 public class BusinessInvoice {
+
     private final UUID invoiceId;
     private final Integer invoiceNumber;
     private final DateTime createdDate;
@@ -63,8 +63,8 @@ public class BusinessInvoice {
 
     public BusinessInvoice(final String accountKey, final Invoice invoice) {
         this(invoice.getAccountId(), accountKey, invoice.getChargedAmount(), invoice.getCreditAdjAmount(), invoice.getPaidAmount(), invoice.getBalance(),
-             new DateTime(DateTimeZone.UTC), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getInvoiceNumber(), invoice.getTargetDate(),
-             new DateTime(DateTimeZone.UTC));
+             invoice.getCreatedDate(), invoice.getCurrency(), invoice.getInvoiceDate(), invoice.getId(), invoice.getInvoiceNumber(), invoice.getTargetDate(),
+             invoice.getUpdatedDate());
     }
 
     public UUID getAccountId() {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
index bad0b96..346a7e4 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
@@ -22,7 +22,6 @@ import java.util.UUID;
 import javax.annotation.Nullable;
 
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 
 import com.ning.billing.analytics.utils.Rounder;
@@ -76,13 +75,13 @@ public class BusinessInvoiceItem {
     }
 
     public BusinessInvoiceItem(@Nullable final String externalKey, final InvoiceItem invoiceItem, @Nullable final Plan plan, @Nullable final PlanPhase planPhase) {
-        this(invoiceItem.getAmount(), planPhase != null ? planPhase.getBillingPeriod().toString() : null, new DateTime(DateTimeZone.UTC), invoiceItem.getCurrency(),
+        this(invoiceItem.getAmount(), planPhase != null ? planPhase.getBillingPeriod().toString() : null, invoiceItem.getCreatedDate(), invoiceItem.getCurrency(),
              /* Populate end date for fixed items for convenience (null in invoice_items table) */
              (invoiceItem.getEndDate() == null && planPhase != null) ? invoiceItem.getStartDate().plus(planPhase.getDuration().toJodaPeriod()) : invoiceItem.getEndDate(),
              externalKey, invoiceItem.getInvoiceId(), invoiceItem.getId(), invoiceItem.getLinkedItemId(), invoiceItem.getInvoiceItemType().toString(),
              planPhase != null ? planPhase.getPhaseType().toString() : null, plan != null ? plan.getProduct().getCategory().toString() : null,
              plan != null ? plan.getProduct().getName() : null, plan != null ? plan.getProduct().getCatalogName() : null,
-             planPhase != null ? planPhase.getName() : null, invoiceItem.getStartDate(), new DateTime(DateTimeZone.UTC));
+             planPhase != null ? planPhase.getName() : null, invoiceItem.getStartDate(), invoiceItem.getUpdatedDate());
     }
 
     public DateTime getCreatedDate() {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
index 905aa2a..6012be1 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
@@ -110,7 +110,7 @@ public class TestDefaultAnalyticsUserApi extends AnalyticsTestSuiteWithEmbeddedD
     @Test(groups = "slow")
     public void testAccountsCreatedOverTime() throws Exception {
         final BusinessAccount account = new BusinessAccount(UUID.randomUUID(), UUID.randomUUID().toString(), UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
-                                                            BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", "USD");
+                                                            BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", "USD", clock.getUTCNow(), clock.getUTCNow());
         accountSqlDao.createAccount(account, internalCallContext);
 
         final TimeSeriesData data = analyticsUserApi.getAccountsCreatedOverTime(tenantContext);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index a0b49fe..a263962 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -107,7 +107,7 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
     private void setupBusinessAccount() {
         account = new BusinessAccount(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
-                                      BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", CURRENCY);
+                                      BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", CURRENCY, clock.getUTCNow(), clock.getUTCNow());
 
         final IDBI dbi = helper.getDBI();
         businessAccountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
@@ -278,15 +278,11 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
         // Create and retrieve an account
         businessAccountSqlDao.createAccount(account, internalCallContext);
         final BusinessAccount foundAccount = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext);
-        Assert.assertNotNull(foundAccount.getCreatedDt());
-        Assert.assertEquals(foundAccount.getCreatedDt(), foundAccount.getUpdatedDt());
-        // Verify the dates by backfilling them
-        account.setCreatedDt(foundAccount.getCreatedDt());
-        account.setUpdatedDt(foundAccount.getUpdatedDt());
+        Assert.assertEquals(foundAccount.getCreatedDt().getMillis(), account.getCreatedDt().getMillis());
+        Assert.assertEquals(foundAccount.getUpdatedDt().getMillis(), account.getUpdatedDt().getMillis());
         Assert.assertTrue(foundAccount.equals(account));
 
         // Try to update the account
-        final DateTime previousUpdatedDt = account.getUpdatedDt();
         account.setBalance(BigDecimal.TEN);
         account.setPaymentMethod("PayPal");
         account.setCurrency("CAD");
@@ -296,7 +292,6 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
         Assert.assertEquals(Rounder.round(BigDecimal.TEN), account.getRoundedBalance());
         Assert.assertEquals("PayPal", account.getPaymentMethod());
         Assert.assertEquals("CAD", account.getCurrency());
-        Assert.assertTrue(account.getUpdatedDt().compareTo(previousUpdatedDt) > 0);
 
         // ACCOUNT not found
         Assert.assertNull(businessAccountSqlDao.getAccountByKey("Doesn't exist", internalCallContext));
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
index 8629bce..dfd5b5d 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
@@ -19,10 +19,12 @@ package com.ning.billing.analytics.model;
 import java.math.BigDecimal;
 import java.util.UUID;
 
+import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.ning.billing.account.api.Account;
 import com.ning.billing.analytics.AnalyticsTestSuite;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
@@ -36,7 +38,8 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
     @BeforeMethod(groups = "fast")
     public void setUp() throws Exception {
         account = new BusinessAccount(UUID.randomUUID(), "pierre", UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
-                                      BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "", UUID.randomUUID().toString());
+                                      BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "", UUID.randomUUID().toString(),
+                                      clock.getUTCNow(), clock.getUTCNow());
     }
 
     @Test(groups = "fast")
@@ -48,13 +51,14 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
         final BusinessAccount otherAccount = new BusinessAccount(UUID.randomUUID(), "pierre cardin", UUID.randomUUID().toString(),
                                                                  BigDecimal.ONE, clock.getUTCToday(),
                                                                  BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa",
-                                                                 "", UUID.randomUUID().toString());
+                                                                 "", UUID.randomUUID().toString(), clock.getUTCNow(), clock.getUTCNow());
         Assert.assertFalse(account.equals(otherAccount));
     }
 
     @Test(groups = "fast")
     public void testDefaultBigDecimalValues() throws Exception {
-        final BusinessAccount bac = new BusinessAccount(UUID.randomUUID());
+        final Account account = Mockito.mock(Account.class);
+        final BusinessAccount bac = new BusinessAccount(account);
         Assert.assertEquals(bac.getBalance(), BigDecimal.ZERO);
         Assert.assertEquals(bac.getTotalInvoiceBalance(), BigDecimal.ZERO);