killbill-aplcache
Changes
analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java 15(+10 -5)
beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java 2(+1 -1)
entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java 6(+3 -3)
invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java 10(+6 -4)
invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java 103(+22 -81)
invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java 17(+7 -10)
invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotificationKey.java 2(+1 -1)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java 26(+9 -17)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java 5(+3 -2)
invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java 7(+4 -3)
invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java 233(+115 -118)
invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java 48(+24 -24)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java 56(+28 -28)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java 55(+28 -27)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java 36(+18 -18)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java 73(+37 -36)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java 56(+28 -28)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java 54(+27 -27)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java 102(+51 -51)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java 36(+18 -18)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java 56(+28 -28)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java 54(+27 -27)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java 102(+51 -51)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java 36(+18 -18)
invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java 31(+16 -15)
overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java 23(+18 -5)
overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculator.java 29(+21 -8)
Details
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
index 7ecd1b3..688644f 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -104,7 +105,7 @@ public class BusinessAccountRecorder {
bac.setKey(account.getExternalKey());
try {
- DateTime lastInvoiceDate = bac.getLastInvoiceDate();
+ LocalDate lastInvoiceDate = bac.getLastInvoiceDate();
BigDecimal totalInvoiceBalance = bac.getTotalInvoiceBalance();
String lastPaymentStatus = bac.getLastPaymentStatus();
String paymentMethod = bac.getPaymentMethod();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
index 3ba6ea5..50b857b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
@@ -54,9 +54,9 @@ public @interface BusinessAccountBinder {
q.bind("balance", account.getRoundedBalance());
q.bind("name", account.getName());
if (account.getLastInvoiceDate() != null) {
- q.bind("last_invoice_date", account.getLastInvoiceDate().getMillis());
+ q.bind("last_invoice_date", account.getLastInvoiceDate().toDate());
} else {
- q.bindNull("last_invoice_date", Types.BIGINT);
+ q.bindNull("last_invoice_date", Types.DATE);
}
q.bind("total_invoice_balance", account.getRoundedTotalInvoiceBalance());
q.bind("last_payment_status", account.getLastPaymentStatus());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
index 7bced4f..ca245a0 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
@@ -27,8 +27,9 @@ import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import com.ning.billing.analytics.model.BusinessAccount;
+import com.ning.billing.util.dao.MapperBase;
-public class BusinessAccountMapper implements ResultSetMapper<BusinessAccount> {
+public class BusinessAccountMapper extends MapperBase implements ResultSetMapper<BusinessAccount> {
@Override
public BusinessAccount map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
final BusinessAccount account = new BusinessAccount(
@@ -36,7 +37,7 @@ public class BusinessAccountMapper implements ResultSetMapper<BusinessAccount> {
r.getString(2),
r.getString(6),
BigDecimal.valueOf(r.getDouble(5)),
- r.getLong(7) == 0 ? null : new DateTime(r.getLong(7), DateTimeZone.UTC),
+ getDate(r, "last_invoice_date"),
BigDecimal.valueOf(r.getDouble(8)),
r.getString(9),
r.getString(10),
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java
index fa8358b..c1cdd5b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceBinder.java
@@ -66,15 +66,15 @@ public @interface BusinessInvoiceBinder {
q.bind("account_key", invoice.getAccountKey());
if (invoice.getInvoiceDate() != null) {
- q.bind("invoice_date", invoice.getInvoiceDate().getMillis());
+ q.bind("invoice_date", invoice.getInvoiceDate().toDate());
} else {
- q.bindNull("invoice_date", Types.BIGINT);
+ q.bindNull("invoice_date", Types.DATE);
}
if (invoice.getTargetDate() != null) {
- q.bind("target_date", invoice.getTargetDate().getMillis());
+ q.bind("target_date", invoice.getTargetDate().toDate());
} else {
- q.bindNull("target_date", Types.BIGINT);
+ q.bindNull("target_date", Types.DATE);
}
q.bind("currency", invoice.getCurrency().toString());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemBinder.java
index 7ded40e..48e9fca 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemBinder.java
@@ -67,15 +67,15 @@ public @interface BusinessInvoiceItemBinder {
q.bind("billing_period", invoiceItem.getBillingPeriod());
if (invoiceItem.getStartDate() != null) {
- q.bind("start_date", invoiceItem.getStartDate().getMillis());
+ q.bind("start_date", invoiceItem.getStartDate().toDate());
} else {
- q.bindNull("start_date", Types.BIGINT);
+ q.bindNull("start_date", Types.DATE);
}
if (invoiceItem.getEndDate() != null) {
- q.bind("end_date", invoiceItem.getEndDate().getMillis());
+ q.bind("end_date", invoiceItem.getEndDate().toDate());
} else {
- q.bindNull("end_date", Types.BIGINT);
+ q.bindNull("end_date", Types.DATE);
}
q.bind("amount", Rounder.round(invoiceItem.getAmount()));
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemMapper.java
index b74f5b0..9dc26a7 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceItemMapper.java
@@ -23,13 +23,16 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import com.ning.billing.analytics.model.BusinessInvoiceItem;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.dao.MapperBase;
+
+public class BusinessInvoiceItemMapper extends MapperBase implements ResultSetMapper<BusinessInvoiceItem> {
-public class BusinessInvoiceItemMapper implements ResultSetMapper<BusinessInvoiceItem> {
@Override
public BusinessInvoiceItem map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
final UUID itemId = UUID.fromString(r.getString(1));
@@ -44,8 +47,8 @@ public class BusinessInvoiceItemMapper implements ResultSetMapper<BusinessInvoic
final String slug = r.getString(10);
final String phase = r.getString(11);
final String billingPeriod = r.getString(12);
- final DateTime startDate = new DateTime(r.getLong(13), DateTimeZone.UTC);
- final DateTime endDate = new DateTime(r.getLong(14), DateTimeZone.UTC);
+ final LocalDate startDate = getDate(r, "start_date");
+ final LocalDate endDate = getDate(r, "end_date");
final BigDecimal amount = BigDecimal.valueOf(r.getDouble(15));
final Currency currency = Currency.valueOf(r.getString(16));
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java
index e6df819..9c9f730 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoiceMapper.java
@@ -23,13 +23,15 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import com.ning.billing.analytics.model.BusinessInvoice;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.dao.MapperBase;
-public class BusinessInvoiceMapper implements ResultSetMapper<BusinessInvoice> {
+public class BusinessInvoiceMapper extends MapperBase implements ResultSetMapper<BusinessInvoice> {
@Override
public BusinessInvoice map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
final UUID invoiceId = UUID.fromString(r.getString(1));
@@ -38,8 +40,8 @@ public class BusinessInvoiceMapper implements ResultSetMapper<BusinessInvoice> {
final DateTime updatedDate = new DateTime(r.getLong(4), DateTimeZone.UTC);
final UUID accountId = UUID.fromString(r.getString(5));
final String accountKey = r.getString(6);
- final DateTime invoiceDate = new DateTime(r.getLong(7), DateTimeZone.UTC);
- final DateTime targetDate = new DateTime(r.getLong(8), DateTimeZone.UTC);
+ final LocalDate invoiceDate = getDate(r, "invoice_date");
+ final LocalDate targetDate = getDate(r, "target_date");
final Currency currency = Currency.valueOf(r.getString(9));
final BigDecimal balance = BigDecimal.valueOf(r.getDouble(10));
final BigDecimal amountPaid = BigDecimal.valueOf(r.getDouble(11));
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
index 642a765..b3cc61c 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
@@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.analytics.utils.Rounder;
@@ -32,7 +33,7 @@ public class BusinessAccount {
private String key;
private String name;
private BigDecimal balance;
- private DateTime lastInvoiceDate;
+ private LocalDate lastInvoiceDate;
private BigDecimal totalInvoiceBalance;
private String lastPaymentStatus;
private String paymentMethod;
@@ -44,7 +45,7 @@ public class BusinessAccount {
}
public BusinessAccount(final UUID accountId, final String key, final String name, final BigDecimal balance,
- final DateTime lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus,
+ final LocalDate lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus,
final String paymentMethod, final String creditCardType, final String billingAddressCountry) {
this.accountId = accountId;
this.key = key;
@@ -106,11 +107,11 @@ public class BusinessAccount {
this.creditCardType = creditCardType;
}
- public DateTime getLastInvoiceDate() {
+ public LocalDate getLastInvoiceDate() {
return lastInvoiceDate;
}
- public void setLastInvoiceDate(final DateTime lastInvoiceDate) {
+ public void setLastInvoiceDate(final LocalDate lastInvoiceDate) {
this.lastInvoiceDate = lastInvoiceDate;
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
index caae2a3..891ebcb 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoice.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.analytics.utils.Rounder;
import com.ning.billing.catalog.api.Currency;
@@ -33,8 +34,8 @@ public class BusinessInvoice {
private final DateTime updatedDate;
private final UUID accountId;
private final String accountKey;
- private final DateTime invoiceDate;
- private final DateTime targetDate;
+ private final LocalDate invoiceDate;
+ private final LocalDate targetDate;
private final Currency currency;
private final BigDecimal balance;
private final BigDecimal amountPaid;
@@ -43,8 +44,8 @@ public class BusinessInvoice {
public BusinessInvoice(final UUID accountId, final String accountKey, final BigDecimal amountCharged, final BigDecimal amountCredited,
final BigDecimal amountPaid, final BigDecimal balance, final DateTime createdDate,
- final Currency currency, final DateTime invoiceDate, final UUID invoiceId, final Integer invoiceNumber,
- final DateTime targetDate, final DateTime updatedDate) {
+ final Currency currency, final LocalDate invoiceDate, final UUID invoiceId, final Integer invoiceNumber,
+ final LocalDate targetDate, final DateTime updatedDate) {
this.accountId = accountId;
this.accountKey = accountKey;
this.amountCharged = amountCharged;
@@ -98,7 +99,7 @@ public class BusinessInvoice {
return currency;
}
- public DateTime getInvoiceDate() {
+ public LocalDate getInvoiceDate() {
return invoiceDate;
}
@@ -110,7 +111,7 @@ public class BusinessInvoice {
return invoiceNumber;
}
- public DateTime getTargetDate() {
+ public LocalDate getTargetDate() {
return targetDate;
}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
index 357f4d1..518227b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoiceItem.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.analytics.utils.Rounder;
import com.ning.billing.catalog.api.Currency;
@@ -41,16 +42,16 @@ public class BusinessInvoiceItem {
private final String slug;
private final String phase;
private final String billingPeriod;
- private final DateTime startDate;
- private final DateTime endDate;
+ private final LocalDate startDate;
+ private final LocalDate endDate;
private final BigDecimal amount;
private final Currency currency;
public BusinessInvoiceItem(final BigDecimal amount, final String billingPeriod, final DateTime createdDate,
- final Currency currency, final DateTime endDate, final String externalKey,
+ final Currency currency, final LocalDate endDate, final String externalKey,
final UUID invoiceId, final UUID itemId, final String itemType, final String phase,
final String productCategory, final String productName, final String productType,
- final String slug, final DateTime startDate, final DateTime updatedDate) {
+ final String slug, final LocalDate startDate, final DateTime updatedDate) {
this.amount = amount;
this.billingPeriod = billingPeriod;
this.createdDate = createdDate;
@@ -96,7 +97,7 @@ public class BusinessInvoiceItem {
return currency;
}
- public DateTime getEndDate() {
+ public LocalDate getEndDate() {
return endDate;
}
@@ -132,7 +133,7 @@ public class BusinessInvoiceItem {
return slug;
}
- public DateTime getStartDate() {
+ public LocalDate getStartDate() {
return startDate;
}
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
index 4e219d4..53d6c48 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -46,7 +46,7 @@ create table bac (
, created_date bigint not null
, updated_date bigint not null
, balance numeric(10, 4) default 0
-, last_invoice_date bigint default null
+, last_invoice_date date default null
, total_invoice_balance numeric(10, 4) default 0
, last_payment_status varchar(255) default null
, payment_method varchar(50) default null
@@ -66,8 +66,8 @@ create table bin (
, updated_date bigint not null
, account_id char(36) not null
, account_key varchar(50) not null
-, invoice_date bigint not null
-, target_date bigint not null
+, invoice_date date not null
+, target_date date not null
, currency char(50) not null
, balance numeric(10, 4) default 0 comment 'amount_charged - amount_paid - amount_credited'
, amount_paid numeric(10, 4) default 0 comment 'Sums of the successful payments made for this invoice minus the refunds associated with this invoice'
@@ -92,8 +92,8 @@ create table bii (
, slug varchar(50) default null comment 'foo'
, phase varchar(50) default null
, billing_period varchar(50) default null
-, start_date bigint default null
-, end_date bigint default null
+, start_date date default null
+, end_date date default null
, amount numeric(10, 4) default 0
, currency char(50) default null
, primary key(record_id)
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 2e71aa4..d41ffbe 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -30,16 +30,15 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import com.google.inject.Inject;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountCreationEvent;
import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
import com.ning.billing.analytics.AnalyticsTestModule;
+import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
import com.ning.billing.analytics.MockDuration;
import com.ning.billing.analytics.MockPhase;
import com.ning.billing.analytics.MockProduct;
-import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
import com.ning.billing.analytics.model.BusinessSubscription;
@@ -85,10 +84,13 @@ import com.ning.billing.util.callcontext.UserType;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.DefaultClock;
+import com.google.inject.Inject;
+
import static org.testng.Assert.fail;
@Guice(modules = {AnalyticsTestModule.class})
public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
+
final Product product = new MockProduct("platinum", "subscription", ProductCategory.BASE);
final Plan plan = new MockPlan("platinum-monthly", product);
final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
@@ -208,7 +210,7 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
ACCOUNT_KEY,
transition.getSubscriptionId(),
requestedTransitionTime,
- BusinessSubscriptionEvent.subscriptionCreated(plan.getName(), catalog, new DateTime(), new DateTime()),
+ BusinessSubscriptionEvent.subscriptionCreated(plan.getName(), catalog, clock.getUTCNow(), clock.getUTCNow()),
null,
new BusinessSubscription(priceList.getName(), plan.getName(), phase.getName(), ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, catalog)
);
@@ -219,9 +221,9 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
}
private void createInvoiceAndPaymentCreationEvents(final Account account) {
- final DefaultInvoice invoice = new DefaultInvoice(account.getId(), clock.getUTCNow(), clock.getUTCNow(), ACCOUNT_CURRENCY);
+ final DefaultInvoice invoice = new DefaultInvoice(account.getId(), clock.getUTCToday(), clock.getUTCToday(), ACCOUNT_CURRENCY);
final FixedPriceInvoiceItem invoiceItem = new FixedPriceInvoiceItem(
- UUID.randomUUID(), invoice.getId(), account.getId(), UUID.randomUUID(), UUID.randomUUID(), "somePlan", "somePhase", clock.getUTCNow(), clock.getUTCNow().plusDays(1),
+ UUID.randomUUID(), invoice.getId(), account.getId(), UUID.randomUUID(), UUID.randomUUID(), "somePlan", "somePhase", clock.getUTCToday(),
INVOICE_AMOUNT, ACCOUNT_CURRENCY);
invoice.addInvoiceItem(invoiceItem);
@@ -232,9 +234,9 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
// It doesn't really matter what the events contain - the listener will go back to the db
invoiceCreationNotification = new DefaultInvoiceCreationEvent(invoice.getId(), account.getId(),
- INVOICE_AMOUNT, ACCOUNT_CURRENCY, clock.getUTCNow(), null);
+ INVOICE_AMOUNT, ACCOUNT_CURRENCY, null);
- paymentInfoNotification = new DefaultPaymentInfoEvent(account.getId(), invoices.get(0).getId(), null, invoices.get(0).getBalance(), -1, PaymentStatus.UNKNOWN, null, null, new DateTime());
+ paymentInfoNotification = new DefaultPaymentInfoEvent(account.getId(), invoices.get(0).getId(), null, invoices.get(0).getBalance(), -1, PaymentStatus.UNKNOWN, null, null, clock.getUTCNow());
//STEPH talk to Pierre
/*
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index 67fec93..6d10461 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -23,17 +23,16 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import org.mockito.Mockito;
import org.skife.jdbi.v2.IDBI;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
import com.ning.billing.analytics.MockDuration;
import com.ning.billing.analytics.MockPhase;
import com.ning.billing.analytics.MockProduct;
-import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
import com.ning.billing.analytics.model.BusinessAccount;
import com.ning.billing.analytics.model.BusinessSubscription;
import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
@@ -50,14 +49,18 @@ import com.ning.billing.catalog.api.Product;
import com.ning.billing.catalog.api.ProductCategory;
import com.ning.billing.entitlement.api.user.Subscription;
import com.ning.billing.mock.MockPlan;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
+
private static final Long TOTAL_ORDERING = 1L;
private static final UUID BUNDLE_ID = UUID.randomUUID();
private static final String EXTERNAL_KEY = "23456";
private static final UUID ACCOUNT_ID = UUID.randomUUID();
private static final String ACCOUNT_KEY = "pierre-143343-vcc";
+ private final Clock clock = new DefaultClock();
private final Product product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
private final Plan plan = new MockPlan("platinum-monthly", product);
private final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
@@ -82,9 +85,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
}
private void setupBusinessSubscriptionTransition() {
- final DateTime requestedTimestamp = new DateTime(DateTimeZone.UTC);
- final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.ACTIVE, catalog);
- final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, catalog);
+ final DateTime requestedTimestamp = clock.getUTCNow();
+ final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, clock.getUTCNow(), Subscription.SubscriptionState.ACTIVE, catalog);
+ final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, clock.getUTCNow(), Subscription.SubscriptionState.CANCELLED, catalog);
final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan.getName(), catalog, requestedTimestamp, requestedTimestamp);
transition = new BusinessSubscriptionTransition(TOTAL_ORDERING, BUNDLE_ID, EXTERNAL_KEY, ACCOUNT_ID, ACCOUNT_KEY,
@@ -102,7 +105,7 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
}
private void setupBusinessAccount() {
- account = new BusinessAccount(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(DateTimeZone.UTC), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE");
+ account = new BusinessAccount(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE");
final IDBI dbi = helper.getDBI();
businessAccountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java
index de6aa69..4eb0014 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java
@@ -20,7 +20,7 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.IDBI;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
@@ -29,8 +29,13 @@ import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
import com.ning.billing.analytics.model.BusinessInvoiceItem;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
public class TestBusinessInvoiceItemSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
+
+ private final Clock clock = new DefaultClock();
+
private BusinessInvoiceItemSqlDao invoiceItemSqlDao;
@BeforeMethod(groups = "slow")
@@ -106,9 +111,9 @@ public class TestBusinessInvoiceItemSqlDao extends AnalyticsTestSuiteWithEmbedde
private BusinessInvoiceItem createInvoiceItem(final UUID invoiceId, final String externalKey) {
final BigDecimal amount = BigDecimal.TEN;
final String billingPeriod = UUID.randomUUID().toString().substring(0, 20);
- final DateTime createdDate = new DateTime(DateTimeZone.UTC);
+ final DateTime createdDate = clock.getUTCNow();
final Currency currency = Currency.AUD;
- final DateTime endDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate endDate = clock.getUTCToday();
final UUID itemId = UUID.randomUUID();
final String itemType = UUID.randomUUID().toString().substring(0, 20);
final String phase = UUID.randomUUID().toString().substring(0, 20);
@@ -116,8 +121,8 @@ public class TestBusinessInvoiceItemSqlDao extends AnalyticsTestSuiteWithEmbedde
final String productName = UUID.randomUUID().toString().substring(0, 20);
final String productType = UUID.randomUUID().toString().substring(0, 20);
final String slug = UUID.randomUUID().toString();
- final DateTime startDate = new DateTime(DateTimeZone.UTC);
- final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate startDate = clock.getUTCToday();
+ final DateTime updatedDate = clock.getUTCNow();
return new BusinessInvoiceItem(amount, billingPeriod, createdDate, currency, endDate, externalKey, invoiceId,
itemId, itemType, phase, productCategory, productName, productType, slug, startDate, updatedDate);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
index 226c058..515b14e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
@@ -20,7 +20,7 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.IDBI;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
@@ -29,8 +29,13 @@ import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
import com.ning.billing.analytics.model.BusinessInvoice;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
public class TestBusinessInvoiceSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
+
+ private final Clock clock = new DefaultClock();
+
private BusinessInvoiceSqlDao invoiceSqlDao;
@BeforeMethod(groups = "slow")
@@ -104,11 +109,11 @@ public class TestBusinessInvoiceSqlDao extends AnalyticsTestSuiteWithEmbeddedDB
final BigDecimal amountCredited = BigDecimal.ONE;
final BigDecimal amountPaid = BigDecimal.TEN;
final BigDecimal balance = BigDecimal.valueOf(123L);
- final DateTime createdDate = new DateTime(DateTimeZone.UTC);
+ final DateTime createdDate = clock.getUTCNow();
final Currency currency = Currency.MXN;
- final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
- final DateTime targetDate = new DateTime(DateTimeZone.UTC);
- final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate invoiceDate = clock.getUTCToday();
+ final LocalDate targetDate = clock.getUTCToday();
+ final DateTime updatedDate = clock.getUTCNow();
return new BusinessInvoice(accountId, accountKey, amountCharged, amountCredited, amountPaid, balance,
createdDate, currency, invoiceDate, invoiceId, 12, targetDate, updatedDate);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
index 88329f7..bdd1a7a 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
@@ -19,19 +19,24 @@ package com.ning.billing.analytics.model;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
public class TestBusinessAccount extends AnalyticsTestSuite {
+
+ private final Clock clock = new DefaultClock();
+
private BusinessAccount account;
@BeforeMethod(groups = "fast")
public void setUp() throws Exception {
- account = new BusinessAccount(UUID.randomUUID(), "pierre", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(),
+ account = new BusinessAccount(UUID.randomUUID(), "pierre", UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
}
@@ -41,7 +46,7 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
Assert.assertEquals(account, account);
Assert.assertTrue(account.equals(account));
- final BusinessAccount otherAccount = new BusinessAccount(UUID.randomUUID(), "pierre cardin", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(),
+ final BusinessAccount otherAccount = new BusinessAccount(UUID.randomUUID(), "pierre cardin", UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
Assert.assertFalse(account.equals(otherAccount));
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
index 9ec77f2..d866eda 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
@@ -20,14 +20,19 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuite;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
public class TestBusinessInvoice extends AnalyticsTestSuite {
+
+ private final Clock clock = new DefaultClock();
+
@Test(groups = "fast")
public void testEquals() throws Exception {
final UUID accountId = UUID.randomUUID();
@@ -36,13 +41,13 @@ public class TestBusinessInvoice extends AnalyticsTestSuite {
final BigDecimal amountCredited = BigDecimal.ONE;
final BigDecimal amountPaid = BigDecimal.TEN;
final BigDecimal balance = BigDecimal.valueOf(123L);
- final DateTime createdDate = new DateTime(DateTimeZone.UTC);
+ final DateTime createdDate = clock.getUTCNow();
final Currency currency = Currency.MXN;
- final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate invoiceDate = clock.getUTCToday();
final UUID invoiceId = UUID.randomUUID();
final Integer invoiceNumber = 15;
- final DateTime targetDate = new DateTime(DateTimeZone.UTC);
- final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate targetDate = clock.getUTCToday();
+ final DateTime updatedDate = clock.getUTCNow();
final BusinessInvoice invoice = new BusinessInvoice(accountId, accountKey, amountCharged, amountCredited, amountPaid, balance,
createdDate, currency, invoiceDate, invoiceId, invoiceNumber, targetDate, updatedDate);
Assert.assertSame(invoice, invoice);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java
index 50fac73..eb7100e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java
@@ -20,21 +20,26 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.ning.billing.analytics.AnalyticsTestSuite;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
public class TestBusinessInvoiceItem extends AnalyticsTestSuite {
+
+ private final Clock clock = new DefaultClock();
+
@Test(groups = "fast")
public void testEquals() throws Exception {
final BigDecimal amount = BigDecimal.TEN;
final String billingPeriod = UUID.randomUUID().toString();
- final DateTime createdDate = new DateTime(DateTimeZone.UTC);
+ final DateTime createdDate = clock.getUTCNow();
final Currency currency = Currency.AUD;
- final DateTime endDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate endDate = clock.getUTCToday();
final String externalKey = UUID.randomUUID().toString();
final UUID invoiceId = UUID.randomUUID();
final UUID itemId = UUID.randomUUID();
@@ -44,8 +49,8 @@ public class TestBusinessInvoiceItem extends AnalyticsTestSuite {
final String productName = UUID.randomUUID().toString();
final String productType = UUID.randomUUID().toString();
final String slug = UUID.randomUUID().toString();
- final DateTime startDate = new DateTime(DateTimeZone.UTC);
- final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate startDate = clock.getUTCToday();
+ final DateTime updatedDate = clock.getUTCNow();
final BusinessInvoiceItem invoiceItem = new BusinessInvoiceItem(amount, billingPeriod, createdDate, currency,
endDate, externalKey, invoiceId, itemId, itemType,
phase, productCategory, productName, productType,
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
index ee661bc..3c8e9d9 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
@@ -58,7 +58,6 @@ public interface BillingEvent extends Comparable<BillingEvent> {
*/
public PlanPhase getPlanPhase();
-
/**
* @return the plan
*/
diff --git a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
index f79a46e..b8dff70 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
@@ -20,12 +20,13 @@ import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.util.entity.Entity;
public interface Invoice extends Entity {
+
boolean addInvoiceItem(InvoiceItem item);
boolean addInvoiceItems(List<InvoiceItem> items);
@@ -48,14 +49,20 @@ public interface Invoice extends Entity {
Integer getInvoiceNumber();
- DateTime getInvoiceDate();
+ /**
+ * @return the day the invoice was generated, in the account timezone
+ */
+ LocalDate getInvoiceDate();
- DateTime getTargetDate();
+ /**
+ * The target day is the latest day to consider for billing events.
+ *
+ * @return the target day in the account timezone
+ */
+ LocalDate getTargetDate();
Currency getCurrency();
- DateTime getLastPaymentDate();
-
BigDecimal getPaidAmount();
BigDecimal getChargedAmount();
@@ -70,7 +77,5 @@ public interface Invoice extends Entity {
BigDecimal getBalance();
- boolean isDueForPayment(DateTime targetDate, int numberOfDays);
-
boolean isMigrationInvoice();
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java
index 5fb8964..43e2f97 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java
@@ -19,8 +19,6 @@ package com.ning.billing.invoice.api;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
-
import com.ning.billing.catalog.api.Currency;
public interface InvoiceCreationEvent extends InvoiceEvent {
@@ -31,6 +29,4 @@ public interface InvoiceCreationEvent extends InvoiceEvent {
public Currency getCurrency();
- public DateTime getInvoiceCreationDate();
-
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java
index 6c5cbef..700a7f8 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceItem.java
@@ -19,7 +19,7 @@ package com.ning.billing.invoice.api;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.util.entity.Entity;
@@ -32,9 +32,17 @@ public interface InvoiceItem extends Entity, Comparable<InvoiceItem> {
UUID getAccountId();
- DateTime getStartDate();
-
- DateTime getEndDate();
+ /**
+ * @return the service period start date for that item, in the account timezone
+ */
+ LocalDate getStartDate();
+
+ /**
+ * The end date of an item can be null (e.g. for fixed price items).
+ *
+ * @return the service period end date for that item (if available), in the account timezone
+ */
+ LocalDate getEndDate();
BigDecimal getAmount();
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceMigrationApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceMigrationApi.java
index c1d4490..4c9e4c3 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceMigrationApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceMigrationApi.java
@@ -19,21 +19,19 @@ package com.ning.billing.invoice.api;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
public interface InvoiceMigrationApi {
-
-
/**
- * @param accountId
- * @param targetDate
- * @param balance
- * @param currency
+ * @param accountId account id
+ * @param targetDate maximum billing event day to consider (in the account timezone)
+ * @param balance invoice balance
+ * @param currency invoice currency
* @return The UUID of the created invoice
*/
- public UUID createMigrationInvoice(UUID accountId, DateTime targetDate,
+ public UUID createMigrationInvoice(UUID accountId, LocalDate targetDate,
BigDecimal balance, Currency currency);
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index fa1a0d1..ef784e0 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -22,7 +22,7 @@ import java.util.Collection;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.account.api.AccountApiException;
import com.ning.billing.catalog.api.Currency;
@@ -30,9 +30,17 @@ import com.ning.billing.util.api.TagApiException;
import com.ning.billing.util.callcontext.CallContext;
public interface InvoiceUserApi {
+
public List<Invoice> getInvoicesByAccount(UUID accountId);
- public List<Invoice> getInvoicesByAccount(UUID accountId, DateTime fromDate);
+ /**
+ * Find invoices from a given day, for a given account.
+ *
+ * @param accountId account id
+ * @param fromDate the earliest target day to consider, in the account timezone
+ * @return a list of invoices
+ */
+ public List<Invoice> getInvoicesByAccount(UUID accountId, LocalDate fromDate);
public BigDecimal getAccountBalance(UUID accountId);
@@ -42,9 +50,26 @@ public interface InvoiceUserApi {
public void notifyOfPayment(InvoicePayment invoicePayment, CallContext context);
- public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, DateTime upToDate);
-
- public Invoice triggerInvoiceGeneration(UUID accountId, DateTime targetDate, boolean dryRun, CallContext context) throws InvoiceApiException;
+ /**
+ * Find unpaid invoices for a given account, up to a given day.
+ *
+ * @param accountId account id
+ * @param upToDate the latest target day to consider, in the account timezone
+ * @return a collection of invoices
+ */
+ public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, LocalDate upToDate);
+
+ /**
+ * Trigger an invoice for a given account and a given day.
+ *
+ * @param accountId account id
+ * @param targetDate the target day, in the account timezone
+ * @param dryRun dry run mode or not
+ * @param context the call context
+ * @return the invoice generated
+ * @throws InvoiceApiException
+ */
+ public Invoice triggerInvoiceGeneration(UUID accountId, LocalDate targetDate, boolean dryRun, CallContext context) throws InvoiceApiException;
public void tagInvoiceAsWrittenOff(UUID invoiceId, CallContext context) throws TagApiException;
@@ -52,11 +77,34 @@ public interface InvoiceUserApi {
public InvoiceItem getCreditById(UUID creditId) throws InvoiceApiException;
- public InvoiceItem insertCredit(UUID accountId, BigDecimal amount, DateTime effectiveDate,
- Currency currency, CallContext context) throws InvoiceApiException;
-
- public InvoiceItem insertCreditForInvoice(UUID accountId, UUID invoiceId, BigDecimal amount, DateTime effectiveDate,
- Currency currency, CallContext context) throws InvoiceApiException;
+ /**
+ * Add a credit to an account.
+ *
+ * @param accountId account id
+ * @param amount the credit amount
+ * @param effectiveDate the day to grant the credit, in the account timezone
+ * @param currency the credit currency
+ * @param context the call context
+ * @return the credit invoice item
+ * @throws InvoiceApiException
+ */
+ public InvoiceItem insertCredit(UUID accountId, BigDecimal amount, LocalDate effectiveDate,
+ Currency currency, CallContext context) throws InvoiceApiException;
+
+ /**
+ * Add a credit to an invoice.
+ *
+ * @param accountId account id
+ * @param invoiceId invoice id
+ * @param amount the credit amount
+ * @param effectiveDate the day to grant the credit, in the account timezone
+ * @param currency the credit currency
+ * @param context the call context
+ * @return the credit invoice item
+ * @throws InvoiceApiException
+ */
+ public InvoiceItem insertCreditForInvoice(UUID accountId, UUID invoiceId, BigDecimal amount, LocalDate effectiveDate,
+ Currency currency, CallContext context) throws InvoiceApiException;
public String getInvoiceAsHTML(UUID invoiceId) throws AccountApiException, IOException, InvoiceApiException;
}
diff --git a/api/src/main/java/com/ning/billing/overdue/Condition.java b/api/src/main/java/com/ning/billing/overdue/Condition.java
index 7ecc40b..8319b48 100644
--- a/api/src/main/java/com/ning/billing/overdue/Condition.java
+++ b/api/src/main/java/com/ning/billing/overdue/Condition.java
@@ -16,14 +16,20 @@
package com.ning.billing.overdue;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.junction.api.Blockable;
import com.ning.billing.overdue.config.api.BillingState;
-
public interface Condition<T extends Blockable> {
- public boolean evaluate(BillingState<T> state, DateTime now);
+ /**
+ * Evaluate the condition in a given state, at a given date.
+ *
+ * @param state the billing state
+ * @param now the day to use to evaluate the condition, in the account timezone
+ * @return true if the condition is true, false otherwise
+ */
+ public boolean evaluate(BillingState<T> state, LocalDate now);
}
diff --git a/api/src/main/java/com/ning/billing/overdue/config/api/BillingState.java b/api/src/main/java/com/ning/billing/overdue/config/api/BillingState.java
index bec3db5..56a63f9 100644
--- a/api/src/main/java/com/ning/billing/overdue/config/api/BillingState.java
+++ b/api/src/main/java/com/ning/billing/overdue/config/api/BillingState.java
@@ -20,6 +20,8 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.junction.api.Blockable;
import com.ning.billing.util.tag.Tag;
@@ -28,7 +30,8 @@ public class BillingState<T extends Blockable> {
private final UUID objectId;
private final int numberOfUnpaidInvoices;
private final BigDecimal balanceOfUnpaidInvoices;
- private final DateTime dateOfEarliestUnpaidInvoice;
+ private final LocalDate dateOfEarliestUnpaidInvoice;
+ private final DateTimeZone accountTimeZone;
private final UUID idOfEarliestUnpaidInvoice;
private final PaymentResponse responseForLastFailedPayment;
private final Tag[] tags;
@@ -36,15 +39,16 @@ public class BillingState<T extends Blockable> {
public BillingState(final UUID id,
final int numberOfUnpaidInvoices,
final BigDecimal balanceOfUnpaidInvoices,
- final DateTime dateOfEarliestUnpaidInvoice,
+ final LocalDate dateOfEarliestUnpaidInvoice,
+ final DateTimeZone accountTimeZone,
final UUID idOfEarliestUnpaidInvoice,
final PaymentResponse responseForLastFailedPayment,
final Tag[] tags) {
- super();
this.objectId = id;
this.numberOfUnpaidInvoices = numberOfUnpaidInvoices;
this.balanceOfUnpaidInvoices = balanceOfUnpaidInvoices;
this.dateOfEarliestUnpaidInvoice = dateOfEarliestUnpaidInvoice;
+ this.accountTimeZone = accountTimeZone;
this.idOfEarliestUnpaidInvoice = idOfEarliestUnpaidInvoice;
this.responseForLastFailedPayment = responseForLastFailedPayment;
this.tags = tags;
@@ -62,7 +66,7 @@ public class BillingState<T extends Blockable> {
return balanceOfUnpaidInvoices;
}
- public DateTime getDateOfEarliestUnpaidInvoice() {
+ public LocalDate getDateOfEarliestUnpaidInvoice() {
return dateOfEarliestUnpaidInvoice;
}
@@ -78,4 +82,7 @@ public class BillingState<T extends Blockable> {
return tags;
}
+ public DateTimeZone getAccountTimeZone() {
+ return accountTimeZone;
+ }
}
diff --git a/api/src/main/java/com/ning/billing/overdue/config/api/BillingStateBundle.java b/api/src/main/java/com/ning/billing/overdue/config/api/BillingStateBundle.java
index 600b1c2..00ac5fd 100644
--- a/api/src/main/java/com/ning/billing/overdue/config/api/BillingStateBundle.java
+++ b/api/src/main/java/com/ning/billing/overdue/config/api/BillingStateBundle.java
@@ -19,7 +19,8 @@ package com.ning.billing.overdue.config.api;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.PhaseType;
@@ -29,6 +30,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionBundle;
import com.ning.billing.util.tag.Tag;
public class BillingStateBundle extends BillingState<SubscriptionBundle> {
+
private final Product basePlanProduct;
private final BillingPeriod basePlanBillingPeriod;
private final PriceList basePlanPriceList;
@@ -37,7 +39,8 @@ public class BillingStateBundle extends BillingState<SubscriptionBundle> {
public BillingStateBundle(final UUID id,
final int numberOfUnpaidInvoices,
final BigDecimal unpaidInvoiceBalance,
- final DateTime dateOfEarliestUnpaidInvoice,
+ final LocalDate dateOfEarliestUnpaidInvoice,
+ final DateTimeZone accountTimeZone,
final UUID idOfEarliestUnpaidInvoice,
final PaymentResponse responseForLastFailedPayment,
final Tag[] tags,
@@ -45,7 +48,7 @@ public class BillingStateBundle extends BillingState<SubscriptionBundle> {
final BillingPeriod basePlanBillingPeriod,
final PriceList basePlanPriceList, final PhaseType basePlanPhaseType) {
super(id, numberOfUnpaidInvoices, unpaidInvoiceBalance,
- dateOfEarliestUnpaidInvoice, idOfEarliestUnpaidInvoice,
+ dateOfEarliestUnpaidInvoice, accountTimeZone, idOfEarliestUnpaidInvoice,
responseForLastFailedPayment, tags);
this.basePlanProduct = basePlanProduct;
diff --git a/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java b/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java
index 8449db2..e423d10 100644
--- a/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java
+++ b/api/src/main/java/com/ning/billing/overdue/config/api/OverdueStateSet.java
@@ -16,7 +16,7 @@
package com.ning.billing.overdue.config.api;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.junction.api.Blockable;
import com.ning.billing.overdue.OverdueApiException;
@@ -28,7 +28,15 @@ public interface OverdueStateSet<T extends Blockable> {
public abstract OverdueState<T> findState(String stateName) throws OverdueApiException;
- public abstract OverdueState<T> calculateOverdueState(BillingState<T> billingState, DateTime now) throws OverdueApiException;
+ /**
+ * Compute an overdue state, given a billing state, at a given day.
+ *
+ * @param billingState the billing state
+ * @param now the day to use to calculate the overdue state, in the account timezone
+ * @return the overdue state
+ * @throws OverdueApiException
+ */
+ public abstract OverdueState<T> calculateOverdueState(BillingState<T> billingState, LocalDate now) throws OverdueApiException;
public abstract int size();
-}
\ No newline at end of file
+}
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
index c6b1d85..8709621 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
@@ -237,7 +237,7 @@ public class TestOverdueIntegration extends TestIntegrationBase {
checkODState("OD3");
paymentPlugin.makeAllInvoicesFailWithError(false);
- final Collection<Invoice> invoices = invoiceApi.getUnpaidInvoicesByAccountId(account.getId(), clock.getUTCNow());
+ final Collection<Invoice> invoices = invoiceApi.getUnpaidInvoicesByAccountId(account.getId(), clock.getUTCToday());
final List<String> invoiceIds = new ArrayList<String>();
for (final Invoice invoice : invoices) {
invoiceIds.add(invoice.getId().toString());
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
index 27dddf5..62e15e2 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
@@ -24,6 +24,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
@@ -449,9 +450,8 @@ public class TestAnalytics extends TestIntegrationBase {
// No billing period for the trial item
Assert.assertEquals(invoiceItem.getBillingPeriod(), subscription.getCurrentPhase().getBillingPeriod().toString());
Assert.assertEquals(invoiceItem.getCurrency(), account.getCurrency());
- final DateTime subscriptionEndDate = subscription.getStartDate().plus(subscription.getCurrentPhase().getDuration().toJodaPeriod());
- final DateTime roundedSubscriptionEndDate = InvoiceDateUtils.roundDateTimeToDate(subscriptionEndDate, DateTimeZone.UTC);
- Assert.assertEquals(invoiceItem.getEndDate(), roundedSubscriptionEndDate);
+ // No end date for the trial item (fixed price of zero)
+ Assert.assertNull(invoiceItem.getEndDate());
Assert.assertEquals(invoiceItem.getExternalKey(), bundle.getKey());
Assert.assertEquals(invoiceItem.getInvoiceId(), invoice.getInvoiceId());
Assert.assertEquals(invoiceItem.getItemType(), "FIXED");
@@ -461,8 +461,7 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(invoiceItem.getProductType(), subscription.getCurrentPlan().getProduct().getCatalogName());
Assert.assertEquals(invoiceItem.getSlug(), subscription.getCurrentPhase().getName());
final DateTime subscriptionStartDate = subscription.getStartDate();
- final DateTime roundedSubscriptionStartDate = InvoiceDateUtils.roundDateTimeToDate(subscriptionStartDate, DateTimeZone.UTC);
- Assert.assertEquals(invoiceItem.getStartDate(), roundedSubscriptionStartDate);
+ Assert.assertEquals(invoiceItem.getStartDate(), new LocalDate(subscriptionStartDate.getYear(), subscriptionStartDate.getMonthOfYear(), subscriptionStartDate.getDayOfMonth()));
return subscription;
}
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
index d43f6d1..36854d4 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
@@ -23,6 +23,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.Interval;
+import org.joda.time.LocalDate;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
@@ -44,6 +45,7 @@ import com.google.common.collect.ImmutableList;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
@Guice(modules = {BeatrixModule.class})
@@ -51,12 +53,12 @@ public class TestIntegration extends TestIntegrationBase {
@Test(groups = "slow")
public void testCancelBPWithAOTheSameDay() throws Exception {
// We take april as it has 30 days (easier to play with BCD)
- final DateTime today = new DateTime(2012, 4, 1, 0, 0, 0, 0, testTimeZone);
- final DateTime trialEndDate = new DateTime(2012, 5, 1, 0, 0, 0, 0, testTimeZone);
+ final LocalDate today = new LocalDate(2012, 4, 1);
+ final LocalDate trialEndDate = new LocalDate(2012, 5, 1);
final Account account = createAccountWithPaymentMethod(getAccountData(1));
- // Set clock to the initial start date
- clock.setDeltaFromReality(today.getMillis() - clock.getUTCNow().getMillis());
+ // Set clock to the initial start date - we implicitly assume here that the account timezone is UTC
+ clock.setDeltaFromReality(today.toDateTimeAtCurrentTime().getMillis() - clock.getUTCNow().getMillis());
final SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(account.getId(), "whatever", context);
final String productName = "Shotgun";
@@ -81,7 +83,7 @@ public class TestIntegration extends TestIntegrationBase {
//
busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.INVOICE, NextEvent.PAYMENT);
final PlanPhaseSpecifier addonPlanPhaseSpecifier = new PlanPhaseSpecifier("Telescopic-Scope", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
- final SubscriptionData aoSubscription = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(), addonPlanPhaseSpecifier, null, context));
+ entitlementUserApi.createSubscription(bundle.getId(), addonPlanPhaseSpecifier, null, context);
assertTrue(busHandler.isCompleted(DELAY));
assertListenerStatus();
@@ -98,7 +100,8 @@ public class TestIntegration extends TestIntegrationBase {
// The first invoice is for the trial BP
assertEquals(invoices.get(0).getNumberOfItems(), 1);
assertEquals(invoices.get(0).getInvoiceItems().get(0).getStartDate().compareTo(today), 0);
- assertEquals(invoices.get(0).getInvoiceItems().get(0).getEndDate().compareTo(trialEndDate), 0);
+ // No end date for the trial item (fixed price of zero)
+ assertNull(invoices.get(0).getInvoiceItems().get(0).getEndDate());
// The second invoice should be adjusted for the AO (we paid for the full period)
assertEquals(invoices.get(1).getNumberOfItems(), 3);
for (final InvoiceItem item : invoices.get(1).getInvoiceItems()) {
@@ -355,10 +358,9 @@ public class TestIntegration extends TestIntegrationBase {
// VERIFY CTD HAS BEEN SET
//
final DateTime startDate = subscription.getCurrentPhaseStart();
- DateTime endDate = startDate.plusDays(30);
final BigDecimal rate = subscription.getCurrentPhase().getFixedPrice().getPrice(Currency.USD);
final int invoiceItemCount = 1;
- verifyTestResult(accountId, subscription.getId(), startDate, endDate, rate, endDate, invoiceItemCount);
+ verifyTestResult(accountId, subscription.getId(), startDate, null, rate, clock.getUTCNow(), invoiceItemCount);
//
// MOVE TIME TO AFTER TRIAL AND EXPECT BOTH EVENTS : NextEvent.PHASE NextEvent.INVOICE
@@ -374,7 +376,7 @@ public class TestIntegration extends TestIntegrationBase {
// MOVE AFTER CANCEL DATE AND EXPECT EVENT : NextEvent.CANCEL
busHandler.pushExpectedEvent(NextEvent.CANCEL);
- endDate = subscription.getChargedThroughDate();
+ DateTime endDate = subscription.getChargedThroughDate();
final Interval it = new Interval(clock.getUTCNow(), endDate);
clock.addDeltaFromReality(it.toDurationMillis());
assertTrue(busHandler.isCompleted(DELAY));
@@ -420,10 +422,10 @@ public class TestIntegration extends TestIntegrationBase {
// VERIFY CTD HAS BEEN SET
//
DateTime startDate = subscription.getCurrentPhaseStart();
- DateTime endDate = startDate.plusDays(30);
BigDecimal rate = subscription.getCurrentPhase().getFixedPrice().getPrice(Currency.USD);
int invoiceItemCount = 1;
- verifyTestResult(accountId, subscription.getId(), startDate, endDate, rate, endDate, invoiceItemCount);
+ // No end date for the trial item (fixed price of zero), and CTD should be today (i.e. when the trial started)
+ verifyTestResult(accountId, subscription.getId(), startDate, null, rate, clock.getUTCNow(), invoiceItemCount);
//
// CHANGE PLAN IMMEDIATELY AND EXPECT BOTH EVENTS: NextEvent.CHANGE NextEvent.INVOICE
@@ -442,9 +444,9 @@ public class TestIntegration extends TestIntegrationBase {
// VERIFY AGAIN CTD HAS BEEN SET
//
startDate = subscription.getCurrentPhaseStart();
- endDate = startDate.plusDays(30);
invoiceItemCount = 2;
- verifyTestResult(accountId, subscription.getId(), startDate, endDate, rate, endDate, invoiceItemCount);
+ // No end date for the trial item (fixed price of zero), and CTD should be today (i.e. when the second trial started)
+ verifyTestResult(accountId, subscription.getId(), startDate, null, rate, clock.getUTCNow(), invoiceItemCount);
//
// MOVE TIME
@@ -520,7 +522,7 @@ public class TestIntegration extends TestIntegrationBase {
assertTrue(busHandler.isCompleted(DELAY));
startDate = chargeThroughDate;
- endDate = chargeThroughDate.plusMonths(1);
+ DateTime endDate = chargeThroughDate.plusMonths(1);
price = subscription.getCurrentPhase().getRecurringPrice().getPrice(Currency.USD);
invoiceItemCount += 1;
verifyTestResult(accountId, subscription.getId(), startDate, endDate, price, endDate, invoiceItemCount);
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
index 16266bd..9b872f6 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
@@ -22,8 +22,11 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.IDBI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -205,7 +208,7 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
}
protected void verifyTestResult(final UUID accountId, final UUID subscriptionId,
- final DateTime startDate, final DateTime endDate,
+ final DateTime startDate, @Nullable final DateTime endDate,
final BigDecimal amount, final DateTime chargeThroughDate,
final int totalInvoiceItemCount) throws EntitlementUserApiException {
final SubscriptionData subscription = subscriptionDataFromSubscription(entitlementUserApi.getSubscriptionFromId(subscriptionId));
@@ -219,12 +222,10 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
boolean wasFound = false;
- // Make sure to round the dates in the comparisons as the invoice items dates are rounded
- final DateTime roundedStartDate = InvoiceDateUtils.roundDateTimeToDate(startDate, testTimeZone);
- final DateTime roundedEndDate = InvoiceDateUtils.roundDateTimeToDate(endDate, testTimeZone);
+ // We implicitly assume here that the account timezone is the same as the one for startDate/endDate
for (final InvoiceItem item : invoiceItems) {
- if (item.getStartDate().compareTo(roundedStartDate) == 0) {
- if (item.getEndDate().compareTo(roundedEndDate) == 0) {
+ if (item.getStartDate().compareTo(new LocalDate(startDate)) == 0) {
+ if ((item.getEndDate() == null && endDate == null) || (item.getEndDate() != null && new LocalDate(endDate).compareTo(item.getEndDate()) == 0)) {
if (item.getAmount().compareTo(amount) == 0) {
wasFound = true;
break;
@@ -240,9 +241,10 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
final DateTime ctd = subscription.getChargedThroughDate();
assertNotNull(ctd);
log.info("Checking CTD: " + ctd.toString() + "; clock is " + clock.getUTCNow().toString());
- assertTrue(clock.getUTCNow().isBefore(ctd));
+ // Either the ctd is today (start of the trial) or the clock is strictly before the CTD
+ assertTrue(clock.getUTCToday().compareTo(new LocalDate(ctd)) == 0 || clock.getUTCNow().isBefore(ctd));
// The CTD is rounded too
- assertTrue(ctd.compareTo(InvoiceDateUtils.roundDateTimeToDate(chargeThroughDate, testTimeZone)) == 0);
+ assertTrue(ctd.compareTo(new DateTime(chargeThroughDate.getYear(), chargeThroughDate.getMonthOfYear(), chargeThroughDate.getDayOfMonth(), 0, 0, testTimeZone)) == 0);
}
protected SubscriptionData subscriptionDataFromSubscription(final Subscription sub) {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
index b80a18f..5c5e7fc 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
@@ -81,7 +81,7 @@ public interface BundleSqlDao extends Transactional<BundleSqlDao>, EntitySqlDao<
final UUID id = UUID.fromString(r.getString("id"));
final String key = r.getString("external_key");
final UUID accountId = UUID.fromString(r.getString("account_id"));
- final DateTime lastSysUpdateDate = getDate(r, "last_sys_update_date");
+ final DateTime lastSysUpdateDate = getDateTime(r, "last_sys_update_date");
return new SubscriptionBundleData(id, key, accountId, lastSysUpdateDate);
}
}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
index bc4bd1e..74973b7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
@@ -133,9 +133,9 @@ public interface EntitlementEventSqlDao extends Transactional<EntitlementEventSq
final UUID id = UUID.fromString(r.getString("id"));
final EventType eventType = EventType.valueOf(r.getString("event_type"));
final ApiEventType userType = (eventType == EventType.API_USER) ? ApiEventType.valueOf(r.getString("user_type")) : null;
- final DateTime createdDate = getDate(r, "created_date");
- final DateTime requestedDate = getDate(r, "requested_date");
- final DateTime effectiveDate = getDate(r, "effective_date");
+ final DateTime createdDate = getDateTime(r, "created_date");
+ final DateTime requestedDate = getDateTime(r, "requested_date");
+ final DateTime effectiveDate = getDateTime(r, "effective_date");
final UUID subscriptionId = UUID.fromString(r.getString("subscription_id"));
final String planName = r.getString("plan_name");
final String phaseName = r.getString("phase_name");
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
index 07c72c0..861973c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
@@ -96,10 +96,10 @@ public interface SubscriptionSqlDao extends Transactional<SubscriptionSqlDao>, A
final UUID id = UUID.fromString(r.getString("id"));
final UUID bundleId = UUID.fromString(r.getString("bundle_id"));
final ProductCategory category = ProductCategory.valueOf(r.getString("category"));
- final DateTime bundleStartDate = getDate(r, "bundle_start_date");
- final DateTime startDate = getDate(r, "start_date");
- final DateTime ctd = getDate(r, "charged_through_date");
- final DateTime ptd = getDate(r, "paid_through_date");
+ final DateTime bundleStartDate = getDateTime(r, "bundle_start_date");
+ final DateTime startDate = getDateTime(r, "start_date");
+ final DateTime ctd = getDateTime(r, "charged_through_date");
+ final DateTime ptd = getDateTime(r, "paid_through_date");
final long activeVersion = r.getLong("active_version");
return new SubscriptionData(new SubscriptionBuilder()
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
index f0c3d0c..e5ea92c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
@@ -16,7 +16,6 @@
package com.ning.billing.invoice.api;
-import com.google.inject.Inject;
import com.ning.billing.invoice.InvoiceListener;
import com.ning.billing.invoice.notification.NextBillingDateNotifier;
import com.ning.billing.lifecycle.LifecycleHandlerType;
@@ -25,6 +24,8 @@ import com.ning.billing.util.bus.Bus;
import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotificationQueue;
import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.google.inject.Inject;
+
public class DefaultInvoiceService implements InvoiceService {
public static final String INVOICE_SERVICE_NAME = "invoice-service";
@@ -39,7 +40,6 @@ public class DefaultInvoiceService implements InvoiceService {
this.dateNotifier = dateNotifier;
}
-
@Override
public String getName() {
return INVOICE_SERVICE_NAME;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
index dfb40b4..400046c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
@@ -23,7 +23,6 @@ import java.util.UUID;
import org.joda.time.DateTime;
-import com.google.inject.Inject;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
@@ -34,6 +33,8 @@ import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.model.DefaultInvoicePayment;
import com.ning.billing.util.callcontext.CallContext;
+import com.google.inject.Inject;
+
public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
private final InvoiceDao dao;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
index 67d3c77..7294117 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -19,11 +19,11 @@ package com.ning.billing.invoice.api.migration;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.inject.Inject;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountApiException;
import com.ning.billing.account.api.AccountUserApi;
@@ -39,6 +39,8 @@ import com.ning.billing.util.callcontext.DefaultCallContextFactory;
import com.ning.billing.util.callcontext.UserType;
import com.ning.billing.util.clock.Clock;
+import com.google.inject.Inject;
+
public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceMigrationApi.class);
@@ -54,7 +56,7 @@ public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
}
@Override
- public UUID createMigrationInvoice(final UUID accountId, final DateTime targetDate, final BigDecimal balance, final Currency currency) {
+ public UUID createMigrationInvoice(final UUID accountId, final LocalDate targetDate, final BigDecimal balance, final Currency currency) {
final Account account;
try {
account = accountUserApi.getAccountById(accountId);
@@ -64,7 +66,7 @@ public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
}
final CallContext context = new DefaultCallContextFactory(clock).createMigrationCallContext("Migration", CallOrigin.INTERNAL, UserType.MIGRATION, clock.getUTCNow(), clock.getUTCNow());
- final Invoice migrationInvoice = new MigrationInvoice(accountId, clock.getUTCNow(), targetDate, currency);
+ final Invoice migrationInvoice = new MigrationInvoice(accountId, clock.getUTCToday(), targetDate, currency);
final InvoiceItem migrationInvoiceItem = new MigrationInvoiceItem(migrationInvoice.getId(), accountId, targetDate, balance, currency);
migrationInvoice.addInvoiceItem(migrationInvoiceItem);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java
index a23bd01..3534e6d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java
@@ -18,13 +18,13 @@ package com.ning.billing.invoice.api.migration;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.model.DefaultInvoice;
public class MigrationInvoice extends DefaultInvoice {
- public MigrationInvoice(final UUID accountId, final DateTime invoiceDate, final DateTime targetDate, final Currency currency) {
+ public MigrationInvoice(final UUID accountId, final LocalDate invoiceDate, final LocalDate targetDate, final Currency currency) {
super(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, true);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
index 6a3cf86..82969a4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
@@ -19,13 +19,12 @@ package com.ning.billing.invoice.api.user;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
@@ -33,7 +32,6 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
private final UUID accountId;
private final BigDecimal amountOwed;
private final Currency currency;
- private final DateTime invoiceCreationDate;
private final UUID userToken;
@JsonCreator
@@ -41,13 +39,11 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
@JsonProperty("accountId") final UUID accountId,
@JsonProperty("amountOwed") final BigDecimal amountOwed,
@JsonProperty("currency") final Currency currency,
- @JsonProperty("invoiceCreationDate") final DateTime invoiceCreationDate,
@JsonProperty("userToken") final UUID userToken) {
this.invoiceId = invoiceId;
this.accountId = accountId;
this.amountOwed = amountOwed;
this.currency = currency;
- this.invoiceCreationDate = invoiceCreationDate;
this.userToken = userToken;
}
@@ -83,88 +79,33 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
}
@Override
- public DateTime getInvoiceCreationDate() {
- return invoiceCreationDate;
+ public String toString() {
+ return "DefaultInvoiceCreationNotification [invoiceId=" + invoiceId + ", accountId=" + accountId + ", amountOwed=" + amountOwed + ", currency=" + currency + "]";
}
@Override
- public String toString() {
- return "DefaultInvoiceCreationNotification [invoiceId=" + invoiceId + ", accountId=" + accountId + ", amountOwed=" + amountOwed + ", currency=" + currency + ", invoiceCreationDate=" + invoiceCreationDate + "]";
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final DefaultInvoiceCreationEvent that = (DefaultInvoiceCreationEvent) o;
+
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) return false;
+ if (amountOwed != null ? !amountOwed.equals(that.amountOwed) : that.amountOwed != null) return false;
+ if (currency != that.currency) return false;
+ if (invoiceId != null ? !invoiceId.equals(that.invoiceId) : that.invoiceId != null) return false;
+ if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) return false;
+
+ return true;
}
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result
- + ((accountId == null) ? 0 : accountId.hashCode());
- result = prime * result
- + ((amountOwed == null) ? 0 : amountOwed.hashCode());
- result = prime * result
- + ((currency == null) ? 0 : currency.hashCode());
- result = prime
- * result
- + ((invoiceCreationDate == null) ? 0 : invoiceCreationDate
- .hashCode());
- result = prime * result
- + ((invoiceId == null) ? 0 : invoiceId.hashCode());
- result = prime * result
- + ((userToken == null) ? 0 : userToken.hashCode());
+ int result = invoiceId != null ? invoiceId.hashCode() : 0;
+ result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
+ result = 31 * result + (amountOwed != null ? amountOwed.hashCode() : 0);
+ result = 31 * result + (currency != null ? currency.hashCode() : 0);
+ result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
return result;
}
-
- @Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final DefaultInvoiceCreationEvent other = (DefaultInvoiceCreationEvent) obj;
- if (accountId == null) {
- if (other.accountId != null) {
- return false;
- }
- } else if (!accountId.equals(other.accountId)) {
- return false;
- }
- if (amountOwed == null) {
- if (other.amountOwed != null) {
- return false;
- }
- } else if (!amountOwed.equals(other.amountOwed)) {
- return false;
- }
- if (currency != other.currency) {
- return false;
- }
- if (invoiceCreationDate == null) {
- if (other.invoiceCreationDate != null) {
- return false;
- }
- } else if (invoiceCreationDate.compareTo(other.invoiceCreationDate) != 0) {
- return false;
- }
- if (invoiceId == null) {
- if (other.invoiceId != null) {
- return false;
- }
- } else if (!invoiceId.equals(other.invoiceId)) {
- return false;
- }
- if (userToken == null) {
- if (other.userToken != null) {
- return false;
- }
- } else if (!userToken.equals(other.userToken)) {
- return false;
- }
- return true;
- }
-
-
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 19b5523..90db0b1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -22,8 +22,8 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
-import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountApiException;
@@ -40,7 +40,10 @@ import com.ning.billing.invoice.template.HtmlInvoiceGenerator;
import com.ning.billing.util.api.TagApiException;
import com.ning.billing.util.callcontext.CallContext;
+import com.google.inject.Inject;
+
public class DefaultInvoiceUserApi implements InvoiceUserApi {
+
private final InvoiceDao dao;
private final InvoiceDispatcher dispatcher;
private final AccountUserApi accountUserApi;
@@ -60,7 +63,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
@Override
- public List<Invoice> getInvoicesByAccount(final UUID accountId, final DateTime fromDate) {
+ public List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate) {
return dao.getInvoicesByAccount(accountId, fromDate);
}
@@ -86,15 +89,22 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
@Override
- public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
+ public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate) {
return dao.getUnpaidInvoicesByAccountId(accountId, upToDate);
}
@Override
- public Invoice triggerInvoiceGeneration(final UUID accountId,
- final DateTime targetDate, final boolean dryRun,
+ public Invoice triggerInvoiceGeneration(final UUID accountId, final LocalDate targetDate, final boolean dryRun,
final CallContext context) throws InvoiceApiException {
- final Invoice result = dispatcher.processAccount(accountId, targetDate, dryRun, context);
+ final Account account;
+ try {
+ account = accountUserApi.getAccountById(accountId);
+ } catch (AccountApiException e) {
+ throw new InvoiceApiException(e, ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID, e.toString());
+ }
+
+ final DateTime processingDateTime = targetDate.toDateTimeAtCurrentTime(account.getTimeZone());
+ final Invoice result = dispatcher.processAccount(accountId, processingDateTime, dryRun, context);
if (result == null) {
throw new InvoiceApiException(ErrorCode.INVOICE_NOTHING_TO_DO, accountId, targetDate);
} else {
@@ -118,19 +128,17 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
@Override
- public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final DateTime effectiveDate,
+ public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final LocalDate effectiveDate,
final Currency currency, final CallContext context) throws InvoiceApiException {
return dao.insertCredit(accountId, null, amount, effectiveDate, currency, context);
}
@Override
- public InvoiceItem insertCreditForInvoice(UUID accountId, UUID invoiceId,
- BigDecimal amount, DateTime effectiveDate, Currency currency,
- CallContext context) throws InvoiceApiException {
+ public InvoiceItem insertCreditForInvoice(final UUID accountId, final UUID invoiceId, final BigDecimal amount,
+ final LocalDate effectiveDate, final Currency currency, final CallContext context) throws InvoiceApiException {
return dao.insertCredit(accountId, invoiceId, amount, effectiveDate, currency, context);
}
-
@Override
public String getInvoiceAsHTML(final UUID invoiceId) throws AccountApiException, IOException, InvoiceApiException {
final Invoice invoice = getInvoice(invoiceId);
@@ -141,4 +149,5 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
final Account account = accountUserApi.getAccountById(invoice.getAccountId());
return generator.generateInvoice(account, invoice);
}
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java
index b9c431c..7b4a35a 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java
@@ -18,22 +18,24 @@ package com.ning.billing.invoice.api.user;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+
+import com.ning.billing.invoice.api.NullInvoiceEvent;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
public class DefaultNullInvoiceEvent implements NullInvoiceEvent {
+
private final UUID accountId;
- private final DateTime processingDate;
+ private final LocalDate processingDate;
private final UUID userToken;
@JsonCreator
public DefaultNullInvoiceEvent(@JsonProperty("accountId") final UUID accountId,
- @JsonProperty("processingDate") final DateTime processingDate,
- @JsonProperty("userToken") final UUID userToken) {
+ @JsonProperty("processingDate") final LocalDate processingDate,
+ @JsonProperty("userToken") final UUID userToken) {
super();
this.accountId = accountId;
this.processingDate = processingDate;
@@ -56,7 +58,7 @@ public class DefaultNullInvoiceEvent implements NullInvoiceEvent {
return accountId;
}
- public DateTime getProcessingDate() {
+ public LocalDate getProcessingDate() {
return processingDate;
}
@@ -76,11 +78,11 @@ public class DefaultNullInvoiceEvent implements NullInvoiceEvent {
final int prime = 31;
int result = 1;
result = prime * result
- + ((accountId == null) ? 0 : accountId.hashCode());
+ + ((accountId == null) ? 0 : accountId.hashCode());
result = prime * result
- + ((processingDate == null) ? 0 : processingDate.hashCode());
+ + ((processingDate == null) ? 0 : processingDate.hashCode());
result = prime * result
- + ((userToken == null) ? 0 : userToken.hashCode());
+ + ((userToken == null) ? 0 : userToken.hashCode());
return result;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 86d7bef..94ffef9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.IDBI;
import org.skife.jdbi.v2.Transaction;
import org.skife.jdbi.v2.TransactionStatus;
@@ -100,11 +101,11 @@ public class DefaultInvoiceDao implements InvoiceDao {
}
@Override
- public List<Invoice> getInvoicesByAccount(final UUID accountId, final DateTime fromDate) {
+ public List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate) {
return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
@Override
public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
- final List<Invoice> invoices = invoiceDao.getInvoicesByAccountAfterDate(accountId.toString(), fromDate.toDate());
+ final List<Invoice> invoices = invoiceDao.getInvoicesByAccountAfterDate(accountId.toString(), fromDate.toDateTimeAtStartOfDay().toDate());
populateChildren(invoices, invoiceDao);
@@ -256,7 +257,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
}
@Override
- public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
+ public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate) {
return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
@Override
public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
@@ -345,7 +346,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
BigDecimal cbaAdjAmount = BigDecimal.ZERO;
if (accountCbaAvailable.compareTo(BigDecimal.ZERO) > 0) {
cbaAdjAmount = (requestedPositiveAmount.compareTo(accountCbaAvailable) > 0) ? accountCbaAvailable.negate() : requestedPositiveAmount.negate();
- final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate(), cbaAdjAmount, invoice.getCurrency());
+ final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), new LocalDate(context.getCreatedDate()), cbaAdjAmount, invoice.getCurrency());
transInvoiceItemDao.create(cbaAdjItem, context);
}
final BigDecimal requestedPositiveAmountAfterCbaAdj = requestedPositiveAmount.add(cbaAdjAmount);
@@ -354,7 +355,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
final BigDecimal maxBalanceToAdjust = (invoiceBalanceAfterRefund.compareTo(BigDecimal.ZERO) <= 0) ? BigDecimal.ZERO : invoiceBalanceAfterRefund;
final BigDecimal requestedPositiveAmountToAdjust = requestedPositiveAmountAfterCbaAdj.compareTo(maxBalanceToAdjust) > 0 ? maxBalanceToAdjust : requestedPositiveAmountAfterCbaAdj;
if (requestedPositiveAmountToAdjust.compareTo(BigDecimal.ZERO) > 0) {
- final InvoiceItem adjItem = new RefundAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate(), requestedPositiveAmountToAdjust.negate(), invoice.getCurrency());
+ final InvoiceItem adjItem = new RefundAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), new LocalDate(context.getCreatedDate()), requestedPositiveAmountToAdjust.negate(), invoice.getCurrency());
transInvoiceItemDao.create(adjItem, context);
}
}
@@ -433,7 +434,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount,
- final DateTime effectiveDate, final Currency currency,
+ final LocalDate effectiveDate, final Currency currency,
final CallContext context) {
return invoiceSqlDao.inTransaction(new Transaction<InvoiceItem, InvoiceSqlDao>() {
@@ -537,7 +538,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
// we'll be notified by entitlement.
if (shouldBeNotified) {
// We could be notified at any time during the day at the billCycleDay - use the current time to
- // spread the load
+ // spread the load.
final DateTime nextNotificationDateTime = InvoiceDateUtils.calculateBillingCycleDateAfter(clock.getUTCNow(), billCycleDay);
// NextBillingDatePoster will ignore duplicates
nextBillingDatePoster.insertNextBillingNotification(dao, accountId, subscriptionForNextNotification, nextNotificationDateTime);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index bef6721..f872cf2 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -20,7 +20,7 @@ import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
@@ -31,6 +31,7 @@ import com.ning.billing.util.api.TagApiException;
import com.ning.billing.util.callcontext.CallContext;
public interface InvoiceDao {
+
void create(final Invoice invoice, final int billCycleDay, final CallContext context);
Invoice getById(final UUID id);
@@ -41,7 +42,7 @@ public interface InvoiceDao {
List<Invoice> getInvoicesByAccount(final UUID accountId);
- List<Invoice> getInvoicesByAccount(final UUID accountId, final DateTime fromDate);
+ List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate);
List<Invoice> getInvoicesBySubscription(final UUID subscriptionId);
@@ -55,7 +56,7 @@ public interface InvoiceDao {
public BigDecimal getAccountCBA(final UUID accountId);
- List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate);
+ List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate);
void test();
@@ -82,6 +83,6 @@ public interface InvoiceDao {
InvoiceItem getCreditById(final UUID creditId) throws InvoiceApiException;
InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount,
- final DateTime effectiveDate, final Currency currency, final CallContext context);
+ final LocalDate effectiveDate, final Currency currency, final CallContext context);
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
index e9b888d..e7ddfb8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemSqlDao.java
@@ -13,6 +13,7 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.dao;
import java.lang.annotation.Annotation;
@@ -26,7 +27,7 @@ import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.sqlobject.Bind;
@@ -54,12 +55,10 @@ import com.ning.billing.util.callcontext.CallContextBinder;
import com.ning.billing.util.dao.MapperBase;
import com.ning.billing.util.entity.dao.EntitySqlDao;
-
@ExternalizedSqlViaStringTemplate3()
@RegisterMapper(InvoiceItemSqlDao.InvoiceItemSqlDaoMapper.class)
public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
-
@SqlQuery
List<Long> getRecordIds(@Bind("invoiceId") final String invoiceId);
@@ -83,7 +82,9 @@ public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface InvoiceItemBinder {
+
public static class InvoiceItemBinderFactory implements BinderFactory {
+
@Override
public Binder build(final Annotation annotation) {
return new Binder<InvoiceItemBinder, InvoiceItem>() {
@@ -110,6 +111,7 @@ public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
}
public static class InvoiceItemSqlDaoMapper extends MapperBase implements ResultSetMapper<InvoiceItem> {
+
@Override
public InvoiceItem map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
final UUID id = getUUID(result, "id");
@@ -120,35 +122,35 @@ public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
final UUID bundleId = getUUID(result, "bundle_id");
final String planName = result.getString("plan_name");
final String phaseName = result.getString("phase_name");
- final DateTime startDate = getDate(result, "start_date");
- final DateTime endDate = getDate(result, "end_date");
+ final LocalDate startDate = getDate(result, "start_date");
+ final LocalDate endDate = getDate(result, "end_date");
final BigDecimal amount = result.getBigDecimal("amount");
final BigDecimal rate = result.getBigDecimal("rate");
final Currency currency = Currency.valueOf(result.getString("currency"));
final UUID linkedItemId = getUUID(result, "linked_item_id");
InvoiceItem item = null;
- switch(type) {
- case FIXED:
- item = new FixedPriceInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
- break;
- case RECURRING:
- item = new RecurringInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
- break;
- case CBA_ADJ:
- item = new CreditBalanceAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
- break;
- case CREDIT_ADJ:
- item = new CreditAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
- break;
- case REFUND_ADJ:
- item = new RefundAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
- break;
- case REPAIR_ADJ:
- item = new RepairAdjInvoiceItem(id, invoiceId, accountId, startDate, endDate, amount, currency, linkedItemId);
- break;
- default:
- throw new RuntimeException("Unexpected type of event item " + item);
+ switch (type) {
+ case FIXED:
+ item = new FixedPriceInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency);
+ break;
+ case RECURRING:
+ item = new RecurringInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
+ break;
+ case CBA_ADJ:
+ item = new CreditBalanceAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
+ break;
+ case CREDIT_ADJ:
+ item = new CreditAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
+ break;
+ case REFUND_ADJ:
+ item = new RefundAdjInvoiceItem(id, invoiceId, accountId, startDate, amount, currency);
+ break;
+ case REPAIR_ADJ:
+ item = new RepairAdjInvoiceItem(id, invoiceId, accountId, startDate, endDate, amount, currency, linkedItemId);
+ break;
+ default:
+ throw new RuntimeException("Unexpected type of event item " + item);
}
return item;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
index 4a9f143..31e85cd 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -58,6 +58,7 @@ import com.ning.billing.util.entity.dao.EntitySqlDao;
@ExternalizedSqlViaStringTemplate3
@RegisterMapper(InvoicePaymentSqlDao.InvoicePaymentMapper.class)
public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Transactional<InvoicePaymentSqlDao>, AuditSqlDao, Transmogrifier {
+
@SqlQuery
List<Long> getRecordIds(@Bind("invoiceId") final String invoiceId);
@@ -101,13 +102,14 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
List<InvoicePayment> getChargebacksByPaymentId(@Bind("paymentId") final String paymentId);
public static class InvoicePaymentMapper extends MapperBase implements ResultSetMapper<InvoicePayment> {
+
@Override
public InvoicePayment map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
final UUID id = getUUID(result, "id");
final InvoicePaymentType type = InvoicePaymentType.valueOf(result.getString("type"));
final UUID paymentId = getUUID(result, "payment_id");
final UUID invoiceId = getUUID(result, "invoice_id");
- final DateTime paymentDate = getDate(result, "payment_date");
+ final DateTime paymentDate = getDateTime(result, "payment_date");
final BigDecimal amount = result.getBigDecimal("amount");
final String currencyString = result.getString("currency");
final Currency currency = (currencyString == null) ? null : Currency.valueOf(currencyString);
@@ -123,7 +125,9 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface InvoicePaymentBinder {
+
public static class InvoicePaymentBinderFactory extends BinderBase implements BinderFactory {
+
@Override
public Binder build(final Annotation annotation) {
return new Binder<InvoicePaymentBinder, InvoicePayment>() {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index 845b7b9..6581d3f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -21,7 +21,6 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
@@ -29,6 +28,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.sqlobject.Bind;
@@ -50,12 +50,14 @@ import com.ning.billing.invoice.model.DefaultInvoice;
import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.callcontext.CallContextBinder;
import com.ning.billing.util.dao.AuditSqlDao;
+import com.ning.billing.util.dao.MapperBase;
import com.ning.billing.util.dao.UuidMapper;
import com.ning.billing.util.entity.dao.EntitySqlDao;
@ExternalizedSqlViaStringTemplate3()
@RegisterMapper(InvoiceSqlDao.InvoiceMapper.class)
public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Transactional<InvoiceSqlDao>, Transmogrifier, CloseMe {
+
@Override
@SqlUpdate
void create(@InvoiceBinder Invoice invoice, @CallContextBinder final CallContext context);
@@ -77,12 +79,13 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
@RegisterMapper(UuidMapper.class)
UUID getInvoiceIdByPaymentId(@Bind("paymentId") final String paymentId);
-
@BindingAnnotation(InvoiceBinder.InvoiceBinderFactory.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface InvoiceBinder {
+
public static class InvoiceBinderFactory implements BinderFactory {
+
@Override
public Binder<InvoiceBinder, Invoice> build(final Annotation annotation) {
return new Binder<InvoiceBinder, Invoice>() {
@@ -100,14 +103,15 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
}
}
- public static class InvoiceMapper implements ResultSetMapper<Invoice> {
+ public static class InvoiceMapper extends MapperBase implements ResultSetMapper<Invoice> {
+
@Override
public Invoice map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
final UUID id = UUID.fromString(result.getString("id"));
final UUID accountId = UUID.fromString(result.getString("account_id"));
final int invoiceNumber = result.getInt("invoice_number");
- final DateTime invoiceDate = new DateTime(result.getTimestamp("invoice_date"));
- final DateTime targetDate = new DateTime(result.getTimestamp("target_date"));
+ final LocalDate invoiceDate = getDate(result, "invoice_date");
+ final LocalDate targetDate = getDate(result, "target_date");
final Currency currency = Currency.valueOf(result.getString("currency"));
final boolean isMigrationInvoice = result.getBoolean("migrated");
diff --git a/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java
index 4264af1..ae23bd9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java
@@ -16,7 +16,6 @@
package com.ning.billing.invoice.generator;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
@@ -26,17 +25,17 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
-import org.joda.time.DateTime;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.joda.time.Months;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.catalog.api.Duration;
import com.ning.billing.config.InvoiceConfig;
import com.ning.billing.entitlement.api.billing.BillingEvent;
import com.ning.billing.entitlement.api.billing.BillingModeType;
@@ -57,7 +56,10 @@ import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
import com.ning.billing.junction.api.BillingEventSet;
import com.ning.billing.util.clock.Clock;
+import com.google.inject.Inject;
+
public class DefaultInvoiceGenerator implements InvoiceGenerator {
+
private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceGenerator.class);
private static final int ROUNDING_MODE = InvoicingConfiguration.getRoundingMode();
private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
@@ -76,9 +78,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
*/
@Override
public Invoice generateInvoice(final UUID accountId, @Nullable final BillingEventSet events,
- @Nullable final List<Invoice> existingInvoices,
- DateTime targetDate,
- final Currency targetCurrency) throws InvoiceApiException {
+ @Nullable final List<Invoice> existingInvoices,
+ final LocalDate targetDate, final DateTimeZone accountTimeZone,
+ final Currency targetCurrency) throws InvoiceApiException {
if ((events == null) || (events.size() == 0) || events.isAccountAutoInvoiceOff()) {
return null;
}
@@ -92,8 +94,8 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
for (final Invoice invoice : existingInvoices) {
for (final InvoiceItem item : invoice.getInvoiceItems()) {
if (item.getSubscriptionId() == null || // Always include migration invoices, credits etc.
- !events.getSubscriptionIdsWithAutoInvoiceOff()
- .contains(item.getSubscriptionId())) { //don't add items with auto_invoice_off tag
+ !events.getSubscriptionIdsWithAutoInvoiceOff()
+ .contains(item.getSubscriptionId())) { //don't add items with auto_invoice_off tag
existingItems.add(item);
}
}
@@ -102,11 +104,11 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
Collections.sort(existingItems);
}
- targetDate = adjustTargetDate(existingInvoices, targetDate);
+ final LocalDate adjustedTargetDate = adjustTargetDate(existingInvoices, targetDate);
- final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, targetCurrency);
+ final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), adjustedTargetDate, targetCurrency);
final UUID invoiceId = invoice.getId();
- final List<InvoiceItem> proposedItems = generateInvoiceItems(invoiceId, accountId, events, targetDate, targetCurrency);
+ final List<InvoiceItem> proposedItems = generateInvoiceItems(invoiceId, accountId, events, adjustedTargetDate, accountTimeZone, targetCurrency);
removeCancellingInvoiceItems(existingItems);
removeDuplicatedInvoiceItems(proposedItems, existingItems);
@@ -124,8 +126,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
}
- void generateCBAForExistingInvoices(final UUID accountId, final List<Invoice> existingInvoices, final List<InvoiceItem> proposedItems, final Currency currency) {
- // determine most accurate invoice balances up to this point
+ void generateCBAForExistingInvoices(final UUID accountId, final List<Invoice> existingInvoices,
+ final List<InvoiceItem> proposedItems, final Currency currency) {
+ // Determine most accurate invoice balances up to this point
final Map<UUID, BigDecimal> amountOwedByInvoice = new HashMap<UUID, BigDecimal>();
if (existingInvoices != null) {
@@ -146,7 +149,7 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
for (final UUID invoiceId : amountOwedByInvoice.keySet()) {
final BigDecimal invoiceBalance = amountOwedByInvoice.get(invoiceId);
if (invoiceBalance.compareTo(BigDecimal.ZERO) < 0) {
- final DateTime creditDate = InvoiceDateUtils.roundDateTimeToDate(clock.getUTCNow(), DateTimeZone.UTC);
+ final LocalDate creditDate = clock.getUTCToday();
final CreditBalanceAdjInvoiceItem creditInvoiceItem = new CreditBalanceAdjInvoiceItem(invoiceId, accountId, creditDate, invoiceBalance.negate(), currency);
proposedItems.add(creditInvoiceItem);
}
@@ -156,16 +159,16 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
void addRepairedItems(final List<InvoiceItem> existingItems, final List<InvoiceItem> proposedItems) {
for (final InvoiceItem existingItem : existingItems) {
if (existingItem.getInvoiceItemType() == InvoiceItemType.RECURRING ||
- existingItem.getInvoiceItemType() == InvoiceItemType.FIXED) {
+ existingItem.getInvoiceItemType() == InvoiceItemType.FIXED) {
final BigDecimal amountNegated = existingItem.getAmount() == null ? null : existingItem.getAmount().negate();
- final RepairAdjInvoiceItem repairItem = new RepairAdjInvoiceItem(existingItem.getInvoiceId(), existingItem.getAccountId(), existingItem.getStartDate(),existingItem.getEndDate(), amountNegated, existingItem.getCurrency(), existingItem.getId());
+ final RepairAdjInvoiceItem repairItem = new RepairAdjInvoiceItem(existingItem.getInvoiceId(), existingItem.getAccountId(), existingItem.getStartDate(), existingItem.getEndDate(), amountNegated, existingItem.getCurrency(), existingItem.getId());
proposedItems.add(repairItem);
}
}
}
void consumeExistingCredit(final UUID invoiceId, final UUID accountId, final List<InvoiceItem> existingItems,
- final List<InvoiceItem> proposedItems, final Currency targetCurrency) {
+ final List<InvoiceItem> proposedItems, final Currency targetCurrency) {
BigDecimal totalUnusedCreditAmount = BigDecimal.ZERO;
BigDecimal totalAmountOwed = BigDecimal.ZERO;
@@ -183,7 +186,6 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
}
-
BigDecimal creditAmount = BigDecimal.ZERO;
if (totalUnusedCreditAmount.compareTo(BigDecimal.ZERO) > 0) {
if (totalAmountOwed.abs().compareTo(totalUnusedCreditAmount.abs()) > 0) {
@@ -194,26 +196,26 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
if (creditAmount.compareTo(BigDecimal.ZERO) < 0) {
- final DateTime creditDate = InvoiceDateUtils.roundDateTimeToDate(clock.getUTCNow(), DateTimeZone.UTC);
+ final LocalDate creditDate = clock.getUTCToday();
final CreditBalanceAdjInvoiceItem creditInvoiceItem = new CreditBalanceAdjInvoiceItem(invoiceId, accountId, creditDate, creditAmount, targetCurrency);
proposedItems.add(creditInvoiceItem);
}
}
- void validateTargetDate(final DateTime targetDate) throws InvoiceApiException {
+ private void validateTargetDate(final LocalDate targetDate) throws InvoiceApiException {
final int maximumNumberOfMonths = config.getNumberOfMonthsInFuture();
- if (Months.monthsBetween(clock.getUTCNow(), targetDate).getMonths() > maximumNumberOfMonths) {
+ if (Months.monthsBetween(clock.getUTCToday(), targetDate).getMonths() > maximumNumberOfMonths) {
throw new InvoiceApiException(ErrorCode.INVOICE_TARGET_DATE_TOO_FAR_IN_THE_FUTURE, targetDate.toString());
}
}
- DateTime adjustTargetDate(final List<Invoice> existingInvoices, final DateTime targetDate) {
+ private LocalDate adjustTargetDate(final List<Invoice> existingInvoices, final LocalDate targetDate) {
if (existingInvoices == null) {
return targetDate;
}
- DateTime maxDate = targetDate;
+ LocalDate maxDate = targetDate;
for (final Invoice invoice : existingInvoices) {
if (invoice.getTargetDate().isAfter(maxDate)) {
@@ -225,10 +227,10 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
/*
- * removes all matching items from both submitted collections
+ * Removes all matching items from both submitted collections
*/
void removeDuplicatedInvoiceItems(final List<InvoiceItem> proposedItems,
- final List<InvoiceItem> existingInvoiceItems) {
+ final List<InvoiceItem> existingInvoiceItems) {
final Iterator<InvoiceItem> proposedItemIterator = proposedItems.iterator();
while (proposedItemIterator.hasNext()) {
final InvoiceItem proposedItem = proposedItemIterator.next();
@@ -264,8 +266,8 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
}
- List<InvoiceItem> generateInvoiceItems(final UUID invoiceId, final UUID accountId, final BillingEventSet events,
- final DateTime targetDate, final Currency currency) throws InvoiceApiException {
+ private List<InvoiceItem> generateInvoiceItems(final UUID invoiceId, final UUID accountId, final BillingEventSet events,
+ final LocalDate targetDate, final DateTimeZone accountTimeZone, final Currency currency) throws InvoiceApiException {
final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
if (events.size() == 0) {
@@ -281,10 +283,10 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
if (!events.getSubscriptionIdsWithAutoInvoiceOff().
contains(thisEvent.getSubscription().getId())) { // don't consider events for subscriptions that have auto_invoice_off
final BillingEvent adjustedNextEvent = (thisEvent.getSubscription().getId() == nextEvent.getSubscription().getId()) ? nextEvent : null;
- items.addAll(processEvents(invoiceId, accountId, thisEvent, adjustedNextEvent, targetDate, currency));
+ items.addAll(processEvents(invoiceId, accountId, thisEvent, adjustedNextEvent, targetDate, accountTimeZone, currency));
}
}
- items.addAll(processEvents(invoiceId, accountId, nextEvent, null, targetDate, currency));
+ items.addAll(processEvents(invoiceId, accountId, nextEvent, null, targetDate, accountTimeZone, currency));
// The above should reproduce the semantics of the code below using iterator instead of list.
//
@@ -302,14 +304,12 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
// Turn a set of events into a list of invoice items. Note that the dates on the invoice items will be rounded (granularity of a day)
- List<InvoiceItem> processEvents(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent, @Nullable final BillingEvent nextEvent,
- final DateTime targetDate, final Currency currency) throws InvoiceApiException {
+ private List<InvoiceItem> processEvents(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent, @Nullable final BillingEvent nextEvent,
+ final LocalDate targetDate, final DateTimeZone accountTimeZone, final Currency currency) throws InvoiceApiException {
final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
- final DateTime roundedTargetDate = InvoiceDateUtils.roundDateTimeToDate(targetDate, thisEvent.getTimeZone());
-
// Handle fixed price items
- final InvoiceItem fixedPriceInvoiceItem = generateFixedPriceItem(invoiceId, accountId, thisEvent, roundedTargetDate, currency);
+ final InvoiceItem fixedPriceInvoiceItem = generateFixedPriceItem(invoiceId, accountId, thisEvent, targetDate, currency);
if (fixedPriceInvoiceItem != null) {
items.add(fixedPriceInvoiceItem);
}
@@ -318,21 +318,18 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
final BillingPeriod billingPeriod = thisEvent.getBillingPeriod();
if (billingPeriod != BillingPeriod.NO_BILLING_PERIOD) {
final BillingMode billingMode = instantiateBillingMode(thisEvent.getBillingMode());
- // Invoice granularity is day; (if not some comparison might fail)
- final DateTime startDate = thisEvent.getEffectiveDate();
- final DateTime roundedStartDate = InvoiceDateUtils.roundDateTimeToDate(startDate, thisEvent.getTimeZone());
+ final LocalDate startDate = new LocalDate(thisEvent.getEffectiveDate(), thisEvent.getTimeZone());
- if (!roundedStartDate.isAfter(roundedTargetDate)) {
- final DateTime endDate = (nextEvent == null) ? null : nextEvent.getEffectiveDate();
+ if (!startDate.isAfter(targetDate)) {
+ final LocalDate endDate = (nextEvent == null) ? null : new LocalDate(nextEvent.getEffectiveDate(), nextEvent.getTimeZone());
- final DateTime roundedEndDate = InvoiceDateUtils.roundDateTimeToDate(endDate, thisEvent.getTimeZone());
final int billCycleDay = thisEvent.getBillCycleDay();
final List<RecurringInvoiceItemData> itemData;
try {
- itemData = billingMode.calculateInvoiceItemData(roundedStartDate, roundedEndDate, roundedTargetDate, billCycleDay, billingPeriod);
+ itemData = billingMode.calculateInvoiceItemData(startDate, endDate, targetDate, accountTimeZone, billCycleDay, billingPeriod);
} catch (InvalidDateSequenceException e) {
- throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_DATE_SEQUENCE, startDate, endDate, roundedTargetDate);
+ throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_DATE_SEQUENCE, startDate, endDate, targetDate);
}
for (final RecurringInvoiceItemData itemDatum : itemData) {
@@ -342,13 +339,13 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
final BigDecimal amount = itemDatum.getNumberOfCycles().multiply(rate).setScale(NUMBER_OF_DECIMALS, ROUNDING_MODE);
final RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId,
- accountId,
- thisEvent.getSubscription().getBundleId(),
- thisEvent.getSubscription().getId(),
- thisEvent.getPlan().getName(),
- thisEvent.getPlanPhase().getName(),
- itemDatum.getStartDate(), itemDatum.getEndDate(),
- amount, rate, currency);
+ accountId,
+ thisEvent.getSubscription().getBundleId(),
+ thisEvent.getSubscription().getId(),
+ thisEvent.getPlan().getName(),
+ thisEvent.getPlanPhase().getName(),
+ itemDatum.getStartDate(), itemDatum.getEndDate(),
+ amount, rate, currency);
items.add(recurringItem);
}
}
@@ -360,31 +357,27 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
private BillingMode instantiateBillingMode(final BillingModeType billingMode) {
switch (billingMode) {
- case IN_ADVANCE:
- return new InAdvanceBillingMode();
- default:
- throw new UnsupportedOperationException();
+ case IN_ADVANCE:
+ return new InAdvanceBillingMode();
+ default:
+ throw new UnsupportedOperationException();
}
}
InvoiceItem generateFixedPriceItem(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent,
- final DateTime roundedTargetDate, final Currency currency) {
- final DateTime roundedStartDate = InvoiceDateUtils.roundDateTimeToDate(thisEvent.getEffectiveDate(), thisEvent.getTimeZone());
+ final LocalDate targetDate, final Currency currency) {
+ final LocalDate roundedStartDate = new LocalDate(thisEvent.getEffectiveDate(), thisEvent.getTimeZone());
- if (roundedStartDate.isAfter(roundedTargetDate)) {
+ if (roundedStartDate.isAfter(targetDate)) {
return null;
} else {
final BigDecimal fixedPrice = thisEvent.getFixedPrice();
if (fixedPrice != null) {
- final Duration duration = thisEvent.getPlanPhase().getDuration();
- final DateTime endDate = InvoiceDateUtils.roundDateTimeToDate(duration.addToDateTime(roundedStartDate), thisEvent.getTimeZone());
-
return new FixedPriceInvoiceItem(invoiceId, accountId, thisEvent.getSubscription().getBundleId(),
thisEvent.getSubscription().getId(),
thisEvent.getPlan().getName(), thisEvent.getPlanPhase().getName(),
- roundedStartDate, endDate,
- fixedPrice, currency);
+ roundedStartDate, fixedPrice, currency);
} else {
return null;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceDateUtils.java b/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceDateUtils.java
index 5b2b60f..3fab3b2 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceDateUtils.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceDateUtils.java
@@ -16,18 +16,151 @@
package com.ning.billing.invoice.generator;
+import java.math.BigDecimal;
+
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.Days;
+import org.joda.time.LocalDate;
+import org.joda.time.Months;
import org.joda.time.MutableDateTime;
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.invoice.model.InvoicingConfiguration;
+
public class InvoiceDateUtils {
- public static DateTime roundDateTimeToDate(final DateTime input, final DateTimeZone timeZone) {
- if (input == null) {
- return null;
+
+ private static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
+ private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
+
+ public static BigDecimal calculateProRationBeforeFirstBillingPeriod(final LocalDate startDate, final LocalDate nextBillingCycleDate,
+ final BillingPeriod billingPeriod) {
+ final LocalDate previousBillingCycleDate = nextBillingCycleDate.plusMonths(-billingPeriod.getNumberOfMonths());
+
+ final int daysBetween = Days.daysBetween(previousBillingCycleDate, nextBillingCycleDate).getDays();
+ if (daysBetween <= 0) {
+ return BigDecimal.ZERO;
+ }
+
+ final BigDecimal daysInPeriod = new BigDecimal(daysBetween);
+ final BigDecimal days = new BigDecimal(Days.daysBetween(startDate, nextBillingCycleDate).getDays());
+
+ return days.divide(daysInPeriod, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+ }
+
+ public static int calculateNumberOfWholeBillingPeriods(final LocalDate startDate, final LocalDate endDate, final BillingPeriod billingPeriod) {
+ final int numberOfMonths = Months.monthsBetween(startDate, endDate).getMonths();
+ final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
+ return numberOfMonths / numberOfMonthsInPeriod;
+ }
+
+ public static LocalDate calculateLastBillingCycleDateBefore(final LocalDate date, final LocalDate previousBillCycleDate,
+ final int billingCycleDay, final BillingPeriod billingPeriod) {
+ LocalDate proposedDate = previousBillCycleDate;
+
+ int numberOfPeriods = 0;
+ while (!proposedDate.isAfter(date)) {
+ proposedDate = previousBillCycleDate.plusMonths(numberOfPeriods * billingPeriod.getNumberOfMonths());
+ numberOfPeriods += 1;
+ }
+
+ proposedDate = proposedDate.plusMonths(-billingPeriod.getNumberOfMonths());
+
+ if (proposedDate.dayOfMonth().get() < billingCycleDay) {
+ final int lastDayOfTheMonth = proposedDate.dayOfMonth().getMaximumValue();
+ if (lastDayOfTheMonth < billingCycleDay) {
+ return new LocalDate(proposedDate.getYear(), proposedDate.getMonthOfYear(), lastDayOfTheMonth);
+ } else {
+ return new LocalDate(proposedDate.getYear(), proposedDate.getMonthOfYear(), billingCycleDay);
+ }
+ } else {
+ return proposedDate;
+ }
+ }
+
+ public static LocalDate calculateEffectiveEndDate(final LocalDate billCycleDate, final LocalDate targetDate,
+ final BillingPeriod billingPeriod) {
+ if (targetDate.isBefore(billCycleDate)) {
+ return billCycleDate;
+ }
+
+ final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
+ int numberOfPeriods = 0;
+ LocalDate proposedDate = billCycleDate;
+
+ while (!proposedDate.isAfter(targetDate)) {
+ proposedDate = billCycleDate.plusMonths(numberOfPeriods * numberOfMonthsInPeriod);
+ numberOfPeriods += 1;
}
- final DateTime tzAdjustedStartDate = input.toDateTime(timeZone);
- return new DateTime(tzAdjustedStartDate.getYear(), tzAdjustedStartDate.getMonthOfYear(), tzAdjustedStartDate.getDayOfMonth(), 0, 0, timeZone);
+ return proposedDate;
+ }
+
+ public static LocalDate calculateEffectiveEndDate(final LocalDate billCycleDate, final LocalDate targetDate,
+ final LocalDate endDate, final BillingPeriod billingPeriod) {
+ if (targetDate.isBefore(endDate)) {
+ if (targetDate.isBefore(billCycleDate)) {
+ return billCycleDate;
+ }
+
+ final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
+ int numberOfPeriods = 0;
+ LocalDate proposedDate = billCycleDate;
+
+ while (!proposedDate.isAfter(targetDate)) {
+ proposedDate = billCycleDate.plusMonths(numberOfPeriods * numberOfMonthsInPeriod);
+ numberOfPeriods += 1;
+ }
+
+ // the current period includes the target date
+ // check to see whether the end date truncates the period
+ if (endDate.isBefore(proposedDate)) {
+ return endDate;
+ } else {
+ return proposedDate;
+ }
+ } else {
+ return endDate;
+ }
+ }
+
+ public static BigDecimal calculateProRationAfterLastBillingCycleDate(final LocalDate endDate, final LocalDate previousBillThroughDate,
+ final BillingPeriod billingPeriod) {
+ // Note: assumption is that previousBillThroughDate is correctly aligned with the billing cycle day
+ final LocalDate nextBillThroughDate = previousBillThroughDate.plusMonths(billingPeriod.getNumberOfMonths());
+ final BigDecimal daysInPeriod = new BigDecimal(Days.daysBetween(previousBillThroughDate, nextBillThroughDate).getDays());
+
+ final BigDecimal days = new BigDecimal(Days.daysBetween(previousBillThroughDate, endDate).getDays());
+
+ return days.divide(daysInPeriod, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+ }
+
+ public static LocalDate calculateBillingCycleDateOnOrAfter(final LocalDate date, final DateTimeZone accountTimeZone,
+ final int billingCycleDay) {
+ // We go back to DateTime here. Since the BCD was computed in UTC, use UTC here as well
+ final DateTime tmp = new DateTime(date.toDateTimeAtStartOfDay(), DateTimeZone.UTC);
+ final DateTime proposedDateTime = calculateBillingCycleDateOnOrAfter(tmp, billingCycleDay);
+
+ final LocalDate proposedLocalDate = new LocalDate(proposedDateTime, accountTimeZone);
+ if (proposedLocalDate.isBefore(date)) {
+ return proposedLocalDate.plusMonths(1);
+ } else {
+ return proposedLocalDate;
+ }
+ }
+
+ public static LocalDate calculateBillingCycleDateAfter(final LocalDate date, final DateTimeZone accountTimeZone,
+ final int billingCycleDay) {
+ // We go back to DateTime here. Since the BCD was computed in UTC, use UTC here as well
+ final DateTime tmp = new DateTime(date.toDateTimeAtStartOfDay(), DateTimeZone.UTC);
+ final DateTime proposedDateTime = calculateBillingCycleDateAfter(tmp, billingCycleDay);
+
+ final LocalDate proposedLocalDate = new LocalDate(proposedDateTime, accountTimeZone);
+ if (proposedLocalDate.isBefore(date)) {
+ return proposedLocalDate.plusMonths(1);
+ } else {
+ return proposedLocalDate;
+ }
}
// Note: date has to be in UTC
@@ -51,10 +184,10 @@ public class InvoiceDateUtils {
// Note: date has to be in UTC
public static DateTime calculateBillingCycleDateAfter(final DateTime date, final int billingCycleDay) {
DateTime proposedDate = calculateBillingCycleDateOnOrAfter(date, billingCycleDay);
-
if (date.compareTo(proposedDate) == 0) {
proposedDate = proposedDate.plusMonths(1);
}
+
return proposedDate;
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceGenerator.java
index a56357b..474a132 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/generator/InvoiceGenerator.java
@@ -16,11 +16,13 @@
package com.ning.billing.invoice.generator;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
@@ -28,6 +30,7 @@ import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.junction.api.BillingEventSet;
public interface InvoiceGenerator {
+
public Invoice generateInvoice(UUID accountId, @Nullable BillingEventSet events, @Nullable List<Invoice> existingInvoices,
- DateTime targetDate, Currency targetCurrency) throws InvoiceApiException;
+ LocalDate targetDate, DateTimeZone accountTimeZone, Currency targetCurrency) throws InvoiceApiException;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
index 1f2507b..cd3c34e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
@@ -18,7 +18,6 @@ package com.ning.billing.invoice.glue;
import org.skife.config.ConfigurationObjectFactory;
-import com.google.inject.AbstractModule;
import com.ning.billing.config.InvoiceConfig;
import com.ning.billing.glue.InvoiceModule;
import com.ning.billing.invoice.InvoiceListener;
@@ -44,7 +43,10 @@ import com.ning.billing.invoice.notification.NextBillingDatePoster;
import com.ning.billing.invoice.notification.NullInvoiceNotifier;
import com.ning.billing.util.template.translation.TranslatorConfig;
+import com.google.inject.AbstractModule;
+
public class DefaultInvoiceModule extends AbstractModule implements InvoiceModule {
+
InvoiceConfig config;
protected void installInvoiceDao() {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index d7e7b13..89a6850 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -24,10 +24,11 @@ import java.util.Map;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountApiException;
@@ -41,8 +42,8 @@ import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoiceCreationEvent;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceNotifier;
-import com.ning.billing.invoice.api.user.DefaultNullInvoiceEvent;
import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
+import com.ning.billing.invoice.api.user.DefaultNullInvoiceEvent;
import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.generator.InvoiceDateUtils;
import com.ning.billing.invoice.generator.InvoiceGenerator;
@@ -60,7 +61,10 @@ import com.ning.billing.util.globallocker.GlobalLocker;
import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
import com.ning.billing.util.globallocker.LockFailedException;
+import com.google.inject.Inject;
+
public class InvoiceDispatcher {
+
private static final Logger log = LoggerFactory.getLogger(InvoiceDispatcher.class);
private static final int NB_LOCK_TRY = 5;
@@ -138,8 +142,7 @@ public class InvoiceDispatcher {
return null;
}
-
- private Invoice processAccountWithLock(final UUID accountId, final DateTime targetDate,
+ private Invoice processAccountWithLock(final UUID accountId, final DateTime targetDateTime,
final boolean dryRun, final CallContext context) throws InvoiceApiException {
try {
final Account account = accountUserApi.getAccountById(accountId);
@@ -152,14 +155,16 @@ public class InvoiceDispatcher {
final Currency targetCurrency = account.getCurrency();
+ // All the computations in invoice are performed on days, in the account timezone
+ final LocalDate targetDate = new LocalDate(targetDateTime, account.getTimeZone());
- final Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoices, targetDate, targetCurrency);
+ final Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoices, targetDate, account.getTimeZone(), targetCurrency);
if (invoice == null) {
log.info("Generated null invoice.");
outputDebugData(billingEvents, invoices);
if (!dryRun) {
- final BusEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCNow(), context.getUserToken());
+ final BusEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday(), context.getUserToken());
postEvent(event, accountId);
}
} else {
@@ -180,7 +185,7 @@ public class InvoiceDispatcher {
final InvoiceCreationEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
invoice.getBalance(), invoice.getCurrency(),
- invoice.getInvoiceDate(), context.getUserToken());
+ context.getUserToken());
postEvent(event, accountId);
}
@@ -201,6 +206,7 @@ public class InvoiceDispatcher {
final Collection<InvoiceItem> fixedPriceItems,
final Collection<InvoiceItem> recurringItems,
final CallContext context) {
+ // TODO - this should be handled by entitlement
final Map<UUID, DateTime> chargeThroughDates = new HashMap<UUID, DateTime>();
addInvoiceItemsToChargeThroughDates(billCycleDay, chargeThroughDates, fixedPriceItems);
addInvoiceItemsToChargeThroughDates(billCycleDay, chargeThroughDates, recurringItems);
@@ -227,7 +233,13 @@ public class InvoiceDispatcher {
final Collection<InvoiceItem> items) {
for (final InvoiceItem item : items) {
final UUID subscriptionId = item.getSubscriptionId();
- final DateTime endDate = item.getEndDate();
+ final DateTime endDate;
+ if (item.getEndDate() != null) {
+ endDate = new DateTime(item.getEndDate().toDateTimeAtStartOfDay(), DateTimeZone.UTC);
+ } else {
+ // item end date is null for fixed price items for instance
+ endDate = new DateTime(item.getStartDate().toDateTimeAtStartOfDay(), DateTimeZone.UTC);
+ }
if (chargeThroughDates.containsKey(subscriptionId)) {
if (chargeThroughDates.get(subscriptionId).isBefore(endDate)) {
@@ -241,7 +253,6 @@ public class InvoiceDispatcher {
}
}
-
private void outputDebugData(final Collection<BillingEvent> events, final Collection<Invoice> invoices) {
if (VERBOSE_OUTPUT) {
log.info("Events");
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index 9b4868c..d6d2b93 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -22,8 +22,6 @@ import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.eventbus.Subscribe;
-import com.google.inject.Inject;
import com.ning.billing.entitlement.api.SubscriptionTransitionType;
import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
@@ -33,7 +31,11 @@ import com.ning.billing.util.callcontext.CallContextFactory;
import com.ning.billing.util.callcontext.CallOrigin;
import com.ning.billing.util.callcontext.UserType;
+import com.google.common.eventbus.Subscribe;
+import com.google.inject.Inject;
+
public class InvoiceListener {
+
private static final Logger log = LoggerFactory.getLogger(InvoiceListener.class);
private final InvoiceDispatcher dispatcher;
private final CallContextFactory factory;
@@ -60,8 +62,8 @@ public class InvoiceListener {
// Skip future uncancel event
// Skip events which are marked as not being the last one
if (transition.getTransitionType() == SubscriptionTransitionType.UNCANCEL ||
- transition.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT
- || transition.getRemainingEventsForUserOperation() > 0) {
+ transition.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT
+ || transition.getRemainingEventsForUserOperation() > 0) {
return;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
index da5ae4f..7a4f9b1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/AdjInvoiceItem.java
@@ -13,34 +13,33 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
public abstract class AdjInvoiceItem extends InvoiceItemBase {
-
-
-
- public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
this(UUID.randomUUID(), invoiceId, accountId, startDate, endDate, amount, currency);
}
- public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
+ public AdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
this(UUID.randomUUID(), invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
}
- public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
super(id, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency);
}
- public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
+ public AdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversingId) {
super(id, invoiceId, accountId, null, null, null, null, startDate, endDate, amount, currency, reversingId);
}
@@ -90,7 +89,7 @@ public abstract class AdjInvoiceItem extends InvoiceItemBase {
return startDate.compareTo(that.startDate);
}
if (currency != that.currency) {
- return currency.ordinal() > that.currency.ordinal() ? 1: -1;
+ return currency.ordinal() > that.currency.ordinal() ? 1 : -1;
}
return id.compareTo(that.getId());
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java b/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java
index 7006cf6..7700c4e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java
@@ -18,12 +18,16 @@ package com.ning.billing.invoice.model;
import java.util.List;
-import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.BillingPeriod;
public interface BillingMode {
- List<RecurringInvoiceItemData> calculateInvoiceItemData(DateTime startDate, DateTime endDate, DateTime targetDate, int billingCycleDay, BillingPeriod billingPeriod) throws InvalidDateSequenceException;
- List<RecurringInvoiceItemData> calculateInvoiceItemData(DateTime startDate, DateTime targetDate, int billingCycleDay, BillingPeriod billingPeriod) throws InvalidDateSequenceException;
+ List<RecurringInvoiceItemData> calculateInvoiceItemData(LocalDate startDate, LocalDate endDate, LocalDate targetDate,
+ DateTimeZone accountTimeZone, int billingCycleDay, BillingPeriod billingPeriod) throws InvalidDateSequenceException;
+
+ List<RecurringInvoiceItemData> calculateInvoiceItemData(LocalDate startDate, LocalDate targetDate,
+ DateTimeZone accountTimeZone, int billingCycleDay, BillingPeriod billingPeriod) throws InvalidDateSequenceException;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
index bbc06da..6c856e8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditAdjInvoiceItem.java
@@ -13,25 +13,26 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItemType;
public class CreditAdjInvoiceItem extends AdjInvoiceItem {
-
- public CreditAdjInvoiceItem(UUID invoiceId, UUID accountId, DateTime date,
- BigDecimal amount, Currency currency) {
+ public CreditAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date,
+ final BigDecimal amount, final Currency currency) {
super(invoiceId, accountId, date, date, amount, currency);
}
- public CreditAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime date,
- BigDecimal amount, Currency currency) {
+ public CreditAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate date,
+ final BigDecimal amount, final Currency currency) {
super(id, invoiceId, accountId, date, date, amount, currency);
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
index f32bc72..3eb05b2 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditBalanceAdjInvoiceItem.java
@@ -19,24 +19,22 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItemType;
public class CreditBalanceAdjInvoiceItem extends AdjInvoiceItem {
-
- public CreditBalanceAdjInvoiceItem(UUID invoiceId, UUID accountId,
- DateTime date, BigDecimal amount, Currency currency) {
+ public CreditBalanceAdjInvoiceItem(final UUID invoiceId, final UUID accountId,
+ final LocalDate date, final BigDecimal amount, final Currency currency) {
super(invoiceId, accountId, date, date, amount, currency);
}
- public CreditBalanceAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId,
- DateTime date, BigDecimal amount, Currency currency) {
+ public CreditBalanceAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId,
+ final LocalDate date, final BigDecimal amount, final Currency currency) {
super(id, invoiceId, accountId, date, date, amount, currency);
}
-
@Override
public InvoiceItemType getInvoiceItemType() {
return InvoiceItemType.CBA_ADJ;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index 41297fe..9c04617 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -16,13 +16,15 @@
package com.ning.billing.invoice.model;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
@@ -35,19 +37,19 @@ public class DefaultInvoice extends EntityBase implements Invoice {
private final List<InvoicePayment> payments = new ArrayList<InvoicePayment>();
private final UUID accountId;
private final Integer invoiceNumber;
- private final DateTime invoiceDate;
- private final DateTime targetDate;
+ private final LocalDate invoiceDate;
+ private final LocalDate targetDate;
private final Currency currency;
private final boolean migrationInvoice;
- // used to create a new invoice
- public DefaultInvoice(final UUID accountId, final DateTime invoiceDate, final DateTime targetDate, final Currency currency) {
+ // Used to create a new invoice
+ public DefaultInvoice(final UUID accountId, final LocalDate invoiceDate, final LocalDate targetDate, final Currency currency) {
this(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, false);
}
- // used to hydrate invoice from persistence layer
- public DefaultInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final DateTime invoiceDate,
- final DateTime targetDate, final Currency currency, final boolean isMigrationInvoice) {
+ // Used to hydrate invoice from persistence layer
+ public DefaultInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final LocalDate invoiceDate,
+ final LocalDate targetDate, final Currency currency, final boolean isMigrationInvoice) {
super(invoiceId);
this.accountId = accountId;
this.invoiceNumber = invoiceNumber;
@@ -124,12 +126,12 @@ public class DefaultInvoice extends EntityBase implements Invoice {
}
@Override
- public DateTime getInvoiceDate() {
+ public LocalDate getInvoiceDate() {
return invoiceDate;
}
@Override
- public DateTime getTargetDate() {
+ public LocalDate getTargetDate() {
return targetDate;
}
@@ -144,24 +146,6 @@ public class DefaultInvoice extends EntityBase implements Invoice {
}
@Override
- public DateTime getLastPaymentDate() {
- DateTime lastPaymentDate = null;
-
- for (final InvoicePayment paymentAttempt : payments) {
- final DateTime paymentDate = paymentAttempt.getPaymentDate();
- if (lastPaymentDate == null) {
- lastPaymentDate = paymentDate;
- }
-
- if (lastPaymentDate.isBefore(paymentDate)) {
- lastPaymentDate = paymentDate;
- }
- }
-
- return lastPaymentDate;
- }
-
- @Override
public BigDecimal getPaidAmount() {
BigDecimal amountPaid = BigDecimal.ZERO;
for (final InvoicePayment payment : payments) {
@@ -196,26 +180,15 @@ public class DefaultInvoice extends EntityBase implements Invoice {
public BigDecimal getRefundAdjAmount() {
return invoiceItems.getRefundAdjAmount();
}
- @Override
- public BigDecimal getBalance() {
- final BigDecimal balance = getChargedAmount().add(getTotalAdjAmount()).add(getCBAAmount()).subtract(getPaidAmount());;
- return balance;
- }
@Override
- public boolean isDueForPayment(final DateTime targetDate, final int numberOfDays) {
- if (getBalance().compareTo(BigDecimal.ZERO) == 0) {
- return false;
- }
-
- final DateTime lastPayment = getLastPaymentDate();
- return (lastPayment == null) || lastPayment.plusDays(numberOfDays).isAfter(targetDate);
+ public BigDecimal getBalance() {
+ return getChargedAmount().add(getTotalAdjAmount()).add(getCBAAmount()).subtract(getPaidAmount());
}
@Override
public String toString() {
- return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getPaidAmount() + ", lastPaymentDate=" + getLastPaymentDate() + "]";
+ return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getPaidAmount() + "]";
}
-
}
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 d8ac06b..71a7cca 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
@@ -16,26 +16,26 @@
package com.ning.billing.invoice.model;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import javax.annotation.Nullable;
+
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
public class FixedPriceInvoiceItem extends InvoiceItemBase {
-
public FixedPriceInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+ final LocalDate date, final BigDecimal amount, final Currency currency) {
+ super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, date, null, amount, currency);
}
public FixedPriceInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
- super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+ final LocalDate date, final BigDecimal amount, final Currency currency) {
+ super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, date, null, amount, currency);
}
@Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java b/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
index bf146cc..dd5061b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
@@ -20,24 +20,26 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
-import org.joda.time.DateTime;
-import org.joda.time.Days;
-import org.joda.time.Months;
-import org.joda.time.MutableDateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.invoice.generator.InvoiceDateUtils;
+
+import static com.ning.billing.invoice.generator.InvoiceDateUtils.calculateBillingCycleDateOnOrAfter;
+import static com.ning.billing.invoice.generator.InvoiceDateUtils.calculateEffectiveEndDate;
+import static com.ning.billing.invoice.generator.InvoiceDateUtils.calculateLastBillingCycleDateBefore;
+import static com.ning.billing.invoice.generator.InvoiceDateUtils.calculateNumberOfWholeBillingPeriods;
+import static com.ning.billing.invoice.generator.InvoiceDateUtils.calculateProRationAfterLastBillingCycleDate;
+import static com.ning.billing.invoice.generator.InvoiceDateUtils.calculateProRationBeforeFirstBillingPeriod;
public class InAdvanceBillingMode implements BillingMode {
- private static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
- private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
@Override
- public List<RecurringInvoiceItemData> calculateInvoiceItemData(final DateTime startDate, final DateTime endDate,
- final DateTime targetDate, final int billingCycleDay,
- final BillingPeriod billingPeriod) throws InvalidDateSequenceException {
+ public List<RecurringInvoiceItemData> calculateInvoiceItemData(final LocalDate startDate, final LocalDate endDate,
+ final LocalDate targetDate, final DateTimeZone accountTimeZone,
+ final int billingCycleDay, final BillingPeriod billingPeriod) throws InvalidDateSequenceException {
if (endDate == null) {
- return calculateInvoiceItemData(startDate, targetDate, billingCycleDay, billingPeriod);
+ return calculateInvoiceItemData(startDate, targetDate, accountTimeZone, billingCycleDay, billingPeriod);
}
if (endDate.isBefore(startDate)) {
@@ -50,7 +52,7 @@ public class InAdvanceBillingMode implements BillingMode {
final List<RecurringInvoiceItemData> results = new ArrayList<RecurringInvoiceItemData>();
// beginning from the start date, find the first billing date
- final DateTime firstBillingCycleDate = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(startDate, billingCycleDay);
+ final LocalDate firstBillingCycleDate = calculateBillingCycleDateOnOrAfter(startDate, accountTimeZone, billingCycleDay);
// add pro-ration item if needed
if (firstBillingCycleDate.isAfter(startDate)) {
@@ -61,8 +63,8 @@ public class InAdvanceBillingMode implements BillingMode {
}
// add one item per billing period
- final DateTime effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, endDate, billingPeriod);
- final DateTime lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
+ final LocalDate effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, endDate, billingPeriod);
+ final LocalDate lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
final int numberOfWholeBillingPeriods = calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
final int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
@@ -82,8 +84,10 @@ public class InAdvanceBillingMode implements BillingMode {
}
@Override
- public List<RecurringInvoiceItemData> calculateInvoiceItemData(final DateTime startDate,
- final DateTime targetDate, final int billingCycleDay,
+ public List<RecurringInvoiceItemData> calculateInvoiceItemData(final LocalDate startDate,
+ final LocalDate targetDate,
+ final DateTimeZone accountTimeZone,
+ final int billingCycleDay,
final BillingPeriod billingPeriod) throws InvalidDateSequenceException {
final List<RecurringInvoiceItemData> results = new ArrayList<RecurringInvoiceItemData>();
@@ -93,7 +97,7 @@ public class InAdvanceBillingMode implements BillingMode {
}
// beginning from the start date, find the first billing date
- final DateTime firstBillingCycleDate = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(startDate, billingCycleDay);
+ final LocalDate firstBillingCycleDate = calculateBillingCycleDateOnOrAfter(startDate, accountTimeZone, billingCycleDay);
// add pro-ration item if needed
if (firstBillingCycleDate.isAfter(startDate)) {
@@ -104,8 +108,8 @@ public class InAdvanceBillingMode implements BillingMode {
}
// add one item per billing period
- final DateTime effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, billingPeriod);
- final DateTime lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
+ final LocalDate effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, billingPeriod);
+ final LocalDate lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
final int numberOfWholeBillingPeriods = calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
final int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
@@ -124,101 +128,4 @@ public class InAdvanceBillingMode implements BillingMode {
return results;
}
-
- private BigDecimal calculateProRationBeforeFirstBillingPeriod(final DateTime startDate, final DateTime nextBillingCycleDate, final BillingPeriod billingPeriod) {
- final DateTime previousBillingCycleDate = nextBillingCycleDate.plusMonths(-billingPeriod.getNumberOfMonths());
-
- final int daysBetween = Days.daysBetween(previousBillingCycleDate, nextBillingCycleDate).getDays();
- if (daysBetween <= 0) {
- return BigDecimal.ZERO;
- }
-
- final BigDecimal daysInPeriod = new BigDecimal(daysBetween);
- final BigDecimal days = new BigDecimal(Days.daysBetween(startDate, nextBillingCycleDate).getDays());
-
- return days.divide(daysInPeriod, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
- }
-
- private int calculateNumberOfWholeBillingPeriods(final DateTime startDate, final DateTime endDate, final BillingPeriod billingPeriod) {
- final int numberOfMonths = Months.monthsBetween(startDate, endDate).getMonths();
- final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
- return numberOfMonths / numberOfMonthsInPeriod;
- }
-
- private DateTime calculateEffectiveEndDate(final DateTime billCycleDate, final DateTime targetDate, final DateTime endDate, final BillingPeriod billingPeriod) {
- if (targetDate.isBefore(endDate)) {
- if (targetDate.isBefore(billCycleDate)) {
- return billCycleDate;
- }
-
- final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
- int numberOfPeriods = 0;
- DateTime proposedDate = billCycleDate;
-
- while (!proposedDate.isAfter(targetDate)) {
- proposedDate = billCycleDate.plusMonths(numberOfPeriods * numberOfMonthsInPeriod);
- numberOfPeriods += 1;
- }
-
- // the current period includes the target date
- // check to see whether the end date truncates the period
- if (endDate.isBefore(proposedDate)) {
- return endDate;
- } else {
- return proposedDate;
- }
- } else {
- return endDate;
- }
- }
-
- private DateTime calculateEffectiveEndDate(final DateTime billCycleDate, final DateTime targetDate, final BillingPeriod billingPeriod) {
- if (targetDate.isBefore(billCycleDate)) {
- return billCycleDate;
- }
-
- final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
- int numberOfPeriods = 0;
- DateTime proposedDate = billCycleDate;
-
- while (!proposedDate.isAfter(targetDate)) {
- proposedDate = billCycleDate.plusMonths(numberOfPeriods * numberOfMonthsInPeriod);
- numberOfPeriods += 1;
- }
-
- return proposedDate;
- }
-
- private DateTime calculateLastBillingCycleDateBefore(final DateTime date, final DateTime previousBillCycleDate, final int billingCycleDay, final BillingPeriod billingPeriod) {
- DateTime proposedDate = previousBillCycleDate;
-
- int numberOfPeriods = 0;
- while (!proposedDate.isAfter(date)) {
- proposedDate = previousBillCycleDate.plusMonths(numberOfPeriods * billingPeriod.getNumberOfMonths());
- numberOfPeriods += 1;
- }
-
- proposedDate = proposedDate.plusMonths(-billingPeriod.getNumberOfMonths());
-
- if (proposedDate.dayOfMonth().get() < billingCycleDay) {
- final int lastDayOfTheMonth = proposedDate.dayOfMonth().getMaximumValue();
- if (lastDayOfTheMonth < billingCycleDay) {
- return new MutableDateTime(proposedDate).dayOfMonth().set(lastDayOfTheMonth).toDateTime();
- } else {
- return new MutableDateTime(proposedDate).dayOfMonth().set(billingCycleDay).toDateTime();
- }
- } else {
- return proposedDate;
- }
- }
-
- private BigDecimal calculateProRationAfterLastBillingCycleDate(final DateTime endDate, final DateTime previousBillThroughDate, final BillingPeriod billingPeriod) {
- // note: assumption is that previousBillThroughDate is correctly aligned with the billing cycle day
- final DateTime nextBillThroughDate = previousBillThroughDate.plusMonths(billingPeriod.getNumberOfMonths());
- final BigDecimal daysInPeriod = new BigDecimal(Days.daysBetween(previousBillThroughDate, nextBillThroughDate).getDays());
-
- final BigDecimal days = new BigDecimal(Days.daysBetween(previousBillThroughDate, endDate).getDays());
-
- return days.divide(daysInPeriod, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
- }
}
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 842e4d9..a4264b6 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
@@ -16,11 +16,13 @@
package com.ning.billing.invoice.model;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
@@ -28,12 +30,11 @@ import com.ning.billing.invoice.api.InvoiceItemType;
import com.ning.billing.util.entity.EntityBase;
public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem {
-
/* Common to all items */
protected final UUID invoiceId;
protected final UUID accountId;
- protected final DateTime startDate;
- protected final DateTime endDate;
+ protected final LocalDate startDate;
+ protected final LocalDate endDate;
protected final BigDecimal amount;
protected final Currency currency;
@@ -47,17 +48,16 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
protected final BigDecimal rate;
/* RepairAdjInvoiceItem */
- protected final UUID linkedItemId;
-
+ protected final UUID linkedItemId;
@Override
public String toString() {
return getInvoiceItemType() + ": [startDate=" + startDate + ", endDate="
- + endDate + ", amount=" + amount + ", currency=" + currency
- + ", invoiceId=" + invoiceId
- + ", subscriptionId=" + subscriptionId + ", planName="
- + planName + ", phaseName=" + phaseName + ", rate=" + rate
- + ", linkedItemId=" + linkedItemId + "]";
+ + endDate + ", amount=" + amount + ", currency=" + currency
+ + ", invoiceId=" + invoiceId
+ + ", subscriptionId=" + subscriptionId + ", planName="
+ + planName + ", phaseName=" + phaseName + ", rate=" + rate
+ + ", linkedItemId=" + linkedItemId + "]";
}
/*
@@ -65,56 +65,53 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
*/
// No rate and no reversing item
public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
- this(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency);
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
+ this(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency);
}
// With rate but no reversing item
public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
- startDate, endDate, amount, rate, currency, null);
+ startDate, endDate, amount, rate, currency, null);
}
// With reversing item, no rate
public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
- startDate, endDate, amount, null, currency, reversedItemId);
+ startDate, endDate, amount, null, currency, reversedItemId);
}
-
-
/*
- * CTORs with ID; called from DAO when rehydrating
- */
+ * CTORs with ID; called from DAO when rehydrating
+ */
// No rate and no reversing item
public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
- @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency) {
this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, null);
}
// With rate but no reversing item
public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
- @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) {
this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency, null);
}
// With reversing item, no rate
public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
- @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, null, currency, reversedItemId);
}
-
private InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
- @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency,
- UUID reversedItemId) {
+ @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency,
+ final UUID reversedItemId) {
super(id);
this.invoiceId = invoiceId;
this.accountId = accountId;
@@ -166,12 +163,12 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem
}
@Override
- public DateTime getStartDate() {
+ public LocalDate getStartDate() {
return startDate;
}
@Override
- public DateTime getEndDate() {
+ public LocalDate getEndDate() {
return endDate;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
index 32de55b..013eb92 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
@@ -19,15 +19,15 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.catalog.api.MigrationPlan;
public class MigrationInvoiceItem extends FixedPriceInvoiceItem {
-
- public MigrationInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime startDate, final BigDecimal amount, final Currency currency) {
+ public MigrationInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate,
+ final BigDecimal amount, final Currency currency) {
super(invoiceId, accountId, null, null, MigrationPlan.MIGRATION_PLAN_NAME, MigrationPlan.MIGRATION_PLAN_PHASE_NAME,
- startDate, startDate, amount, currency);
+ startDate, amount, currency);
}
}
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 23ac57b..d6f98a2 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
@@ -19,7 +19,7 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
@@ -30,32 +30,24 @@ import com.ning.billing.invoice.api.InvoiceItemType;
public class RecurringInvoiceItem extends InvoiceItemBase {
private final DateTimeFormatter dateTimeFormatter = DateTimeFormat.mediumDate();
-
-
- public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency) {
+ public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
+ final String planName, final String phaseName, final LocalDate startDate, final LocalDate endDate,
+ final BigDecimal amount, final BigDecimal rate, final Currency currency) {
super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate,
final Currency currency, final UUID reversedItemId) {
- super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
- amount, rate, currency);
+ super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
- final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency) {
+ final String planName, final String phaseName, final LocalDate startDate, final LocalDate endDate,
+ final BigDecimal amount, final BigDecimal rate, final Currency currency) {
super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, rate, currency);
}
-
@Override
public String getDescription() {
return String.format("%s from %s to %s", phaseName, startDate.toString(dateTimeFormatter), endDate.toString(dateTimeFormatter));
@@ -179,5 +171,4 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
public InvoiceItemType getInvoiceItemType() {
return InvoiceItemType.RECURRING;
}
-
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java
index 3d4a2d8..4fa3aa6 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java
@@ -18,24 +18,25 @@ package com.ning.billing.invoice.model;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
public class RecurringInvoiceItemData {
- private final DateTime startDate;
- private final DateTime endDate;
+
+ private final LocalDate startDate;
+ private final LocalDate endDate;
private final BigDecimal numberOfCycles;
- public RecurringInvoiceItemData(final DateTime startDate, final DateTime endDate, final BigDecimal numberOfCycles) {
+ public RecurringInvoiceItemData(final LocalDate startDate, final LocalDate endDate, final BigDecimal numberOfCycles) {
this.startDate = startDate;
this.endDate = endDate;
this.numberOfCycles = numberOfCycles;
}
- public DateTime getStartDate() {
+ public LocalDate getStartDate() {
return startDate;
}
- public DateTime getEndDate() {
+ public LocalDate getEndDate() {
return endDate;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
index 6eac357..9091b6c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RefundAdjInvoiceItem.java
@@ -13,25 +13,25 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItemType;
public class RefundAdjInvoiceItem extends AdjInvoiceItem {
-
- public RefundAdjInvoiceItem(UUID invoiceId, UUID accountId, DateTime date,
- BigDecimal amount, Currency currency) {
+ public RefundAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate date,
+ final BigDecimal amount, final Currency currency) {
super(invoiceId, accountId, date, date, amount, currency);
}
- public RefundAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime date,
- BigDecimal amount, Currency currency) {
+ public RefundAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate date,
+ final BigDecimal amount, final Currency currency) {
super(id, invoiceId, accountId, date, date, amount, currency);
}
@@ -44,6 +44,4 @@ public class RefundAdjInvoiceItem extends AdjInvoiceItem {
public String getDescription() {
return "refund-adj";
}
-
-
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
index 1ea8ef4..36327d2 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RepairAdjInvoiceItem.java
@@ -13,25 +13,25 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
+
package com.ning.billing.invoice.model;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItemType;
public class RepairAdjInvoiceItem extends AdjInvoiceItem {
-
- public RepairAdjInvoiceItem(UUID invoiceId, UUID accountId, DateTime startDate, DateTime endDate,
- BigDecimal amount, Currency currency, final UUID reversingId) {
+ public RepairAdjInvoiceItem(final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate,
+ final BigDecimal amount, final Currency currency, final UUID reversingId) {
super(invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
}
- public RepairAdjInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime startDate, DateTime endDate,
- BigDecimal amount, Currency currency, final UUID reversingId) {
+ public RepairAdjInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final LocalDate startDate, final LocalDate endDate,
+ final BigDecimal amount, final Currency currency, final UUID reversingId) {
super(id, invoiceId, accountId, startDate, endDate, amount, currency, reversingId);
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
index 5f1c8e4..5b87451 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
@@ -25,13 +25,14 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.inject.Inject;
import com.ning.billing.invoice.api.DefaultInvoiceService;
import com.ning.billing.util.notificationq.Notification;
import com.ning.billing.util.notificationq.NotificationQueue;
import com.ning.billing.util.notificationq.NotificationQueueService;
import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotificationQueue;
+import com.google.inject.Inject;
+
public class DefaultNextBillingDatePoster implements NextBillingDatePoster {
private static final Logger log = LoggerFactory.getLogger(DefaultNextBillingDatePoster.class);
@@ -39,27 +40,23 @@ public class DefaultNextBillingDatePoster implements NextBillingDatePoster {
private final NotificationQueueService notificationQueueService;
@Inject
- public DefaultNextBillingDatePoster(
- final NotificationQueueService notificationQueueService) {
- super();
+ public DefaultNextBillingDatePoster(final NotificationQueueService notificationQueueService) {
this.notificationQueueService = notificationQueueService;
}
@Override
- public void insertNextBillingNotification(final Transmogrifier transactionalDao, final UUID accountId, final UUID subscriptionId, final DateTime futureNotificationTime) {
+ public void insertNextBillingNotification(final Transmogrifier transactionalDao, final UUID accountId,
+ final UUID subscriptionId, final DateTime futureNotificationTime) {
final NotificationQueue nextBillingQueue;
try {
-
-
nextBillingQueue = notificationQueueService.getNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME,
DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE);
log.info("Queuing next billing date notification. id: {}, timestamp: {}", subscriptionId.toString(), futureNotificationTime.toString());
-
- List<Notification> existingNotifications = nextBillingQueue.getNotificationForAccountAndDate(accountId, futureNotificationTime);
+ final List<Notification> existingNotifications = nextBillingQueue.getNotificationForAccountAndDate(accountId, futureNotificationTime);
if (existingNotifications.size() > 0) {
log.info(String.format("%s : notification for account %s and date %s already exist, skip...",
- DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE, accountId, futureNotificationTime));
+ DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE, accountId, futureNotificationTime));
return;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotificationKey.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotificationKey.java
index 998d7a6..33131c8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotificationKey.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotificationKey.java
@@ -23,7 +23,7 @@ import com.ning.billing.util.notificationq.DefaultUUIDNotificationKey;
public class NextBillingDateNotificationKey extends DefaultUUIDNotificationKey {
@JsonCreator
- public NextBillingDateNotificationKey(@JsonProperty("uuidKey") UUID uuidKey) {
+ public NextBillingDateNotificationKey(@JsonProperty("uuidKey") final UUID uuidKey) {
super(uuidKey);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java
index e0e44f7..78cc394 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java
@@ -21,6 +21,7 @@ import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceNotifier;
public class NullInvoiceNotifier implements InvoiceNotifier {
+
@Override
public void notify(final Account account, final Invoice invoice) {
// deliberate no-op
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index 345fff6..286b189 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -38,13 +38,10 @@ import java.util.List;
import java.util.Locale;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
-import com.google.common.base.Objects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
@@ -52,10 +49,15 @@ import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
import com.ning.billing.util.template.translation.TranslatorConfig;
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+
/**
* Format invoice fields. Note that the Mustache engine won't accept null values.
*/
public class DefaultInvoiceFormatter implements InvoiceFormatter {
+
private final TranslatorConfig config;
private final Invoice invoice;
private final DateTimeFormatter dateFormatter;
@@ -143,22 +145,17 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
}
@Override
- public boolean isDueForPayment(final DateTime targetDate, final int numberOfDays) {
- return invoice.isDueForPayment(targetDate, numberOfDays);
- }
-
- @Override
public boolean isMigrationInvoice() {
return invoice.isMigrationInvoice();
}
@Override
- public DateTime getInvoiceDate() {
+ public LocalDate getInvoiceDate() {
return invoice.getInvoiceDate();
}
@Override
- public DateTime getTargetDate() {
+ public LocalDate getTargetDate() {
return invoice.getTargetDate();
}
@@ -168,18 +165,13 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
}
@Override
- public DateTime getLastPaymentDate() {
- return invoice.getLastPaymentDate();
- }
-
- @Override
public BigDecimal getPaidAmount() {
return Objects.firstNonNull(invoice.getPaidAmount(), BigDecimal.ZERO);
}
@Override
public String getFormattedInvoiceDate() {
- final DateTime invoiceDate = invoice.getInvoiceDate();
+ final LocalDate invoiceDate = invoice.getInvoiceDate();
if (invoiceDate == null) {
return "";
} else {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
index 86be83b..a5bf42e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
@@ -21,6 +21,7 @@ import java.util.Locale;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter;
import com.google.common.base.Objects;
@@ -72,12 +73,12 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
}
@Override
- public DateTime getStartDate() {
+ public LocalDate getStartDate() {
return item.getStartDate();
}
@Override
- public DateTime getEndDate() {
+ public LocalDate getEndDate() {
return item.getEndDate();
}
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 1af1116..fa8b276 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -10,8 +10,8 @@ CREATE TABLE invoice_items (
subscription_id char(36),
plan_name varchar(50),
phase_name varchar(50),
- start_date datetime NOT NULL,
- end_date datetime,
+ start_date date NOT NULL,
+ end_date date,
amount numeric(10,4) NOT NULL,
rate numeric(10,4) NULL,
currency char(3) NOT NULL,
@@ -31,8 +31,8 @@ CREATE TABLE invoices (
record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
id char(36) NOT NULL,
account_id char(36) NOT NULL,
- invoice_date datetime NOT NULL,
- target_date datetime NOT NULL,
+ invoice_date date NOT NULL,
+ target_date date NOT NULL,
currency char(3) NOT NULL,
migrated bool NOT NULL,
created_by varchar(50) NOT NULL,
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 4d1075b..3b455e0 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -101,7 +102,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
private Account account;
private UUID accountId;
private UUID subscriptionId;
- private DateTime date_migrated;
+ private LocalDate date_migrated;
private DateTime date_regular;
private UUID migrationInvoiceId;
@@ -121,7 +122,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
public void setupMethod() throws Exception {
accountId = UUID.randomUUID();
subscriptionId = UUID.randomUUID();
- date_migrated = clock.getUTCNow().minusYears(1);
+ date_migrated = clock.getUTCToday().minusYears(1);
date_regular = clock.getUTCNow();
account = Mockito.mock(Account.class);
@@ -210,7 +211,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
Assert.assertEquals(byAccountAndDate.size(), 1);
Assert.assertEquals(byAccountAndDate.get(0).getId(), regularInvoiceId);
- final Collection<Invoice> unpaid = invoiceUserApi.getUnpaidInvoicesByAccountId(accountId, date_regular.plusDays(1));
+ final Collection<Invoice> unpaid = invoiceUserApi.getUnpaidInvoicesByAccountId(accountId, new LocalDate(date_regular.plusDays(1)));
Assert.assertEquals(unpaid.size(), 2);
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
index 848a8e6..e1e177c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
@@ -19,7 +19,7 @@ package com.ning.billing.invoice.api.user;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -30,29 +30,24 @@ import com.ning.billing.invoice.api.NullInvoiceEvent;
import com.ning.billing.util.jackson.ObjectMapper;
public class TestEventJson extends InvoiceTestSuite {
- private final ObjectMapper mapper = new ObjectMapper();
+
+ private static final ObjectMapper mapper = new ObjectMapper();
@Test(groups = "fast")
public void testInvoiceCreationEvent() throws Exception {
-
- final InvoiceCreationEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, new DateTime(), UUID.randomUUID());
-
+ final InvoiceCreationEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, UUID.randomUUID());
final String json = mapper.writeValueAsString(e);
- final Class<?> claz = Class.forName(DefaultInvoiceCreationEvent.class.getName());
- final Object obj = mapper.readValue(json, claz);
- Assert.assertTrue(obj.equals(e));
+ final Object obj = mapper.readValue(json, DefaultInvoiceCreationEvent.class);
+ Assert.assertEquals(obj, e);
}
@Test(groups = "fast")
public void testEmptyInvoiceEvent() throws Exception {
-
- final NullInvoiceEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new DateTime(), UUID.randomUUID());
-
+ final NullInvoiceEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new LocalDate(), UUID.randomUUID());
final String json = mapper.writeValueAsString(e);
- final Class<?> claz = Class.forName(DefaultNullInvoiceEvent.class.getName());
- final Object obj = mapper.readValue(json, claz);
- Assert.assertTrue(obj.equals(e));
+ final Object obj = mapper.readValue(json, DefaultNullInvoiceEvent.class);
+ Assert.assertEquals(obj, e);
}
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index 5d7f2c6..aa95c33 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -24,6 +24,7 @@ import java.util.Map;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.google.inject.Inject;
import com.ning.billing.catalog.api.Currency;
@@ -53,7 +54,7 @@ public class MockInvoiceDao implements InvoiceDao {
try {
eventBus.post(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
invoice.getBalance(), invoice.getCurrency(),
- invoice.getInvoiceDate(), null));
+ null));
} catch (Bus.EventBusException ex) {
throw new RuntimeException(ex);
}
@@ -101,7 +102,7 @@ public class MockInvoiceDao implements InvoiceDao {
}
@Override
- public List<Invoice> getInvoicesByAccount(final UUID accountId, final DateTime fromDate) {
+ public List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate) {
final List<Invoice> invoicesForAccount = new ArrayList<Invoice>();
synchronized (monitor) {
@@ -189,7 +190,7 @@ public class MockInvoiceDao implements InvoiceDao {
}
@Override
- public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
+ public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate) {
final List<Invoice> unpaidInvoices = new ArrayList<Invoice>();
for (final Invoice invoice : get()) {
@@ -261,13 +262,12 @@ public class MockInvoiceDao implements InvoiceDao {
}
@Override
- public InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount, final DateTime effectiveDate, final Currency currency, final CallContext context) {
+ public InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal amount, final LocalDate effectiveDate, final Currency currency, final CallContext context) {
throw new UnsupportedOperationException();
}
@Override
public BigDecimal getAccountCBA(UUID accountId) {
- // TODO Auto-generated method stub
return null;
}
@@ -275,7 +275,6 @@ public class MockInvoiceDao implements InvoiceDao {
public InvoicePayment createRefund(UUID paymentId,
BigDecimal amount, boolean isInvoiceAdjusted, UUID paymentCookieId, CallContext context)
throws InvoiceApiException {
- // TODO Auto-generated method stub
return null;
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index fb7bf9c..5b3d802 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -24,6 +24,8 @@ import java.util.Map;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.annotations.Test;
@@ -72,8 +74,8 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
public void testCreationAndRetrievalByAccount() {
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
- final DateTime invoiceDate = invoice.getInvoiceDate();
+ final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
+ final LocalDate invoiceDate = invoice.getInvoiceDate();
invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
@@ -91,12 +93,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
public void testInvoicePayment() {
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
+ final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
final UUID invoiceId = invoice.getId();
final UUID subscriptionId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2010, 1, 1, 0, 0, 0, 0);
- final DateTime endDate = new DateTime(2010, 4, 1, 0, 0, 0, 0);
+ final LocalDate startDate = new LocalDate(2010, 1, 1);
+ final LocalDate endDate = new LocalDate(2010, 4, 1);
final InvoiceItem invoiceItem = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, "test plan", "test phase", startDate, endDate,
new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
@@ -129,39 +131,6 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
}
@Test(groups = "slow")
- public void testAddPayment1() {
- final UUID accountId = UUID.randomUUID();
- final DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-
- final UUID paymentId = UUID.randomUUID();
- final DateTime paymentDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
- final BigDecimal paymentAmount = new BigDecimal("14.0");
-
- invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
- invoiceDao.notifyOfPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice.getId(), paymentDate, paymentAmount, Currency.USD), context);
-
- invoice = invoiceDao.getById(invoice.getId());
- assertEquals(invoice.getPaidAmount().compareTo(paymentAmount), 0);
- assertEquals(invoice.getLastPaymentDate().compareTo(paymentDate), 0);
- assertEquals(invoice.getNumberOfPayments(), 1);
- }
-
- @Test(groups = "slow")
- public void testAddPayment2() {
- final UUID accountId = UUID.randomUUID();
- final DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
-
- final DateTime paymentDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
-
- invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
- invoiceDao.notifyOfPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice.getId(), paymentDate, invoice.getBalance(), Currency.USD), context);
- invoice = invoiceDao.getById(invoice.getId());
- assertEquals(invoice.getLastPaymentDate().compareTo(paymentDate), 0);
- }
-
- @Test(groups = "slow")
public void testGetInvoicesBySubscriptionForRecurringItems() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
@@ -175,16 +144,16 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final UUID subscriptionId4 = UUID.randomUUID();
final BigDecimal rate4 = new BigDecimal("12.0");
- final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+ final LocalDate targetDate = new LocalDate(2011, 5, 23);
// Create invoice 1 (subscriptions 1-4)
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
final UUID invoiceId1 = invoice1.getId();
- DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- DateTime endDate = startDate.plusMonths(1);
+ LocalDate startDate = new LocalDate(2011, 3, 1);
+ LocalDate endDate = startDate.plusMonths(1);
final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
rate1, rate1, Currency.USD);
@@ -203,7 +172,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
invoiceItemSqlDao.create(item4, context);
// Create invoice 2 (subscriptions 1-3)
- final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
final UUID invoiceId2 = invoice2.getId();
@@ -251,35 +220,35 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final UUID subscriptionId4 = UUID.randomUUID();
final BigDecimal rate4 = new BigDecimal("12.0");
- final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+ final LocalDate targetDate = new LocalDate(2011, 5, 23);
// Create invoice 1 (subscriptions 1-4)
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
final UUID invoiceId1 = invoice1.getId();
- DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- DateTime endDate = startDate.plusMonths(1);
+ LocalDate startDate = new LocalDate(2011, 3, 1);
+ LocalDate endDate = startDate.plusMonths(1);
- final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
+ final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate,
rate1, Currency.USD);
invoiceItemSqlDao.create(item1, context);
- final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
+ final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate,
rate2, Currency.USD);
invoiceItemSqlDao.create(item2, context);
- final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
+ final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate,
rate3, Currency.USD);
invoiceItemSqlDao.create(item3, context);
- final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
+ final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate,
rate4, Currency.USD);
invoiceItemSqlDao.create(item4, context);
// create invoice 2 (subscriptions 1-3)
- final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
final UUID invoiceId2 = invoice2.getId();
@@ -287,15 +256,15 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
startDate = endDate;
endDate = startDate.plusMonths(1);
- final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+ final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate,
rate1, Currency.USD);
invoiceItemSqlDao.create(item5, context);
- final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+ final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate,
rate2, Currency.USD);
invoiceItemSqlDao.create(item6, context);
- final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+ final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate,
rate3, Currency.USD);
invoiceItemSqlDao.create(item7, context);
@@ -327,16 +296,16 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final UUID subscriptionId4 = UUID.randomUUID();
final BigDecimal rate4 = new BigDecimal("12.0");
- final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+ final LocalDate targetDate = new LocalDate(2011, 5, 23);
// Create invoice 1 (subscriptions 1-4)
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
final UUID invoiceId1 = invoice1.getId();
- DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- DateTime endDate = startDate.plusMonths(1);
+ LocalDate startDate = new LocalDate(2011, 3, 1);
+ LocalDate endDate = startDate.plusMonths(1);
final RecurringInvoiceItem recurringItem1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
rate1, rate1, Currency.USD);
@@ -354,24 +323,24 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
rate4, rate4, Currency.USD);
invoiceItemSqlDao.create(recurringItem4, context);
- final FixedPriceInvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate,
rate1, Currency.USD);
invoiceItemSqlDao.create(fixedItem1, context);
- final FixedPriceInvoiceItem fixedItem2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate,
rate2, Currency.USD);
invoiceItemSqlDao.create(fixedItem2, context);
- final FixedPriceInvoiceItem fixedItem3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate,
rate3, Currency.USD);
invoiceItemSqlDao.create(fixedItem3, context);
- final FixedPriceInvoiceItem fixedItem4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate,
rate4, Currency.USD);
invoiceItemSqlDao.create(fixedItem4, context);
// create invoice 2 (subscriptions 1-3)
- final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
final UUID invoiceId2 = invoice2.getId();
@@ -390,15 +359,15 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final RecurringInvoiceItem recurringItem7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
rate3, rate3, Currency.USD);
invoiceItemSqlDao.create(recurringItem7, context);
- final FixedPriceInvoiceItem fixedItem5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate,
rate1, Currency.USD);
invoiceItemSqlDao.create(fixedItem5, context);
- final FixedPriceInvoiceItem fixedItem6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate,
rate2, Currency.USD);
invoiceItemSqlDao.create(fixedItem6, context);
- final FixedPriceInvoiceItem fixedItem7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+ final FixedPriceInvoiceItem fixedItem7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate,
rate3, Currency.USD);
invoiceItemSqlDao.create(fixedItem7, context);
@@ -419,28 +388,28 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
public void testGetInvoicesForAccountAfterDate() {
final UUID accountId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime targetDate2 = new DateTime(2011, 12, 6, 0, 0, 0, 0);
- final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
+ final LocalDate targetDate2 = new LocalDate(2011, 12, 6);
+ final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate2, Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
List<Invoice> invoices;
- invoices = invoiceDao.getInvoicesByAccount(accountId, new DateTime(2011, 1, 1, 0, 0, 0, 0));
+ invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 1, 1));
assertEquals(invoices.size(), 2);
- invoices = invoiceDao.getInvoicesByAccount(accountId, new DateTime(2011, 10, 6, 0, 0, 0, 0));
+ invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 10, 6));
assertEquals(invoices.size(), 2);
- invoices = invoiceDao.getInvoicesByAccount(accountId, new DateTime(2011, 10, 11, 0, 0, 0, 0));
+ invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 10, 11));
assertEquals(invoices.size(), 1);
- invoices = invoiceDao.getInvoicesByAccount(accountId, new DateTime(2011, 12, 6, 0, 0, 0, 0));
+ invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 12, 6));
assertEquals(invoices.size(), 1);
- invoices = invoiceDao.getInvoicesByAccount(accountId, new DateTime(2012, 1, 1, 0, 0, 0, 0));
+ invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2012, 1, 1));
assertEquals(invoices.size(), 0);
}
@@ -448,12 +417,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
public void testAccountBalance() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("17.0");
final BigDecimal rate2 = new BigDecimal("42.0");
@@ -478,12 +447,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
public void testAccountBalanceWithCredit() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("17.0");
@@ -491,7 +460,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
endDate, rate1, rate1, Currency.USD);
invoiceItemSqlDao.create(item1, context);
- final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice1.getId(), accountId, new DateTime(), rate1.negate(), Currency.USD);
+ final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate1.negate(), Currency.USD);
invoiceItemSqlDao.create(creditItem, context);
final BigDecimal balance = invoiceDao.getAccountBalance(accountId);
@@ -502,12 +471,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
public void testAccountBalanceWithNoPayments() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("17.0");
final BigDecimal rate2 = new BigDecimal("42.0");
@@ -527,8 +496,8 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
public void testAccountBalanceWithNoInvoiceItems() {
final UUID accountId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
final BigDecimal payment1 = new BigDecimal("48.0");
@@ -553,12 +522,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("20.0");
final BigDecimal refund1 = new BigDecimal("-7.00");
@@ -619,12 +588,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
private void testAccountBalanceWithRefundAndCBAInternal(boolean withAdjustment, final BigDecimal refundAmount, final BigDecimal expectedFinalBalance) throws InvoiceApiException {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal amount1 = new BigDecimal("5.0");
final BigDecimal rate1 = new BigDecimal("20.0");
@@ -632,7 +601,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
// Fixed Item
final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
- endDate, amount1, Currency.USD);
+ amount1, Currency.USD);
invoiceItemSqlDao.create(item1, context);
BigDecimal balance = invoiceDao.getAccountBalance(accountId);
@@ -663,7 +632,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
// CBA
- final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new DateTime(), balance.negate(), Currency.USD);
+ final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), balance.negate(), Currency.USD);
invoiceItemSqlDao.create(cbaItem, context);
balance = invoiceDao.getAccountBalance(accountId);
assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
@@ -686,12 +655,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
public void testAccountBalanceWithAllSortsOfThings() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal amount1 = new BigDecimal("5.0");
final BigDecimal rate1 = new BigDecimal("20.0");
@@ -699,7 +668,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
// Fixed Item
final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
- endDate, amount1, Currency.USD);
+ amount1, Currency.USD);
invoiceItemSqlDao.create(item1, context);
BigDecimal balance = invoiceDao.getAccountBalance(accountId);
@@ -729,7 +698,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
// CBA
- final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new DateTime(), balance.negate(), Currency.USD);
+ final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), balance.negate(), Currency.USD);
invoiceItemSqlDao.create(cbaItem, context);
balance = invoiceDao.getAccountBalance(accountId);
assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
@@ -739,7 +708,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
// partial REFUND on the payment (along with CBA generated by the system)
final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), rate2.negate(), Currency.USD, null, payment.getId());
invoicePaymentDao.create(refund, context);
- final CreditBalanceAdjInvoiceItem cbaItem2 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new DateTime(), rate2.negate(), Currency.USD);
+ final CreditBalanceAdjInvoiceItem cbaItem2 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
invoiceItemSqlDao.create(cbaItem2, context);
balance = invoiceDao.getAccountBalance(accountId);
@@ -749,7 +718,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
// NEXT RECURRING on invoice 2
- final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1.plusMonths(1), Currency.USD);
+ final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1.plusMonths(1), Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
final RecurringInvoiceItem nextItem = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test bla", startDate.plusMonths(1),
@@ -761,7 +730,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
assertEquals(cba.compareTo(new BigDecimal("0.00")), 0);
// FINALLY ISSUE A CREDIT ADJ
- final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice2.getId(), accountId, new DateTime(), rate2.negate(), Currency.USD);
+ final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice2.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
invoiceItemSqlDao.create(creditItem, context);
balance = invoiceDao.getAccountBalance(accountId);
assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
@@ -774,12 +743,12 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
public void testGetUnpaidInvoicesByAccountId() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+ final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
+ final LocalDate endDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("17.0");
final BigDecimal rate2 = new BigDecimal("42.0");
@@ -792,23 +761,23 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
rate2, rate2, Currency.USD);
invoiceItemSqlDao.create(item2, context);
- DateTime upToDate;
+ LocalDate upToDate;
Collection<Invoice> invoices;
- upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
+ upToDate = new LocalDate(2011, 1, 1);
invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
assertEquals(invoices.size(), 0);
- upToDate = new DateTime(2012, 1, 1, 0, 0, 0, 0);
+ upToDate = new LocalDate(2012, 1, 1);
invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
assertEquals(invoices.size(), 1);
- final DateTime targetDate2 = new DateTime(2011, 7, 1, 0, 0, 0, 0);
- final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
+ final LocalDate targetDate2 = new LocalDate(2011, 7, 1);
+ final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate2, Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
- final DateTime startDate2 = new DateTime(2011, 6, 1, 0, 0, 0, 0);
- final DateTime endDate2 = startDate2.plusMonths(3);
+ final LocalDate startDate2 = new LocalDate(2011, 6, 1);
+ final LocalDate endDate2 = startDate2.plusMonths(3);
final BigDecimal rate3 = new BigDecimal("21.0");
@@ -816,11 +785,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
rate3, rate3, Currency.USD);
invoiceItemSqlDao.create(item3, context);
- upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
+ upToDate = new LocalDate(2011, 1, 1);
invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
assertEquals(invoices.size(), 0);
- upToDate = new DateTime(2012, 1, 1, 0, 0, 0, 0);
+ upToDate = new LocalDate(2012, 1, 1);
invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
assertEquals(invoices.size(), 2);
}
@@ -834,7 +803,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
public void testInvoiceGenerationForImmediateChanges() throws InvoiceApiException, CatalogApiException {
final UUID accountId = UUID.randomUUID();
final List<Invoice> invoiceList = new ArrayList<Invoice>();
- final DateTime targetDate = new DateTime(2011, 2, 16, 0, 0, 0, 0);
+ final LocalDate targetDate = new LocalDate(2011, 2, 16);
final Currency currency = Currency.USD;
// generate first invoice
@@ -845,7 +814,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final Subscription subscription = getZombieSubscription();
- final DateTime effectiveDate1 = new DateTime(2011, 2, 1, 0, 0, 0, 0);
+ final DateTime effectiveDate1 = new DateTime(2011, 2, 1, 0, 0, 0);
final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan1, phase1, null,
recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
"testEvent1", 1L, SubscriptionTransitionType.CREATE);
@@ -853,7 +822,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final BillingEventSet events = new MockBillingEventSet();
events.add(event1);
- final Invoice invoice1 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, invoiceList, targetDate, DateTimeZone.UTC, Currency.USD);
assertEquals(invoice1.getBalance(), TEN);
invoiceList.add(invoice1);
@@ -863,7 +832,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null, BillingPeriod.MONTHLY, PhaseType.TRIAL);
final MockPlan plan2 = new MockPlan(phase2);
- final DateTime effectiveDate2 = new DateTime(2011, 2, 15, 0, 0, 0, 0);
+ final DateTime effectiveDate2 = new DateTime(2011, 2, 15, 0, 0, 0);
final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan2, phase2, null,
recurringPrice2.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
"testEvent2", 2L, SubscriptionTransitionType.CREATE);
@@ -871,7 +840,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
// second invoice should be for one half (14/28 days) the difference between the rate plans
// this is a temporary state, since it actually contains an adjusting item that properly belong to invoice 1
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, targetDate, DateTimeZone.UTC, Currency.USD);
assertEquals(invoice2.getBalance(), FIVE);
invoiceList.add(invoice2);
@@ -894,7 +863,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final MockPlan plan = new MockPlan(phase);
final Subscription subscription = getZombieSubscription();
- final DateTime effectiveDate = buildDateTime(2011, 1, 1);
+ final DateTime effectiveDate = buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
final BillingEvent event = createMockBillingEvent(null, subscription, effectiveDate, plan, phase, null,
recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 15, BillingModeType.IN_ADVANCE,
@@ -902,8 +871,8 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final BillingEventSet events = new MockBillingEventSet();
events.add(event);
- final DateTime targetDate = buildDateTime(2011, 1, 15);
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+ final LocalDate targetDate = buildDate(2011, 1, 15);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, DateTimeZone.UTC, Currency.USD);
// expect one pro-ration item and one full-period item
assertEquals(invoice.getNumberOfItems(), 2);
@@ -933,7 +902,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final MockPlan plan = new MockPlan();
final Subscription subscription = getZombieSubscription();
- final DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
+ final DateTime effectiveDate1 = buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1, fixedPrice.getPrice(currency),
null, currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
@@ -942,7 +911,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
events.add(event1);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, effectiveDate1, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, new LocalDate(effectiveDate1), DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
assertEquals(invoice1.getBalance().compareTo(ZERO), 0);
@@ -958,7 +927,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
"testEvent2", 2L, SubscriptionTransitionType.PHASE);
events.add(event2);
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate2, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, new LocalDate(effectiveDate2), DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
assertEquals(invoice2.getBalance().compareTo(cheapAmount), 0);
@@ -968,7 +937,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
//invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
final DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
- final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate3, Currency.USD);
+ final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, new LocalDate(effectiveDate3), DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice3);
assertEquals(invoice3.getNumberOfItems(), 1);
assertEquals(invoice3.getBalance().compareTo(cheapAmount), 0);
@@ -979,7 +948,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
public void testInvoiceForEmptyEventSet() throws InvoiceApiException {
final BillingEventSet events = new MockBillingEventSet();
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new DateTime(), Currency.USD);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new LocalDate(), DateTimeZone.UTC, Currency.USD);
assertNull(invoice);
}
@@ -998,7 +967,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final MockPlan plan = new MockPlan();
final Subscription subscription = getZombieSubscription();
- final DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
+ final DateTime effectiveDate1 = buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1,
fixedPrice.getPrice(currency), null, currency,
@@ -1013,7 +982,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
"testEvent2", 2L, SubscriptionTransitionType.CHANGE);
events.add(event2);
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, effectiveDate2, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new LocalDate(effectiveDate2), DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
assertEquals(invoice.getBalance().compareTo(cheapAmount), 0);
@@ -1029,8 +998,8 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
public void testInvoiceNumber() throws InvoiceApiException {
final Currency currency = Currency.USD;
- final DateTime targetDate1 = DateTime.now().plusMonths(1);
- final DateTime targetDate2 = DateTime.now().plusMonths(2);
+ final DateTime targetDate1 = clock.getUTCNow().plusMonths(1);
+ final DateTime targetDate2 = clock.getUTCNow().plusMonths(2);
final Subscription subscription = getZombieSubscription();
@@ -1052,7 +1021,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
"testEvent1", 1L, SubscriptionTransitionType.CHANGE);
events.add(event1);
- Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate1, Currency.USD);
+ Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, invoices, new LocalDate(targetDate1), DateTimeZone.UTC, Currency.USD);
invoices.add(invoice1);
invoiceDao.create(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
invoice1 = invoiceDao.getById(invoice1.getId());
@@ -1063,7 +1032,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
"testEvent2", 2L, SubscriptionTransitionType.CHANGE);
events.add(event2);
- Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate2, Currency.USD);
+ Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, invoices, new LocalDate(targetDate2), DateTimeZone.UTC, Currency.USD);
invoiceDao.create(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
invoice2 = invoiceDao.getById(invoice2.getId());
assertNotNull(invoice2.getInvoiceNumber());
@@ -1090,7 +1059,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final BillingEventSet events = new MockBillingEventSet();
events.add(event1);
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new LocalDate(targetDate1), DateTimeZone.UTC, Currency.USD);
invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
invoiceDao.setWrittenOff(invoice.getId(), context);
@@ -1121,7 +1090,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final BillingEventSet events = new MockBillingEventSet();
events.add(event1);
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new LocalDate(targetDate1), DateTimeZone.UTC, Currency.USD);
invoiceDao.create(invoice, invoice.getTargetDate().getDayOfMonth(), context);
invoiceDao.setWrittenOff(invoice.getId(), context);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
index 11825c2..f8766f9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.Currency;
@@ -35,14 +36,15 @@ import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
public class TestInvoiceItemDao extends InvoiceDaoTestBase {
+
@Test(groups = "slow")
public void testInvoiceItemCreation() {
final UUID accountId = UUID.randomUUID();
final UUID invoiceId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
final UUID subscriptionId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2011, 10, 1, 0, 0, 0, 0);
- final DateTime endDate = new DateTime(2011, 11, 1, 0, 0, 0, 0);
+ final LocalDate startDate = new LocalDate(2011, 10, 1);
+ final LocalDate endDate = new LocalDate(2011, 11, 1);
final BigDecimal rate = new BigDecimal("20.00");
final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, "test plan", "test phase", startDate, endDate,
@@ -68,7 +70,7 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
final UUID accountId = UUID.randomUUID();
final UUID subscriptionId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
final BigDecimal rate = new BigDecimal("20.00");
for (int i = 0; i < 3; i++) {
@@ -89,7 +91,7 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
final UUID accountId = UUID.randomUUID();
final UUID invoiceId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
final BigDecimal rate = new BigDecimal("20.00");
for (int i = 0; i < 5; i++) {
@@ -110,13 +112,13 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
public void testGetInvoiceItemsByAccountId() {
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
- final DefaultInvoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final LocalDate targetDate = new LocalDate(2011, 5, 23);
+ final DefaultInvoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
invoiceDao.create(invoice, targetDate.getDayOfMonth(), context);
final UUID invoiceId = invoice.getId();
- final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+ final LocalDate startDate = new LocalDate(2011, 3, 1);
final BigDecimal rate = new BigDecimal("20.00");
final UUID subscriptionId = UUID.randomUUID();
@@ -134,7 +136,7 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
public void testCreditBalanceInvoiceSqlDao() {
final UUID invoiceId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
- final DateTime creditDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
+ final LocalDate creditDate = new LocalDate(2012, 4, 1);
final InvoiceItem creditInvoiceItem = new CreditBalanceAdjInvoiceItem(invoiceId, accountId, creditDate, TEN, Currency.USD);
invoiceItemSqlDao.create(creditInvoiceItem, context);
@@ -147,10 +149,10 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
public void testFixedPriceInvoiceSqlDao() {
final UUID invoiceId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
+ final LocalDate startDate = new LocalDate(2012, 4, 1);
final InvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(),
- UUID.randomUUID(), "test plan", "test phase", startDate, startDate.plusMonths(1), TEN, Currency.USD);
+ UUID.randomUUID(), "test plan", "test phase", startDate, TEN, Currency.USD);
invoiceItemSqlDao.create(fixedPriceInvoiceItem, context);
final InvoiceItem savedItem = invoiceItemSqlDao.getById(fixedPriceInvoiceItem.getId().toString());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index 974c48c..16d2441 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -16,7 +16,6 @@
package com.ning.billing.invoice.generator;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
@@ -25,8 +24,11 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
+import javax.annotation.Nullable;
+
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,6 +71,7 @@ import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
+
private static final Logger log = LoggerFactory.getLogger(TestDefaultInvoiceGenerator.class);
private final Clock clock = new ClockMock();
@@ -104,7 +107,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
@Test(groups = "fast")
public void testWithNullEventSetAndNullInvoiceSet() throws InvoiceApiException {
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, null, null, clock.getUTCToday(), DateTimeZone.UTC, Currency.USD);
assertNull(invoice);
}
@@ -114,7 +117,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEventSet events = new MockBillingEventSet();
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, new DateTime(), Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, clock.getUTCToday(), DateTimeZone.UTC, Currency.USD);
assertNull(invoice);
}
@@ -124,7 +127,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEventSet events = new MockBillingEventSet();
final Subscription sub = createZombieSubscription();
- final DateTime startDate = buildDateTime(2011, 9, 1);
+ final LocalDate startDate = buildDate(2011, 9, 1);
final Plan plan = new MockPlan();
final BigDecimal rate1 = TEN;
@@ -133,9 +136,9 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
events.add(event);
- final DateTime targetDate = buildDateTime(2011, 10, 3);
+ final LocalDate targetDate = buildDate(2011, 10, 3);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -160,7 +163,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEventSet events = new MockBillingEventSet();
final Subscription sub = createZombieSubscription();
- final DateTime startDate = buildDateTime(2011, 9, 1);
+ final LocalDate startDate = buildDate(2011, 9, 1);
final Plan plan = new MockPlan();
final BigDecimal rate = TEN;
@@ -168,9 +171,9 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 15);
events.add(event);
- final DateTime targetDate = buildDateTime(2011, 10, 3);
+ final LocalDate targetDate = buildDate(2011, 10, 3);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -195,15 +198,15 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final Subscription sub = createZombieSubscription();
- final BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
+ final BillingEvent event1 = createBillingEvent(sub.getId(), buildDate(2011, 9, 1), plan1, phase1, 1);
events.add(event1);
- final BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan2, phase2, 1);
+ final BillingEvent event2 = createBillingEvent(sub.getId(), buildDate(2011, 10, 1), plan2, phase2, 1);
events.add(event2);
- final DateTime targetDate = buildDateTime(2011, 10, 3);
+ final LocalDate targetDate = buildDate(2011, 10, 3);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -219,17 +222,17 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
final Subscription sub = createZombieSubscription();
- final BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
+ final BillingEvent event1 = createBillingEvent(sub.getId(), buildDate(2011, 9, 1), plan1, phase1, 1);
events.add(event1);
final BigDecimal rate2 = TEN;
final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
- final BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 15), plan1, phase2, 15);
+ final BillingEvent event2 = createBillingEvent(sub.getId(), buildDate(2011, 10, 15), plan1, phase2, 15);
events.add(event2);
- final DateTime targetDate = buildDateTime(2011, 12, 3);
+ final LocalDate targetDate = buildDate(2011, 12, 3);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 4);
@@ -256,22 +259,22 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
final Subscription sub = createZombieSubscription();
- final BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
+ final BillingEvent event1 = createBillingEvent(sub.getId(), buildDate(2011, 9, 1), plan1, phase1, 1);
events.add(event1);
final BigDecimal rate2 = TEN;
final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
- final BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan1, phase2, 1);
+ final BillingEvent event2 = createBillingEvent(sub.getId(), buildDate(2011, 10, 1), plan1, phase2, 1);
events.add(event2);
final BigDecimal rate3 = THIRTY;
final PlanPhase phase3 = createMockMonthlyPlanPhase(rate3);
- final BillingEvent event3 = createBillingEvent(sub.getId(), buildDateTime(2011, 11, 1), plan1, phase3, 1);
+ final BillingEvent event3 = createBillingEvent(sub.getId(), buildDate(2011, 11, 1), plan1, phase3, 1);
events.add(event3);
- final DateTime targetDate = buildDateTime(2011, 12, 3);
+ final LocalDate targetDate = buildDate(2011, 12, 3);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 4);
@@ -283,7 +286,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEventSet events = new MockBillingEventSet();
final Subscription sub = createZombieSubscription();
- final DateTime startDate = buildDateTime(2011, 9, 1);
+ final LocalDate startDate = buildDate(2011, 9, 1);
final Plan plan1 = new MockPlan();
final BigDecimal rate = FIVE;
@@ -292,14 +295,14 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEvent event1 = createBillingEvent(sub.getId(), startDate, plan1, phase1, 1);
events.add(event1);
- DateTime targetDate = buildDateTime(2011, 12, 1);
+ LocalDate targetDate = buildDate(2011, 12, 1);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
final List<Invoice> existingInvoices = new ArrayList<Invoice>();
existingInvoices.add(invoice1);
- targetDate = buildDateTime(2011, 12, 3);
- final Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoices, targetDate, Currency.USD);
+ targetDate = buildDate(2011, 12, 3);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoices, targetDate, DateTimeZone.UTC, Currency.USD);
assertNull(invoice2);
}
@@ -323,37 +326,37 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final PlanPhase plan1Phase1 = createMockMonthlyPlanPhase(EIGHT, PhaseType.TRIAL);
final PlanPhase plan1Phase2 = createMockMonthlyPlanPhase(TWELVE, PhaseType.DISCOUNT);
final PlanPhase plan1Phase3 = createMockMonthlyPlanPhase();
- final DateTime plan1StartDate = buildDateTime(2011, 1, 5);
- final DateTime plan1PhaseChangeDate = buildDateTime(2011, 4, 5);
- final DateTime plan1CancelDate = buildDateTime(2011, 4, 29);
+ final LocalDate plan1StartDate = buildDate(2011, 1, 5);
+ final LocalDate plan1PhaseChangeDate = buildDate(2011, 4, 5);
+ final LocalDate plan1CancelDate = buildDate(2011, 4, 29);
final Plan plan2 = new MockPlan("Change phase from trial to discount to evergreen");
final PlanPhase plan2Phase1 = createMockMonthlyPlanPhase(TWENTY, PhaseType.TRIAL);
final PlanPhase plan2Phase2 = createMockMonthlyPlanPhase(THIRTY, PhaseType.DISCOUNT);
final PlanPhase plan2Phase3 = createMockMonthlyPlanPhase(FORTY, PhaseType.EVERGREEN);
- final DateTime plan2StartDate = buildDateTime(2011, 3, 10);
- final DateTime plan2PhaseChangeToDiscountDate = buildDateTime(2011, 6, 10);
- final DateTime plan2PhaseChangeToEvergreenDate = buildDateTime(2011, 9, 10);
+ final LocalDate plan2StartDate = buildDate(2011, 3, 10);
+ final LocalDate plan2PhaseChangeToDiscountDate = buildDate(2011, 6, 10);
+ final LocalDate plan2PhaseChangeToEvergreenDate = buildDate(2011, 9, 10);
final Plan plan3 = new MockPlan("Upgrade with immediate change, BCD = 31");
final PlanPhase plan3Phase1 = createMockMonthlyPlanPhase(TEN, PhaseType.EVERGREEN);
final PlanPhase plan3Phase2 = createMockAnnualPlanPhase(ONE_HUNDRED, PhaseType.EVERGREEN);
- final DateTime plan3StartDate = buildDateTime(2011, 5, 20);
- final DateTime plan3UpgradeToAnnualDate = buildDateTime(2011, 7, 31);
+ final LocalDate plan3StartDate = buildDate(2011, 5, 20);
+ final LocalDate plan3UpgradeToAnnualDate = buildDate(2011, 7, 31);
final Plan plan4a = new MockPlan("Plan change effective EOT; plan 1");
final Plan plan4b = new MockPlan("Plan change effective EOT; plan 2");
final PlanPhase plan4aPhase1 = createMockMonthlyPlanPhase(FIFTEEN);
final PlanPhase plan4bPhase1 = createMockMonthlyPlanPhase(TWENTY_FOUR);
- final DateTime plan4StartDate = buildDateTime(2011, 6, 7);
- final DateTime plan4ChangeOfPlanDate = buildDateTime(2011, 8, 7);
+ final LocalDate plan4StartDate = buildDate(2011, 6, 7);
+ final LocalDate plan4ChangeOfPlanDate = buildDate(2011, 8, 7);
final Plan plan5 = new MockPlan("Add-on");
final PlanPhase plan5Phase1 = createMockMonthlyPlanPhase(TWENTY);
final PlanPhase plan5Phase2 = createMockMonthlyPlanPhase();
- final DateTime plan5StartDate = buildDateTime(2011, 6, 21);
- final DateTime plan5CancelDate = buildDateTime(2011, 10, 7);
+ final LocalDate plan5StartDate = buildDate(2011, 6, 21);
+ final LocalDate plan5CancelDate = buildDate(2011, 10, 7);
BigDecimal expectedAmount;
final List<Invoice> invoices = new ArrayList<Invoice>();
@@ -366,11 +369,11 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 2/5/2011, invoice subscription 1 (trial)
expectedAmount = EIGHT;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 2, 5), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 2, 5), 1, expectedAmount);
// on 3/5/2011, invoice subscription 1 (trial)
expectedAmount = EIGHT;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 3, 5), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 3, 5), 1, expectedAmount);
// on 3/10/2011, create subscription 2 (trial)
events.add(createBillingEvent(subscriptionId2, plan2StartDate, plan2, plan2Phase1, 10));
@@ -384,7 +387,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 4/10/2011, invoice subscription 2 (trial)
expectedAmount = TWENTY;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 4, 10), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 4, 10), 1, expectedAmount);
// on 4/29/2011, cancel subscription 1
events.add(createBillingEvent(subscriptionId1, plan1CancelDate, plan1, plan1Phase3, 5));
@@ -394,7 +397,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 5/10/2011, invoice subscription 2 (trial)
expectedAmount = TWENTY;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 5, 10), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 5, 10), 1, expectedAmount);
// on 5/20/2011, create subscription 3 (monthly)
events.add(createBillingEvent(subscriptionId3, plan3StartDate, plan3, plan3Phase1, 20));
@@ -413,7 +416,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 6/20/2011, invoice subscription 3 (monthly)
expectedAmount = TEN;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 6, 20), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 6, 20), 1, expectedAmount);
// on 6/21/2011, create add-on (subscription 5)
events.add(createBillingEvent(subscriptionId5, plan5StartDate, plan5, plan5Phase1, 10));
@@ -422,15 +425,15 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 7/7/2011, invoice subscription 4 (plan 1)
expectedAmount = FIFTEEN;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 7, 7), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 7, 7), 1, expectedAmount);
// on 7/10/2011, invoice subscription 2 (discount), invoice subscription 5
expectedAmount = THIRTY.add(TWENTY);
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 7, 10), 2, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 7, 10), 2, expectedAmount);
// on 7/20/2011, invoice subscription 3 (monthly)
expectedAmount = TEN;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 7, 20), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 7, 20), 1, expectedAmount);
// on 7/31/2011, convert subscription 3 to annual
events.add(createBillingEvent(subscriptionId3, plan3UpgradeToAnnualDate, plan3, plan3Phase2, 31));
@@ -445,11 +448,11 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 8/10/2011, invoice plan 2 (discount), invoice subscription 5
expectedAmount = THIRTY.add(TWENTY);
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 8, 10), 2, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 8, 10), 2, expectedAmount);
// on 9/7/2011, invoice subscription 4 (plan 2)
expectedAmount = TWENTY_FOUR;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 9, 7), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 9, 7), 1, expectedAmount);
// on 9/10/2011, invoice plan 2 (evergreen), invoice subscription 5
events.add(createBillingEvent(subscriptionId2, plan2PhaseChangeToEvergreenDate, plan2, plan2Phase3, 10));
@@ -463,7 +466,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
// on 10/10/2011, invoice plan 2 (evergreen)
expectedAmount = FORTY;
- testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 10, 10), 1, expectedAmount);
+ testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 10, 10), 1, expectedAmount);
}
@Test(groups = "fast")
@@ -471,10 +474,10 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final Plan plan = new MockPlan();
final PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
final BillingEventSet events = new MockBillingEventSet();
- final DateTime targetDate = buildDateTime(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 1);
events.add(createBillingEvent(UUID.randomUUID(), targetDate, plan, planPhase, 1));
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertEquals(invoice.getNumberOfItems(), 1);
}
@@ -484,16 +487,16 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final Plan plan = new MockPlan();
final PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
final BillingEventSet events = new MockBillingEventSet();
- final DateTime startDate = clock.getUTCNow().minusDays(1);
- final DateTime targetDate = startDate.plusDays(1);
+ final LocalDate startDate = clock.getUTCToday().minusDays(1);
+ final LocalDate targetDate = startDate.plusDays(1);
events.add(createBillingEvent(UUID.randomUUID(), startDate, plan, planPhase, startDate.getDayOfMonth()));
- final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, DateTimeZone.UTC, Currency.USD);
final RecurringInvoiceItem item = (RecurringInvoiceItem) invoice.getInvoiceItems().get(0);
// end date of the invoice item should be equal to exactly one month later (rounded)
- assertDatesEqualRounded(item.getEndDate(), startDate.plusMonths(1));
+ assertEquals(item.getEndDate(), startDate.plusMonths(1));
}
@Test(groups = "fast")
@@ -508,11 +511,11 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final PlanPhase phase1 = new MockPlanPhase(null, zeroPrice, BillingPeriod.NO_BILLING_PERIOD, PhaseType.TRIAL);
final PlanPhase phase2 = new MockPlanPhase(cheapPrice, null, BillingPeriod.MONTHLY, PhaseType.DISCOUNT);
- final DateTime changeDate = new DateTime("2012-04-1T00:00:00.000-08:00");
+ final DateTime changeDate = new DateTime("2012-04-1");
final BillingEventSet events = new MockBillingEventSet();
- final BillingEvent event1 = createMockBillingEvent(null, subscription, new DateTime("2012-01-1T00:00:00.000-08:00"),
+ final BillingEvent event1 = createMockBillingEvent(null, subscription, new DateTime("2012-01-1"),
plan, phase1,
ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
BillingModeType.IN_ADVANCE, "Test Event 1", 1L,
@@ -526,17 +529,17 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
events.add(event2);
events.add(event1);
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, new DateTime("2012-02-01T00:01:00.000-08:00"), Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, new LocalDate("2012-02-01"), DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
final List<Invoice> invoiceList = new ArrayList<Invoice>();
invoiceList.add(invoice1);
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, new DateTime("2012-04-05T00:01:00.000-08:00"), Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, new LocalDate("2012-04-05"), DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
final FixedPriceInvoiceItem item = (FixedPriceInvoiceItem) invoice2.getInvoiceItems().get(0);
- assertDatesEqualRounded(item.getStartDate(), changeDate);
+ assertEquals(item.getStartDate(), changeDate.toLocalDate());
}
@Test(groups = "fast")
@@ -551,12 +554,12 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final UUID subscriptionId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2011, 1, 1, 3, 40, 27, 0);
+ final LocalDate startDate = new LocalDate(2011, 1, 1);
final BillingEvent event1 = createBillingEvent(subscriptionId, startDate, plan1, phase1, 1);
events.add(event1);
// ensure both components are invoiced
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 2);
assertEquals(invoice1.getBalance(), FIFTEEN);
@@ -565,10 +568,10 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
invoiceList.add(invoice1);
// move forward in time one billing period
- final DateTime currentDate = startDate.plusMonths(1);
+ final LocalDate currentDate = startDate.plusMonths(1);
// ensure that only the recurring price is invoiced
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, currentDate, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, currentDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
assertEquals(invoice2.getBalance(), FIVE);
@@ -587,12 +590,12 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final UUID subscriptionId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2011, 1, 1, 3, 40, 27, 0);
+ final LocalDate startDate = new LocalDate(2011, 1, 1);
final BillingEvent event1 = createBillingEvent(subscriptionId, startDate, plan1, phase1, 1);
events.add(event1);
// ensure that a single invoice item is generated for the fixed cost
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
assertEquals(invoice1.getBalance(), fixedCost1);
@@ -601,12 +604,12 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
invoiceList.add(invoice1);
// move forward in time one billing period
- final DateTime phaseChangeDate = startDate.plusMonths(1);
+ final LocalDate phaseChangeDate = startDate.plusMonths(1);
final BillingEvent event2 = createBillingEvent(subscriptionId, phaseChangeDate, plan1, phase2, 1);
events.add(event2);
// ensure that a single invoice item is generated for the fixed cost
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, phaseChangeDate, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, phaseChangeDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
assertEquals(invoice2.getBalance(), fixedCost2);
@@ -627,18 +630,18 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final PlanPhase phase3 = createMockMonthlyPlanPhase(new BigDecimal("19.95"), null, PhaseType.EVERGREEN);
// set up billing events
- final DateTime creationDate = new DateTime(2012, 3, 6, 21, 36, 18, 896, DateTimeZone.UTC);
+ final LocalDate creationDate = new LocalDate(2012, 3, 6);
events.add(createBillingEvent(subscriptionId, creationDate, plan1, phase1, BILL_CYCLE_DAY));
// trialPhaseEndDate = 2012/4/5
- final DateTime trialPhaseEndDate = creationDate.plusDays(30);
+ final LocalDate trialPhaseEndDate = creationDate.plusDays(30);
events.add(createBillingEvent(subscriptionId, trialPhaseEndDate, plan1, phase2, BILL_CYCLE_DAY));
// discountPhaseEndDate = 2012/10/5
- final DateTime discountPhaseEndDate = trialPhaseEndDate.plusMonths(6);
+ final LocalDate discountPhaseEndDate = trialPhaseEndDate.plusMonths(6);
events.add(createBillingEvent(subscriptionId, discountPhaseEndDate, plan1, phase3, BILL_CYCLE_DAY));
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, creationDate, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, creationDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
assertEquals(invoice1.getBalance().compareTo(ZERO), 0);
@@ -646,35 +649,35 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final List<Invoice> invoiceList = new ArrayList<Invoice>();
invoiceList.add(invoice1);
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, trialPhaseEndDate, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, trialPhaseEndDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
- assertDatesEqualRounded(invoice2.getInvoiceItems().get(0).getStartDate(), trialPhaseEndDate);
+ assertEquals(invoice2.getInvoiceItems().get(0).getStartDate(), trialPhaseEndDate);
assertEquals(invoice2.getBalance().compareTo(new BigDecimal("3.21")), 0);
invoiceList.add(invoice2);
- DateTime targetDate = trialPhaseEndDate.toMutableDateTime().dayOfMonth().set(BILL_CYCLE_DAY).toDateTime();
- final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+ LocalDate targetDate = new LocalDate(trialPhaseEndDate.getYear(), trialPhaseEndDate.getMonthOfYear(), BILL_CYCLE_DAY);
+ final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice3);
assertEquals(invoice3.getNumberOfItems(), 1);
- assertDatesEqualRounded(invoice3.getInvoiceItems().get(0).getStartDate(), targetDate);
+ assertEquals(invoice3.getInvoiceItems().get(0).getStartDate(), targetDate);
assertEquals(invoice3.getBalance().compareTo(DISCOUNT_PRICE), 0);
invoiceList.add(invoice3);
targetDate = targetDate.plusMonths(6);
- final Invoice invoice4 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+ final Invoice invoice4 = generator.generateInvoice(accountId, events, invoiceList, targetDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice4);
assertEquals(invoice4.getNumberOfItems(), 7);
}
@Test(groups = "fast", expectedExceptions = {InvoiceApiException.class})
public void testTargetDateRestrictionFailure() throws InvoiceApiException, CatalogApiException {
- final DateTime targetDate = DateTime.now().plusMonths(60);
+ final LocalDate targetDate = clock.getUTCToday().plusMonths(60);
final BillingEventSet events = new MockBillingEventSet();
final Plan plan1 = new MockPlan();
final PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
- events.add(createBillingEvent(UUID.randomUUID(), DateTime.now(), plan1, phase1, 1));
- generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+ events.add(createBillingEvent(UUID.randomUUID(), clock.getUTCToday(), plan1, phase1, 1));
+ generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, DateTimeZone.UTC, Currency.USD);
}
private MockPlanPhase createMockMonthlyPlanPhase() {
@@ -705,12 +708,12 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
null, BillingPeriod.ANNUAL, phaseType);
}
- private BillingEvent createBillingEvent(final UUID subscriptionId, final DateTime startDate,
+ private BillingEvent createBillingEvent(final UUID subscriptionId, final LocalDate startDate,
final Plan plan, final PlanPhase planPhase, final int billCycleDay) throws CatalogApiException {
final Subscription sub = createZombieSubscription(subscriptionId);
final Currency currency = Currency.USD;
- return createMockBillingEvent(null, sub, startDate, plan, planPhase,
+ return createMockBillingEvent(null, sub, startDate.toDateTimeAtStartOfDay(), plan, planPhase,
planPhase.getFixedPrice() == null ? null : planPhase.getFixedPrice().getPrice(currency),
planPhase.getRecurringPrice() == null ? null : planPhase.getRecurringPrice().getPrice(currency),
currency, planPhase.getBillingPeriod(),
@@ -718,10 +721,10 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
}
private void testInvoiceGeneration(final UUID accountId, final BillingEventSet events, final List<Invoice> existingInvoices,
- final DateTime targetDate, final int expectedNumberOfItems,
+ final LocalDate targetDate, final int expectedNumberOfItems,
final BigDecimal expectedAmount) throws InvoiceApiException {
final Currency currency = Currency.USD;
- final Invoice invoice = generator.generateInvoice(accountId, events, existingInvoices, targetDate, currency);
+ final Invoice invoice = generator.generateInvoice(accountId, events, existingInvoices, targetDate, DateTimeZone.UTC, currency);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), expectedNumberOfItems);
existingInvoices.add(invoice);
@@ -732,7 +735,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
@Test(groups = "fast")
public void testAddOnInvoiceGeneration() throws CatalogApiException, InvoiceApiException {
- final DateTime april25 = new DateTime(2012, 4, 25, 0, 0, 0, 0);
+ final LocalDate april25 = new LocalDate(2012, 4, 25);
// create a base plan on April 25th
final UUID accountId = UUID.randomUUID();
@@ -748,7 +751,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
events.add(createBillingEvent(baseSubscription.getId(), april25, basePlan, basePlanEvergreen, 25));
// generate invoice
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
assertEquals(invoice1.getBalance().compareTo(TEN), 0);
@@ -757,7 +760,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
invoices.add(invoice1);
// create 2 add ons on April 28th
- final DateTime april28 = new DateTime(2012, 4, 28, 0, 0, 0, 0);
+ final LocalDate april28 = new LocalDate(2012, 4, 28);
final Subscription addOnSubscription1 = createZombieSubscription();
final Plan addOn1Plan = new MockPlan("add on 1");
final PlanPhase addOn1PlanPhaseEvergreen = new MockPlanPhase(price5, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
@@ -769,7 +772,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
events.add(createBillingEvent(addOnSubscription2.getId(), april28, addOn2Plan, addOn2PlanPhaseEvergreen, 25));
// generate invoice
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april28, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april28, DateTimeZone.UTC, Currency.USD);
invoices.add(invoice2);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 2);
@@ -785,8 +788,8 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
newEvents.add(createBillingEvent(addOnSubscription1.getId(), april28, addOn1Plan, addOn1PlanPhaseEvergreen, 25));
// generate invoice
- final DateTime may1 = new DateTime(2012, 5, 1, 0, 0, 0, 0);
- final Invoice invoice3 = generator.generateInvoice(accountId, newEvents, invoices, may1, Currency.USD);
+ final LocalDate may1 = new LocalDate(2012, 5, 1);
+ final Invoice invoice3 = generator.generateInvoice(accountId, newEvents, invoices, may1, DateTimeZone.UTC, Currency.USD);
assertNotNull(invoice3);
assertEquals(invoice3.getNumberOfItems(), 5);
// -4.50 -18 - 10 (to correct the previous 2 invoices) + 4.50 + 13
@@ -796,7 +799,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
@Test
public void testRepairForPaidInvoice() throws CatalogApiException, InvoiceApiException {
// create an invoice
- final DateTime april25 = new DateTime(2012, 4, 25, 0, 0, 0, 0);
+ final LocalDate april25 = new LocalDate(2012, 4, 25);
// create a base plan on April 25th
final UUID accountId = UUID.randomUUID();
@@ -809,7 +812,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEventSet events = new MockBillingEventSet();
events.add(createBillingEvent(originalSubscription.getId(), april25, originalPlan, originalPlanEvergreen, 25));
- final Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, Currency.USD);
+ final Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, DateTimeZone.UTC, Currency.USD);
printDetailInvoice(invoice1);
@@ -818,7 +821,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
invoices.add(invoice1);
// pay the invoice
- invoice1.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), april25, TEN, Currency.USD));
+ invoice1.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), april25.toDateTimeAtCurrentTime(), TEN, Currency.USD));
assertEquals(invoice1.getBalance().compareTo(ZERO), 0);
// change the plan (i.e. repair) on start date
@@ -830,7 +833,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
events.add(createBillingEvent(newSubscription.getId(), april25, newPlan, newPlanEvergreen, 25));
// generate a new invoice
- final Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april25, Currency.USD);
+ final Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april25, DateTimeZone.UTC, Currency.USD);
printDetailInvoice(invoice2);
assertEquals(invoice2.getNumberOfItems(), 4);
@@ -882,7 +885,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
events.setAccountInvoiceOff(true);
final Subscription sub = createZombieSubscription();
- final DateTime startDate = buildDateTime(2011, 9, 1);
+ final LocalDate startDate = buildDate(2011, 9, 1);
final Plan plan = new MockPlan();
final BigDecimal rate1 = TEN;
@@ -891,9 +894,9 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
events.add(event);
- final DateTime targetDate = buildDateTime(2011, 10, 3);
+ final LocalDate targetDate = buildDate(2011, 10, 3);
final UUID accountId = UUID.randomUUID();
- final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+ final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, DateTimeZone.UTC, Currency.USD);
assertNull(invoice);
}
@@ -904,7 +907,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final MockBillingEventSet eventSet = new MockBillingEventSet();
final UUID accountId = UUID.randomUUID();
- final DateTime startDate = new DateTime(2012, 1, 1, 0, 12, 34, 0);
+ final LocalDate startDate = new LocalDate(2012, 1, 1);
// add first subscription creation event
final UUID subscriptionId1 = UUID.randomUUID();
@@ -920,7 +923,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
eventSet.add(createBillingEvent(subscriptionId2, startDate, plan2, plan2phase1, 1));
// generate the first invoice
- final Invoice invoice1 = generator.generateInvoice(accountId, eventSet, invoices, startDate, currency);
+ final Invoice invoice1 = generator.generateInvoice(accountId, eventSet, invoices, startDate, DateTimeZone.UTC, currency);
assertNotNull(invoice1);
assertTrue(invoice1.getBalance().compareTo(FIFTEEN.add(TWELVE)) == 0);
invoices.add(invoice1);
@@ -930,16 +933,16 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
eventSet.remove(subscription1creation);
eventSet.addSubscriptionWithAutoInvoiceOff(subscriptionId1);
- final DateTime targetDate2 = startDate.plusMonths(1);
- final Invoice invoice2 = generator.generateInvoice(accountId, eventSet, invoices, targetDate2, currency);
+ final LocalDate targetDate2 = startDate.plusMonths(1);
+ final Invoice invoice2 = generator.generateInvoice(accountId, eventSet, invoices, targetDate2, DateTimeZone.UTC, currency);
assertNotNull(invoice2);
assertTrue(invoice2.getBalance().compareTo(TWELVE) == 0);
invoices.add(invoice2);
- final DateTime targetDate3 = targetDate2.plusMonths(1);
+ final LocalDate targetDate3 = targetDate2.plusMonths(1);
eventSet.clearSubscriptionsWithAutoInvoiceOff();
eventSet.add(subscription1creation);
- final Invoice invoice3 = generator.generateInvoice(accountId, eventSet, invoices, targetDate3, currency);
+ final Invoice invoice3 = generator.generateInvoice(accountId, eventSet, invoices, targetDate3, DateTimeZone.UTC, currency);
assertNotNull(invoice3);
assertTrue(invoice3.getBalance().compareTo(FIFTEEN.multiply(TWO).add(TWELVE)) == 0);
}
@@ -948,7 +951,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
public void testAccountCredit() throws CatalogApiException, InvoiceApiException {
final BillingEventSet billingEventSet = new MockBillingEventSet();
- final DateTime startDate = new DateTime(2012, 3, 1, 0, 0, 0, 0);
+ final LocalDate startDate = new LocalDate(2012, 3, 1);
final UUID accountId = UUID.randomUUID();
final UUID subscriptionId = UUID.randomUUID();
final Plan plan = new MockPlan("original plan");
@@ -959,7 +962,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
final List<Invoice> invoices = new ArrayList<Invoice>();
- final Invoice initialInvoice = generator.generateInvoice(accountId, billingEventSet, null, startDate, Currency.USD);
+ final Invoice initialInvoice = generator.generateInvoice(accountId, billingEventSet, null, startDate, DateTimeZone.UTC, Currency.USD);
assertNotNull(initialInvoice);
assertEquals(initialInvoice.getNumberOfItems(), 1);
assertEquals(initialInvoice.getBalance().compareTo(TEN), 0);
@@ -968,7 +971,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
printDetailInvoice(initialInvoice);
// add account-level credit
- final DateTime creditDate = startDate.plusDays(5);
+ final LocalDate creditDate = new LocalDate(startDate.plusDays(5), DateTimeZone.UTC);
final Invoice invoiceWithCredit = new DefaultInvoice(accountId, creditDate, creditDate, Currency.USD);
final InvoiceItem accountCredit = new CreditBalanceAdjInvoiceItem(invoiceWithCredit.getId(), accountId, creditDate, FIVE, Currency.USD);
invoiceWithCredit.addInvoiceItem(accountCredit);
@@ -977,7 +980,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
printDetailInvoice(invoiceWithCredit);
// invoice one month after the initial subscription
- final Invoice finalInvoice = generator.generateInvoice(accountId, billingEventSet, invoices, startDate.plusMonths(1), Currency.USD);
+ final Invoice finalInvoice = generator.generateInvoice(accountId, billingEventSet, invoices, startDate.plusMonths(1), DateTimeZone.UTC, Currency.USD);
printDetailInvoice(finalInvoice);
@@ -991,19 +994,13 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
private void printDetailInvoice(final Invoice invoice) {
log.info("-------------------- START DETAIL ----------------------");
log.info("Invoice " + invoice.getId() + ": BALANCE = " + invoice.getBalance()
- + ", CBA = " + invoice.getCBAAmount()
- + ", CHARGE_AMOUNT = " + invoice.getChargedAmount()
- + ", ADJ_AMOUNT = " + invoice.getCreditAdjAmount());
+ + ", CBA = " + invoice.getCBAAmount()
+ + ", CHARGE_AMOUNT = " + invoice.getChargedAmount()
+ + ", ADJ_AMOUNT = " + invoice.getCreditAdjAmount());
for (final InvoiceItem cur : invoice.getInvoiceItems()) {
log.info(cur.toString());
}
log.info("-------------------- END DETAIL ----------------------");
}
-
- private void assertDatesEqualRounded(final DateTime date1, final DateTime date2) {
- assertEquals(date1.toDateTime(DateTimeZone.UTC).getDayOfMonth(), date2.toDateTime(DateTimeZone.UTC).getDayOfMonth());
- assertEquals(date1.toDateTime(DateTimeZone.UTC).getMonthOfYear(), date2.toDateTime(DateTimeZone.UTC).getMonthOfYear());
- assertEquals(date1.toDateTime(DateTimeZone.UTC).getYear(), date2.toDateTime(DateTimeZone.UTC).getYear());
- }
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
index 1afb905..2f119e3 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -88,15 +89,15 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
@Test(groups = "fast")
public void testRemoveCancellingInvoiceItemsFixedPrice() {
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal amount = new BigDecimal("12.00");
final BigDecimal rate2 = new BigDecimal("14.85");
final BigDecimal amount2 = rate2;
final List<InvoiceItem> items = new LinkedList<InvoiceItem>();
- final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency);
+ final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency);
items.add(item1);
items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount.negate(), currency, item1.getId()));
items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency));
@@ -109,9 +110,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
@Test(groups = "fast")
public void testRemoveCancellingInvoiceItemsRecurringPrice() {
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("12.00");
final BigDecimal amount1 = rate1;
@@ -131,9 +132,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
@Test(groups = "fast")
public void testRemoveDuplicatedInvoiceItemsFixedPrice() {
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal amount1 = new BigDecimal("12.00");
@@ -143,7 +144,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
final BigDecimal amount3 = rate3;
final List<InvoiceItem> existing = new LinkedList<InvoiceItem>();
- final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount1, currency);
+ final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount1, currency);
existing.add(item1);
final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>();
@@ -161,9 +162,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
@Test(groups = "fast")
public void testRemoveDuplicatedInvoiceItemsRecurringPrice() {
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("12.00");
final BigDecimal amount1 = rate1;
@@ -191,9 +192,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
// STEPH same as testRemoveCancellingInvoiceItemsFixedPrice: should we have one for FixedPrice?
@Test(groups = "fast")
public void testAddRepairedItemsItemsRecurringPrice() {
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("12.00");
final BigDecimal amount1 = rate1;
@@ -228,10 +229,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
@Test(groups = "fast")
public void testGenerateCreditsForPastRepairedInvoices() {
-
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("10.00");
final BigDecimal amount1 = rate1;
@@ -287,9 +287,9 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
}
private void testConsumeCreditInternal(final BigDecimal newRate, final BigDecimal expectedNewCba) {
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusDays(30);
- final DateTime nextEndDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusDays(30);
+ final LocalDate nextEndDate = startDate.plusMonths(1);
final BigDecimal rate1 = new BigDecimal("20.00");
final BigDecimal amount1 = rate1;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java
index 810e76b..30d602b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java
@@ -16,51 +16,64 @@
package com.ning.billing.invoice.generator;
-import org.joda.time.DateTime;
+import java.math.BigDecimal;
+
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.ning.billing.catalog.api.BillingPeriod;
+
public class TestInvoiceDateUtils {
+
+ @Test(groups = "fast")
+ public void testProRationAfterLastBillingCycleDate() throws Exception {
+ final LocalDate endDate = new LocalDate("2012-06-02");
+ final LocalDate previousBillThroughDate = new LocalDate("2012-03-02");
+ final BigDecimal proration = InvoiceDateUtils.calculateProRationAfterLastBillingCycleDate(endDate, previousBillThroughDate, BillingPeriod.MONTHLY);
+ Assert.assertEquals(proration, new BigDecimal("2.9677"));
+ }
+
@Test(groups = "fast")
public void testBeforeBCDWithAfter() throws Exception {
- final DateTime from = new DateTime("2012-03-02T00:03:47.000Z", DateTimeZone.UTC);
- final DateTime to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, 3);
- Assert.assertEquals(to, new DateTime("2012-03-03T00:03:47.000Z", DateTimeZone.UTC));
+ final LocalDate from = new LocalDate("2012-03-02");
+ final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, DateTimeZone.UTC, 3);
+ Assert.assertEquals(to, new LocalDate("2012-03-03"));
}
@Test(groups = "fast")
public void testEqualBCDWithAfter() throws Exception {
- final DateTime from = new DateTime("2012-03-03T00:03:47.000Z", DateTimeZone.UTC);
- final DateTime to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, 3);
- Assert.assertEquals(to, new DateTime("2012-04-03T00:03:47.000Z", DateTimeZone.UTC));
+ final LocalDate from = new LocalDate("2012-03-03");
+ final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, DateTimeZone.UTC, 3);
+ Assert.assertEquals(to, new LocalDate("2012-04-03"));
}
@Test(groups = "fast")
public void testAfterBCDWithAfter() throws Exception {
- final DateTime from = new DateTime("2012-03-04T00:03:47.000Z", DateTimeZone.UTC);
- final DateTime to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, 3);
- Assert.assertEquals(to, new DateTime("2012-04-03T00:03:47.000Z", DateTimeZone.UTC));
+ final LocalDate from = new LocalDate("2012-03-04");
+ final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, DateTimeZone.UTC, 3);
+ Assert.assertEquals(to, new LocalDate("2012-04-03"));
}
@Test(groups = "fast")
public void testBeforeBCDWithOnOrAfter() throws Exception {
- final DateTime from = new DateTime("2012-03-02T00:03:47.000Z", DateTimeZone.UTC);
- final DateTime to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 3);
- Assert.assertEquals(to, new DateTime("2012-03-03T00:03:47.000Z", DateTimeZone.UTC));
+ final LocalDate from = new LocalDate("2012-03-02");
+ final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, DateTimeZone.UTC, 3);
+ Assert.assertEquals(to, new LocalDate("2012-03-03"));
}
@Test(groups = "fast")
public void testEqualBCDWithOnOrAfter() throws Exception {
- final DateTime from = new DateTime("2012-03-03T00:03:47.000Z", DateTimeZone.UTC);
- final DateTime to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 3);
- Assert.assertEquals(to, new DateTime("2012-03-03T00:03:47.000Z", DateTimeZone.UTC));
+ final LocalDate from = new LocalDate("2012-03-03");
+ final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, DateTimeZone.UTC, 3);
+ Assert.assertEquals(to, new LocalDate("2012-03-03"));
}
@Test(groups = "fast")
public void testAfterBCDWithOnOrAfter() throws Exception {
- final DateTime from = new DateTime("2012-03-04T00:03:47.000Z", DateTimeZone.UTC);
- final DateTime to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 3);
- Assert.assertEquals(to, new DateTime("2012-04-03T00:03:47.000Z", DateTimeZone.UTC));
+ final LocalDate from = new LocalDate("2012-03-04");
+ final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, DateTimeZone.UTC, 3);
+ Assert.assertEquals(to, new LocalDate("2012-04-03"));
}
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
index 56fa7fa..c3fc3d4 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -22,6 +22,8 @@ import java.util.List;
import java.util.Locale;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.skife.config.ConfigurationObjectFactory;
import org.testng.Assert;
@@ -88,8 +90,8 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuite {
}
private Invoice createInvoice() {
- final DateTime startDate = new DateTime().minusMonths(1);
- final DateTime endDate = new DateTime();
+ final LocalDate startDate = new LocalDate(new DateTime().minusMonths(1), DateTimeZone.UTC);
+ final LocalDate endDate = new LocalDate(DateTimeZone.UTC);
final BigDecimal price1 = new BigDecimal("29.95");
final BigDecimal price2 = new BigDecimal("59.95");
@@ -109,7 +111,8 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuite {
return dummyInvoice;
}
- private InvoiceItem createInvoiceItem(final BigDecimal amount, final String networkName, final DateTime startDate, final DateTime endDate, final String planName) {
+ private InvoiceItem createInvoiceItem(final BigDecimal amount, final String networkName, final LocalDate startDate,
+ final LocalDate endDate, final String planName) {
final InvoiceItem item = Mockito.mock(InvoiceItem.class);
Mockito.when(item.getAmount()).thenReturn(amount);
Mockito.when(item.getStartDate()).thenReturn(startDate);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java
index 082b751..4cb1f53 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.annual;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,9 +33,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 1);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 1);
+ final LocalDate endDate = buildDate(2012, 1, 27);
final BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -43,9 +43,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 7);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 7);
+ final LocalDate endDate = buildDate(2012, 1, 27);
final BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -53,9 +53,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 15);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 15);
+ final LocalDate endDate = buildDate(2012, 1, 27);
final BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -63,9 +63,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 22);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 22);
+ final LocalDate endDate = buildDate(2012, 1, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -76,9 +76,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2012, 1, 15);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2012, 1, 15);
+ final LocalDate endDate = buildDate(2012, 1, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -91,9 +91,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2012, 1, 17);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2012, 1, 17);
+ final LocalDate endDate = buildDate(2012, 1, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -106,9 +106,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2012, 1, 27);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2012, 1, 27);
+ final LocalDate endDate = buildDate(2012, 1, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -121,9 +121,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2012, 3, 7);
- final DateTime endDate = buildDateTime(2012, 1, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2012, 3, 7);
+ final LocalDate endDate = buildDate(2012, 1, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -136,9 +136,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2012, 2, 26);
- final DateTime endDate = buildDateTime(2013, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2012, 2, 26);
+ final LocalDate endDate = buildDate(2013, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java
index bfe28ac..3ac8120 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.annual;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -26,6 +26,7 @@ import com.ning.billing.invoice.model.InvalidDateSequenceException;
import com.ning.billing.invoice.tests.inAdvance.ProRationInAdvanceTestBase;
public class TestLeadingProRation extends ProRationInAdvanceTestBase {
+
@Override
protected BillingPeriod getBillingPeriod() {
return BillingPeriod.ANNUAL;
@@ -33,8 +34,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -44,8 +45,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 4);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 4);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -55,8 +56,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -66,8 +67,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -77,9 +78,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
- final DateTime endDate = buildDateTime(2012, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
+ final LocalDate endDate = buildDate(2012, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -89,9 +90,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 4);
- final DateTime endDate = buildDateTime(2012, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 4);
+ final LocalDate endDate = buildDate(2012, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -101,9 +102,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 13);
- final DateTime endDate = buildDateTime(2012, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 13);
+ final LocalDate endDate = buildDate(2012, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -113,9 +114,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 10);
- final DateTime endDate = buildDateTime(2012, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 10);
+ final LocalDate endDate = buildDate(2012, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -125,9 +126,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2012, 2, 13);
- final DateTime endDate = buildDateTime(2012, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2012, 2, 13);
+ final LocalDate endDate = buildDate(2012, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -137,9 +138,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2012, 4, 10);
- final DateTime endDate = buildDateTime(2012, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2012, 4, 10);
+ final LocalDate endDate = buildDate(2012, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java
index b9afbeb..366f987 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.annual;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,8 +33,8 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_PrecedingProRation() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 31);
- final DateTime targetDate = buildDateTime(2011, 2, 24);
+ final LocalDate startDate = buildDate(2011, 1, 31);
+ final LocalDate targetDate = buildDate(2011, 2, 24);
final BigDecimal expectedValue = ONE.add(FIFTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, expectedValue);
@@ -42,8 +42,8 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_PrecedingProRation_CrossingYearBoundary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 12, 15);
- final DateTime targetDate = buildDateTime(2011, 1, 13);
+ final LocalDate startDate = buildDate(2010, 12, 15);
+ final LocalDate targetDate = buildDate(2011, 1, 13);
final BigDecimal expectedValue = ONE.add(TWENTY.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, targetDate, 4, expectedValue);
@@ -52,9 +52,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
// TODO Test fails, needs to be investigated
@Test(groups = "fast", enabled=false)
public void testSinglePlanDoubleProRation() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 10);
- final DateTime endDate = buildDateTime(2012, 3, 4);
- final DateTime targetDate = buildDateTime(2012, 4, 5);
+ final LocalDate startDate = buildDate(2011, 1, 10);
+ final LocalDate endDate = buildDate(2012, 3, 4);
+ final LocalDate targetDate = buildDate(2012, 4, 5);
final BigDecimal expectedValue = BigDecimal.ZERO;
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java
index 798231a..fb7d4cd 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.annual;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,27 +33,27 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2012, 6, 25);
- final DateTime targetDate = buildDateTime(2010, 6, 17);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2012, 6, 25);
+ final LocalDate targetDate = buildDate(2010, 6, 17);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
}
@Test(groups = "fast")
public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2011, 6, 25);
- final DateTime targetDate = buildDateTime(2010, 6, 20);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2011, 6, 25);
+ final LocalDate targetDate = buildDate(2010, 6, 20);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
}
@Test(groups = "fast")
public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2011, 6, 25);
- final DateTime targetDate = buildDateTime(2011, 6, 17);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2011, 6, 25);
+ final LocalDate targetDate = buildDate(2011, 6, 17);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -61,9 +61,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2011, 6, 25);
- final DateTime targetDate = buildDateTime(2011, 6, 18);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2011, 6, 25);
+ final LocalDate targetDate = buildDate(2011, 6, 18);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -71,8 +71,8 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2011, 6, 25);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2011, 6, 25);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
@@ -80,9 +80,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2011, 6, 25);
- final DateTime targetDate = buildDateTime(2011, 7, 30);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2011, 6, 25);
+ final LocalDate targetDate = buildDate(2011, 7, 30);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
index 500ffd0..42ed57d 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
@@ -18,7 +18,8 @@ package com.ning.billing.invoice.tests.inAdvance;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.invoice.model.InvalidDateSequenceException;
@@ -33,47 +34,47 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testSinglePlan_OnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 15);
+ final LocalDate startDate = buildDate(2011, 2, 15);
testCalculateNumberOfBillingCycles(startDate, startDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_LessThanOnePeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_OnePeriodLessADayAfterStart() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(-1);
+ final LocalDate startDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(-1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_ExactlyOnePeriodAfterStart() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+ final LocalDate startDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_SlightlyMoreThanOnePeriodAfterStart() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(1);
+ final LocalDate startDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 12, 15);
- final DateTime oneCycleLater = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+ final LocalDate startDate = buildDate(2011, 12, 15);
+ final LocalDate oneCycleLater = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
// test just before the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(-1), 15, ONE);
@@ -87,27 +88,27 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testSinglePlan_StartingMidFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+ final LocalDate startDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_StartingMidFebruaryOfLeapYear() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 2, 15);
- final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+ final LocalDate startDate = buildDate(2012, 2, 15);
+ final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_MovingForwardThroughTime() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 31);
+ final LocalDate startDate = buildDate(2011, 1, 31);
BigDecimal expectedValue = ONE;
for (int i = 1; i <= 12; i++) {
- final DateTime oneCycleLater = startDate.plusMonths(i * getBillingPeriod().getNumberOfMonths());
+ final LocalDate oneCycleLater = startDate.plusMonths(i * getBillingPeriod().getNumberOfMonths());
// test just before the billing cycle day
testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(-1), 31, expectedValue);
@@ -124,9 +125,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
// tests for cancellation in less than one period, beginning Jan 1
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateInStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 1);
- final DateTime endDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 1);
+ final LocalDate endDate = buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -134,9 +135,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateInSubscriptionPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 7);
- final DateTime endDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 7);
+ final LocalDate endDate = buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -144,9 +145,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 15);
- final DateTime endDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 15);
+ final LocalDate endDate = buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -154,9 +155,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateAfterEndDateButInFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 17);
- final DateTime endDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 17);
+ final LocalDate endDate = buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -164,9 +165,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateAtEndOfFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
- final DateTime endDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
+ final LocalDate endDate = buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -174,9 +175,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
@Test(groups = "fast")
public void testCancelledBeforeOnePeriod_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 5);
- final DateTime endDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 5);
+ final LocalDate endDate = buildDate(2011, 1, 15);
final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java
index 06573d9..4586e51 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.monthly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,9 +33,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 1);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 1);
+ final LocalDate endDate = buildDate(2011, 2, 27);
final BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -43,9 +43,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 7);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 7);
+ final LocalDate endDate = buildDate(2011, 2, 27);
final BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -53,9 +53,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 15);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 15);
+ final LocalDate endDate = buildDate(2011, 2, 27);
final BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -63,9 +63,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 22);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 22);
+ final LocalDate endDate = buildDate(2011, 2, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -76,9 +76,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 27);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 27);
+ final LocalDate endDate = buildDate(2011, 2, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -90,9 +90,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 26);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 26);
+ final LocalDate endDate = buildDate(2011, 2, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -104,9 +104,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 27);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 27);
+ final LocalDate endDate = buildDate(2011, 2, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -118,9 +118,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 3, 7);
- final DateTime endDate = buildDateTime(2011, 2, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 3, 7);
+ final LocalDate endDate = buildDate(2011, 2, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -132,9 +132,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 26);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 26);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java
index aa76033..2bf67d4 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.monthly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,8 +33,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -44,8 +44,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 4);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 4);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -55,8 +55,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -66,8 +66,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(THREE);
@@ -77,9 +77,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
- final DateTime endDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
+ final LocalDate endDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -89,9 +89,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 4);
- final DateTime endDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 4);
+ final LocalDate endDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -101,9 +101,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 13);
- final DateTime endDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 13);
+ final LocalDate endDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -113,9 +113,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 10);
- final DateTime endDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 10);
+ final LocalDate endDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -125,9 +125,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 13);
- final DateTime endDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 13);
+ final LocalDate endDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -137,9 +137,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 10);
- final DateTime endDate = buildDateTime(2011, 4, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 10);
+ final LocalDate endDate = buildDate(2011, 4, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java
index d0e4726..e5ad773 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.monthly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,9 +33,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 10);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 24);
- final DateTime targetDate = buildDateTime(2011, 3, 6);
+ final LocalDate startDate = buildDate(2011, 2, 10);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 24);
+ final LocalDate targetDate = buildDate(2011, 3, 6);
testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 10, ONE_HALF);
testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 10, ONE_HALF);
@@ -43,9 +43,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange_BeforeBillCycleDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 3);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 3);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_HALF);
@@ -53,9 +53,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange_OnBillCycleDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 3);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
- final DateTime targetDate = buildDateTime(2011, 3, 3);
+ final LocalDate startDate = buildDate(2011, 2, 3);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
+ final LocalDate targetDate = buildDate(2011, 3, 3);
testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_AND_A_HALF);
@@ -63,9 +63,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange_AfterBillCycleDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 3);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
- final DateTime targetDate = buildDateTime(2011, 3, 4);
+ final LocalDate startDate = buildDate(2011, 2, 3);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
+ final LocalDate targetDate = buildDate(2011, 3, 4);
testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_AND_A_HALF);
@@ -73,9 +73,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_WithChangeOfBillCycleDayToLaterDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime planChangeDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate planChangeDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 1, ONE_HALF);
testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 15, ONE);
@@ -83,9 +83,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_WithChangeOfBillCycleDayToEarlierDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 20);
- final DateTime planChangeDate = buildDateTime(2011, 3, 6);
- final DateTime targetDate = buildDateTime(2011, 3, 9);
+ final LocalDate startDate = buildDate(2011, 2, 20);
+ final LocalDate planChangeDate = buildDate(2011, 3, 6);
+ final LocalDate targetDate = buildDate(2011, 3, 9);
testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 20, ONE_HALF);
testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 6, ONE);
@@ -93,41 +93,41 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 12, 15);
- final DateTime targetDate = buildDateTime(2011, 1, 16);
+ final LocalDate startDate = buildDate(2010, 12, 15);
+ final LocalDate targetDate = buildDate(2011, 1, 16);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_LeapYear_StartingMidFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 2, 15);
- final DateTime targetDate = buildDateTime(2012, 3, 15);
+ final LocalDate startDate = buildDate(2012, 2, 15);
+ final LocalDate targetDate = buildDate(2012, 3, 15);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_LeapYear_StartingBeforeFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 1, 15);
- final DateTime targetDate = buildDateTime(2012, 2, 3);
+ final LocalDate startDate = buildDate(2012, 1, 15);
+ final LocalDate targetDate = buildDate(2012, 2, 3);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_LeapYear_IncludingAllOfFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 1, 30);
- final DateTime targetDate = buildDateTime(2012, 3, 1);
+ final LocalDate startDate = buildDate(2012, 1, 30);
+ final LocalDate targetDate = buildDate(2012, 3, 1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 30, TWO);
}
@Test(groups = "fast")
public void testSinglePlan_ChangeBCDTo31() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime planChangeDate = buildDateTime(2011, 2, 14);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate planChangeDate = buildDate(2011, 2, 14);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
BigDecimal expectedValue;
@@ -140,9 +140,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_ChangeBCD() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime planChangeDate = buildDateTime(2011, 2, 14);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate planChangeDate = buildDate(2011, 2, 14);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
BigDecimal expectedValue;
@@ -155,9 +155,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_LeapYearFebruaryProRation() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 2, 1);
- final DateTime endDate = buildDateTime(2012, 2, 15);
- final DateTime targetDate = buildDateTime(2012, 2, 19);
+ final LocalDate startDate = buildDate(2012, 2, 1);
+ final LocalDate endDate = buildDate(2012, 2, 15);
+ final LocalDate targetDate = buildDate(2012, 2, 19);
final BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(TWENTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -167,9 +167,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_BeforeBillingDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 7);
- final DateTime changeDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = buildDateTime(2011, 4, 21);
+ final LocalDate startDate = buildDate(2011, 2, 7);
+ final LocalDate changeDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = buildDate(2011, 4, 21);
final BigDecimal expectedValue;
@@ -181,9 +181,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_OnBillingDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 7);
- final DateTime changeDate = buildDateTime(2011, 3, 7);
- final DateTime targetDate = buildDateTime(2011, 4, 21);
+ final LocalDate startDate = buildDate(2011, 2, 7);
+ final LocalDate changeDate = buildDate(2011, 3, 7);
+ final LocalDate targetDate = buildDate(2011, 4, 21);
testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, ONE);
@@ -194,9 +194,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_AfterBillingDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 7);
- final DateTime changeDate = buildDateTime(2011, 3, 10);
- final DateTime targetDate = buildDateTime(2011, 4, 21);
+ final LocalDate startDate = buildDate(2011, 2, 7);
+ final LocalDate changeDate = buildDate(2011, 3, 10);
+ final LocalDate targetDate = buildDate(2011, 4, 21);
BigDecimal expectedValue;
@@ -209,9 +209,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_DoubleProRation() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 31);
- final DateTime planChangeDate = buildDateTime(2011, 3, 10);
- final DateTime targetDate = buildDateTime(2011, 4, 21);
+ final LocalDate startDate = buildDate(2011, 1, 31);
+ final LocalDate planChangeDate = buildDate(2011, 3, 10);
+ final LocalDate targetDate = buildDate(2011, 4, 21);
BigDecimal expectedValue;
expectedValue = SEVEN.divide(THIRTY_ONE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -226,9 +226,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testStartTargetEnd() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 12, 15);
- final DateTime targetDate = buildDateTime(2011, 3, 15);
- final DateTime endDate = buildDateTime(2011, 3, 17);
+ final LocalDate startDate = buildDate(2010, 12, 15);
+ final LocalDate targetDate = buildDate(2011, 3, 15);
+ final LocalDate endDate = buildDate(2011, 3, 17);
final BigDecimal expectedValue = THREE.add(TWO.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java
index 40b62e8..d643d36 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.monthly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,27 +33,27 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 7, 25);
- final DateTime targetDate = buildDateTime(2010, 6, 17);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 7, 25);
+ final LocalDate targetDate = buildDate(2010, 6, 17);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
}
@Test(groups = "fast")
public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 7, 25);
- final DateTime targetDate = buildDateTime(2010, 6, 20);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 7, 25);
+ final LocalDate targetDate = buildDate(2010, 6, 20);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
}
@Test(groups = "fast")
public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 7, 25);
- final DateTime targetDate = buildDateTime(2010, 7, 17);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 7, 25);
+ final LocalDate targetDate = buildDate(2010, 7, 17);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -61,9 +61,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 7, 25);
- final DateTime targetDate = buildDateTime(2010, 7, 18);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 7, 25);
+ final LocalDate targetDate = buildDate(2010, 7, 18);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -71,8 +71,8 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 7, 25);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 7, 25);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
@@ -80,9 +80,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 7, 25);
- final DateTime targetDate = buildDateTime(2010, 7, 30);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 7, 25);
+ final LocalDate targetDate = buildDate(2010, 7, 30);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java
index 9fe0746..05e145d 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.quarterly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,9 +33,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 1);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 1);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -44,9 +44,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 7);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 7);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -55,9 +55,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 15);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 15);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue = ONE.add(FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD));
expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -66,9 +66,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 1, 22);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 1, 22);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -80,9 +80,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 15);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 15);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -95,9 +95,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 26);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 26);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -110,9 +110,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 4, 27);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 4, 27);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -125,9 +125,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 5, 7);
- final DateTime endDate = buildDateTime(2011, 4, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 5, 7);
+ final LocalDate endDate = buildDate(2011, 4, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -140,9 +140,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 1);
- final DateTime targetDate = buildDateTime(2011, 6, 26);
- final DateTime endDate = buildDateTime(2011, 8, 27);
+ final LocalDate startDate = buildDate(2011, 1, 1);
+ final LocalDate targetDate = buildDate(2011, 6, 26);
+ final LocalDate endDate = buildDate(2011, 8, 27);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java
index fc7e423..b831003 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.quarterly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,8 +33,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -44,8 +44,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 4);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 4);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -55,8 +55,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -66,8 +66,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 6, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 6, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -77,9 +77,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 1);
- final DateTime endDate = buildDateTime(2011, 8, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 1);
+ final LocalDate endDate = buildDate(2011, 8, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -89,9 +89,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 4);
- final DateTime endDate = buildDateTime(2011, 8, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 4);
+ final LocalDate endDate = buildDate(2011, 8, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -101,9 +101,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 2, 13);
- final DateTime endDate = buildDateTime(2011, 8, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 2, 13);
+ final LocalDate endDate = buildDate(2011, 8, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -113,9 +113,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 8, 10);
- final DateTime endDate = buildDateTime(2011, 8, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 8, 10);
+ final LocalDate endDate = buildDate(2011, 8, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -125,9 +125,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 8, 13);
- final DateTime endDate = buildDateTime(2011, 8, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 8, 13);
+ final LocalDate endDate = buildDate(2011, 8, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -137,9 +137,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime targetDate = buildDateTime(2011, 9, 10);
- final DateTime endDate = buildDateTime(2011, 8, 13);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate targetDate = buildDate(2011, 9, 10);
+ final LocalDate endDate = buildDate(2011, 8, 13);
final BigDecimal expectedValue;
expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java
index a2884c3..36a98e2 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.quarterly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,9 +33,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 10);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 24);
- final DateTime targetDate = buildDateTime(2011, 3, 6);
+ final LocalDate startDate = buildDate(2011, 2, 10);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 24);
+ final LocalDate targetDate = buildDate(2011, 3, 6);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -47,9 +47,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange_BeforeBillCycleDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 3);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 3);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -61,9 +61,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange_OnBillCycleDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 3);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
- final DateTime targetDate = buildDateTime(2011, 3, 3);
+ final LocalDate startDate = buildDate(2011, 2, 3);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
+ final LocalDate targetDate = buildDate(2011, 3, 3);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -75,9 +75,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_WithPhaseChange_AfterBillCycleDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 3);
- final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
- final DateTime targetDate = buildDateTime(2011, 3, 4);
+ final LocalDate startDate = buildDate(2011, 2, 3);
+ final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
+ final LocalDate targetDate = buildDate(2011, 3, 4);
BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -89,9 +89,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_WithChangeOfBillCycleDayToLaterDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime planChangeDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate planChangeDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
final BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 1, expectedValue);
@@ -100,9 +100,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_WithChangeOfBillCycleDayToEarlierDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 20);
- final DateTime planChangeDate = buildDateTime(2011, 3, 6);
- final DateTime targetDate = buildDateTime(2011, 3, 9);
+ final LocalDate startDate = buildDate(2011, 2, 20);
+ final LocalDate planChangeDate = buildDate(2011, 3, 6);
+ final LocalDate targetDate = buildDate(2011, 3, 9);
final BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 20, expectedValue);
@@ -111,41 +111,41 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 12, 15);
- final DateTime targetDate = buildDateTime(2011, 1, 16);
+ final LocalDate startDate = buildDate(2010, 12, 15);
+ final LocalDate targetDate = buildDate(2011, 1, 16);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_LeapYear_StartingMidFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 2, 15);
- final DateTime targetDate = buildDateTime(2012, 3, 15);
+ final LocalDate startDate = buildDate(2012, 2, 15);
+ final LocalDate targetDate = buildDate(2012, 3, 15);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_LeapYear_StartingBeforeFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 1, 15);
- final DateTime targetDate = buildDateTime(2012, 2, 3);
+ final LocalDate startDate = buildDate(2012, 1, 15);
+ final LocalDate targetDate = buildDate(2012, 2, 3);
testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_LeapYear_IncludingAllOfFebruary() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 1, 30);
- final DateTime targetDate = buildDateTime(2012, 3, 1);
+ final LocalDate startDate = buildDate(2012, 1, 30);
+ final LocalDate targetDate = buildDate(2012, 3, 1);
testCalculateNumberOfBillingCycles(startDate, targetDate, 30, ONE);
}
@Test(groups = "fast")
public void testSinglePlan_ChangeBCDTo31() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime planChangeDate = buildDateTime(2011, 2, 14);
- final DateTime targetDate = buildDateTime(2011, 3, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate planChangeDate = buildDate(2011, 2, 14);
+ final LocalDate targetDate = buildDate(2011, 3, 1);
BigDecimal expectedValue;
@@ -158,9 +158,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_ChangeBCD() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 1);
- final DateTime planChangeDate = buildDateTime(2011, 2, 14);
- final DateTime targetDate = buildDateTime(2011, 5, 1);
+ final LocalDate startDate = buildDate(2011, 2, 1);
+ final LocalDate planChangeDate = buildDate(2011, 2, 14);
+ final LocalDate targetDate = buildDate(2011, 5, 1);
BigDecimal expectedValue;
@@ -173,9 +173,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testSinglePlan_LeapYearFebruaryProRation() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2012, 2, 1);
- final DateTime endDate = buildDateTime(2012, 2, 15);
- final DateTime targetDate = buildDateTime(2012, 2, 19);
+ final LocalDate startDate = buildDate(2012, 2, 1);
+ final LocalDate endDate = buildDate(2012, 2, 15);
+ final LocalDate targetDate = buildDate(2012, 2, 19);
final BigDecimal expectedValue;
expectedValue = FOURTEEN.divide(NINETY, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -185,9 +185,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_BeforeBillingDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 7);
- final DateTime changeDate = buildDateTime(2011, 2, 15);
- final DateTime targetDate = buildDateTime(2011, 9, 21);
+ final LocalDate startDate = buildDate(2011, 2, 7);
+ final LocalDate changeDate = buildDate(2011, 2, 15);
+ final LocalDate targetDate = buildDate(2011, 9, 21);
final BigDecimal expectedValue;
@@ -199,9 +199,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_OnBillingDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 7);
- final DateTime changeDate = buildDateTime(2011, 5, 7);
- final DateTime targetDate = buildDateTime(2011, 7, 21);
+ final LocalDate startDate = buildDate(2011, 2, 7);
+ final LocalDate changeDate = buildDate(2011, 5, 7);
+ final LocalDate targetDate = buildDate(2011, 7, 21);
testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, ONE);
@@ -212,9 +212,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_AfterBillingDay() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 2, 7);
- final DateTime changeDate = buildDateTime(2011, 5, 10);
- final DateTime targetDate = buildDateTime(2011, 9, 21);
+ final LocalDate startDate = buildDate(2011, 2, 7);
+ final LocalDate changeDate = buildDate(2011, 5, 10);
+ final LocalDate targetDate = buildDate(2011, 9, 21);
BigDecimal expectedValue;
@@ -227,9 +227,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testPlanChange_DoubleProRation() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 31);
- final DateTime planChangeDate = buildDateTime(2011, 5, 10);
- final DateTime targetDate = buildDateTime(2011, 5, 21);
+ final LocalDate startDate = buildDate(2011, 1, 31);
+ final LocalDate planChangeDate = buildDate(2011, 5, 10);
+ final LocalDate targetDate = buildDate(2011, 5, 21);
BigDecimal expectedValue;
expectedValue = SEVEN.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -243,9 +243,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testStartTargetEnd() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 12, 15);
- final DateTime targetDate = buildDateTime(2011, 6, 15);
- final DateTime endDate = buildDateTime(2011, 6, 17);
+ final LocalDate startDate = buildDate(2010, 12, 15);
+ final LocalDate targetDate = buildDate(2011, 6, 15);
+ final LocalDate endDate = buildDate(2011, 6, 17);
final BigDecimal expectedValue = TWO.add(TWO.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java
index bb40078..ff53385 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance.quarterly;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -33,27 +33,27 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 9, 25);
- final DateTime targetDate = buildDateTime(2010, 6, 17);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 9, 25);
+ final LocalDate targetDate = buildDate(2010, 6, 17);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
}
@Test(groups = "fast")
public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 9, 25);
- final DateTime targetDate = buildDateTime(2010, 6, 20);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 9, 25);
+ final LocalDate targetDate = buildDate(2010, 6, 20);
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
}
@Test(groups = "fast")
public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 9, 25);
- final DateTime targetDate = buildDateTime(2010, 9, 17);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 9, 25);
+ final LocalDate targetDate = buildDate(2010, 9, 17);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -61,9 +61,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 9, 25);
- final DateTime targetDate = buildDateTime(2010, 9, 18);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 9, 25);
+ final LocalDate targetDate = buildDate(2010, 9, 18);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -71,8 +71,8 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 9, 25);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 9, 25);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
@@ -80,9 +80,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
@Test(groups = "fast")
public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2010, 6, 17);
- final DateTime endDate = buildDateTime(2010, 9, 25);
- final DateTime targetDate = buildDateTime(2010, 9, 30);
+ final LocalDate startDate = buildDate(2010, 6, 17);
+ final LocalDate endDate = buildDate(2010, 9, 25);
+ final LocalDate targetDate = buildDate(2010, 9, 30);
final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java
index 6dcf75a..e6fb631 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java
@@ -18,7 +18,7 @@ package com.ning.billing.invoice.tests.inAdvance;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -30,6 +30,7 @@ import com.ning.billing.invoice.tests.ProRationTestBase;
import static org.testng.Assert.assertEquals;
public class TestValidationProRation extends ProRationTestBase {
+
@Override
protected BillingPeriod getBillingPeriod() {
return BillingPeriod.MONTHLY;
@@ -42,44 +43,44 @@ public class TestValidationProRation extends ProRationTestBase {
@Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
public void testTargetStartEnd() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 30);
- final DateTime endDate = buildDateTime(2011, 3, 15);
- final DateTime targetDate = buildDateTime(2011, 1, 15);
+ final LocalDate startDate = buildDate(2011, 1, 30);
+ final LocalDate endDate = buildDate(2011, 3, 15);
+ final LocalDate targetDate = buildDate(2011, 1, 15);
calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
}
@Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
public void testTargetEndStart() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 4, 30);
- final DateTime endDate = buildDateTime(2011, 3, 15);
- final DateTime targetDate = buildDateTime(2011, 2, 15);
+ final LocalDate startDate = buildDate(2011, 4, 30);
+ final LocalDate endDate = buildDate(2011, 3, 15);
+ final LocalDate targetDate = buildDate(2011, 2, 15);
calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
}
@Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
public void testEndTargetStart() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 3, 30);
- final DateTime endDate = buildDateTime(2011, 1, 15);
- final DateTime targetDate = buildDateTime(2011, 2, 15);
+ final LocalDate startDate = buildDate(2011, 3, 30);
+ final LocalDate endDate = buildDate(2011, 1, 15);
+ final LocalDate targetDate = buildDate(2011, 2, 15);
calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
}
@Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
public void testEndStartTarget() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 1, 30);
- final DateTime endDate = buildDateTime(2011, 1, 15);
- final DateTime targetDate = buildDateTime(2011, 2, 15);
+ final LocalDate startDate = buildDate(2011, 1, 30);
+ final LocalDate endDate = buildDate(2011, 1, 15);
+ final LocalDate targetDate = buildDate(2011, 2, 15);
calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
}
@Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
public void testTargetStart() throws InvalidDateSequenceException {
- final DateTime startDate = buildDateTime(2011, 4, 30);
- final DateTime targetDate = buildDateTime(2011, 2, 15);
+ final LocalDate startDate = buildDate(2011, 4, 30);
+ final LocalDate targetDate = buildDate(2011, 2, 15);
calculateNumberOfBillingCycles(startDate, targetDate, 15);
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java
index edb4450..a10d37d 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java
@@ -21,6 +21,7 @@ import java.math.BigDecimal;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.account.api.Account;
import com.ning.billing.catalog.api.BillingPeriod;
@@ -81,8 +82,8 @@ public abstract class InvoicingTestBase extends InvoiceTestSuiteWithEmbeddedDB {
protected static final BigDecimal THREE_HUNDRED_AND_SIXTY_FIVE = new BigDecimal("365.0").setScale(NUMBER_OF_DECIMALS);
protected static final BigDecimal THREE_HUNDRED_AND_SIXTY_SIX = new BigDecimal("366.0").setScale(NUMBER_OF_DECIMALS);
- protected DateTime buildDateTime(final int year, final int month, final int day) {
- return new DateTime(year, month, day, 0, 0, 0, 0);
+ protected LocalDate buildDate(final int year, final int month, final int day) {
+ return new LocalDate(year, month, day);
}
protected BillingEvent createMockBillingEvent(@Nullable final Account account, final Subscription subscription,
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
index 578b199..e191f92 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
@@ -20,6 +20,8 @@ import java.math.BigDecimal;
import java.util.List;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.invoice.model.BillingMode;
@@ -30,11 +32,12 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
public abstract class ProRationTestBase extends InvoicingTestBase {
+
protected abstract BillingMode getBillingMode();
protected abstract BillingPeriod getBillingPeriod();
- protected void testCalculateNumberOfBillingCycles(final DateTime startDate, final DateTime targetDate, final int billingCycleDay, final BigDecimal expectedValue) throws InvalidDateSequenceException {
+ protected void testCalculateNumberOfBillingCycles(final LocalDate startDate, final LocalDate targetDate, final int billingCycleDay, final BigDecimal expectedValue) throws InvalidDateSequenceException {
try {
final BigDecimal numberOfBillingCycles;
numberOfBillingCycles = calculateNumberOfBillingCycles(startDate, targetDate, billingCycleDay);
@@ -47,7 +50,7 @@ public abstract class ProRationTestBase extends InvoicingTestBase {
}
}
- protected void testCalculateNumberOfBillingCycles(final DateTime startDate, final DateTime endDate, final DateTime targetDate, final int billingCycleDay, final BigDecimal expectedValue) throws InvalidDateSequenceException {
+ protected void testCalculateNumberOfBillingCycles(final LocalDate startDate, final LocalDate endDate, final LocalDate targetDate, final int billingCycleDay, final BigDecimal expectedValue) throws InvalidDateSequenceException {
try {
final BigDecimal numberOfBillingCycles;
numberOfBillingCycles = calculateNumberOfBillingCycles(startDate, endDate, targetDate, billingCycleDay);
@@ -60,8 +63,8 @@ public abstract class ProRationTestBase extends InvoicingTestBase {
}
}
- protected BigDecimal calculateNumberOfBillingCycles(final DateTime startDate, final DateTime endDate, final DateTime targetDate, final int billingCycleDay) throws InvalidDateSequenceException {
- final List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, endDate, targetDate, billingCycleDay, getBillingPeriod());
+ protected BigDecimal calculateNumberOfBillingCycles(final LocalDate startDate, final LocalDate endDate, final LocalDate targetDate, final int billingCycleDay) throws InvalidDateSequenceException {
+ final List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, endDate, targetDate, DateTimeZone.UTC, billingCycleDay, getBillingPeriod());
BigDecimal numberOfBillingCycles = ZERO;
for (final RecurringInvoiceItemData item : items) {
@@ -71,8 +74,8 @@ public abstract class ProRationTestBase extends InvoicingTestBase {
return numberOfBillingCycles.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
}
- protected BigDecimal calculateNumberOfBillingCycles(final DateTime startDate, final DateTime targetDate, final int billingCycleDay) throws InvalidDateSequenceException {
- final List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, targetDate, billingCycleDay, getBillingPeriod());
+ protected BigDecimal calculateNumberOfBillingCycles(final LocalDate startDate, final LocalDate targetDate, final int billingCycleDay) throws InvalidDateSequenceException {
+ final List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, targetDate, DateTimeZone.UTC, billingCycleDay, getBillingPeriod());
BigDecimal numberOfBillingCycles = ZERO;
for (final RecurringInvoiceItemData item : items) {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
index b0d75dc..ef43230 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
@@ -218,8 +218,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
Mockito.when(invoice.getId()).thenReturn(invoiceId);
Mockito.when(invoice.getAccountId()).thenReturn(accountId);
- Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCNow());
- Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCNow());
+ Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCToday());
+ Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCToday());
Mockito.when(invoice.getCurrency()).thenReturn(CURRENCY);
Mockito.when(invoice.isMigrationInvoice()).thenReturn(false);
@@ -234,7 +234,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
private InvoiceItem createInvoiceItem(final UUID invoiceId, final UUID accountId, final BigDecimal amount) {
return new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(), UUID.randomUUID(),
- "charge back test", "charge back phase", clock.getUTCNow(), clock.getUTCNow(), amount, CURRENCY);
+ "charge back test", "charge back phase", clock.getUTCToday(), amount, CURRENCY);
}
private InvoicePayment createAndPersistPayment(final UUID invoiceId, final BigDecimal amount) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CreditJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CreditJson.java
index a63a244..ab5221e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CreditJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CreditJson.java
@@ -20,12 +20,15 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
+import com.ning.billing.invoice.api.InvoiceItem;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.invoice.api.InvoiceItem;
public class CreditJson {
+
private final BigDecimal creditAmount;
private final UUID invoiceId;
private final String invoiceNumber;
@@ -51,12 +54,12 @@ public class CreditJson {
this.accountId = accountId;
}
- public CreditJson(final InvoiceItem credit) {
+ public CreditJson(final InvoiceItem credit, final DateTimeZone accountTimeZone) {
this.creditAmount = credit.getAmount();
this.invoiceId = credit.getInvoiceId();
this.invoiceNumber = null;
this.requestedDate = null;
- this.effectiveDate = credit.getStartDate();
+ this.effectiveDate = credit.getStartDate().toDateTimeAtStartOfDay(accountTimeZone);
this.reason = null;
this.accountId = credit.getAccountId();
}
@@ -101,11 +104,11 @@ public class CreditJson {
final CreditJson that = (CreditJson) o;
if (!((creditAmount == null && that.creditAmount == null) ||
- (creditAmount != null && that.creditAmount != null && creditAmount.compareTo(that.creditAmount) == 0))) {
+ (creditAmount != null && that.creditAmount != null && creditAmount.compareTo(that.creditAmount) == 0))) {
return false;
}
if (!((effectiveDate == null && that.effectiveDate == null) ||
- (effectiveDate != null && that.effectiveDate != null && effectiveDate.compareTo(that.effectiveDate) == 0))) {
+ (effectiveDate != null && that.effectiveDate != null && effectiveDate.compareTo(that.effectiveDate) == 0))) {
return false;
}
if (invoiceId != null ? !invoiceId.equals(that.invoiceId) : that.invoiceId != null) {
@@ -118,7 +121,7 @@ public class CreditJson {
return false;
}
if (!((requestedDate == null && that.requestedDate == null) ||
- (requestedDate != null && that.requestedDate != null && requestedDate.compareTo(that.requestedDate) == 0))) {
+ (requestedDate != null && that.requestedDate != null && requestedDate.compareTo(that.requestedDate) == 0))) {
return false;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java
index 3273246..5c2991c 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java
@@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ning.billing.catalog.api.Currency;
@@ -33,8 +34,8 @@ public class InvoiceItemJsonSimple {
private final String planName;
private final String phaseName;
private final String description;
- private final DateTime startDate;
- private final DateTime endDate;
+ private final LocalDate startDate;
+ private final LocalDate endDate;
private final BigDecimal amount;
private final Currency currency;
@@ -45,8 +46,8 @@ public class InvoiceItemJsonSimple {
@JsonProperty("planName") final String planName,
@JsonProperty("phaseName") final String phaseName,
@JsonProperty("description") final String description,
- @JsonProperty("startDate") final DateTime startDate,
- @JsonProperty("endDate") final DateTime endDate,
+ @JsonProperty("startDate") final LocalDate startDate,
+ @JsonProperty("endDate") final LocalDate endDate,
@JsonProperty("amount") final BigDecimal amount,
@JsonProperty("currency") final Currency currency) {
this.invoiceId = invoiceId;
@@ -96,11 +97,11 @@ public class InvoiceItemJsonSimple {
return description;
}
- public DateTime getStartDate() {
+ public LocalDate getStartDate() {
return startDate;
}
- public DateTime getEndDate() {
+ public LocalDate getEndDate() {
return endDate;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
index 670c0c6..195c7d4 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
@@ -16,21 +16,23 @@
package com.ning.billing.jaxrs.json;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import javax.annotation.Nullable;
+
+import org.joda.time.LocalDate;
+
+import com.ning.billing.invoice.api.Invoice;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.invoice.api.Invoice;
public class InvoiceJsonSimple {
private final BigDecimal amount;
private final String invoiceId;
- private final DateTime invoiceDate;
- private final DateTime targetDate;
+ private final LocalDate invoiceDate;
+ private final LocalDate targetDate;
private final String invoiceNumber;
private final BigDecimal balance;
private final BigDecimal creditAdj;
@@ -39,20 +41,20 @@ public class InvoiceJsonSimple {
private final String accountId;
public InvoiceJsonSimple() {
- this(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO , BigDecimal.ZERO, null, null, null, null, BigDecimal.ZERO, null);
+ this(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, null, null, null, BigDecimal.ZERO, null);
}
@JsonCreator
public InvoiceJsonSimple(@JsonProperty("amount") final BigDecimal amount,
- @JsonProperty("cba") final BigDecimal cba,
- @JsonProperty("creditAdj") final BigDecimal creditAdj,
- @JsonProperty("refundAdj") final BigDecimal refundAdj,
- @JsonProperty("invoiceId") @Nullable final String invoiceId,
- @JsonProperty("invoiceDate") @Nullable final DateTime invoiceDate,
- @JsonProperty("targetDate") @Nullable final DateTime targetDate,
- @JsonProperty("invoiceNumber") @Nullable final String invoiceNumber,
- @JsonProperty("balance") final BigDecimal balance,
- @JsonProperty("accountId") @Nullable final String accountId) {
+ @JsonProperty("cba") final BigDecimal cba,
+ @JsonProperty("creditAdj") final BigDecimal creditAdj,
+ @JsonProperty("refundAdj") final BigDecimal refundAdj,
+ @JsonProperty("invoiceId") @Nullable final String invoiceId,
+ @JsonProperty("invoiceDate") @Nullable final LocalDate invoiceDate,
+ @JsonProperty("targetDate") @Nullable final LocalDate targetDate,
+ @JsonProperty("invoiceNumber") @Nullable final String invoiceNumber,
+ @JsonProperty("balance") final BigDecimal balance,
+ @JsonProperty("accountId") @Nullable final String accountId) {
this.amount = amount;
this.cba = cba;
this.creditAdj = creditAdj;
@@ -67,7 +69,7 @@ public class InvoiceJsonSimple {
public InvoiceJsonSimple(final Invoice input) {
this(input.getChargedAmount(), input.getCBAAmount(), input.getCreditAdjAmount(), input.getRefundAdjAmount(), input.getId().toString(), input.getInvoiceDate(),
- input.getTargetDate(), String.valueOf(input.getInvoiceNumber()), input.getBalance(), input.getAccountId().toString());
+ input.getTargetDate(), String.valueOf(input.getInvoiceNumber()), input.getBalance(), input.getAccountId().toString());
}
public BigDecimal getAmount() {
@@ -90,11 +92,11 @@ public class InvoiceJsonSimple {
return invoiceId;
}
- public DateTime getInvoiceDate() {
+ public LocalDate getInvoiceDate() {
return invoiceDate;
}
- public DateTime getTargetDate() {
+ public LocalDate getTargetDate() {
return targetDate;
}
@@ -125,27 +127,27 @@ public class InvoiceJsonSimple {
return false;
}
if (!((amount == null && that.amount == null) ||
- (amount != null && that.amount != null && amount.compareTo(that.amount) == 0))) {
+ (amount != null && that.amount != null && amount.compareTo(that.amount) == 0))) {
return false;
}
if (!((balance == null && that.balance == null) ||
- (balance != null && that.balance != null && balance.compareTo(that.balance) == 0))) {
+ (balance != null && that.balance != null && balance.compareTo(that.balance) == 0))) {
return false;
}
if (!((cba == null && that.cba == null) ||
- (cba != null && that.cba != null && cba.compareTo(that.cba) == 0))) {
+ (cba != null && that.cba != null && cba.compareTo(that.cba) == 0))) {
return false;
}
if (!((creditAdj == null && that.creditAdj == null) ||
- (creditAdj != null && that.creditAdj != null && creditAdj.compareTo(that.creditAdj) == 0))) {
+ (creditAdj != null && that.creditAdj != null && creditAdj.compareTo(that.creditAdj) == 0))) {
return false;
}
if (!((refundAdj == null && that.refundAdj == null) ||
- (refundAdj != null && that.refundAdj != null && refundAdj.compareTo(that.refundAdj) == 0))) {
+ (refundAdj != null && that.refundAdj != null && refundAdj.compareTo(that.refundAdj) == 0))) {
return false;
}
if (!((invoiceDate == null && that.invoiceDate == null) ||
- (invoiceDate != null && that.invoiceDate != null && invoiceDate.compareTo(that.invoiceDate) == 0))) {
+ (invoiceDate != null && that.invoiceDate != null && invoiceDate.compareTo(that.invoiceDate) == 0))) {
return false;
}
if (invoiceId != null ? !invoiceId.equals(that.invoiceId) : that.invoiceId != null) {
@@ -155,7 +157,7 @@ public class InvoiceJsonSimple {
return false;
}
if (!((targetDate == null && that.targetDate == null) ||
- (targetDate != null && that.targetDate != null && targetDate.compareTo(that.targetDate) == 0))) {
+ (targetDate != null && that.targetDate != null && targetDate.compareTo(that.targetDate) == 0))) {
return false;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
index 963e78b..4c27655 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
@@ -2,11 +2,12 @@ package com.ning.billing.jaxrs.json;
import java.math.BigDecimal;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+
+import com.ning.billing.invoice.api.Invoice;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.invoice.api.Invoice;
/*
* Copyright 2010-2011 Ning, Inc.
@@ -25,6 +26,7 @@ import com.ning.billing.invoice.api.Invoice;
*/
public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
+
private final String bundleKeys;
public InvoiceJsonWithBundleKeys() {
@@ -34,16 +36,16 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
@JsonCreator
public InvoiceJsonWithBundleKeys(@JsonProperty("amount") final BigDecimal amount,
- @JsonProperty("cba") final BigDecimal cba,
- @JsonProperty("creditAdj") final BigDecimal creditAdj,
- @JsonProperty("refundAdj") final BigDecimal refundAdj,
- @JsonProperty("invoiceId") final String invoiceId,
- @JsonProperty("invoiceDate") final DateTime invoiceDate,
- @JsonProperty("targetDate") final DateTime targetDate,
- @JsonProperty("invoiceNumber") final String invoiceNumber,
- @JsonProperty("balance") final BigDecimal balance,
- @JsonProperty("accountId") final String accountId,
- @JsonProperty("externalBundleKeys") final String bundleKeys) {
+ @JsonProperty("cba") final BigDecimal cba,
+ @JsonProperty("creditAdj") final BigDecimal creditAdj,
+ @JsonProperty("refundAdj") final BigDecimal refundAdj,
+ @JsonProperty("invoiceId") final String invoiceId,
+ @JsonProperty("invoiceDate") final LocalDate invoiceDate,
+ @JsonProperty("targetDate") final LocalDate targetDate,
+ @JsonProperty("invoiceNumber") final String invoiceNumber,
+ @JsonProperty("balance") final BigDecimal balance,
+ @JsonProperty("accountId") final String accountId,
+ @JsonProperty("externalBundleKeys") final String bundleKeys) {
super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
this.bundleKeys = bundleKeys;
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
index ab26af2..0f73274 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
@@ -21,28 +21,30 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
public class InvoiceJsonWithItems extends InvoiceJsonSimple {
+
private final List<InvoiceItemJsonSimple> items;
@JsonCreator
public InvoiceJsonWithItems(@JsonProperty("amount") final BigDecimal amount,
- @JsonProperty("cba") final BigDecimal cba,
- @JsonProperty("creditAdj") final BigDecimal creditAdj,
- @JsonProperty("refundAdj") final BigDecimal refundAdj,
- @JsonProperty("invoiceId") final String invoiceId,
- @JsonProperty("invoiceDate") final DateTime invoiceDate,
- @JsonProperty("targetDate") final DateTime targetDate,
- @JsonProperty("invoiceNumber") final String invoiceNumber,
- @JsonProperty("balance") final BigDecimal balance,
- @JsonProperty("accountId") final String accountId,
- @JsonProperty("items") final List<InvoiceItemJsonSimple> items) {
+ @JsonProperty("cba") final BigDecimal cba,
+ @JsonProperty("creditAdj") final BigDecimal creditAdj,
+ @JsonProperty("refundAdj") final BigDecimal refundAdj,
+ @JsonProperty("invoiceId") final String invoiceId,
+ @JsonProperty("invoiceDate") final LocalDate invoiceDate,
+ @JsonProperty("targetDate") final LocalDate targetDate,
+ @JsonProperty("invoiceNumber") final String invoiceNumber,
+ @JsonProperty("balance") final BigDecimal balance,
+ @JsonProperty("accountId") final String accountId,
+ @JsonProperty("items") final List<InvoiceItemJsonSimple> items) {
super(amount, cba, creditAdj, refundAdj, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
this.items = new ArrayList<InvoiceItemJsonSimple>(items);
}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CreditResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CreditResource.java
index 74ea6a3..adad09b 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CreditResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CreditResource.java
@@ -26,6 +26,7 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import java.util.UUID;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -70,12 +71,15 @@ public class CreditResource implements JaxrsResource {
if (credit == null) {
return Response.status(Response.Status.NOT_FOUND).build();
} else {
- final CreditJson creditJson = new CreditJson(credit);
+ final Account account = accountUserApi.getAccountById(credit.getAccountId());
+ final CreditJson creditJson = new CreditJson(credit, account.getTimeZone());
return Response.status(Response.Status.OK).entity(creditJson).build();
}
} catch (InvoiceApiException e) {
- final String error = String.format("Failed to locate credit for id %s", creditId);
- log.info(error, e);
+ log.warn(String.format("Failed to locate credit for id %s", creditId), e);
+ return Response.status(Response.Status.NO_CONTENT).build();
+ } catch (AccountApiException e) {
+ log.warn(String.format("Failed to locate account for credit id %s", creditId), e);
return Response.status(Response.Status.NO_CONTENT).build();
}
}
@@ -94,8 +98,9 @@ public class CreditResource implements JaxrsResource {
try {
final Account account = accountUserApi.getAccountById(accountId);
+ final LocalDate effectiveDate = json.getEffectiveDate().toDateTime(account.getTimeZone()).toLocalDate();
- final InvoiceItem credit = invoiceUserApi.insertCredit(account.getId(), json.getCreditAmount(), json.getEffectiveDate(),
+ final InvoiceItem credit = invoiceUserApi.insertCredit(account.getId(), json.getCreditAmount(), effectiveDate,
account.getCurrency(), context.createContext(createdBy, reason, comment));
return uriBuilder.buildResponse(CreditResource.class, "getCredit", credit.getId());
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
index 1144a36..c4acd5a 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
@@ -35,8 +35,11 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
import com.google.inject.Inject;
@@ -68,6 +71,8 @@ import static javax.ws.rs.core.MediaType.TEXT_HTML;
@Path(JaxrsResource.INVOICES_PATH)
public class InvoiceResource extends JaxRsResourceBase {
+
+ private static final Logger log = LoggerFactory.getLogger(InvoiceResource.class);
private static final String ID_PARAM_NAME = "invoiceId";
private static final String CUSTOM_FIELD_URI = JaxrsResource.CUSTOM_FIELDS + "/{" + ID_PARAM_NAME + ":" + UUID_PATTERN + "}";
private static final String TAG_URI = JaxrsResource.TAGS + "/{" + ID_PARAM_NAME + ":" + UUID_PATTERN + "}";
@@ -151,18 +156,20 @@ public class InvoiceResource extends JaxRsResourceBase {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response createFutureInvoice(@QueryParam(QUERY_ACCOUNT_ID) final String accountId,
- @QueryParam(QUERY_TARGET_DATE) final String targetDate,
+ @QueryParam(QUERY_TARGET_DATE) final String targetDateTime,
@QueryParam(QUERY_DRY_RUN) @DefaultValue("false") final Boolean dryRun,
@HeaderParam(HDR_CREATED_BY) final String createdBy,
@HeaderParam(HDR_REASON) final String reason,
@HeaderParam(HDR_COMMENT) final String comment) {
try {
Preconditions.checkNotNull(accountId, "% needs to be specified", QUERY_ACCOUNT_ID);
- Preconditions.checkNotNull(targetDate, "% needs to be specified", QUERY_TARGET_DATE);
+ Preconditions.checkNotNull(targetDateTime, "% needs to be specified", QUERY_TARGET_DATE);
- final DateTime inputDate = (targetDate != null) ? DATE_TIME_FORMATTER.parseDateTime(targetDate) : null;
+ final DateTime inputDateTime = (targetDateTime != null) ? DATE_TIME_FORMATTER.parseDateTime(targetDateTime) : null;
+
+ final Account account = accountApi.getAccountById(UUID.fromString(accountId));
+ final LocalDate inputDate = inputDateTime.toDateTime(account.getTimeZone()).toLocalDate();
- accountApi.getAccountById(UUID.fromString(accountId));
final Invoice generatedInvoice = invoiceApi.triggerInvoiceGeneration(UUID.fromString(accountId), inputDate, dryRun,
context.createContext(createdBy, reason, comment));
if (dryRun) {
@@ -170,8 +177,6 @@ public class InvoiceResource extends JaxRsResourceBase {
} else {
return uriBuilder.buildResponse(InvoiceResource.class, "getInvoice", generatedInvoice.getId());
}
- } catch (AccountApiException e) {
- return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (InvoiceApiException e) {
if (e.getCode() == ErrorCode.INVOICE_NOTHING_TO_DO.getCode()) {
return Response.status(Status.NO_CONTENT).build();
@@ -180,6 +185,9 @@ public class InvoiceResource extends JaxRsResourceBase {
}
} catch (NullPointerException e) {
return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
+ } catch (AccountApiException e) {
+ log.warn(String.format("Failed to locate account for id %s", accountId), e);
+ return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
}
}
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
index d6bf35f..96b6adf 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
@@ -20,15 +20,11 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.google.common.collect.ImmutableList;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.PlanPhaseSpecifier;
@@ -36,11 +32,20 @@ import com.ning.billing.catalog.api.ProductCategory;
import com.ning.billing.entitlement.api.SubscriptionTransitionType;
import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline;
import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.DefaultClock;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.google.common.collect.ImmutableList;
+
public class TestBundleTimelineJson extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -70,41 +75,41 @@ public class TestBundleTimelineJson extends JaxrsTestSuite {
final InvoiceJsonSimple invoice = bundleTimelineJson.getInvoices().get(0);
Assert.assertEquals(asJson, "{\"viewId\":\"" + bundleTimelineJson.getViewId() + "\"," +
- "\"bundle\":{\"bundleId\":\"" + bundleTimelineJson.getBundle().getBundleId() + "\"," +
- "\"externalKey\":\"" + bundleTimelineJson.getBundle().getExternalKey() + "\"," +
- "\"subscriptions\":" +
- "[{\"events\":[{\"eventId\":\"" + event.getEventId() + "\"," +
- "\"billingPeriod\":\"" + event.getBillingPeriod() + "\"," +
- "\"product\":\"" + event.getProduct() + "\"," +
- "\"priceList\":\"" + event.getPriceList() + "\"," +
- "\"eventType\":\"" + event.getEventType() + "\"," +
- "\"phase\":\"" + event.getPhase() + "\"," +
- "\"requestedDate\":null," +
- "\"effectiveDate\":\"" + event.getEffectiveDate().toDateTimeISO().toString() + "\"}]," +
- "\"subscriptionId\":\"" + subscription.getSubscriptionId() + "\"," +
- "\"deletedEvents\":null," +
- "\"newEvents\":null}]}," +
- "\"payments\":[{\"amount\":" + payment.getAmount() + "," +
- "\"paidAmount\":" + payment.getPaidAmount() + "," +
- "\"accountId\":\"" + payment.getAccountId() + "\"," +
- "\"invoiceId\":\"" + payment.getInvoiceId() + "\"," +
- "\"paymentId\":\"" + payment.getPaymentId() + "\"," +
- "\"requestedDate\":\"" + payment.getRequestedDate().toDateTimeISO().toString() + "\"," +
- "\"effectiveDate\":\"" + payment.getEffectiveDate().toDateTimeISO().toString() + "\"," +
- "\"retryCount\":" + payment.getRetryCount() + "," +
- "\"currency\":\"" + payment.getCurrency() + "\"," +
- "\"status\":\"" + payment.getStatus() + "\"}]," +
- "\"invoices\":[{\"amount\":" + invoice.getAmount() + "," +
- "\"cba\":" + invoice.getCBA() + "," +
- "\"creditAdj\":" + invoice.getCreditAdj() + "," +
- "\"refundAdj\":" + invoice.getRefundAdj() + "," +
- "\"invoiceId\":\"" + invoice.getInvoiceId() + "\"," +
- "\"invoiceDate\":\"" + invoice.getInvoiceDate().toDateTimeISO().toString() + "\"," +
- "\"targetDate\":\"" + invoice.getTargetDate() + "\"," +
- "\"invoiceNumber\":\"" + invoice.getInvoiceNumber() + "\"," +
- "\"balance\":" + invoice.getBalance() + "," +
- "\"accountId\":\"" + invoice.getAccountId() + "\"}]," +
- "\"reasonForChange\":\"" + reason + "\"}");
+ "\"bundle\":{\"bundleId\":\"" + bundleTimelineJson.getBundle().getBundleId() + "\"," +
+ "\"externalKey\":\"" + bundleTimelineJson.getBundle().getExternalKey() + "\"," +
+ "\"subscriptions\":" +
+ "[{\"events\":[{\"eventId\":\"" + event.getEventId() + "\"," +
+ "\"billingPeriod\":\"" + event.getBillingPeriod() + "\"," +
+ "\"product\":\"" + event.getProduct() + "\"," +
+ "\"priceList\":\"" + event.getPriceList() + "\"," +
+ "\"eventType\":\"" + event.getEventType() + "\"," +
+ "\"phase\":\"" + event.getPhase() + "\"," +
+ "\"requestedDate\":null," +
+ "\"effectiveDate\":\"" + event.getEffectiveDate().toDateTimeISO().toString() + "\"}]," +
+ "\"subscriptionId\":\"" + subscription.getSubscriptionId() + "\"," +
+ "\"deletedEvents\":null," +
+ "\"newEvents\":null}]}," +
+ "\"payments\":[{\"amount\":" + payment.getAmount() + "," +
+ "\"paidAmount\":" + payment.getPaidAmount() + "," +
+ "\"accountId\":\"" + payment.getAccountId() + "\"," +
+ "\"invoiceId\":\"" + payment.getInvoiceId() + "\"," +
+ "\"paymentId\":\"" + payment.getPaymentId() + "\"," +
+ "\"requestedDate\":\"" + payment.getRequestedDate().toDateTimeISO().toString() + "\"," +
+ "\"effectiveDate\":\"" + payment.getEffectiveDate().toDateTimeISO().toString() + "\"," +
+ "\"retryCount\":" + payment.getRetryCount() + "," +
+ "\"currency\":\"" + payment.getCurrency() + "\"," +
+ "\"status\":\"" + payment.getStatus() + "\"}]," +
+ "\"invoices\":[{\"amount\":" + invoice.getAmount() + "," +
+ "\"cba\":" + invoice.getCBA() + "," +
+ "\"creditAdj\":" + invoice.getCreditAdj() + "," +
+ "\"refundAdj\":" + invoice.getRefundAdj() + "," +
+ "\"invoiceId\":\"" + invoice.getInvoiceId() + "\"," +
+ "\"invoiceDate\":\"" + invoice.getInvoiceDate().toString() + "\"," +
+ "\"targetDate\":\"" + invoice.getTargetDate() + "\"," +
+ "\"invoiceNumber\":\"" + invoice.getInvoiceNumber() + "\"," +
+ "\"balance\":" + invoice.getBalance() + "," +
+ "\"accountId\":\"" + invoice.getAccountId() + "\"}]," +
+ "\"reasonForChange\":\"" + reason + "\"}");
final BundleTimelineJson fromJson = mapper.readValue(asJson, BundleTimelineJson.class);
Assert.assertEquals(fromJson, bundleTimelineJson);
@@ -112,7 +117,7 @@ public class TestBundleTimelineJson extends JaxrsTestSuite {
private BundleJsonWithSubscriptions createBundleWithSubscriptions() {
final SubscriptionTimeline.ExistingEvent event = Mockito.mock(SubscriptionTimeline.ExistingEvent.class);
- final DateTime effectiveDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
+ final DateTime effectiveDate = clock.getUTCNow();
final UUID eventId = UUID.randomUUID();
final PlanPhaseSpecifier planPhaseSpecifier = new PlanPhaseSpecifier(UUID.randomUUID().toString(), ProductCategory.BASE,
BillingPeriod.NO_BILLING_PERIOD, UUID.randomUUID().toString(),
@@ -140,8 +145,8 @@ public class TestBundleTimelineJson extends JaxrsTestSuite {
final BigDecimal cba = BigDecimal.ONE;
final BigDecimal creditAdj = BigDecimal.ONE;
final BigDecimal refundAdj = BigDecimal.ONE;
- final DateTime invoiceDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
- final DateTime targetDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
+ final LocalDate invoiceDate = clock.getUTCToday();
+ final LocalDate targetDate = clock.getUTCToday();
final String invoiceNumber = UUID.randomUUID().toString();
final BigDecimal balance = BigDecimal.ZERO;
@@ -153,8 +158,8 @@ public class TestBundleTimelineJson extends JaxrsTestSuite {
final UUID paymentId = UUID.randomUUID();
final BigDecimal paidAmount = BigDecimal.TEN;
final BigDecimal amount = BigDecimal.ZERO;
- final DateTime paymentRequestedDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
- final DateTime paymentEffectiveDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
+ final DateTime paymentRequestedDate = clock.getUTCNow();
+ final DateTime paymentEffectiveDate = clock.getUTCNow();
final Integer retryCount = Integer.MAX_VALUE;
final String currency = "USD";
final String status = UUID.randomUUID().toString();
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditCollectionJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditCollectionJson.java
index 31be145..0579cac 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditCollectionJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditCollectionJson.java
@@ -20,19 +20,24 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
+
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.google.common.collect.ImmutableList;
-import com.ning.billing.jaxrs.JaxrsTestSuite;
public class TestCreditCollectionJson extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -45,8 +50,8 @@ public class TestCreditCollectionJson extends JaxrsTestSuite {
final BigDecimal creditAmount = BigDecimal.TEN;
final UUID invoiceId = UUID.randomUUID();
final String invoiceNumber = UUID.randomUUID().toString();
- final DateTime requestedDate = new DateTime(DateTimeZone.UTC);
- final DateTime effectiveDate = new DateTime(DateTimeZone.UTC);
+ final DateTime requestedDate = clock.getUTCNow();
+ final DateTime effectiveDate = clock.getUTCNow();
final String reason = UUID.randomUUID().toString();
final CreditJson creditJson = new CreditJson(creditAmount, invoiceId, invoiceNumber, requestedDate, effectiveDate, reason, accountId);
@@ -57,13 +62,13 @@ public class TestCreditCollectionJson extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(creditCollectionJson);
Assert.assertEquals(asJson, "{\"accountId\":\"" + accountId.toString() + "\"," +
- "\"credits\":[{\"creditAmount\":" + creditJson.getCreditAmount() + "," +
- "\"invoiceId\":\"" + creditJson.getInvoiceId().toString() + "\"," +
- "\"invoiceNumber\":\"" + creditJson.getInvoiceNumber() + "\"," +
- "\"requestedDate\":\"" + creditJson.getRequestedDate() + "\"," +
- "\"effectiveDate\":\"" + creditJson.getEffectiveDate() + "\"," +
- "\"reason\":\"" + creditJson.getReason() + "\"," +
- "\"accountId\":\"" + creditJson.getAccountId().toString() + "\"}]}");
+ "\"credits\":[{\"creditAmount\":" + creditJson.getCreditAmount() + "," +
+ "\"invoiceId\":\"" + creditJson.getInvoiceId().toString() + "\"," +
+ "\"invoiceNumber\":\"" + creditJson.getInvoiceNumber() + "\"," +
+ "\"requestedDate\":\"" + creditJson.getRequestedDate().toDateTimeISO().toString() + "\"," +
+ "\"effectiveDate\":\"" + creditJson.getEffectiveDate().toDateTimeISO().toString() + "\"," +
+ "\"reason\":\"" + creditJson.getReason() + "\"," +
+ "\"accountId\":\"" + creditJson.getAccountId().toString() + "\"}]}");
final CreditCollectionJson fromJson = mapper.readValue(asJson, CreditCollectionJson.class);
Assert.assertEquals(fromJson, creditCollectionJson);
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditJson.java
index b15b6d1..b18156c 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCreditJson.java
@@ -20,18 +20,23 @@ import java.math.BigDecimal;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
+
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.ning.billing.jaxrs.JaxrsTestSuite;
public class TestCreditJson extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -42,8 +47,8 @@ public class TestCreditJson extends JaxrsTestSuite {
final BigDecimal creditAmount = BigDecimal.TEN;
final UUID invoiceId = UUID.randomUUID();
final String invoiceNumber = UUID.randomUUID().toString();
- final DateTime requestedDate = new DateTime(DateTimeZone.UTC);
- final DateTime effectiveDate = new DateTime(DateTimeZone.UTC);
+ final DateTime requestedDate = clock.getUTCNow();
+ final DateTime effectiveDate = clock.getUTCNow();
final String reason = UUID.randomUUID().toString();
final UUID accountId = UUID.randomUUID();
@@ -58,12 +63,12 @@ public class TestCreditJson extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(creditJson);
Assert.assertEquals(asJson, "{\"creditAmount\":" + creditJson.getCreditAmount() + "," +
- "\"invoiceId\":\"" + creditJson.getInvoiceId().toString() + "\"," +
- "\"invoiceNumber\":\"" + creditJson.getInvoiceNumber() + "\"," +
- "\"requestedDate\":\"" + creditJson.getRequestedDate() + "\"," +
- "\"effectiveDate\":\"" + creditJson.getEffectiveDate() + "\"," +
- "\"reason\":\"" + creditJson.getReason() + "\"," +
- "\"accountId\":\"" + creditJson.getAccountId().toString() + "\"}");
+ "\"invoiceId\":\"" + creditJson.getInvoiceId().toString() + "\"," +
+ "\"invoiceNumber\":\"" + creditJson.getInvoiceNumber() + "\"," +
+ "\"requestedDate\":\"" + creditJson.getRequestedDate().toDateTimeISO().toString() + "\"," +
+ "\"effectiveDate\":\"" + creditJson.getEffectiveDate().toDateTimeISO().toString() + "\"," +
+ "\"reason\":\"" + creditJson.getReason() + "\"," +
+ "\"accountId\":\"" + creditJson.getAccountId().toString() + "\"}");
final CreditJson fromJson = mapper.readValue(asJson, CreditJson.class);
Assert.assertEquals(fromJson, creditJson);
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceItemJsonSimple.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceItemJsonSimple.java
index 3191568..8168844 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceItemJsonSimple.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceItemJsonSimple.java
@@ -19,22 +19,27 @@ package com.ning.billing.jaxrs.json;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
public class TestInvoiceItemJsonSimple extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -49,8 +54,8 @@ public class TestInvoiceItemJsonSimple extends JaxrsTestSuite {
final String planName = UUID.randomUUID().toString();
final String phaseName = UUID.randomUUID().toString();
final String description = UUID.randomUUID().toString();
- final DateTime startDate = new DateTime(DateTimeZone.UTC);
- final DateTime endDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = clock.getUTCToday();
final BigDecimal amount = BigDecimal.TEN;
final Currency currency = Currency.MXN;
final InvoiceItemJsonSimple invoiceItemJsonSimple = new InvoiceItemJsonSimple(invoiceId, accountId, bundleId, subscriptionId,
@@ -70,16 +75,16 @@ public class TestInvoiceItemJsonSimple extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(invoiceItemJsonSimple);
Assert.assertEquals(asJson, "{\"invoiceId\":\"" + invoiceItemJsonSimple.getInvoiceId().toString() + "\"," +
- "\"accountId\":\"" + invoiceItemJsonSimple.getAccountId().toString() + "\"," +
- "\"bundleId\":\"" + invoiceItemJsonSimple.getBundleId().toString() + "\"," +
- "\"subscriptionId\":\"" + invoiceItemJsonSimple.getSubscriptionId().toString() + "\"," +
- "\"planName\":\"" + invoiceItemJsonSimple.getPlanName() + "\"," +
- "\"phaseName\":\"" + invoiceItemJsonSimple.getPhaseName() + "\"," +
- "\"description\":\"" + invoiceItemJsonSimple.getDescription() + "\"," +
- "\"startDate\":\"" + invoiceItemJsonSimple.getStartDate().toDateTimeISO().toString() + "\"," +
- "\"endDate\":\"" + invoiceItemJsonSimple.getEndDate().toDateTimeISO().toString() + "\"," +
- "\"amount\":" + invoiceItemJsonSimple.getAmount().toString() + "," +
- "\"currency\":\"" + invoiceItemJsonSimple.getCurrency().toString() + "\"}");
+ "\"accountId\":\"" + invoiceItemJsonSimple.getAccountId().toString() + "\"," +
+ "\"bundleId\":\"" + invoiceItemJsonSimple.getBundleId().toString() + "\"," +
+ "\"subscriptionId\":\"" + invoiceItemJsonSimple.getSubscriptionId().toString() + "\"," +
+ "\"planName\":\"" + invoiceItemJsonSimple.getPlanName() + "\"," +
+ "\"phaseName\":\"" + invoiceItemJsonSimple.getPhaseName() + "\"," +
+ "\"description\":\"" + invoiceItemJsonSimple.getDescription() + "\"," +
+ "\"startDate\":\"" + invoiceItemJsonSimple.getStartDate().toString() + "\"," +
+ "\"endDate\":\"" + invoiceItemJsonSimple.getEndDate().toString() + "\"," +
+ "\"amount\":" + invoiceItemJsonSimple.getAmount().toString() + "," +
+ "\"currency\":\"" + invoiceItemJsonSimple.getCurrency().toString() + "\"}");
final InvoiceItemJsonSimple fromJson = mapper.readValue(asJson, InvoiceItemJsonSimple.class);
Assert.assertEquals(fromJson, invoiceItemJsonSimple);
@@ -95,8 +100,8 @@ public class TestInvoiceItemJsonSimple extends JaxrsTestSuite {
Mockito.when(invoiceItem.getPlanName()).thenReturn(UUID.randomUUID().toString());
Mockito.when(invoiceItem.getPhaseName()).thenReturn(UUID.randomUUID().toString());
Mockito.when(invoiceItem.getDescription()).thenReturn(UUID.randomUUID().toString());
- Mockito.when(invoiceItem.getStartDate()).thenReturn(new DateTime(DateTimeZone.UTC));
- Mockito.when(invoiceItem.getEndDate()).thenReturn(new DateTime(DateTimeZone.UTC));
+ Mockito.when(invoiceItem.getStartDate()).thenReturn(clock.getUTCToday());
+ Mockito.when(invoiceItem.getEndDate()).thenReturn(clock.getUTCToday());
Mockito.when(invoiceItem.getAmount()).thenReturn(BigDecimal.TEN);
Mockito.when(invoiceItem.getCurrency()).thenReturn(Currency.EUR);
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
index 0080402..b517039 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonSimple.java
@@ -19,21 +19,26 @@ package com.ning.billing.jaxrs.json;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
+
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.jaxrs.JaxrsTestSuite;
public class TestInvoiceJsonSimple extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -46,8 +51,8 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuite {
final BigDecimal creditAdj = BigDecimal.ONE;
final BigDecimal refundAdj = BigDecimal.ONE;
final String invoiceId = UUID.randomUUID().toString();
- final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
- final DateTime targetDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate invoiceDate = clock.getUTCToday();
+ final LocalDate targetDate = clock.getUTCToday();
final String invoiceNumber = UUID.randomUUID().toString();
final BigDecimal balance = BigDecimal.ZERO;
final String accountId = UUID.randomUUID().toString();
@@ -66,15 +71,15 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(invoiceJsonSimple);
Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonSimple.getAmount().toString() + "," +
- "\"cba\":" + invoiceJsonSimple.getCBA().toString() + "," +
- "\"creditAdj\":" + invoiceJsonSimple.getCreditAdj().toString() + "," +
- "\"refundAdj\":" + invoiceJsonSimple.getRefundAdj().toString() + "," +
- "\"invoiceId\":\"" + invoiceJsonSimple.getInvoiceId() + "\"," +
- "\"invoiceDate\":\"" + invoiceJsonSimple.getInvoiceDate().toDateTimeISO().toString() + "\"," +
- "\"targetDate\":\"" + invoiceJsonSimple.getTargetDate().toDateTimeISO().toString() + "\"," +
- "\"invoiceNumber\":\"" + invoiceJsonSimple.getInvoiceNumber() + "\"," +
- "\"balance\":" + invoiceJsonSimple.getBalance().toString() + "," +
- "\"accountId\":\"" + invoiceJsonSimple.getAccountId() + "\"}");
+ "\"cba\":" + invoiceJsonSimple.getCBA().toString() + "," +
+ "\"creditAdj\":" + invoiceJsonSimple.getCreditAdj().toString() + "," +
+ "\"refundAdj\":" + invoiceJsonSimple.getRefundAdj().toString() + "," +
+ "\"invoiceId\":\"" + invoiceJsonSimple.getInvoiceId() + "\"," +
+ "\"invoiceDate\":\"" + invoiceJsonSimple.getInvoiceDate().toString() + "\"," +
+ "\"targetDate\":\"" + invoiceJsonSimple.getTargetDate().toString() + "\"," +
+ "\"invoiceNumber\":\"" + invoiceJsonSimple.getInvoiceNumber() + "\"," +
+ "\"balance\":" + invoiceJsonSimple.getBalance().toString() + "," +
+ "\"accountId\":\"" + invoiceJsonSimple.getAccountId() + "\"}");
final InvoiceJsonSimple fromJson = mapper.readValue(asJson, InvoiceJsonSimple.class);
Assert.assertEquals(fromJson, invoiceJsonSimple);
@@ -88,8 +93,8 @@ public class TestInvoiceJsonSimple extends JaxrsTestSuite {
Mockito.when(invoice.getCreditAdjAmount()).thenReturn(BigDecimal.ONE);
Mockito.when(invoice.getRefundAdjAmount()).thenReturn(BigDecimal.ONE);
Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
- Mockito.when(invoice.getInvoiceDate()).thenReturn(new DateTime(DateTimeZone.UTC));
- Mockito.when(invoice.getTargetDate()).thenReturn(new DateTime(DateTimeZone.UTC));
+ Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCToday());
+ Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCToday());
Mockito.when(invoice.getInvoiceNumber()).thenReturn(Integer.MAX_VALUE);
Mockito.when(invoice.getBalance()).thenReturn(BigDecimal.ZERO);
Mockito.when(invoice.getAccountId()).thenReturn(UUID.randomUUID());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
index e50bd4b..642313a 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithBundleKeys.java
@@ -19,21 +19,26 @@ package com.ning.billing.jaxrs.json;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
+
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.jaxrs.JaxrsTestSuite;
public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -46,8 +51,8 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
final BigDecimal creditAdj = BigDecimal.ONE;
final BigDecimal refundAdj = BigDecimal.ONE;
final String invoiceId = UUID.randomUUID().toString();
- final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
- final DateTime targetDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate invoiceDate = clock.getUTCToday();
+ final LocalDate targetDate = clock.getUTCToday();
final String invoiceNumber = UUID.randomUUID().toString();
final BigDecimal balance = BigDecimal.ZERO;
final String accountId = UUID.randomUUID().toString();
@@ -68,16 +73,16 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(invoiceJsonSimple);
Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonSimple.getAmount().toString() + "," +
- "\"cba\":" + invoiceJsonSimple.getCBA().toString() + "," +
- "\"creditAdj\":" + invoiceJsonSimple.getCreditAdj().toString() + "," +
- "\"refundAdj\":" + invoiceJsonSimple.getRefundAdj().toString() + "," +
- "\"invoiceId\":\"" + invoiceJsonSimple.getInvoiceId() + "\"," +
- "\"invoiceDate\":\"" + invoiceJsonSimple.getInvoiceDate().toDateTimeISO().toString() + "\"," +
- "\"targetDate\":\"" + invoiceJsonSimple.getTargetDate().toDateTimeISO().toString() + "\"," +
- "\"invoiceNumber\":\"" + invoiceJsonSimple.getInvoiceNumber() + "\"," +
- "\"balance\":" + invoiceJsonSimple.getBalance().toString() + "," +
- "\"accountId\":\"" + invoiceJsonSimple.getAccountId() + "\"," +
- "\"bundleKeys\":\"" + invoiceJsonSimple.getBundleKeys() + "\"}");
+ "\"cba\":" + invoiceJsonSimple.getCBA().toString() + "," +
+ "\"creditAdj\":" + invoiceJsonSimple.getCreditAdj().toString() + "," +
+ "\"refundAdj\":" + invoiceJsonSimple.getRefundAdj().toString() + "," +
+ "\"invoiceId\":\"" + invoiceJsonSimple.getInvoiceId() + "\"," +
+ "\"invoiceDate\":\"" + invoiceJsonSimple.getInvoiceDate().toString() + "\"," +
+ "\"targetDate\":\"" + invoiceJsonSimple.getTargetDate().toString() + "\"," +
+ "\"invoiceNumber\":\"" + invoiceJsonSimple.getInvoiceNumber() + "\"," +
+ "\"balance\":" + invoiceJsonSimple.getBalance().toString() + "," +
+ "\"accountId\":\"" + invoiceJsonSimple.getAccountId() + "\"," +
+ "\"bundleKeys\":\"" + invoiceJsonSimple.getBundleKeys() + "\"}");
final InvoiceJsonWithBundleKeys fromJson = mapper.readValue(asJson, InvoiceJsonWithBundleKeys.class);
Assert.assertEquals(fromJson, invoiceJsonSimple);
@@ -91,8 +96,8 @@ public class TestInvoiceJsonWithBundleKeys extends JaxrsTestSuite {
Mockito.when(invoice.getCreditAdjAmount()).thenReturn(BigDecimal.ONE);
Mockito.when(invoice.getRefundAdjAmount()).thenReturn(BigDecimal.ONE);
Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
- Mockito.when(invoice.getInvoiceDate()).thenReturn(new DateTime(DateTimeZone.UTC));
- Mockito.when(invoice.getTargetDate()).thenReturn(new DateTime(DateTimeZone.UTC));
+ Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCToday());
+ Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCToday());
Mockito.when(invoice.getInvoiceNumber()).thenReturn(Integer.MAX_VALUE);
Mockito.when(invoice.getBalance()).thenReturn(BigDecimal.ZERO);
Mockito.when(invoice.getAccountId()).thenReturn(UUID.randomUUID());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
index 8722422..e849f0e 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceJsonWithItems.java
@@ -19,24 +19,29 @@ package com.ning.billing.jaxrs.json;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.google.common.collect.ImmutableList;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.google.common.collect.ImmutableList;
public class TestInvoiceJsonWithItems extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
+ private final Clock clock = new DefaultClock();
+
static {
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -49,8 +54,8 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuite {
final BigDecimal creditAdj = BigDecimal.ONE;
final BigDecimal refundAdj = BigDecimal.ONE;
final String invoiceId = UUID.randomUUID().toString();
- final DateTime invoiceDate = new DateTime(DateTimeZone.UTC);
- final DateTime targetDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate invoiceDate = clock.getUTCToday();
+ final LocalDate targetDate = clock.getUTCToday();
final String invoiceNumber = UUID.randomUUID().toString();
final BigDecimal balance = BigDecimal.ZERO;
final String accountId = UUID.randomUUID().toString();
@@ -73,26 +78,26 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(invoiceJsonWithItems);
Assert.assertEquals(asJson, "{\"amount\":" + invoiceJsonWithItems.getAmount().toString() + "," +
- "\"cba\":" + invoiceJsonWithItems.getCBA().toString() + "," +
- "\"creditAdj\":" + invoiceJsonWithItems.getCreditAdj().toString() + "," +
- "\"refundAdj\":" + invoiceJsonWithItems.getRefundAdj().toString() + "," +
- "\"invoiceId\":\"" + invoiceJsonWithItems.getInvoiceId() + "\"," +
- "\"invoiceDate\":\"" + invoiceJsonWithItems.getInvoiceDate().toDateTimeISO().toString() + "\"," +
- "\"targetDate\":\"" + invoiceJsonWithItems.getTargetDate().toDateTimeISO().toString() + "\"," +
- "\"invoiceNumber\":\"" + invoiceJsonWithItems.getInvoiceNumber() + "\"," +
- "\"balance\":" + invoiceJsonWithItems.getBalance().toString() + "," +
- "\"accountId\":\"" + invoiceJsonWithItems.getAccountId() + "\"," +
- "\"items\":[{\"invoiceId\":\"" + invoiceItemJsonSimple.getInvoiceId().toString() + "\"," +
- "\"accountId\":\"" + invoiceItemJsonSimple.getAccountId().toString() + "\"," +
- "\"bundleId\":\"" + invoiceItemJsonSimple.getBundleId().toString() + "\"," +
- "\"subscriptionId\":\"" + invoiceItemJsonSimple.getSubscriptionId().toString() + "\"," +
- "\"planName\":\"" + invoiceItemJsonSimple.getPlanName() + "\"," +
- "\"phaseName\":\"" + invoiceItemJsonSimple.getPhaseName() + "\"," +
- "\"description\":\"" + invoiceItemJsonSimple.getDescription() + "\"," +
- "\"startDate\":\"" + invoiceItemJsonSimple.getStartDate().toDateTimeISO().toString() + "\"," +
- "\"endDate\":\"" + invoiceItemJsonSimple.getEndDate().toDateTimeISO().toString() + "\"," +
- "\"amount\":" + invoiceItemJsonSimple.getAmount().toString() + "," +
- "\"currency\":\"" + invoiceItemJsonSimple.getCurrency().toString() + "\"}]}");
+ "\"cba\":" + invoiceJsonWithItems.getCBA().toString() + "," +
+ "\"creditAdj\":" + invoiceJsonWithItems.getCreditAdj().toString() + "," +
+ "\"refundAdj\":" + invoiceJsonWithItems.getRefundAdj().toString() + "," +
+ "\"invoiceId\":\"" + invoiceJsonWithItems.getInvoiceId() + "\"," +
+ "\"invoiceDate\":\"" + invoiceJsonWithItems.getInvoiceDate().toString() + "\"," +
+ "\"targetDate\":\"" + invoiceJsonWithItems.getTargetDate().toString() + "\"," +
+ "\"invoiceNumber\":\"" + invoiceJsonWithItems.getInvoiceNumber() + "\"," +
+ "\"balance\":" + invoiceJsonWithItems.getBalance().toString() + "," +
+ "\"accountId\":\"" + invoiceJsonWithItems.getAccountId() + "\"," +
+ "\"items\":[{\"invoiceId\":\"" + invoiceItemJsonSimple.getInvoiceId().toString() + "\"," +
+ "\"accountId\":\"" + invoiceItemJsonSimple.getAccountId().toString() + "\"," +
+ "\"bundleId\":\"" + invoiceItemJsonSimple.getBundleId().toString() + "\"," +
+ "\"subscriptionId\":\"" + invoiceItemJsonSimple.getSubscriptionId().toString() + "\"," +
+ "\"planName\":\"" + invoiceItemJsonSimple.getPlanName() + "\"," +
+ "\"phaseName\":\"" + invoiceItemJsonSimple.getPhaseName() + "\"," +
+ "\"description\":\"" + invoiceItemJsonSimple.getDescription() + "\"," +
+ "\"startDate\":\"" + invoiceItemJsonSimple.getStartDate().toString() + "\"," +
+ "\"endDate\":\"" + invoiceItemJsonSimple.getEndDate().toString() + "\"," +
+ "\"amount\":" + invoiceItemJsonSimple.getAmount().toString() + "," +
+ "\"currency\":\"" + invoiceItemJsonSimple.getCurrency().toString() + "\"}]}");
final InvoiceJsonWithItems fromJson = mapper.readValue(asJson, InvoiceJsonWithItems.class);
Assert.assertEquals(fromJson, invoiceJsonWithItems);
@@ -103,8 +108,8 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuite {
final Invoice invoice = Mockito.mock(Invoice.class);
Mockito.when(invoice.getChargedAmount()).thenReturn(BigDecimal.TEN);
Mockito.when(invoice.getId()).thenReturn(UUID.randomUUID());
- Mockito.when(invoice.getInvoiceDate()).thenReturn(new DateTime(DateTimeZone.UTC));
- Mockito.when(invoice.getTargetDate()).thenReturn(new DateTime(DateTimeZone.UTC));
+ Mockito.when(invoice.getInvoiceDate()).thenReturn(clock.getUTCToday());
+ Mockito.when(invoice.getTargetDate()).thenReturn(clock.getUTCToday());
Mockito.when(invoice.getInvoiceNumber()).thenReturn(Integer.MAX_VALUE);
Mockito.when(invoice.getBalance()).thenReturn(BigDecimal.ZERO);
Mockito.when(invoice.getAccountId()).thenReturn(UUID.randomUUID());
@@ -142,8 +147,8 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuite {
final String planName = UUID.randomUUID().toString();
final String phaseName = UUID.randomUUID().toString();
final String description = UUID.randomUUID().toString();
- final DateTime startDate = new DateTime(DateTimeZone.UTC);
- final DateTime endDate = new DateTime(DateTimeZone.UTC);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = clock.getUTCToday();
final BigDecimal amount = BigDecimal.TEN;
final Currency currency = Currency.MXN;
return new InvoiceItemJsonSimple(invoiceId, accountId, bundleId, subscriptionId,
@@ -160,8 +165,8 @@ public class TestInvoiceJsonWithItems extends JaxrsTestSuite {
Mockito.when(invoiceItem.getPlanName()).thenReturn(UUID.randomUUID().toString());
Mockito.when(invoiceItem.getPhaseName()).thenReturn(UUID.randomUUID().toString());
Mockito.when(invoiceItem.getDescription()).thenReturn(UUID.randomUUID().toString());
- Mockito.when(invoiceItem.getStartDate()).thenReturn(new DateTime(DateTimeZone.UTC));
- Mockito.when(invoiceItem.getEndDate()).thenReturn(new DateTime(DateTimeZone.UTC));
+ Mockito.when(invoiceItem.getStartDate()).thenReturn(clock.getUTCToday());
+ Mockito.when(invoiceItem.getEndDate()).thenReturn(clock.getUTCToday());
Mockito.when(invoiceItem.getAmount()).thenReturn(BigDecimal.TEN);
Mockito.when(invoiceItem.getCurrency()).thenReturn(Currency.EUR);
diff --git a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java
index a8cb2a9..8346357 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java
@@ -19,15 +19,14 @@ package com.ning.billing.overdue.calculator;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Comparator;
-import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
-import com.google.inject.Inject;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceUserApi;
import com.ning.billing.junction.api.Blockable;
@@ -35,16 +34,19 @@ import com.ning.billing.overdue.config.api.BillingState;
import com.ning.billing.overdue.config.api.OverdueError;
import com.ning.billing.util.clock.Clock;
+import com.google.inject.Inject;
+
public abstract class BillingStateCalculator<T extends Blockable> {
private final InvoiceUserApi invoiceApi;
private final Clock clock;
protected class InvoiceDateComparator implements Comparator<Invoice> {
+
@Override
public int compare(final Invoice i1, final Invoice i2) {
- final DateTime d1 = i1.getInvoiceDate();
- final DateTime d2 = i2.getInvoiceDate();
+ final LocalDate d1 = i1.getInvoiceDate();
+ final LocalDate d2 = i2.getInvoiceDate();
if (d1.compareTo(d2) == 0) {
return i1.hashCode() - i2.hashCode(); // consistent (arbitrary) resolution for tied dates
}
@@ -70,15 +72,14 @@ public abstract class BillingStateCalculator<T extends Blockable> {
protected BigDecimal sumBalance(final SortedSet<Invoice> unpaidInvoices) {
BigDecimal sum = BigDecimal.ZERO;
- final Iterator<Invoice> it = unpaidInvoices.iterator();
- while (it.hasNext()) {
- sum = sum.add(it.next().getBalance());
+ for (final Invoice unpaidInvoice : unpaidInvoices) {
+ sum = sum.add(unpaidInvoice.getBalance());
}
return sum;
}
- protected SortedSet<Invoice> unpaidInvoicesForAccount(final UUID accountId) {
- final Collection<Invoice> invoices = invoiceApi.getUnpaidInvoicesByAccountId(accountId, clock.getUTCNow());
+ protected SortedSet<Invoice> unpaidInvoicesForAccount(final UUID accountId, final DateTimeZone accountTimeZone) {
+ final Collection<Invoice> invoices = invoiceApi.getUnpaidInvoicesByAccountId(accountId, clock.getToday(accountTimeZone));
final SortedSet<Invoice> sortedInvoices = new TreeSet<Invoice>(new InvoiceDateComparator());
sortedInvoices.addAll(invoices);
return sortedInvoices;
diff --git a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java
index 0bde914..fea8534 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java
@@ -22,8 +22,14 @@ import java.util.TreeSet;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.google.inject.Inject;
+
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.PriceList;
@@ -44,24 +50,28 @@ import com.ning.billing.util.tag.Tag;
public class BillingStateCalculatorBundle extends BillingStateCalculator<SubscriptionBundle> {
private final EntitlementUserApi entitlementApi;
+ private final AccountUserApi accountApi;
@Inject
- public BillingStateCalculatorBundle(final EntitlementUserApi entitlementApi, final InvoiceUserApi invoiceApi, final Clock clock) {
+ public BillingStateCalculatorBundle(final EntitlementUserApi entitlementApi, final InvoiceUserApi invoiceApi,
+ final AccountUserApi accountApi, final Clock clock) {
super(invoiceApi, clock);
this.entitlementApi = entitlementApi;
+ this.accountApi = accountApi;
}
@Override
public BillingStateBundle calculateBillingState(final SubscriptionBundle bundle) throws OverdueError {
try {
- final SortedSet<Invoice> unpaidInvoices = unpaidInvoicesForBundle(bundle.getId(), bundle.getAccountId());
+ final Account account = accountApi.getAccountById(bundle.getAccountId());
+ final SortedSet<Invoice> unpaidInvoices = unpaidInvoicesForBundle(bundle.getId(), bundle.getAccountId(), account.getTimeZone());
final Subscription basePlan = entitlementApi.getBaseSubscription(bundle.getId());
final UUID id = bundle.getId();
final int numberOfUnpaidInvoices = unpaidInvoices.size();
final BigDecimal unpaidInvoiceBalance = sumBalance(unpaidInvoices);
- DateTime dateOfEarliestUnpaidInvoice = null;
+ LocalDate dateOfEarliestUnpaidInvoice = null;
UUID idOfEarliestUnpaidInvoice = null;
final Invoice invoice = earliest(unpaidInvoices);
if (invoice != null) {
@@ -92,6 +102,7 @@ public class BillingStateCalculatorBundle extends BillingStateCalculator<Subscri
numberOfUnpaidInvoices,
unpaidInvoiceBalance,
dateOfEarliestUnpaidInvoice,
+ account.getTimeZone(),
idOfEarliestUnpaidInvoice,
responseForLastFailedPayment,
tags,
@@ -101,11 +112,13 @@ public class BillingStateCalculatorBundle extends BillingStateCalculator<Subscri
basePlanPhaseType);
} catch (EntitlementUserApiException e) {
throw new OverdueError(e);
+ } catch (AccountApiException e) {
+ throw new OverdueError(e);
}
}
- public SortedSet<Invoice> unpaidInvoicesForBundle(final UUID bundleId, final UUID accountId) {
- final SortedSet<Invoice> unpaidInvoices = unpaidInvoicesForAccount(accountId);
+ public SortedSet<Invoice> unpaidInvoicesForBundle(final UUID bundleId, final UUID accountId, final DateTimeZone accountTimeZone) {
+ final SortedSet<Invoice> unpaidInvoices = unpaidInvoicesForAccount(accountId, accountTimeZone);
final SortedSet<Invoice> result = new TreeSet<Invoice>(new InvoiceDateComparator());
result.addAll(unpaidInvoices);
for (final Invoice invoice : unpaidInvoices) {
diff --git a/overdue/src/main/java/com/ning/billing/overdue/config/DefaultCondition.java b/overdue/src/main/java/com/ning/billing/overdue/config/DefaultCondition.java
index 6f43038..58b2e81 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/config/DefaultCondition.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/config/DefaultCondition.java
@@ -16,14 +16,15 @@
package com.ning.billing.overdue.config;
+import java.math.BigDecimal;
+import java.net.URI;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
-import java.math.BigDecimal;
-import java.net.URI;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Duration;
import com.ning.billing.catalog.api.TimeUnit;
@@ -39,6 +40,7 @@ import com.ning.billing.util.tag.Tag;
@XmlAccessorType(XmlAccessType.NONE)
public class DefaultCondition<T extends Blockable> extends ValidatingConfig<OverdueConfig> implements Condition<T> {
+
@XmlElement(required = false, name = "numberOfUnpaidInvoicesEqualsOrExceeds")
private Integer numberOfUnpaidInvoicesEqualsOrExceeds;
@@ -55,23 +57,20 @@ public class DefaultCondition<T extends Blockable> extends ValidatingConfig<Over
@XmlElement(required = false, name = "controlTag")
private ControlTagType controlTag;
- /* (non-Javadoc)
- * @see com.ning.billing.catalog.overdue.Condition#evaluate(com.ning.billing.catalog.api.overdue.BillingState, org.joda.time.DateTime)
- */
@Override
- public boolean evaluate(final BillingState<T> state, final DateTime now) {
- DateTime unpaidInvoiceTriggerDate = null;
+ public boolean evaluate(final BillingState<T> state, final LocalDate date) {
+ LocalDate unpaidInvoiceTriggerDate = null;
if (timeSinceEarliestUnpaidInvoiceEqualsOrExceeds != null && state.getDateOfEarliestUnpaidInvoice() != null) { // no date => no unpaid invoices
unpaidInvoiceTriggerDate = state.getDateOfEarliestUnpaidInvoice().plus(timeSinceEarliestUnpaidInvoiceEqualsOrExceeds.toJodaPeriod());
}
return
- (numberOfUnpaidInvoicesEqualsOrExceeds == null || state.getNumberOfUnpaidInvoices() >= numberOfUnpaidInvoicesEqualsOrExceeds.intValue()) &&
- (totalUnpaidInvoiceBalanceEqualsOrExceeds == null || totalUnpaidInvoiceBalanceEqualsOrExceeds.compareTo(state.getBalanceOfUnpaidInvoices()) <= 0) &&
- (timeSinceEarliestUnpaidInvoiceEqualsOrExceeds == null ||
- (unpaidInvoiceTriggerDate != null && !unpaidInvoiceTriggerDate.isAfter(now))) &&
- (responseForLastFailedPayment == null || responseIsIn(state.getResponseForLastFailedPayment(), responseForLastFailedPayment)) &&
- (controlTag == null || isTagIn(controlTag, state.getTags()));
+ (numberOfUnpaidInvoicesEqualsOrExceeds == null || state.getNumberOfUnpaidInvoices() >= numberOfUnpaidInvoicesEqualsOrExceeds) &&
+ (totalUnpaidInvoiceBalanceEqualsOrExceeds == null || totalUnpaidInvoiceBalanceEqualsOrExceeds.compareTo(state.getBalanceOfUnpaidInvoices()) <= 0) &&
+ (timeSinceEarliestUnpaidInvoiceEqualsOrExceeds == null ||
+ (unpaidInvoiceTriggerDate != null && !unpaidInvoiceTriggerDate.isAfter(date))) &&
+ (responseForLastFailedPayment == null || responseIsIn(state.getResponseForLastFailedPayment(), responseForLastFailedPayment)) &&
+ (controlTag == null || isTagIn(controlTag, state.getTags()));
}
private boolean responseIsIn(final PaymentResponse actualResponse,
diff --git a/overdue/src/main/java/com/ning/billing/overdue/config/DefaultOverdueStateSet.java b/overdue/src/main/java/com/ning/billing/overdue/config/DefaultOverdueStateSet.java
index 07d25bc..8b3419a 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/config/DefaultOverdueStateSet.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/config/DefaultOverdueStateSet.java
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.joda.time.Period;
import com.ning.billing.ErrorCode;
@@ -61,11 +62,8 @@ public abstract class DefaultOverdueStateSet<T extends Blockable> extends Valida
return clearState;
}
- /* (non-Javadoc)
- * @see com.ning.billing.catalog.overdue.OverdueBillingState#calculateOverdueState(com.ning.billing.catalog.api.overdue.BillingState, org.joda.time.DateTime)
- */
@Override
- public DefaultOverdueState<T> calculateOverdueState(final BillingState<T> billingState, final DateTime now) throws OverdueApiException {
+ public DefaultOverdueState<T> calculateOverdueState(final BillingState<T> billingState, final LocalDate now) throws OverdueApiException {
for (final DefaultOverdueState<T> overdueState : getStates()) {
if (overdueState.getCondition().evaluate(billingState, now)) {
return overdueState;
diff --git a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java
index ed4bd61..5ed1d52 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapper.java
@@ -55,14 +55,13 @@ public class OverdueWrapper<T extends Blockable> {
final BillingState<T> billingState = billingState();
final String previousOverdueStateName = api.getBlockingStateFor(overdueable).getStateName();
- final OverdueState<T> nextOverdueState = overdueStateSet.calculateOverdueState(billingState, clock.getUTCNow());
+ final OverdueState<T> nextOverdueState = overdueStateSet.calculateOverdueState(billingState, clock.getToday(billingState.getAccountTimeZone()));
if (nextOverdueState != null && !previousOverdueStateName.equals(nextOverdueState.getName())) {
overdueStateApplicator.apply(overdueable, previousOverdueStateName, nextOverdueState);
}
return nextOverdueState;
-
}
public BillingState<T> billingState() throws OverdueError {
diff --git a/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculator.java b/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculator.java
index 57426a3..344a1fa 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculator.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculator.java
@@ -23,11 +23,15 @@ import java.util.List;
import java.util.SortedSet;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.entitlement.api.user.SubscriptionBundle;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
@@ -38,18 +42,27 @@ import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.ClockMock;
public class TestBillingStateCalculator extends OverdueTestSuite {
+
Clock clock = new ClockMock();
InvoiceUserApi invoiceApi = Mockito.mock(InvoiceUserApi.class);
- DateTime now;
+ AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
+ LocalDate now;
+
+ @BeforeMethod(groups = "fast")
+ public void setUp() throws Exception {
+ final Account account = Mockito.mock(Account.class);
+ Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
+ Mockito.when(accountApi.getAccountById(Mockito.<UUID>any())).thenReturn(account);
+ }
public BillingStateCalculator<SubscriptionBundle> createBSCalc() {
- now = new DateTime();
+ now = new LocalDate();
final Collection<Invoice> invoices = new ArrayList<Invoice>();
invoices.add(createInvoice(now, BigDecimal.ZERO, null));
invoices.add(createInvoice(now.plusDays(1), BigDecimal.TEN, null));
invoices.add(createInvoice(now.plusDays(2), new BigDecimal("100.0"), null));
- Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<DateTime>any())).thenReturn(invoices);
+ Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<LocalDate>any())).thenReturn(invoices);
return new BillingStateCalculator<SubscriptionBundle>(invoiceApi, clock) {
@Override
@@ -60,7 +73,7 @@ public class TestBillingStateCalculator extends OverdueTestSuite {
};
}
- public Invoice createInvoice(final DateTime date, final BigDecimal balance, final List<InvoiceItem> invoiceItems) {
+ public Invoice createInvoice(final LocalDate date, final BigDecimal balance, final List<InvoiceItem> invoiceItems) {
final Invoice invoice = Mockito.mock(Invoice.class);
Mockito.when(invoice.getBalance()).thenReturn(balance);
Mockito.when(invoice.getInvoiceDate()).thenReturn(date);
@@ -73,7 +86,7 @@ public class TestBillingStateCalculator extends OverdueTestSuite {
@Test(groups = "fast")
public void testUnpaidInvoices() {
final BillingStateCalculator<SubscriptionBundle> calc = createBSCalc();
- final SortedSet<Invoice> invoices = calc.unpaidInvoicesForAccount(new UUID(0L, 0L));
+ final SortedSet<Invoice> invoices = calc.unpaidInvoicesForAccount(new UUID(0L, 0L), DateTimeZone.UTC);
Assert.assertEquals(invoices.size(), 3);
Assert.assertEquals(BigDecimal.ZERO.compareTo(invoices.first().getBalance()), 0);
@@ -83,14 +96,14 @@ public class TestBillingStateCalculator extends OverdueTestSuite {
@Test(groups = "fast")
public void testSum() {
final BillingStateCalculator<SubscriptionBundle> calc = createBSCalc();
- final SortedSet<Invoice> invoices = calc.unpaidInvoicesForAccount(new UUID(0L, 0L));
+ final SortedSet<Invoice> invoices = calc.unpaidInvoicesForAccount(new UUID(0L, 0L), DateTimeZone.UTC);
Assert.assertEquals(new BigDecimal("110.0").compareTo(calc.sumBalance(invoices)), 0);
}
@Test(groups = "fast")
public void testEarliest() {
final BillingStateCalculator<SubscriptionBundle> calc = createBSCalc();
- final SortedSet<Invoice> invoices = calc.unpaidInvoicesForAccount(new UUID(0L, 0L));
+ final SortedSet<Invoice> invoices = calc.unpaidInvoicesForAccount(new UUID(0L, 0L), DateTimeZone.UTC);
Assert.assertEquals(calc.earliest(invoices).getInvoiceDate(), now);
}
}
diff --git a/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java b/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java
index bb07af4..7f7b45e 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java
@@ -24,6 +24,8 @@ import java.util.SortedSet;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -60,7 +62,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
@Test(groups = "fast")
public void testBillingStateAfterCancellation() throws Exception {
- Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<DateTime>any())).thenReturn(ImmutableList.<Invoice>of());
+ Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<LocalDate>any())).thenReturn(ImmutableList.<Invoice>of());
final UUID bundleId = UUID.randomUUID();
final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
@@ -70,7 +72,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
final Subscription subscription = Mockito.mock(Subscription.class);
Mockito.when(entitlementApi.getBaseSubscription(bundleId)).thenReturn(subscription);
- final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, clock);
+ final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, accountApi, clock);
final BillingStateBundle billingStateBundle = calc.calculateBillingState(bundle);
Assert.assertNull(billingStateBundle.getBasePlanBillingPeriod());
Assert.assertNull(billingStateBundle.getBasePlanPhaseType());
@@ -83,7 +85,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
final UUID thisBundleId = new UUID(0L, 0L);
final UUID thatBundleId = new UUID(0L, 1L);
- now = new DateTime();
+ now = new LocalDate();
final List<Invoice> invoices = new ArrayList<Invoice>(5);
invoices.add(createInvoice(now, BigDecimal.ZERO, createInvoiceItems(new UUID[]{thisBundleId, thatBundleId})));
// Will not be seen below
@@ -95,15 +97,15 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
final Clock clock = new ClockMock();
final InvoiceUserApi invoiceApi = Mockito.mock(InvoiceUserApi.class);
final EntitlementUserApi entitlementApi = Mockito.mock(EntitlementUserApi.class);
- Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<DateTime>any())).thenReturn(Collections2.filter(invoices, new Predicate<Invoice>() {
+ Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<LocalDate>any())).thenReturn(Collections2.filter(invoices, new Predicate<Invoice>() {
@Override
public boolean apply(@Nullable final Invoice invoice) {
return invoice != null && BigDecimal.ZERO.compareTo(invoice.getBalance()) < 0;
}
}));
- final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, clock);
- final SortedSet<Invoice> resultinvoices = calc.unpaidInvoicesForBundle(thisBundleId, new UUID(0L, 0L));
+ final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, accountApi, clock);
+ final SortedSet<Invoice> resultinvoices = calc.unpaidInvoicesForBundle(thisBundleId, new UUID(0L, 0L), DateTimeZone.UTC);
Assert.assertEquals(resultinvoices.size(), 3);
Assert.assertEquals(new BigDecimal("100.0").compareTo(resultinvoices.first().getBalance()), 0);
@@ -115,7 +117,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
final UUID thisBundleId = new UUID(0L, 0L);
final UUID thatBundleId = new UUID(0L, 1L);
- now = new DateTime();
+ now = new LocalDate();
final List<Invoice> invoices = new ArrayList<Invoice>(5);
invoices.add(createInvoice(now.minusDays(5), BigDecimal.ZERO, createInvoiceItems(new UUID[]{thisBundleId, thatBundleId})));
invoices.add(createInvoice(now.minusDays(4), BigDecimal.TEN, createInvoiceItems(new UUID[]{thatBundleId})));
@@ -125,7 +127,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
final Clock clock = new ClockMock();
final InvoiceUserApi invoiceApi = Mockito.mock(InvoiceUserApi.class);
- Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<DateTime>any())).thenReturn(invoices);
+ Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<LocalDate>any())).thenReturn(invoices);
final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
Mockito.when(bundle.getId()).thenReturn(thisBundleId);
@@ -141,7 +143,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
Mockito.when(subscription.getCurrentPriceList()).thenReturn(pricelist);
Mockito.when(subscription.getCurrentPhase()).thenReturn(plan.getFinalPhase());
- final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, clock);
+ final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, accountApi, clock);
final BillingStateBundle state = calc.calculateBillingState(bundle);
@@ -161,12 +163,12 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
public void testcalculateBillingStateForBundleNoOverdueInvoices() throws Exception {
final UUID thisBundleId = new UUID(0L, 0L);
- now = new DateTime();
+ now = new LocalDate();
final List<Invoice> invoices = new ArrayList<Invoice>(5);
final Clock clock = new ClockMock();
final InvoiceUserApi invoiceApi = Mockito.mock(InvoiceUserApi.class);
- Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<DateTime>any())).thenReturn(invoices);
+ Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<LocalDate>any())).thenReturn(invoices);
final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
Mockito.when(bundle.getId()).thenReturn(thisBundleId);
@@ -182,7 +184,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
Mockito.when(subscription.getCurrentPriceList()).thenReturn(pricelist);
Mockito.when(subscription.getCurrentPhase()).thenReturn(plan.getFinalPhase());
- final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, clock);
+ final BillingStateCalculatorBundle calc = new BillingStateCalculatorBundle(entitlementApi, invoiceApi, accountApi, clock);
final BillingStateBundle state = calc.calculateBillingState(bundle);
diff --git a/overdue/src/test/java/com/ning/billing/overdue/config/TestCondition.java b/overdue/src/test/java/com/ning/billing/overdue/config/TestCondition.java
index dad1a9e..4fc1ded 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/config/TestCondition.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/config/TestCondition.java
@@ -16,13 +16,15 @@
package com.ning.billing.overdue.config;
-import javax.xml.bind.annotation.XmlRootElement;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -37,6 +39,7 @@ import com.ning.billing.util.tag.DescriptiveTag;
import com.ning.billing.util.tag.Tag;
public class TestCondition extends OverdueTestSuite {
+
@XmlRootElement(name = "condition")
private static class MockCondition extends DefaultCondition<Blockable> {}
@@ -44,55 +47,64 @@ public class TestCondition extends OverdueTestSuite {
public void testNumberOfUnpaidInvoicesEqualsOrExceeds() throws Exception {
final String xml =
"<condition>" +
- " <numberOfUnpaidInvoicesEqualsOrExceeds>1</numberOfUnpaidInvoicesEqualsOrExceeds>" +
- "</condition>";
+ " <numberOfUnpaidInvoicesEqualsOrExceeds>1</numberOfUnpaidInvoicesEqualsOrExceeds>" +
+ "</condition>";
final InputStream is = new ByteArrayInputStream(xml.getBytes());
final MockCondition c = XMLLoader.getObjectFromStreamNoValidation(is, MockCondition.class);
final UUID unpaidInvoiceId = UUID.randomUUID();
- final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, new DateTime(), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, BigDecimal.ZERO, new DateTime(), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 2, BigDecimal.ZERO, new DateTime(), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, new LocalDate(),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, BigDecimal.ZERO, new LocalDate(),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 2, BigDecimal.ZERO, new LocalDate(),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- Assert.assertTrue(!c.evaluate(state0, new DateTime()));
- Assert.assertTrue(c.evaluate(state1, new DateTime()));
- Assert.assertTrue(c.evaluate(state2, new DateTime()));
+ Assert.assertTrue(!c.evaluate(state0, new LocalDate()));
+ Assert.assertTrue(c.evaluate(state1, new LocalDate()));
+ Assert.assertTrue(c.evaluate(state2, new LocalDate()));
}
@Test(groups = "fast")
public void testTotalUnpaidInvoiceBalanceEqualsOrExceeds() throws Exception {
final String xml =
"<condition>" +
- " <totalUnpaidInvoiceBalanceEqualsOrExceeds>100.00</totalUnpaidInvoiceBalanceEqualsOrExceeds>" +
- "</condition>";
+ " <totalUnpaidInvoiceBalanceEqualsOrExceeds>100.00</totalUnpaidInvoiceBalanceEqualsOrExceeds>" +
+ "</condition>";
final InputStream is = new ByteArrayInputStream(xml.getBytes());
final MockCondition c = XMLLoader.getObjectFromStreamNoValidation(is, MockCondition.class);
final UUID unpaidInvoiceId = UUID.randomUUID();
- final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, new DateTime(), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), new DateTime(), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), new DateTime(), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, new LocalDate(),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), new LocalDate(),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), new LocalDate(),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- Assert.assertTrue(!c.evaluate(state0, new DateTime()));
- Assert.assertTrue(c.evaluate(state1, new DateTime()));
- Assert.assertTrue(c.evaluate(state2, new DateTime()));
+ Assert.assertTrue(!c.evaluate(state0, new LocalDate()));
+ Assert.assertTrue(c.evaluate(state1, new LocalDate()));
+ Assert.assertTrue(c.evaluate(state2, new LocalDate()));
}
@Test(groups = "fast")
public void testTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds() throws Exception {
final String xml =
"<condition>" +
- " <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds><unit>DAYS</unit><number>10</number></timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
- "</condition>";
+ " <timeSinceEarliestUnpaidInvoiceEqualsOrExceeds><unit>DAYS</unit><number>10</number></timeSinceEarliestUnpaidInvoiceEqualsOrExceeds>" +
+ "</condition>";
final InputStream is = new ByteArrayInputStream(xml.getBytes());
final MockCondition c = XMLLoader.getObjectFromStreamNoValidation(is, MockCondition.class);
final UUID unpaidInvoiceId = UUID.randomUUID();
- final DateTime now = new DateTime();
+ final LocalDate now = new LocalDate();
- final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, null, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), now.minusDays(10), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), now.minusDays(20), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, null,
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), now.minusDays(10),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), now.minusDays(20),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
Assert.assertTrue(!c.evaluate(state0, now));
Assert.assertTrue(c.evaluate(state1, now));
@@ -103,17 +115,20 @@ public class TestCondition extends OverdueTestSuite {
public void testResponseForLastFailedPaymentIn() throws Exception {
final String xml =
"<condition>" +
- " <responseForLastFailedPaymentIn><response>INSUFFICIENT_FUNDS</response><response>DO_NOT_HONOR</response></responseForLastFailedPaymentIn>" +
- "</condition>";
+ " <responseForLastFailedPaymentIn><response>INSUFFICIENT_FUNDS</response><response>DO_NOT_HONOR</response></responseForLastFailedPaymentIn>" +
+ "</condition>";
final InputStream is = new ByteArrayInputStream(xml.getBytes());
final MockCondition c = XMLLoader.getObjectFromStreamNoValidation(is, MockCondition.class);
final UUID unpaidInvoiceId = UUID.randomUUID();
- final DateTime now = new DateTime();
+ final LocalDate now = new LocalDate();
- final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, null, unpaidInvoiceId, PaymentResponse.LOST_OR_STOLEN_CARD, new Tag[]{});
- final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), now.minusDays(10), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
- final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), now.minusDays(20), unpaidInvoiceId, PaymentResponse.DO_NOT_HONOR, new Tag[]{});
+ final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, null,
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.LOST_OR_STOLEN_CARD, new Tag[]{});
+ final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), now.minusDays(10),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{});
+ final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), now.minusDays(20),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.DO_NOT_HONOR, new Tag[]{});
Assert.assertTrue(!c.evaluate(state0, now));
Assert.assertTrue(c.evaluate(state1, now));
@@ -124,21 +139,24 @@ public class TestCondition extends OverdueTestSuite {
public void testHasControlTag() throws Exception {
final String xml =
"<condition>" +
- " <controlTag>OVERDUE_ENFORCEMENT_OFF</controlTag>" +
- "</condition>";
+ " <controlTag>OVERDUE_ENFORCEMENT_OFF</controlTag>" +
+ "</condition>";
final InputStream is = new ByteArrayInputStream(xml.getBytes());
final MockCondition c = XMLLoader.getObjectFromStreamNoValidation(is, MockCondition.class);
final UUID unpaidInvoiceId = UUID.randomUUID();
- final DateTime now = new DateTime();
+ final LocalDate now = new LocalDate();
- final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, null, unpaidInvoiceId, PaymentResponse.LOST_OR_STOLEN_CARD, new Tag[]{new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF), new DescriptiveTag("Tag")});
- final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), now.minusDays(10), unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{new DefaultControlTag(ControlTagType.OVERDUE_ENFORCEMENT_OFF)});
- final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), now.minusDays(20), unpaidInvoiceId,
+ final BillingState<Blockable> state0 = new BillingState<Blockable>(new UUID(0L, 1L), 0, BigDecimal.ZERO, null,
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.LOST_OR_STOLEN_CARD, new Tag[]{new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF), new DescriptiveTag("Tag")});
+ final BillingState<Blockable> state1 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("100.00"), now.minusDays(10),
+ DateTimeZone.UTC, unpaidInvoiceId, PaymentResponse.INSUFFICIENT_FUNDS, new Tag[]{new DefaultControlTag(ControlTagType.OVERDUE_ENFORCEMENT_OFF)});
+ final BillingState<Blockable> state2 = new BillingState<Blockable>(new UUID(0L, 1L), 1, new BigDecimal("200.00"), now.minusDays(20),
+ DateTimeZone.UTC, unpaidInvoiceId,
PaymentResponse.DO_NOT_HONOR,
new Tag[]{new DefaultControlTag(ControlTagType.OVERDUE_ENFORCEMENT_OFF),
- new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF),
- new DescriptiveTag("Tag")});
+ new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF),
+ new DescriptiveTag("Tag")});
Assert.assertTrue(!c.evaluate(state0, now));
Assert.assertTrue(c.evaluate(state1, now));
diff --git a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java
index 9a01428..45a5626 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestBase.java
@@ -22,6 +22,8 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
@@ -31,6 +33,8 @@ import org.testng.annotations.Guice;
import com.google.inject.Inject;
import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.AccountUserApi;
import com.ning.billing.catalog.MockPlan;
import com.ning.billing.catalog.MockPriceList;
import com.ning.billing.catalog.glue.CatalogModule;
@@ -126,6 +130,9 @@ public abstract class OverdueTestBase extends OverdueTestSuiteWithEmbeddedDB {
protected SubscriptionBundle bundle;
@Inject
+ AccountUserApi accountUserApi;
+
+ @Inject
EntitlementUserApi entitlementApi;
@Inject
@@ -169,11 +176,18 @@ public abstract class OverdueTestBase extends OverdueTestSuiteWithEmbeddedDB {
Assert.assertEquals(result.isBlockBilling(), state.disableEntitlementAndChangesBlocked());
}
- protected SubscriptionBundle createBundle(final DateTime dateOfLastUnPaidInvoice) throws EntitlementUserApiException {
+ protected SubscriptionBundle createBundle(final LocalDate dateOfLastUnPaidInvoice) throws EntitlementUserApiException, AccountApiException {
final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
final UUID bundleId = UUID.randomUUID();
Mockito.when(bundle.getId()).thenReturn(bundleId);
- Mockito.when(bundle.getAccountId()).thenReturn(UUID.randomUUID());
+
+ final UUID accountId = UUID.randomUUID();
+ account = Mockito.mock(Account.class);
+ Mockito.when(account.getId()).thenReturn(accountId);
+ Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
+ Mockito.when(accountUserApi.getAccountById(account.getId())).thenReturn(account);
+
+ Mockito.when(bundle.getAccountId()).thenReturn(accountId);
final Invoice invoice = Mockito.mock(Invoice.class);
Mockito.when(invoice.getInvoiceDate()).thenReturn(dateOfLastUnPaidInvoice);
@@ -189,7 +203,7 @@ public abstract class OverdueTestBase extends OverdueTestSuiteWithEmbeddedDB {
final List<Invoice> invoices = new ArrayList<Invoice>();
invoices.add(invoice);
- Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<DateTime>any())).thenReturn(invoices);
+ Mockito.when(invoiceApi.getUnpaidInvoicesByAccountId(Mockito.<UUID>any(), Mockito.<LocalDate>any())).thenReturn(invoices);
final Subscription base = Mockito.mock(Subscription.class);
Mockito.when(base.getCurrentPlan()).thenReturn(MockPlan.createBicycleNoTrialEvergreen1USD());
diff --git a/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java b/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java
index 108a420..0a1f1c2 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/wrapper/TestOverdueWrapper.java
@@ -41,19 +41,19 @@ public class TestOverdueWrapper extends OverdueTestBase {
OverdueState<SubscriptionBundle> state;
state = config.getBundleStateSet().findState("OD1");
- bundle = createBundle(clock.getUTCNow().minusDays(31));
+ bundle = createBundle(clock.getUTCToday().minusDays(31));
wrapper = overdueWrapperFactory.createOverdueWrapperFor(bundle);
wrapper.refresh();
checkStateApplied(state);
state = config.getBundleStateSet().findState("OD2");
- bundle = createBundle(clock.getUTCNow().minusDays(41));
+ bundle = createBundle(clock.getUTCToday().minusDays(41));
wrapper = overdueWrapperFactory.createOverdueWrapperFor(bundle);
wrapper.refresh();
checkStateApplied(state);
state = config.getBundleStateSet().findState("OD3");
- bundle = createBundle(clock.getUTCNow().minusDays(51));
+ bundle = createBundle(clock.getUTCToday().minusDays(51));
wrapper = overdueWrapperFactory.createOverdueWrapperFor(bundle);
wrapper.refresh();
checkStateApplied(state);
@@ -70,7 +70,7 @@ public class TestOverdueWrapper extends OverdueTestBase {
final InputStream is = new ByteArrayInputStream(configXml.getBytes());
config = XMLLoader.getObjectFromStreamNoValidation(is, OverdueConfig.class);
state = config.getBundleStateSet().findState(BlockingApi.CLEAR_STATE_NAME);
- bundle = createBundle(clock.getUTCNow().minusDays(31));
+ bundle = createBundle(clock.getUTCToday().minusDays(31));
wrapper = overdueWrapperFactory.createOverdueWrapperFor(bundle);
final OverdueState<SubscriptionBundle> result = wrapper.refresh();
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index ae6e45e..780fea6 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -404,7 +404,7 @@ public class PaymentProcessor extends ProcessorBase {
final PaymentStatus paymentStatus = PaymentStatus.AUTO_PAY_OFF;
- final PaymentModelDao paymentInfo = new PaymentModelDao(account.getId(), invoice.getId(), account.getPaymentMethodId(), requestedAmount, invoice.getCurrency(), invoice.getTargetDate(), paymentStatus);
+ final PaymentModelDao paymentInfo = new PaymentModelDao(account.getId(), invoice.getId(), account.getPaymentMethodId(), requestedAmount, invoice.getCurrency(), clock.getUTCNow(), paymentStatus);
final PaymentAttemptModelDao attempt = new PaymentAttemptModelDao(account.getId(), invoice.getId(), paymentInfo.getId(), paymentStatus, clock.getUTCNow(), requestedAmount);
paymentDao.insertPaymentWithAttempt(paymentInfo, attempt, context);
@@ -416,7 +416,7 @@ public class PaymentProcessor extends ProcessorBase {
final BigDecimal requestedAmount, final boolean isInstantPayment, final CallContext context) throws PaymentApiException {
- final PaymentModelDao payment = new PaymentModelDao(account.getId(), invoice.getId(), account.getPaymentMethodId(), requestedAmount.setScale(2, RoundingMode.HALF_EVEN), invoice.getCurrency(), invoice.getTargetDate());
+ final PaymentModelDao payment = new PaymentModelDao(account.getId(), invoice.getId(), account.getPaymentMethodId(), requestedAmount.setScale(2, RoundingMode.HALF_EVEN), invoice.getCurrency(), clock.getUTCNow());
final PaymentAttemptModelDao attempt = new PaymentAttemptModelDao(account.getId(), invoice.getId(), payment.getId(), clock.getUTCNow(), requestedAmount);
final PaymentModelDao savedPayment = paymentDao.insertPaymentWithAttempt(payment, attempt, context);
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
index 66276c4..669e669 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
@@ -90,7 +90,7 @@ public interface PaymentAttemptSqlDao extends Transactional<PaymentAttemptSqlDao
final UUID accountId = getUUID(rs, "account_id");
final UUID invoiceId = getUUID(rs, "invoice_id");
final UUID paymentId = getUUID(rs, "payment_id");
- final DateTime effectiveDate = getDate(rs, "effective_date");
+ final DateTime effectiveDate = getDateTime(rs, "effective_date");
final PaymentStatus processingStatus = PaymentStatus.valueOf(rs.getString("processing_status"));
final String paymentError = rs.getString("payment_error");
final BigDecimal requestedAmount = rs.getBigDecimal("requested_amount");
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 7946673..a9dda96 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
@@ -102,7 +102,7 @@ public interface PaymentSqlDao extends Transactional<PaymentSqlDao>, UpdatableEn
final UUID paymentMethodId = getUUID(rs, "payment_method_id");
final Integer paymentNumber = rs.getInt("payment_number");
final BigDecimal amount = rs.getBigDecimal("amount");
- final DateTime effectiveDate = getDate(rs, "effective_date");
+ final DateTime effectiveDate = getDateTime(rs, "effective_date");
final Currency currency = Currency.valueOf(rs.getString("currency"));
final PaymentStatus paymentStatus = PaymentStatus.valueOf(rs.getString("payment_status"));
final String extPaymentRefId = rs.getString("external_payment_ref_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 3d0d55a..a1a649e 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
@@ -23,6 +23,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,6 +76,8 @@ public class TestPaymentApi extends PaymentTestSuite {
protected TestHelper testHelper;
@Inject
protected InvoicePaymentApi invoicePaymentApi;
+ @Inject
+ protected Clock clock;
protected CallContext context;
@@ -137,7 +140,7 @@ public class TestPaymentApi extends PaymentTestSuite {
}
private void testSimplePayment(final BigDecimal invoiceAmount, final BigDecimal requestedAmount, final BigDecimal expectedAmount) throws Exception {
- final DateTime now = new DateTime(DateTimeZone.UTC);
+ final LocalDate now = clock.getUTCToday();
final Invoice invoice = testHelper.createTestInvoice(account, now, Currency.USD);
final UUID subscriptionId = UUID.randomUUID();
diff --git a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
index 5443dcf..2cde1b1 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoice.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
@@ -36,19 +36,19 @@ public class MockInvoice extends EntityBase implements Invoice {
private final List<InvoicePayment> payments = new ArrayList<InvoicePayment>();
private final UUID accountId;
private final Integer invoiceNumber;
- private final DateTime invoiceDate;
- private final DateTime targetDate;
+ private final LocalDate invoiceDate;
+ private final LocalDate targetDate;
private final Currency currency;
private final boolean migrationInvoice;
// used to create a new invoice
- public MockInvoice(final UUID accountId, final DateTime invoiceDate, final DateTime targetDate, final Currency currency) {
+ public MockInvoice(final UUID accountId, final LocalDate invoiceDate, final LocalDate targetDate, final Currency currency) {
this(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, false);
}
// used to hydrate invoice from persistence layer
- public MockInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final DateTime invoiceDate,
- final DateTime targetDate, final Currency currency, final boolean isMigrationInvoice) {
+ public MockInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final LocalDate invoiceDate,
+ final LocalDate targetDate, final Currency currency, final boolean isMigrationInvoice) {
super(invoiceId);
this.accountId = accountId;
this.invoiceNumber = invoiceNumber;
@@ -130,12 +130,12 @@ public class MockInvoice extends EntityBase implements Invoice {
}
@Override
- public DateTime getInvoiceDate() {
+ public LocalDate getInvoiceDate() {
return invoiceDate;
}
@Override
- public DateTime getTargetDate() {
+ public LocalDate getTargetDate() {
return targetDate;
}
@@ -150,24 +150,6 @@ public class MockInvoice extends EntityBase implements Invoice {
}
@Override
- public DateTime getLastPaymentDate() {
- DateTime lastPayment = null;
-
- for (final InvoicePayment payment : payments) {
- final DateTime paymentDate = payment.getPaymentDate();
- if (lastPayment == null) {
- lastPayment = paymentDate;
- }
-
- if (lastPayment.isBefore(paymentDate)) {
- lastPayment = paymentDate;
- }
- }
-
- return lastPayment;
- }
-
- @Override
public BigDecimal getPaidAmount() {
BigDecimal amountPaid = BigDecimal.ZERO;
for (final InvoicePayment payment : payments) {
@@ -208,22 +190,8 @@ public class MockInvoice extends EntityBase implements Invoice {
}
@Override
- public boolean isDueForPayment(final DateTime targetDate, final int numberOfDays) {
- if (getBalance().compareTo(BigDecimal.ZERO) == 0) {
- return false;
- }
-
- final DateTime lastPaymentAttempt = getLastPaymentDate();
- if (lastPaymentAttempt == null) {
- return true;
- }
-
- return !lastPaymentAttempt.plusDays(numberOfDays).isAfter(targetDate);
- }
-
- @Override
public String toString() {
- return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getPaidAmount() + ", lastPaymentDate=" + getLastPaymentDate() + "]";
+ return "DefaultInvoice [items=" + invoiceItems + ", payments=" + payments + ", id=" + id + ", accountId=" + accountId + ", invoiceDate=" + invoiceDate + ", targetDate=" + targetDate + ", currency=" + currency + ", amountPaid=" + getPaidAmount() + "]";
}
@Override
diff --git a/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java b/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
index 3b17037..80a60d1 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
@@ -19,7 +19,7 @@ package com.ning.billing.payment;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -33,7 +33,7 @@ public class MockInvoiceCreationEvent implements InvoiceCreationEvent {
private final UUID accountId;
private final BigDecimal amountOwed;
private final Currency currency;
- private final DateTime invoiceCreationDate;
+ private final LocalDate invoiceCreationDate;
private final UUID userToken;
@JsonCreator
@@ -41,7 +41,7 @@ public class MockInvoiceCreationEvent implements InvoiceCreationEvent {
@JsonProperty("accountId") final UUID accountId,
@JsonProperty("amountOwed") final BigDecimal amountOwed,
@JsonProperty("currency") final Currency currency,
- @JsonProperty("invoiceCreationDate") final DateTime invoiceCreationDate,
+ @JsonProperty("invoiceCreationDate") final LocalDate invoiceCreationDate,
@JsonProperty("userToken") final UUID userToken) {
this.invoiceId = invoiceId;
this.accountId = accountId;
@@ -83,11 +83,6 @@ public class MockInvoiceCreationEvent implements InvoiceCreationEvent {
}
@Override
- public DateTime getInvoiceCreationDate() {
- return invoiceCreationDate;
- }
-
- @Override
public String toString() {
return "DefaultInvoiceCreationNotification [invoiceId=" + invoiceId + ", accountId=" + accountId + ", amountOwed=" + amountOwed + ", currency=" + currency + ", invoiceCreationDate=" + invoiceCreationDate + "]";
}
diff --git a/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java b/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java
index 054d995..7a0ec21 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockRecurringInvoiceItem.java
@@ -16,11 +16,12 @@
package com.ning.billing.payment;
-import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.UUID;
-import org.joda.time.DateTime;
+import javax.annotation.Nullable;
+
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.InvoiceItem;
@@ -36,52 +37,47 @@ public class MockRecurringInvoiceItem extends EntityBase implements InvoiceItem
protected final UUID bundleId;
protected final String planName;
protected final String phaseName;
- protected final DateTime startDate;
- protected final DateTime endDate;
+ protected final LocalDate startDate;
+ protected final LocalDate endDate;
protected final BigDecimal amount;
protected final Currency currency;
-
- public MockRecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency) {
+ public MockRecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
+ final String planName, final String phaseName, final LocalDate startDate, final LocalDate endDate,
+ final BigDecimal amount, final BigDecimal rate, final Currency currency) {
this(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, rate, null);
-
}
- public MockRecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency, final UUID reversedItemId) {
+ public MockRecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
+ final String planName, final String phaseName, final LocalDate startDate, final LocalDate endDate,
+ final BigDecimal amount, final BigDecimal rate, final Currency currency, final UUID reversedItemId) {
this(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
amount, currency, rate, reversedItemId);
}
- public MockRecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency) {
+ public MockRecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId,
+ final UUID subscriptionId, final String planName, final String phaseName,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount,
+ final BigDecimal rate, final Currency currency) {
this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, rate, null);
}
- public MockRecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate,
- final BigDecimal amount, final BigDecimal rate,
- final Currency currency, final UUID reversedItemId) {
+ public MockRecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId,
+ final UUID subscriptionId, final String planName, final String phaseName,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount,
+ final BigDecimal rate, final Currency currency, final UUID reversedItemId) {
this(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, rate, reversedItemId);
}
public MockRecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final BigDecimal rate, final UUID reversedItemId) {
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final BigDecimal rate, final UUID reversedItemId) {
this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
startDate, endDate, amount, currency, rate, reversedItemId);
}
-
public MockRecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final UUID subscriptionId, final String planName, final String phaseName,
- final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency,
+ final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency,
final BigDecimal rate, final UUID reversedItemId) {
super(id);
this.invoiceId = invoiceId;
@@ -139,12 +135,12 @@ public class MockRecurringInvoiceItem extends EntityBase implements InvoiceItem
}
@Override
- public DateTime getStartDate() {
+ public LocalDate getStartDate() {
return startDate;
}
@Override
- public DateTime getEndDate() {
+ public LocalDate getEndDate() {
return endDate;
}
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 abeaa54..2d7bbcd 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestHelper.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
@@ -19,6 +19,7 @@ package com.ning.billing.payment;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.mockito.Mockito;
import com.google.inject.Inject;
@@ -39,6 +40,7 @@ import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.callcontext.CallContextFactory;
import com.ning.billing.util.callcontext.CallOrigin;
import com.ning.billing.util.callcontext.UserType;
+import com.ning.billing.util.clock.Clock;
public class TestHelper {
protected final AccountUserApi accountUserApi;
@@ -46,21 +48,24 @@ public class TestHelper {
protected PaymentApi paymentApi;
private final CallContext context;
private final Bus eventBus;
+ private final Clock clock;
@Inject
- public TestHelper(final CallContextFactory factory, final AccountUserApi accountUserApi, final InvoicePaymentApi invoicePaymentApi, final PaymentApi paymentApi, final Bus eventBus) {
+ public TestHelper(final CallContextFactory factory, final AccountUserApi accountUserApi, final InvoicePaymentApi invoicePaymentApi,
+ final PaymentApi paymentApi, final Bus eventBus, final Clock clock) {
this.eventBus = eventBus;
this.accountUserApi = accountUserApi;
this.invoicePaymentApi = invoicePaymentApi;
this.paymentApi = paymentApi;
+ this.clock = clock;
context = factory.createCallContext("Princess Buttercup", CallOrigin.TEST, UserType.TEST);
}
public Invoice createTestInvoice(final Account account,
- final DateTime targetDate,
+ final LocalDate targetDate,
final Currency currency,
final InvoiceItem... items) throws EventBusException {
- final Invoice invoice = new MockInvoice(account.getId(), new DateTime(), targetDate, currency);
+ final Invoice invoice = new MockInvoice(account.getId(), clock.getUTCToday(), targetDate, currency);
for (final InvoiceItem item : items) {
if (item instanceof MockRecurringInvoiceItem) {
diff --git a/payment/src/test/java/com/ning/billing/payment/TestRetryService.java b/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
index e8e1580..9a002cb 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
@@ -25,6 +25,7 @@ import java.util.concurrent.Callable;
import java.util.concurrent.TimeoutException;
import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Guice;
@@ -151,13 +152,13 @@ public class TestRetryService extends PaymentTestSuite {
private void testSchedulesRetryInternal(final int maxTries, final FailureType failureType) throws Exception {
final Account account = testHelper.createTestAccount("yiyi.gmail.com");
- final Invoice invoice = testHelper.createTestInvoice(account, clock.getUTCNow(), Currency.USD);
+ final Invoice invoice = testHelper.createTestInvoice(account, clock.getUTCToday(), Currency.USD);
final BigDecimal amount = new BigDecimal("10.00");
final UUID subscriptionId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
- final DateTime startDate = clock.getUTCNow();
- final DateTime endDate = startDate.plusMonths(1);
+ final LocalDate startDate = clock.getUTCToday();
+ final LocalDate endDate = startDate.plusMonths(1);
invoice.addInvoiceItem(new MockRecurringInvoiceItem(invoice.getId(),
account.getId(),
subscriptionId,
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestCredit.java b/server/src/test/java/com/ning/billing/jaxrs/TestCredit.java
index 0129225..8d0b3c8 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestCredit.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestCredit.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -44,8 +45,8 @@ public class TestCredit extends TestJaxrsBase {
@Test(groups = "slow")
public void testAddCreditToInvoice() throws Exception {
- final DateTime requestedDate = DefaultClock.truncateMs(new DateTime(DateTimeZone.UTC));
- final DateTime effectiveDate = DefaultClock.truncateMs(new DateTime(DateTimeZone.UTC));
+ final DateTime requestedDate = clock.getUTCNow();
+ final DateTime effectiveDate = clock.getUTCNow();
final CreditJson input = new CreditJson(BigDecimal.TEN, UUID.randomUUID(), UUID.randomUUID().toString(),
requestedDate, effectiveDate,
UUID.randomUUID().toString(), UUID.fromString(accountJson.getAccountId()));
@@ -66,13 +67,15 @@ public class TestCredit extends TestJaxrsBase {
final CreditJson objFromJson = mapper.readValue(response.getResponseBody(), CreditJson.class);
assertEquals(objFromJson.getAccountId(), input.getAccountId());
assertEquals(objFromJson.getCreditAmount().compareTo(input.getCreditAmount()), 0);
- assertEquals(objFromJson.getEffectiveDate().compareTo(input.getEffectiveDate()), 0);
+ assertEquals(objFromJson.getEffectiveDate().toLocalDate().compareTo(input.getEffectiveDate().toLocalDate()), 0);
}
@Test(groups = "slow")
public void testAccountDoesNotExist() throws Exception {
+ final DateTime requestedDate = clock.getUTCNow();
+ final DateTime effectiveDate = clock.getUTCNow();
final CreditJson input = new CreditJson(BigDecimal.TEN, UUID.randomUUID(), UUID.randomUUID().toString(),
- new DateTime(DateTimeZone.UTC), new DateTime(DateTimeZone.UTC),
+ requestedDate, effectiveDate,
UUID.randomUUID().toString(), UUID.randomUUID());
final String jsonInput = mapper.writeValueAsString(input);
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java b/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java
index 83feb57..28c6563 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java
@@ -60,7 +60,7 @@ public class TestSubscription extends TestJaxrsBase {
final SubscriptionJsonNoEvents subscriptionJson = createSubscription(bundleJson.getBundleId(), productName, ProductCategory.BASE.toString(), term.toString(), true);
Assert.assertNotNull(subscriptionJson.getChargedThroughDate());
- Assert.assertEquals(subscriptionJson.getChargedThroughDate().toString(), "2012-05-25T00:00:00.000Z");
+ Assert.assertEquals(subscriptionJson.getChargedThroughDate().toString(), "2012-04-25T00:00:00.000Z");
String uri = JaxrsResource.SUBSCRIPTIONS_PATH + "/" + subscriptionJson.getSubscriptionId().toString();
diff --git a/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java b/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java
index 3543c24..71190eb 100644
--- a/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java
@@ -86,7 +86,7 @@ public interface PersistentBusSqlDao extends Transactional<PersistentBusSqlDao>,
final String className = r.getString("class_name");
final String createdOwner = r.getString("creating_owner");
final String eventJson = r.getString("event_json");
- final DateTime nextAvailableDate = getDate(r, "processing_available_date");
+ final DateTime nextAvailableDate = getDateTime(r, "processing_available_date");
final String processingOwner = r.getString("processing_owner");
final PersistentQueueEntryLifecycleState processingState = PersistentQueueEntryLifecycleState.valueOf(r.getString("processing_state"));
diff --git a/util/src/main/java/com/ning/billing/util/clock/Clock.java b/util/src/main/java/com/ning/billing/util/clock/Clock.java
index 6b65aac..a0ca9d9 100644
--- a/util/src/main/java/com/ning/billing/util/clock/Clock.java
+++ b/util/src/main/java/com/ning/billing/util/clock/Clock.java
@@ -18,6 +18,7 @@ package com.ning.billing.util.clock;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
public interface Clock {
@@ -25,5 +26,9 @@ public interface Clock {
public DateTime getUTCNow();
+ public LocalDate getUTCToday();
+
+ public LocalDate getToday(DateTimeZone timeZone);
+
//public DateTime addDuration(DateTime input, IDuration duration);
}
diff --git a/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java b/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java
index b05d120..0b31aaf 100644
--- a/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java
+++ b/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java
@@ -21,6 +21,7 @@ import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import com.ning.billing.catalog.api.Duration;
@@ -37,6 +38,16 @@ public class DefaultClock implements Clock {
return getNow(DateTimeZone.UTC);
}
+ @Override
+ public LocalDate getUTCToday() {
+ return getToday(DateTimeZone.UTC);
+ }
+
+ @Override
+ public LocalDate getToday(final DateTimeZone timeZone) {
+ return new LocalDate(getUTCNow(), DateTimeZone.UTC);
+ }
+
public static DateTime toUTCDateTime(final DateTime input) {
if (input == null) {
return null;
diff --git a/util/src/main/java/com/ning/billing/util/dao/MapperBase.java b/util/src/main/java/com/ning/billing/util/dao/MapperBase.java
index f688d66..2bae35c 100644
--- a/util/src/main/java/com/ning/billing/util/dao/MapperBase.java
+++ b/util/src/main/java/com/ning/billing/util/dao/MapperBase.java
@@ -19,13 +19,20 @@ package com.ning.billing.util.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
+import java.util.Date;
import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
public abstract class MapperBase {
- protected DateTime getDate(final ResultSet rs, final String fieldName) throws SQLException {
+ protected LocalDate getDate(final ResultSet rs, final String fieldName) throws SQLException {
+ final Date resultStamp = rs.getDate(fieldName);
+ return rs.wasNull() ? null : new LocalDate(resultStamp, DateTimeZone.UTC);
+ }
+
+ protected DateTime getDateTime(final ResultSet rs, final String fieldName) throws SQLException {
final Timestamp resultStamp = rs.getTimestamp(fieldName);
return rs.wasNull() ? null : new DateTime(resultStamp).toDateTime(DateTimeZone.UTC);
}
diff --git a/util/src/main/java/com/ning/billing/util/notificationq/dao/NotificationSqlDao.java b/util/src/main/java/com/ning/billing/util/notificationq/dao/NotificationSqlDao.java
index 0e56efd..43629b1 100644
--- a/util/src/main/java/com/ning/billing/util/notificationq/dao/NotificationSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/notificationq/dao/NotificationSqlDao.java
@@ -104,8 +104,8 @@ public interface NotificationSqlDao extends Transactional<NotificationSqlDao>, C
final String notificationKey = r.getString("notification_key");
final UUID accountId = getUUID(r, "account_id");
final String queueName = r.getString("queue_name");
- final DateTime effectiveDate = getDate(r, "effective_date");
- final DateTime nextAvailableDate = getDate(r, "processing_available_date");
+ final DateTime effectiveDate = getDateTime(r, "effective_date");
+ final DateTime nextAvailableDate = getDateTime(r, "processing_available_date");
final String processingOwner = r.getString("processing_owner");
final PersistentQueueEntryLifecycleState processingState = PersistentQueueEntryLifecycleState.valueOf(r.getString("processing_state"));
diff --git a/util/src/test/java/com/ning/billing/util/clock/ClockMock.java b/util/src/test/java/com/ning/billing/util/clock/ClockMock.java
index 681b0b2..39c8643 100644
--- a/util/src/test/java/com/ning/billing/util/clock/ClockMock.java
+++ b/util/src/test/java/com/ning/billing/util/clock/ClockMock.java
@@ -19,6 +19,7 @@ package com.ning.billing.util.clock;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Days;
+import org.joda.time.LocalDate;
import org.joda.time.Months;
import org.joda.time.MutablePeriod;
import org.joda.time.Period;
@@ -45,6 +46,16 @@ public class ClockMock implements Clock {
return truncate(adjust(now()));
}
+ @Override
+ public LocalDate getUTCToday() {
+ return getToday(DateTimeZone.UTC);
+ }
+
+ @Override
+ public LocalDate getToday(final DateTimeZone timeZone) {
+ return new LocalDate(getUTCNow(), timeZone);
+ }
+
private DateTime adjust(final DateTime now) {
return now.plus(delta);
}
diff --git a/util/src/test/java/com/ning/billing/util/clock/OldClockMock.java b/util/src/test/java/com/ning/billing/util/clock/OldClockMock.java
index 4197b24..e1c614b 100644
--- a/util/src/test/java/com/ning/billing/util/clock/OldClockMock.java
+++ b/util/src/test/java/com/ning/billing/util/clock/OldClockMock.java
@@ -21,6 +21,7 @@ import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -59,6 +60,11 @@ public class OldClockMock extends DefaultClock {
return getNow(DateTimeZone.UTC);
}
+ @Override
+ public LocalDate getUTCToday() {
+ return new LocalDate(getUTCNow(), DateTimeZone.UTC);
+ }
+
private void logClockAdjustment(final DateTime prev, final DateTime next) {
log.info(String.format(" ************ ADJUSTING CLOCK FROM %s to %s ********************", prev, next));
}