killbill-aplcache

Merge branch 'integration' of github.com:ning/killbill

2/28/2012 7:31:35 PM

Changes

Details

diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentAttempt.java b/api/src/main/java/com/ning/billing/payment/api/PaymentAttempt.java
index fcccf9b..b099739 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentAttempt.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentAttempt.java
@@ -60,7 +60,7 @@ public class PaymentAttempt {
         this.invoiceDate = invoiceDate;
         this.paymentAttemptDate = paymentAttemptDate == null ? new DateTime(DateTimeZone.UTC) : paymentAttemptDate;
         this.paymentId = paymentId;
-        this.retryCount = retryCount;
+        this.retryCount = retryCount == null ? 0 : retryCount;
         this.nextRetryDate = nextRetryDate;
         this.createdDate = createdDate == null ? new DateTime(DateTimeZone.UTC) : createdDate;
         this.updatedDate = updatedDate == null ? new DateTime(DateTimeZone.UTC) : updatedDate;
@@ -285,26 +285,32 @@ public class PaymentAttempt {
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (getClass() == obj.getClass()) {
-            PaymentAttempt other = (PaymentAttempt)obj;
-            if (obj == other) {
-                return true;
-            }
-            else {
-                return Objects.equal(paymentAttemptId, other.paymentAttemptId) &&
-                       Objects.equal(invoiceId, other.invoiceId) &&
-                       Objects.equal(accountId, other.accountId) &&
-                       Objects.equal(amount, other.amount) &&
-                       Objects.equal(currency, other.currency) &&
-                       Objects.equal(invoiceDate, other.invoiceDate) &&
-                       Objects.equal(paymentAttemptDate, other.paymentAttemptDate) &&
-                       Objects.equal(retryCount, other.retryCount) &&
-                       Objects.equal(nextRetryDate, other.nextRetryDate) &&
-                       Objects.equal(paymentId, other.paymentId);
-            }
-        }
-        return false;
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        final PaymentAttempt that = (PaymentAttempt) o;
+
+        if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) return false;
+        if (amount != null ? !(amount.compareTo(that.amount) == 0) : that.amount != null) return false;
+        if (createdDate != null ? !(getUnixTimestamp(createdDate) == getUnixTimestamp(that.createdDate)) : that.createdDate != null) return false;
+        if (currency != that.currency) return false;
+        if (invoiceDate != null ? !(getUnixTimestamp(invoiceDate) == getUnixTimestamp(that.invoiceDate)) : that.invoiceDate != null) return false;
+        if (invoiceId != null ? !invoiceId.equals(that.invoiceId) : that.invoiceId != null) return false;
+        if (nextRetryDate != null ? !(getUnixTimestamp(nextRetryDate) == getUnixTimestamp(that.nextRetryDate)) : that.nextRetryDate != null)
+            return false;
+        if (paymentAttemptDate != null ? !(getUnixTimestamp(paymentAttemptDate) == getUnixTimestamp(that.paymentAttemptDate)) : that.paymentAttemptDate != null)
+            return false;
+        if (paymentAttemptId != null ? !paymentAttemptId.equals(that.paymentAttemptId) : that.paymentAttemptId != null)
+            return false;
+        if (paymentId != null ? !paymentId.equals(that.paymentId) : that.paymentId != null) return false;
+        if (retryCount != null ? !retryCount.equals(that.retryCount) : that.retryCount != null) return false;
+        if (updatedDate != null ? !(getUnixTimestamp(updatedDate) == getUnixTimestamp(that.updatedDate)) : that.updatedDate != null) return false;
+
+        return true;
     }
 
+    private static long getUnixTimestamp(final DateTime dateTime) {
+        return dateTime.getMillis() / 1000;
+    }
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java b/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java
index 943c5f7..b0fbca6 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java
@@ -310,31 +310,34 @@ public class PaymentInfo implements BusEvent {
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (getClass() == obj.getClass()) {
-            PaymentInfo other = (PaymentInfo)obj;
-            if (obj == other) {
-                return true;
-            }
-            else {
-                return Objects.equal(amount, other.amount) &&
-                       Objects.equal(bankIdentificationNumber, other.bankIdentificationNumber) &&
-                       Objects.equal(paymentId, other.paymentId) &&
-                       Objects.equal(paymentNumber, other.paymentNumber) &&
-                       Objects.equal(referenceId, other.referenceId) &&
-                       Objects.equal(refundAmount, other.refundAmount) &&
-                       Objects.equal(status, other.status) &&
-                       Objects.equal(type, other.type) &&
-                       Objects.equal(paymentMethodId, other.paymentMethodId) &&
-                       Objects.equal(paymentMethod, other.paymentMethod) &&
-                       Objects.equal(cardType, other.cardType) &&
-                       Objects.equal(cardCoutry, other.cardCoutry) &&
-                       Objects.equal(effectiveDate, other.effectiveDate) &&
-                       Objects.equal(createdDate, other.createdDate) &&
-                       Objects.equal(updatedDate, other.updatedDate);
-            }
-        }
-        return false;
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        final PaymentInfo that = (PaymentInfo) o;
+
+        if (amount != null ? !(amount.compareTo(that.amount) == 0) : that.amount != null) return false;
+        if (bankIdentificationNumber != null ? !bankIdentificationNumber.equals(that.bankIdentificationNumber) : that.bankIdentificationNumber != null)
+            return false;
+        if (cardCoutry != null ? !cardCoutry.equals(that.cardCoutry) : that.cardCoutry != null) return false;
+        if (cardType != null ? !cardType.equals(that.cardType) : that.cardType != null) return false;
+        if (createdDate != null ? !(getUnixTimestamp(createdDate) == getUnixTimestamp(that.createdDate)) : that.createdDate != null) return false;
+        if (effectiveDate != null ? !(getUnixTimestamp(effectiveDate) == getUnixTimestamp(that.effectiveDate)) : that.effectiveDate != null)
+            return false;
+        if (paymentId != null ? !paymentId.equals(that.paymentId) : that.paymentId != null) return false;
+        if (paymentMethod != null ? !paymentMethod.equals(that.paymentMethod) : that.paymentMethod != null)
+            return false;
+        if (paymentMethodId != null ? !paymentMethodId.equals(that.paymentMethodId) : that.paymentMethodId != null)
+            return false;
+        if (paymentNumber != null ? !paymentNumber.equals(that.paymentNumber) : that.paymentNumber != null)
+            return false;
+        if (referenceId != null ? !referenceId.equals(that.referenceId) : that.referenceId != null) return false;
+        if (refundAmount != null ? !refundAmount.equals(that.refundAmount) : that.refundAmount != null) return false;
+        if (status != null ? !status.equals(that.status) : that.status != null) return false;
+        if (type != null ? !type.equals(that.type) : that.type != null) return false;
+        if (updatedDate != null ? !(getUnixTimestamp(updatedDate) == getUnixTimestamp(that.updatedDate)) : that.updatedDate != null) return false;
+
+        return true;
     }
 
     @Override
