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);
}