@@ -342,4 +345,7 @@ public class PaymentInfo implements BusEvent {
         return "PaymentInfo [paymentId=" + paymentId + ", amount=" + amount + ", refundAmount=" + refundAmount + ", paymentNumber=" + paymentNumber + ", bankIdentificationNumber=" + bankIdentificationNumber + ", status=" + status + ", type=" + type + ", referenceId=" + referenceId + ", paymentMethodId=" + paymentMethodId + ", paymentMethod=" + paymentMethod + ", cardType=" + cardType + ", cardCountry=" + cardCoutry + ", effectiveDate=" + effectiveDate + ", createdDate=" + createdDate + ", updatedDate=" + updatedDate + "]";
     }
 
+    private static long getUnixTimestamp(final DateTime dateTime) {
+        return dateTime.getMillis() / 1000;
+    }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java
index 330784e..9fc593c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java
@@ -88,6 +88,8 @@ public interface FixedPriceInvoiceItemSqlDao extends EntityDao<InvoiceItem> {
                         q.bind("endDate", item.getEndDate().toDate());
                         q.bind("amount", item.getAmount());
                         q.bind("currency", item.getCurrency().toString());
+                        q.bind("createdDate", item.getCreatedDate().toDate());
+                        q.bind("updatedDate", item.getUpdatedDate().toDate());
                     }
                 };
             }
@@ -106,9 +108,11 @@ public interface FixedPriceInvoiceItemSqlDao extends EntityDao<InvoiceItem> {
             DateTime endDate = new DateTime(result.getTimestamp("end_date"));
             BigDecimal amount = result.getBigDecimal("amount");
             Currency currency = Currency.valueOf(result.getString("currency"));
+            DateTime createdDate = new DateTime(result.getTimestamp("created_date"));
+            DateTime updatedDate = new DateTime(result.getTimestamp("updated_date"));
 
             return new FixedPriceInvoiceItem(id, invoiceId, subscriptionId, planName, phaseName,
-                                            startDate, endDate, amount, currency);
+                                            startDate, endDate, amount, currency, createdDate, updatedDate);
         }
     }
 }
\ No newline at end of file
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java
index 3409cfe..053eca4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java
@@ -65,7 +65,7 @@ public interface RecurringInvoiceItemSqlDao extends EntityDao<InvoiceItem> {
     @SqlUpdate
     void update(@RecurringInvoiceItemBinder final InvoiceItem invoiceItem);
 
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     void batchCreateFromTransaction(@RecurringInvoiceItemBinder final List<InvoiceItem> items);
 
     @BindingAnnotation(RecurringInvoiceItemBinder.InvoiceItemBinderFactory.class)
@@ -89,6 +89,8 @@ public interface RecurringInvoiceItemSqlDao extends EntityDao<InvoiceItem> {
                         q.bind("rate", item.getRate());
                         q.bind("currency", item.getCurrency().toString());
                         q.bind("reversedItemId", (item.getReversedItemId() == null) ? null : item.getReversedItemId().toString());
+                        q.bind("createdDate", item.getCreatedDate().toDate());
+                        q.bind("updatedDate", item.getUpdatedDate().toDate());
                     }
                 };
             }
@@ -110,9 +112,11 @@ public interface RecurringInvoiceItemSqlDao extends EntityDao<InvoiceItem> {
             Currency currency = Currency.valueOf(result.getString("currency"));
             String reversedItemString = result.getString("reversed_item_id");
             UUID reversedItemId = (reversedItemString == null) ? null : UUID.fromString(reversedItemString);
+            DateTime createdDate = new DateTime(result.getTimestamp("created_date"));
+            DateTime updatedDate = new DateTime(result.getTimestamp("updated_date"));
 
             return new RecurringInvoiceItem(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate,
-                                           amount, rate, currency, reversedItemId);
+                    amount, rate, currency, reversedItemId, createdDate, updatedDate);
         }
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index a8a1ecc..2d58ecf 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -16,28 +16,27 @@
 
 package com.ning.billing.invoice.model;
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
-
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.CatalogApiException;
+import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.Duration;
 import com.ning.billing.catalog.api.InternationalPrice;
-import com.ning.billing.entitlement.api.billing.BillingModeType;
-import com.ning.billing.invoice.api.InvoiceApiException;
-import org.joda.time.DateTime;
-import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.billing.BillingEvent;
+import com.ning.billing.entitlement.api.billing.BillingModeType;
 import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.util.clock.Clock;
+import org.joda.time.DateTime;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.UUID;
 import javax.annotation.Nullable;
 
 public class DefaultInvoiceGenerator implements InvoiceGenerator {
@@ -84,7 +83,7 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
             }
         }
 
-        if (proposedItems == null || proposedItems.size()  == 0) {
+        if (proposedItems == null || proposedItems.size() == 0) {
             return null;
         } else {
             invoice.addInvoiceItems(proposedItems);
@@ -92,7 +91,7 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         }
     }
 
-   /*
+    /*
     * removes all matching items from both submitted collections
     */
     private void removeDuplicatedInvoiceItems(final List<InvoiceItem> proposedItems,
@@ -188,10 +187,10 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
                         BigDecimal amount = itemDatum.getNumberOfCycles().multiply(rate).setScale(NUMBER_OF_DECIMALS, ROUNDING_MODE);
 
                         RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId, thisEvent.getSubscription().getId(),
-                                                                                      thisEvent.getPlan().getName(),
-                                                                                      thisEvent.getPlanPhase().getName(),
-                                                                                      itemDatum.getStartDate(), itemDatum.getEndDate(),
-                                                                                      amount, rate, currency);
+                                thisEvent.getPlan().getName(),
+                                thisEvent.getPlanPhase().getName(),
+                                itemDatum.getStartDate(), itemDatum.getEndDate(),
+                                amount, rate, currency, clock.getUTCNow(), clock.getUTCNow());
                         items.add(recurringItem);
                     }
                 }
@@ -223,8 +222,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
                     DateTime endDate = duration.addToDateTime(thisEvent.getEffectiveDate());
                     BigDecimal fixedPrice = thisEvent.getFixedPrice().getPrice(currency);
                     fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, thisEvent.getSubscription().getId(),
-                                                                      thisEvent.getPlan().getName(), thisEvent.getPlanPhase().getName(),
-                                                                      thisEvent.getEffectiveDate(), endDate, fixedPrice, currency);
+                            thisEvent.getPlan().getName(), thisEvent.getPlanPhase().getName(),
+                            thisEvent.getEffectiveDate(), endDate, fixedPrice, currency,
+                            clock.getUTCNow(), clock.getUTCNow());
                 } catch (CatalogApiException e) {
                     throw new InvoiceApiException(e, ErrorCode.CAT_NO_PRICE_FOR_CURRENCY, currency.toString());
                 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
index 2265abd..f53c1a3 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
@@ -24,12 +24,16 @@ import java.math.BigDecimal;
 import java.util.UUID;
 
 public class FixedPriceInvoiceItem extends InvoiceItemBase {
-    public FixedPriceInvoiceItem(UUID invoiceId, UUID subscriptionId, String planName, String phaseName, DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency) {
-        super(invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+    public FixedPriceInvoiceItem(UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
+                                 DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency,
+                                 DateTime createdDate, DateTime updatedDate) {
+        super(invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, createdDate, updatedDate);
     }
 
-    public FixedPriceInvoiceItem(UUID id, UUID invoiceId, UUID subscriptionId, String planName, String phaseName, DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency) {
-        super(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+    public FixedPriceInvoiceItem(UUID id, UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
+                                 DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency,
+                                 DateTime createdDate, DateTime updatedDate) {
+        super(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, createdDate, updatedDate);
     }
 
     @Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
index 45aa26d..924ed0c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
@@ -33,15 +33,19 @@ public abstract class InvoiceItemBase implements InvoiceItem {
     protected final DateTime endDate;
     protected final BigDecimal amount;
     protected final Currency currency;
+    protected final DateTime createdDate;
+    protected final DateTime updatedDate;
 
     public InvoiceItemBase(UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
-                           DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency) {
+                           DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency,
+                           DateTime createdDate, DateTime updatedDate) {
         this(UUID.randomUUID(), invoiceId, subscriptionId, planName, phaseName,
-             startDate, endDate, amount, currency);
+                startDate, endDate, amount, currency, createdDate, updatedDate);
     }
 
     public InvoiceItemBase(UUID id, UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
-                           DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency) {
+                           DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency,
+                           DateTime createdDate, DateTime updatedDate) {
         this.id = id;
         this.invoiceId = invoiceId;
         this.subscriptionId = subscriptionId;
@@ -51,6 +55,16 @@ public abstract class InvoiceItemBase implements InvoiceItem {
         this.endDate = endDate;
         this.amount = amount;
         this.currency = currency;
+        this.createdDate = createdDate;
+        this.updatedDate = updatedDate;
+    }
+
+    public DateTime getCreatedDate() {
+        return createdDate;
+    }
+
+    public DateTime getUpdatedDate() {
+        return updatedDate;
     }
 
     @Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
index 93ef474..db73939 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
@@ -30,24 +30,27 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
     public RecurringInvoiceItem(UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
                                 DateTime startDate, DateTime endDate,
                                 BigDecimal amount, BigDecimal rate,
-                                Currency currency) {
+                                Currency currency,
+                                DateTime createdDate, DateTime updatedDate) {
         this(UUID.randomUUID(), invoiceId, subscriptionId, planName, phaseName, startDate, endDate,
-             amount, rate, currency);
+                amount, rate, currency, createdDate, updatedDate);
     }
 
     public RecurringInvoiceItem(UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
                                 DateTime startDate, DateTime endDate,
                                 BigDecimal amount, BigDecimal rate,
-                                Currency currency, UUID reversedItemId) {
+                                Currency currency, UUID reversedItemId,
+                                DateTime createdDate, DateTime updatedDate) {
         this(UUID.randomUUID(), invoiceId, subscriptionId, planName, phaseName, startDate, endDate,
-             amount, rate, currency, reversedItemId);
+                amount, rate, currency, reversedItemId, createdDate, updatedDate);
     }
 
     public RecurringInvoiceItem(UUID id, UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
                                 DateTime startDate, DateTime endDate,
                                 BigDecimal amount, BigDecimal rate,
-                                Currency currency) {
-        super(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+                                Currency currency,
+                                DateTime createdDate, DateTime updatedDate) {
+        super(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, createdDate, updatedDate);
 
         this.rate = rate;
         this.reversedItemId = null;
@@ -56,8 +59,9 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
     public RecurringInvoiceItem(UUID id, UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
                                 DateTime startDate, DateTime endDate,
                                 BigDecimal amount, BigDecimal rate,
-                                Currency currency, UUID reversedItemId) {
-        super(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+                                Currency currency, UUID reversedItemId,
+                                DateTime createdDate, DateTime updatedDate) {
+        super(id, invoiceId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, createdDate, updatedDate);
 
         this.rate = rate;
         this.reversedItemId = reversedItemId;
@@ -67,7 +71,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
     public InvoiceItem asCredit() {
         BigDecimal amountNegated = amount == null ? null : amount.negate();
         return new RecurringInvoiceItem(invoiceId, subscriptionId, planName, phaseName, startDate, endDate,
-                                        amountNegated, rate, currency, id);
+                amountNegated, rate, currency, id, createdDate, updatedDate);
     }
 
     @Override
@@ -89,8 +93,12 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
 
     @Override
     public int compareTo(InvoiceItem item) {
-        if (item == null) {return -1;}
-        if (!(item instanceof RecurringInvoiceItem)) {return -1;}
+        if (item == null) {
+            return -1;
+        }
+        if (!(item instanceof RecurringInvoiceItem)) {
+            return -1;
+        }
 
         RecurringInvoiceItem that = (RecurringInvoiceItem) item;
 
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.sql.stg
index 79fd3db..c1d14ef 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.sql.stg
@@ -10,7 +10,8 @@ fields(prefix) ::= <<
   <prefix>end_date,
   <prefix>amount,
   <prefix>currency,
-  <prefix>created_date
+  <prefix>created_date,
+  <prefix>updated_date
 >>
 
 getById() ::= <<
@@ -41,19 +42,19 @@ getInvoiceItemsBySubscription() ::= <<
 create() ::= <<
   INSERT INTO fixed_invoice_items(<fields()>)
   VALUES(:id, :invoiceId, :subscriptionId, :planName, :phaseName,
-         :startDate, :endDate, :amount, :currency, NOW());
+         :startDate, :endDate, :amount, :currency, :createdDate, :updatedDate);
 >>
 
 batchCreateFromTransaction() ::= <<
   INSERT INTO fixed_invoice_items(<fields()>)
   VALUES(:id, :invoiceId, :subscriptionId, :planName, :phaseName,
-         :startDate, :endDate, :amount, :currency, NOW());
+         :startDate, :endDate, :amount, :currency, :createdDate, :updatedDate);
 >>
 
 update() ::= <<
   UPDATE fixed_invoice_items
   SET invoice_id = :invoiceId, subscription_id = :subscriptionId, plan_name = :planName, phase_name = :phaseName,
-      start_date = :startDate, end_date = :endDate, amount = :amount, currency = :currency
+      start_date = :startDate, end_date = :endDate, amount = :amount, currency = :currency, updated_date = :updatedDate
   WHERE id = :id;
 >>
 
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.sql.stg
index a5291e8..0fcbae1 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.sql.stg
@@ -12,7 +12,8 @@ fields(prefix) ::= <<
   <prefix>rate,
   <prefix>currency,
   <prefix>reversed_item_id,
-  <prefix>created_date
+  <prefix>created_date,
+  <prefix>updated_date
 >>
 
 getById() ::= <<
@@ -43,20 +44,20 @@ getInvoiceItemsBySubscription() ::= <<
 create() ::= <<
   INSERT INTO recurring_invoice_items(<fields()>)
   VALUES(:id, :invoiceId, :subscriptionId, :planName, :phaseName, :startDate, :endDate,
-         :amount, :rate, :currency, :reversedItemId, NOW());
+         :amount, :rate, :currency, :reversedItemId, :createdDate, :updatedDate);
 >>
 
 batchCreateFromTransaction() ::= <<
   INSERT INTO recurring_invoice_items(<fields()>)
   VALUES(:id, :invoiceId, :subscriptionId, :planName, :phaseName, :startDate, :endDate,
-         :amount, :rate, :currency, :reversedItemId, NOW());
+         :amount, :rate, :currency, :reversedItemId, :createdDate, :updatedDate);
 >>
 
 update() ::= <<
   UPDATE recurring_invoice_items
   SET invoice_id = :invoiceId, subscription_id = :subscriptionId, plan_name = :planName, phase_name = :phaseName,
       start_date = :startDate, end_date = :endDate, amount = :amount, rate = :rate, currency = :currency,
-      reversed_item_id = :reversedItemId
+      reversed_item_id = :reversedItemId, updated_date = :updatedDate
   WHERE id = :id;
 >>
 
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
index e210044..b9d3faa 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -13,6 +13,7 @@ CREATE TABLE recurring_invoice_items (
   currency char(3) NOT NULL,
   reversed_item_id char(36),
   created_date datetime NOT NULL,
+  updated_date datetime NOT NULL,
   PRIMARY KEY(id)
 ) ENGINE=innodb;
 CREATE INDEX recurring_invoice_items_subscription_id ON recurring_invoice_items(subscription_id ASC);
@@ -30,6 +31,7 @@ CREATE TABLE fixed_invoice_items (
   amount numeric(10,4) NULL,
   currency char(3) NOT NULL,
   created_date datetime NOT NULL,
+  updated_date datetime NOT NULL,
   PRIMARY KEY(id)
 ) ENGINE=innodb;
 CREATE INDEX fixed_invoice_items_subscription_id ON fixed_invoice_items(subscription_id ASC);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index 711665a..4f936fd 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -35,10 +35,10 @@ import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.invoice.model.BillingEventSet;
 import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
-import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.invoice.model.InvoiceGenerator;
 import com.ning.billing.invoice.model.InvoiceItemList;
+import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
 import org.joda.time.DateTime;
@@ -50,8 +50,10 @@ import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 
-import static org.testng.Assert.*;
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
 
 @Test(groups = {"invoicing", "invoicing-invoiceDao"})
 public class InvoiceDaoTests extends InvoiceDaoTestBase {
@@ -85,7 +87,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         UUID subscriptionId = UUID.randomUUID();
         DateTime startDate = new DateTime(2010, 1, 1, 0, 0, 0, 0);
         DateTime endDate = new DateTime(2010, 4, 1, 0, 0, 0, 0);
-        InvoiceItem invoiceItem = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, endDate, new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
+        InvoiceItem invoiceItem = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, endDate,
+                new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         invoice.addInvoiceItem(invoiceItem);
         invoiceDao.create(invoice);
 
@@ -182,7 +185,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         BigDecimal rate = new BigDecimal("9.0");
         BigDecimal amount = rate.multiply(new BigDecimal("3.0"));
 
-        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", targetDate, endDate, amount, rate, Currency.USD);
+        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", targetDate, endDate,
+                amount, rate, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         invoice.addInvoiceItem(item);
         invoiceDao.create(invoice);
 
@@ -245,7 +249,7 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
     }
 
     private List<Invoice> getInvoicesDueForPaymentAttempt(final List<Invoice> invoices, final DateTime date) {
-        List<Invoice> invoicesDue= new ArrayList<Invoice>();
+        List<Invoice> invoicesDue = new ArrayList<Invoice>();
 
         for (final Invoice invoice : invoices) {
             if (invoice.isDueForPayment(date, NUMBER_OF_DAY_BETWEEN_RETRIES)) {
@@ -260,10 +264,14 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
     public void testGetInvoicesBySubscription() {
         UUID accountId = UUID.randomUUID();
 
-        UUID subscriptionId1 = UUID.randomUUID(); BigDecimal rate1 = new BigDecimal("17.0");
-        UUID subscriptionId2 = UUID.randomUUID(); BigDecimal rate2 = new BigDecimal("42.0");
-        UUID subscriptionId3 = UUID.randomUUID(); BigDecimal rate3 = new BigDecimal("3.0");
-        UUID subscriptionId4 = UUID.randomUUID(); BigDecimal rate4 = new BigDecimal("12.0");
+        UUID subscriptionId1 = UUID.randomUUID();
+        BigDecimal rate1 = new BigDecimal("17.0");
+        UUID subscriptionId2 = UUID.randomUUID();
+        BigDecimal rate2 = new BigDecimal("42.0");
+        UUID subscriptionId3 = UUID.randomUUID();
+        BigDecimal rate3 = new BigDecimal("3.0");
+        UUID subscriptionId4 = UUID.randomUUID();
+        BigDecimal rate4 = new BigDecimal("12.0");
 
         DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
 
@@ -277,16 +285,20 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         DateTime endDate = startDate.plusMonths(1);
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, subscriptionId1, "test plan", "test A", startDate, endDate, rate1, rate1, Currency.USD);
+        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, subscriptionId1, "test plan", "test A", startDate, endDate,
+                rate1, rate1, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item1);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, subscriptionId2, "test plan", "test B", startDate, endDate, rate2, rate2, Currency.USD);
+        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, subscriptionId2, "test plan", "test B", startDate, endDate,
+                rate2, rate2, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item2);
 
-        RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, subscriptionId3, "test plan", "test C", startDate, endDate, rate3, rate3, Currency.USD);
+        RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, subscriptionId3, "test plan", "test C", startDate, endDate,
+                rate3, rate3, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item3);
 
-        RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, subscriptionId4, "test plan", "test D", startDate, endDate, rate4, rate4, Currency.USD);
+        RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, subscriptionId4, "test plan", "test D", startDate, endDate,
+                rate4, rate4, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item4);
 
         // create invoice 2 (subscriptions 1-3)
@@ -298,13 +310,16 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         startDate = endDate;
         endDate = startDate.plusMonths(1);
 
-        RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, subscriptionId1, "test plan", "test phase A", startDate, endDate, rate1, rate1, Currency.USD);
+        RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+                rate1, rate1, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item5);
 
-        RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, subscriptionId2, "test plan", "test phase B", startDate, endDate, rate2, rate2, Currency.USD);
+        RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+                rate2, rate2, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item6);
 
-        RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, subscriptionId3, "test plan", "test phase C", startDate, endDate, rate3, rate3, Currency.USD);
+        RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+                rate3, rate3, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item7);
 
         // check that each subscription returns the correct number of invoices
@@ -363,10 +378,12 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         BigDecimal rate1 = new BigDecimal("17.0");
         BigDecimal rate2 = new BigDecimal("42.0");
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase A", startDate, endDate, rate1, rate1, Currency.USD);
+        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase A", startDate,
+                endDate, rate1, rate1, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item1);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase B", startDate, endDate, rate2, rate2, Currency.USD);
+        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase B", startDate,
+                endDate, rate2, rate2, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item2);
 
         BigDecimal payment1 = new BigDecimal("48.0");
@@ -390,10 +407,12 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         BigDecimal rate1 = new BigDecimal("17.0");
         BigDecimal rate2 = new BigDecimal("42.0");
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase A", startDate, endDate, rate1, rate1, Currency.USD);
+        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
+                rate1, rate1, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item1);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase B", startDate, endDate, rate2, rate2, Currency.USD);
+        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
+                rate2, rate2, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item2);
 
         BigDecimal balance = invoiceDao.getAccountBalance(accountId);
@@ -428,10 +447,12 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         BigDecimal rate1 = new BigDecimal("17.0");
         BigDecimal rate2 = new BigDecimal("42.0");
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase A", startDate, endDate, rate1, rate1, Currency.USD);
+        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
+                rate1, rate1, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item1);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase B", startDate, endDate, rate2, rate2, Currency.USD);
+        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
+                rate2, rate2, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item2);
 
         DateTime upToDate;
@@ -454,7 +475,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
         BigDecimal rate3 = new BigDecimal("21.0");
 
-        RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2, rate3, rate3, Currency.USD);
+        RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2,
+                rate3, rate3, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item3);
 
         upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
@@ -489,8 +511,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         Subscription subscription = new MockSubscription();
         DateTime effectiveDate1 = new DateTime(2011, 2, 1, 0, 0, 0, 0);
         BillingEvent event1 = new DefaultBillingEvent(subscription, effectiveDate1, plan1, phase1, null,
-                                                      recurringPrice, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                                                      "testEvent1", SubscriptionTransitionType.CREATE);
+                recurringPrice, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                "testEvent1", SubscriptionTransitionType.CREATE);
 
         BillingEventSet events = new BillingEventSet();
         events.add(event1);
@@ -507,8 +529,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
         DateTime effectiveDate2 = new DateTime(2011, 2, 15, 0, 0, 0, 0);
         BillingEvent event2 = new DefaultBillingEvent(subscription, effectiveDate2, plan2, phase2, null,
-                                                      recurringPrice2, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                                                      "testEvent2", SubscriptionTransitionType.CREATE);
+                recurringPrice2, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                "testEvent2", SubscriptionTransitionType.CREATE);
         events.add(event2);
 
         // second invoice should be for one half (14/28 days) the difference between the rate plans
@@ -538,8 +560,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         DateTime effectiveDate = buildDateTime(2011, 1, 1);
 
         BillingEvent event = new DefaultBillingEvent(subscription, effectiveDate, plan, phase, null,
-                                                     recurringPrice, BillingPeriod.MONTHLY, 15, BillingModeType.IN_ADVANCE,
-                                                     "testEvent", SubscriptionTransitionType.CREATE);
+                recurringPrice, BillingPeriod.MONTHLY, 15, BillingModeType.IN_ADVANCE,
+                "testEvent", SubscriptionTransitionType.CREATE);
         BillingEventSet events = new BillingEventSet();
         events.add(event);
 
@@ -568,8 +590,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
 
         BillingEvent event1 = new DefaultBillingEvent(subscription, effectiveDate1, plan, phase1, fixedPrice,
-                                                     null, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                                                     "testEvent1", SubscriptionTransitionType.CREATE);
+                null, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                "testEvent1", SubscriptionTransitionType.CREATE);
         BillingEventSet events = new BillingEventSet();
         events.add(event1);
 
@@ -583,8 +605,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
         DateTime effectiveDate2 = effectiveDate1.plusDays(30);
         BillingEvent event2 = new DefaultBillingEvent(subscription, effectiveDate2, plan, phase2, null,
-                                                     recurringPrice, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                                                     "testEvent2", SubscriptionTransitionType.CHANGE);
+                recurringPrice, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                "testEvent2", SubscriptionTransitionType.CHANGE);
         events.add(event2);
 
         Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, existingItems, effectiveDate2, Currency.USD);
@@ -625,15 +647,15 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
 
         BillingEvent event1 = new DefaultBillingEvent(subscription, effectiveDate1, plan, phase1, fixedPrice,
-                                                     null, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                                                     "testEvent1", SubscriptionTransitionType.CREATE);
+                null, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                "testEvent1", SubscriptionTransitionType.CREATE);
         BillingEventSet events = new BillingEventSet();
         events.add(event1);
 
         DateTime effectiveDate2 = effectiveDate1.plusDays(30);
         BillingEvent event2 = new DefaultBillingEvent(subscription, effectiveDate2, plan, phase2, null,
-                                                     recurringPrice, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                                                     "testEvent2", SubscriptionTransitionType.CHANGE);
+                recurringPrice, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                "testEvent2", SubscriptionTransitionType.CHANGE);
         events.add(event2);
 
         InvoiceGenerator generator = new DefaultInvoiceGenerator(clock);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
index 16e95fb..2f79c8b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
@@ -22,7 +22,6 @@ import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
-
 import org.joda.time.DateTime;
 import org.testng.annotations.Test;
 
@@ -38,7 +37,7 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
 
     private final Clock clock = new DefaultClock();
 
-    @Test
+    @Test(groups = "slow")
     public void testInvoiceItemCreation() {
         UUID invoiceId = UUID.randomUUID();
         UUID subscriptionId = UUID.randomUUID();
@@ -46,7 +45,9 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
         DateTime endDate = new DateTime(2011, 11, 1, 0, 0, 0, 0);
         BigDecimal rate = new BigDecimal("20.00");
 
-        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, endDate, rate, rate, Currency.USD);
+        final DateTime expectedCreatedDate = clock.getUTCNow();
+        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, endDate,
+                rate, rate, Currency.USD, expectedCreatedDate, expectedCreatedDate);
         recurringInvoiceItemDao.create(item);
 
         RecurringInvoiceItem thisItem = (RecurringInvoiceItem) recurringInvoiceItemDao.getById(item.getId().toString());
@@ -59,9 +60,26 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
         assertEquals(thisItem.getAmount().compareTo(item.getRate()), 0);
         assertEquals(thisItem.getRate().compareTo(item.getRate()), 0);
         assertEquals(thisItem.getCurrency(), item.getCurrency());
+        assertEquals(thisItem.getCreatedDate(), item.getCreatedDate());
+        assertEquals(thisItem.getUpdatedDate(), item.getUpdatedDate());
+        assertEquals(thisItem.getUpdatedDate(), thisItem.getUpdatedDate());
+        assertEquals(thisItem.getUpdatedDate(), expectedCreatedDate);
+
+        // Try to update the object and check the updated_date column
+        final DateTime updatedDate = clock.getUTCNow().plusDays(10);
+        RecurringInvoiceItem expectedUpdatedItem = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, endDate,
+                rate, rate, Currency.USD, expectedCreatedDate, updatedDate);
+        recurringInvoiceItemDao.update(item);
+
+        RecurringInvoiceItem updatedItem = (RecurringInvoiceItem) recurringInvoiceItemDao.getById(item.getId().toString());
+        assertNotNull(updatedItem);
+        assertEquals(updatedItem.getId(), item.getId());
+        assertEquals(updatedItem.getCreatedDate(), item.getCreatedDate());
+        assertEquals(updatedItem.getUpdatedDate(), expectedUpdatedItem.getUpdatedDate());
+        assertEquals(updatedItem.getUpdatedDate(), updatedDate);
     }
 
-    @Test
+    @Test(groups = "slow")
     public void testGetInvoiceItemsBySubscriptionId() {
         UUID subscriptionId = UUID.randomUUID();
         DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
@@ -69,7 +87,8 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
 
         for (int i = 0; i < 3; i++) {
             UUID invoiceId = UUID.randomUUID();
-            RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate.plusMonths(i), startDate.plusMonths(i + 1), rate, rate, Currency.USD);
+            RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate.plusMonths(i), startDate.plusMonths(i + 1),
+                    rate, rate, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
             recurringInvoiceItemDao.create(item);
         }
 
@@ -77,7 +96,7 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
         assertEquals(items.size(), 3);
     }
 
-    @Test
+    @Test(groups = "slow")
     public void testGetInvoiceItemsByInvoiceId() {
         UUID invoiceId = UUID.randomUUID();
         DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
@@ -86,7 +105,8 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
         for (int i = 0; i < 5; i++) {
             UUID subscriptionId = UUID.randomUUID();
             BigDecimal amount = rate.multiply(new BigDecimal(i + 1));
-            RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, startDate.plusMonths(1), amount, amount, Currency.USD);
+            RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, startDate.plusMonths(1),
+                    amount, amount, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
             recurringInvoiceItemDao.create(item);
         }
 
@@ -94,7 +114,7 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
         assertEquals(items.size(), 5);
     }
 
-    @Test
+    @Test(groups = "slow")
     public void testGetInvoiceItemsByAccountId() {
         UUID accountId = UUID.randomUUID();
         DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
@@ -107,7 +127,8 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
         BigDecimal rate = new BigDecimal("20.00");
 
         UUID subscriptionId = UUID.randomUUID();
-        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, startDate.plusMonths(1), rate, rate, Currency.USD);
+        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, subscriptionId, "test plan", "test phase", startDate, startDate.plusMonths(1),
+                rate, rate, Currency.USD, clock.getUTCNow(), clock.getUTCNow());
         recurringInvoiceItemDao.create(item);
 
         List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByAccount(accountId.toString());
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java b/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java
index a86db13..b505fa0 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/DefaultPaymentDao.java
@@ -16,9 +16,11 @@
 
 package com.ning.billing.payment.dao;
 
+import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
+import com.ning.billing.util.clock.Clock;
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.IDBI;
 
@@ -29,10 +31,12 @@ import com.ning.billing.payment.api.PaymentInfo;
 
 public class DefaultPaymentDao implements PaymentDao {
     private final PaymentSqlDao sqlDao;
+    private final Clock clock;
 
     @Inject
-    public DefaultPaymentDao(IDBI dbi) {
+    public DefaultPaymentDao(IDBI dbi, Clock clock) {
         this.sqlDao = dbi.onDemand(PaymentSqlDao.class);
+        this.clock = clock;
     }
 
     @Override
@@ -66,12 +70,12 @@ public class DefaultPaymentDao implements PaymentDao {
 
     @Override
     public void updatePaymentAttemptWithPaymentId(UUID paymentAttemptId, String paymentId) {
-        sqlDao.updatePaymentAttemptWithPaymentId(paymentAttemptId.toString(), paymentId);
+        sqlDao.updatePaymentAttemptWithPaymentId(paymentAttemptId.toString(), paymentId, clock.getUTCNow().toDate());
     }
 
     @Override
     public void updatePaymentInfo(String type, String paymentId, String cardType, String cardCountry) {
-        sqlDao.updatePaymentInfo(type, paymentId, cardType, cardCountry);
+        sqlDao.updatePaymentInfo(type, paymentId, cardType, cardCountry, clock.getUTCNow().toDate());
     }
 
     @Override
@@ -86,7 +90,8 @@ public class DefaultPaymentDao implements PaymentDao {
 
     @Override
     public void updatePaymentAttemptWithRetryInfo(UUID paymentAttemptId, int retryCount, DateTime nextRetryDate) {
-        sqlDao.updatePaymentAttemptWithRetryInfo(paymentAttemptId.toString(), retryCount, nextRetryDate);
+        final Date retryDate = nextRetryDate == null ? null : nextRetryDate.toDate();
+        sqlDao.updatePaymentAttemptWithRetryInfo(paymentAttemptId.toString(), retryCount, retryDate, clock.getUTCNow().toDate());
     }
 
     @Override
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
index 9919d34..ea564f3 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
@@ -71,18 +71,22 @@ public interface PaymentSqlDao extends Transactional<PaymentSqlDao>, CloseMe, Tr
 
     @SqlUpdate
     void updatePaymentAttemptWithPaymentId(@Bind("payment_attempt_id") String paymentAttemptId,
-                                           @Bind("payment_id") String paymentId);
+                                           @Bind("payment_id") String paymentId,
+                                           @Bind("updated_dt") Date updatedDate);
 
     @SqlUpdate
     void updatePaymentAttemptWithRetryInfo(@Bind("payment_attempt_id") String paymentAttemptId,
                                            @Bind("retry_count") int retryCount,
-                                           @Bind("next_retry_dt") DateTime nextRetryDate);
+                                           @Bind("next_retry_dt") Date nextRetryDate,
+                                           @Bind("updated_dt") Date updatedDate);
 
     @SqlUpdate
+
     void updatePaymentInfo(@Bind("payment_method") String paymentMethod,
                            @Bind("payment_id") String paymentId,
                            @Bind("card_type") String cardType,
-                           @Bind("card_country") String cardCountry);
+                           @Bind("card_country") String cardCountry,
+                           @Bind("updated_dt") Date updatedDate);
 
     @SqlQuery
     @Mapper(PaymentInfoMapper.class)
diff --git a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg
index 6576ecb..b349b5e 100644
--- a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg
+++ b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentSqlDao.sql.stg
@@ -65,7 +65,7 @@ getPaymentAttemptForInvoiceId() ::= <<
 updatePaymentAttemptWithPaymentId() ::= <<
     UPDATE payment_attempts
        SET payment_id = :payment_id,
-           updated_dt = NOW()
+           updated_dt = :updated_dt
      WHERE payment_attempt_id = :payment_attempt_id
 >>
 
@@ -79,7 +79,7 @@ updatePaymentInfo() ::= <<
        SET payment_method = :payment_method,
            card_type = :card_type,
            card_country = :card_country,
-           updated_dt = NOW()
+           updated_dt = :updated_dt
      WHERE payment_id = :payment_id
 >>
 
@@ -87,7 +87,7 @@ updatePaymentAttemptWithRetryInfo() ::= <<
     UPDATE payment_attempts
        SET retry_count = :retry_count,
            next_retry_dt = :next_retry_dt,
-           updated_dt = NOW()
+           updated_dt = :updated_dt
      WHERE payment_attempt_id = :payment_attempt_id
 >>
 
diff --git a/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java b/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java
index 2ef26e4..39ae479 100644
--- a/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java
+++ b/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java
@@ -77,7 +77,9 @@ public abstract class TestPaymentApi {
                                                        now.plusMonths(1),
                                                        amount,
                                                        new BigDecimal("1.0"),
-                                                       Currency.USD));
+                                                       Currency.USD,
+                                                       now,
+                                                       now));
 
         List<Either<PaymentError, PaymentInfo>> results = paymentApi.createPayment(account.getExternalKey(), Arrays.asList(invoice.getId().toString()));
 
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
index b245e55..10b81da 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
@@ -29,6 +29,7 @@ import com.google.common.collect.Collections2;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.payment.api.PaymentAttempt;
 import com.ning.billing.payment.api.PaymentInfo;
+import org.joda.time.DateTimeZone;
 
 public class MockPaymentDao implements PaymentDao {
     private final Map<String, PaymentInfo> payments = new ConcurrentHashMap<String, PaymentInfo>();
@@ -86,7 +87,13 @@ public class MockPaymentDao implements PaymentDao {
     public void updatePaymentInfo(String paymentMethodType, String paymentId, String cardType, String cardCountry) {
         PaymentInfo existingPayment = payments.get(paymentId);
         if (existingPayment != null) {
-            PaymentInfo payment = existingPayment.cloner().setPaymentMethod(paymentMethodType).setCardType(cardType).setCardCountry(cardCountry).build();
+            PaymentInfo payment = existingPayment.cloner()
+                    .setPaymentMethod(paymentMethodType)
+                    .setCardType(cardType)
+                    .setCardCountry(cardCountry)
+                    // TODO pass the clock?
+                    .setUpdatedDate(new DateTime(DateTimeZone.UTC))
+                    .build();
             payments.put(paymentId, payment);
         }
     }
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
index 18b0a15..6318d28 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
@@ -16,19 +16,18 @@
 
 package com.ning.billing.payment.dao;
 
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.UUID;
-
+import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.payment.api.PaymentAttempt;
+import com.ning.billing.payment.api.PaymentInfo;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.payment.api.PaymentAttempt;
-import com.ning.billing.payment.api.PaymentInfo;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.UUID;
 
 public abstract class TestPaymentDao {
 
@@ -37,35 +36,35 @@ public abstract class TestPaymentDao {
     @Test
     public void testCreatePayment() {
         PaymentInfo paymentInfo = new PaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
-                                                           .setAmount(BigDecimal.TEN)
-                                                           .setStatus("Processed")
-                                                           .setBankIdentificationNumber("1234")
-                                                           .setPaymentNumber("12345")
-                                                           .setPaymentMethodId("12345")
-                                                           .setReferenceId("12345")
-                                                           .setType("Electronic")
-                                                           .setCreatedDate(new DateTime(DateTimeZone.UTC))
-                                                           .setUpdatedDate(new DateTime(DateTimeZone.UTC))
-                                                           .setEffectiveDate(new DateTime(DateTimeZone.UTC))
-                                                           .build();
+                .setAmount(BigDecimal.TEN)
+                .setStatus("Processed")
+                .setBankIdentificationNumber("1234")
+                .setPaymentNumber("12345")
+                .setPaymentMethodId("12345")
+                .setReferenceId("12345")
+                .setType("Electronic")
+                .setCreatedDate(new DateTime(DateTimeZone.UTC))
+                .setUpdatedDate(new DateTime(DateTimeZone.UTC))
+                .setEffectiveDate(new DateTime(DateTimeZone.UTC))
+                .build();
 
         paymentDao.savePaymentInfo(paymentInfo);
     }
 
     @Test
-    public void testUpdatePayment() {
+    public void testUpdatePaymenInfo() {
         PaymentInfo paymentInfo = new PaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
-                                                           .setAmount(BigDecimal.TEN)
-                                                           .setStatus("Processed")
-                                                           .setBankIdentificationNumber("1234")
-                                                           .setPaymentNumber("12345")
-                                                           .setPaymentMethodId("12345")
-                                                           .setReferenceId("12345")
-                                                           .setType("Electronic")
-                                                           .setCreatedDate(new DateTime(DateTimeZone.UTC))
-                                                           .setUpdatedDate(new DateTime(DateTimeZone.UTC))
-                                                           .setEffectiveDate(new DateTime(DateTimeZone.UTC))
-                                                           .build();
+                .setAmount(BigDecimal.TEN)
+                .setStatus("Processed")
+                .setBankIdentificationNumber("1234")
+                .setPaymentNumber("12345")
+                .setPaymentMethodId("12345")
+                .setReferenceId("12345")
+                .setType("Electronic")
+                .setCreatedDate(new DateTime(DateTimeZone.UTC))
+                .setUpdatedDate(new DateTime(DateTimeZone.UTC))
+                .setEffectiveDate(new DateTime(DateTimeZone.UTC))
+                .build();
 
         paymentDao.savePaymentInfo(paymentInfo);
 
@@ -74,6 +73,24 @@ public abstract class TestPaymentDao {
     }
 
     @Test
+    public void testUpdatePaymentAttempt() {
+        PaymentAttempt paymentAttempt = new PaymentAttempt.Builder().setPaymentAttemptId(UUID.randomUUID())
+                .setPaymentId(UUID.randomUUID().toString())
+                .setInvoiceId(UUID.randomUUID())
+                .setAccountId(UUID.randomUUID())
+                .setAmount(BigDecimal.TEN)
+                .setCurrency(Currency.USD)
+                .setInvoiceDate(new DateTime(DateTimeZone.UTC))
+                .setCreatedDate(new DateTime(DateTimeZone.UTC))
+                .setUpdatedDate(new DateTime(DateTimeZone.UTC))
+                .build();
+
+        paymentDao.createPaymentAttempt(paymentAttempt);
+
+        paymentDao.updatePaymentAttemptWithRetryInfo(paymentAttempt.getPaymentAttemptId(), 1, paymentAttempt.getCreatedDate().plusDays(1));
+    }
+
+    @Test
     public void testGetPaymentForInvoice() throws AccountApiException {
         final UUID invoiceId = UUID.randomUUID();
         final UUID paymentAttemptId = UUID.randomUUID();
@@ -81,7 +98,8 @@ public abstract class TestPaymentDao {
         final String paymentId = UUID.randomUUID().toString();
         final BigDecimal invoiceAmount = BigDecimal.TEN;
 
-        final DateTime now = new DateTime(DateTimeZone.UTC);
+        // Move the clock backwards to test the updated_date field (see below)
+        final DateTime now = new DateTime(DateTimeZone.UTC).minusDays(1);
 
         PaymentAttempt originalPaymenAttempt = new PaymentAttempt(paymentAttemptId, invoiceId, accountId, invoiceAmount, Currency.USD, now, now, paymentId, null, null);
 
@@ -100,22 +118,25 @@ public abstract class TestPaymentDao {
         Assert.assertEquals(attempt3, attempt4);
 
         PaymentInfo originalPaymentInfo = new PaymentInfo.Builder().setPaymentId(paymentId)
-                                                           .setAmount(invoiceAmount)
-                                                           .setStatus("Processed")
-                                                           .setBankIdentificationNumber("1234")
-                                                           .setPaymentNumber("12345")
-                                                           .setPaymentMethodId("12345")
-                                                           .setReferenceId("12345")
-                                                           .setType("Electronic")
-                                                           .setCreatedDate(now)
-                                                           .setUpdatedDate(now)
-                                                           .setEffectiveDate(now)
-                                                           .build();
+                .setAmount(invoiceAmount)
+                .setStatus("Processed")
+                .setBankIdentificationNumber("1234")
+                .setPaymentNumber("12345")
+                .setPaymentMethodId("12345")
+                .setReferenceId("12345")
+                .setType("Electronic")
+                .setCreatedDate(now)
+                .setUpdatedDate(now)
+                .setEffectiveDate(now)
+                .build();
 
         paymentDao.savePaymentInfo(originalPaymentInfo);
         PaymentInfo paymentInfo = paymentDao.getPaymentInfo(Arrays.asList(invoiceId.toString())).get(0);
+        Assert.assertEquals(paymentInfo, originalPaymentInfo);
 
-        Assert.assertEquals(originalPaymentInfo, paymentInfo);
+        paymentDao.updatePaymentInfo(originalPaymentInfo.getPaymentMethod(), originalPaymentInfo.getPaymentId(), originalPaymentInfo.getCardType(), originalPaymentInfo.getCardCountry());
+        paymentInfo = paymentDao.getPaymentInfo(Arrays.asList(invoiceId.toString())).get(0);
+        Assert.assertEquals(paymentInfo.getCreatedDate().getMillis() / 1000, originalPaymentInfo.getCreatedDate().getMillis() / 1000);
+        Assert.assertTrue(paymentInfo.getUpdatedDate().isAfter(originalPaymentInfo.getUpdatedDate()));
     }
-
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDaoWithEmbeddedDb.java b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDaoWithEmbeddedDb.java
index 19ca39d..a5da11b 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDaoWithEmbeddedDb.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDaoWithEmbeddedDb.java
@@ -18,6 +18,7 @@ package com.ning.billing.payment.dao;
 
 import java.io.IOException;
 
+import com.ning.billing.util.clock.DefaultClock;
 import org.apache.commons.io.IOUtils;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -45,6 +46,6 @@ public class TestPaymentDaoWithEmbeddedDb extends TestPaymentDao {
 
     @BeforeMethod(alwaysRun = true)
     public void setUp() throws IOException {
-        paymentDao = new DefaultPaymentDao(helper.getDBI());
+        paymentDao = new DefaultPaymentDao(helper.getDBI(), new DefaultClock());
     }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/TestHelper.java b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
index 4430eb2..1ffda5c 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestHelper.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
@@ -93,7 +93,9 @@ public class TestHelper {
                                                                recurringInvoiceItem.getEndDate(),
                                                                recurringInvoiceItem.getAmount(),
                                                                recurringInvoiceItem.getRate(),
-                                                               recurringInvoiceItem.getCurrency()));
+                                                               recurringInvoiceItem.getCurrency(),
+                                                               recurringInvoiceItem.getCreatedDate(),
+                                                               recurringInvoiceItem.getUpdatedDate()));
             }
         }
         invoiceDao.create(invoice);
@@ -104,7 +106,8 @@ public class TestHelper {
         final DateTime now = new DateTime(DateTimeZone.UTC);
         final UUID subscriptionId = UUID.randomUUID();
         final BigDecimal amount = new BigDecimal("10.00");
-        final InvoiceItem item = new RecurringInvoiceItem(null, subscriptionId, "test plan", "test phase", now, now.plusMonths(1), amount, new BigDecimal("1.0"), Currency.USD);
+        final InvoiceItem item = new RecurringInvoiceItem(null, subscriptionId, "test plan", "test phase", now, now.plusMonths(1),
+                amount, new BigDecimal("1.0"), Currency.USD, now, now);
 
         return createTestInvoice(account, now, Currency.USD, item);
     }