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 12(+7 -5)
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 10(+6 -4)
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)
junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java 44(+33 -11)
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/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
index b540d4a..9f497c6 100644
--- a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
@@ -32,7 +32,7 @@ public class DefaultAccount extends EntityBase implements Account {
// some fields
public static final String DEFAULT_STRING_VALUE = "";
public static final Integer DEFAULT_INTEGER_VALUE = 0;
- public static final Integer DEFAULT_BCD_VALUE = DEFAULT_INTEGER_VALUE;
+ public static final BillCycleDay DEFAULT_BCD_VALUE = new DefaultBillCycleDay(DEFAULT_INTEGER_VALUE);
public static final Currency DEFAULT_CURRENCY_VALUE = Currency.USD;
public static final DateTimeZone DEFAULT_TIMEZONE_VALUE = DateTimeZone.UTC;
private static final Boolean DEFAULT_MIGRATED_VALUE = true;
@@ -43,7 +43,7 @@ public class DefaultAccount extends EntityBase implements Account {
private final String name;
private final Integer firstNameLength;
private final Currency currency;
- private final Integer billCycleDay;
+ private final BillCycleDay billCycleDay;
private final UUID paymentMethodId;
private final DateTimeZone timeZone;
private final String locale;
@@ -82,7 +82,7 @@ public class DefaultAccount extends EntityBase implements Account {
*/
public DefaultAccount(final UUID id, final String externalKey, final String email,
final String name, final Integer firstNameLength,
- final Currency currency, final Integer billCycleDay, final UUID paymentMethodId,
+ final Currency currency, final BillCycleDay billCycleDay, final UUID paymentMethodId,
final DateTimeZone timeZone, final String locale,
final String address1, final String address2, final String companyName,
final String city, final String stateOrProvince, final String country,
@@ -136,7 +136,7 @@ public class DefaultAccount extends EntityBase implements Account {
}
@Override
- public Integer getBillCycleDay() {
+ public BillCycleDay getBillCycleDay() {
return Objects.firstNonNull(billCycleDay, DEFAULT_BCD_VALUE);
}
diff --git a/account/src/main/java/com/ning/billing/account/api/DefaultBillCycleDay.java b/account/src/main/java/com/ning/billing/account/api/DefaultBillCycleDay.java
new file mode 100644
index 0000000..e5587be
--- /dev/null
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultBillCycleDay.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.account.api;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class DefaultBillCycleDay implements BillCycleDay {
+
+ private final int dayOfMonthLocal;
+ private final int dayOfMonthUTC;
+
+ public DefaultBillCycleDay(final int dayOfMonthUTC) {
+ this(dayOfMonthUTC, dayOfMonthUTC);
+ }
+
+ public DefaultBillCycleDay(final BillCycleDay billCycleDay) {
+ this(billCycleDay.getDayOfMonthLocal(), billCycleDay.getDayOfMonthUTC());
+ }
+
+ @JsonCreator
+ public DefaultBillCycleDay(@JsonProperty("dayOfMonthLocal") final int dayOfMonthLocal,
+ @JsonProperty("dayOfMonthUTC") final int dayOfMonthUTC) {
+ this.dayOfMonthLocal = dayOfMonthLocal;
+ this.dayOfMonthUTC = dayOfMonthUTC;
+ }
+
+ @Override
+ public int getDayOfMonthUTC() {
+ return dayOfMonthUTC;
+ }
+
+ @Override
+ public int getDayOfMonthLocal() {
+ return dayOfMonthLocal;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("DefaultBillCycleDay");
+ sb.append("{dayOfMonthLocal=").append(dayOfMonthLocal);
+ sb.append(", dayOfMonthUTC=").append(dayOfMonthUTC);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final DefaultBillCycleDay that = (DefaultBillCycleDay) o;
+
+ if (dayOfMonthLocal != that.dayOfMonthLocal) return false;
+ if (dayOfMonthUTC != that.dayOfMonthUTC) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = dayOfMonthLocal;
+ result = 31 * result + dayOfMonthUTC;
+ return result;
+ }
+}
diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
index e8ceefb..bde268a 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
@@ -20,32 +20,29 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountChangeEvent;
import com.ning.billing.account.api.ChangedField;
import com.ning.billing.account.api.DefaultChangedField;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
public class DefaultAccountChangeEvent implements AccountChangeEvent {
private final UUID userToken;
private final List<ChangedField> changedFields;
private final UUID accountId;
-
@JsonCreator
public DefaultAccountChangeEvent(@JsonProperty("userToken") final UUID userToken,
@JsonProperty("changeFields") final List<ChangedField> changedFields,
@JsonProperty("accountId") final UUID accountId) {
- super();
this.userToken = userToken;
this.accountId = accountId;
this.changedFields = changedFields;
- //new ArrayList<ChangedField>();
- //this.changedFields.addAll(changedFields);
}
public DefaultAccountChangeEvent(final UUID id, final UUID userToken, final Account oldData, final Account newData) {
@@ -87,11 +84,11 @@ public class DefaultAccountChangeEvent implements AccountChangeEvent {
final int prime = 31;
int result = 1;
result = prime * result
- + ((accountId == null) ? 0 : accountId.hashCode());
+ + ((accountId == null) ? 0 : accountId.hashCode());
result = prime * result
- + ((changedFields == null) ? 0 : changedFields.hashCode());
+ + ((changedFields == null) ? 0 : changedFields.hashCode());
result = prime * result
- + ((userToken == null) ? 0 : userToken.hashCode());
+ + ((userToken == null) ? 0 : userToken.hashCode());
return result;
}
@@ -150,7 +147,7 @@ public class DefaultAccountChangeEvent implements AccountChangeEvent {
addIfValueChanged(tmpChangedFields,
"billCycleDay",
- Integer.toString(oldData.getBillCycleDay()), Integer.toString(newData.getBillCycleDay()));
+ oldData.getBillCycleDay().toString(), newData.getBillCycleDay().toString());
addIfValueChanged(tmpChangedFields, "paymentMethodId",
(oldData.getPaymentMethodId() != null) ? oldData.getPaymentMethodId().toString() : null,
diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java
index 025ff14..4c7f93b 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java
@@ -26,6 +26,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountCreationEvent;
import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.BillCycleDay;
+import com.ning.billing.account.api.DefaultBillCycleDay;
import com.ning.billing.catalog.api.Currency;
public class DefaultAccountCreationEvent implements AccountCreationEvent {
@@ -124,7 +126,7 @@ public class DefaultAccountCreationEvent implements AccountCreationEvent {
private final String name;
private final Integer firstNameLength;
private final String email;
- private final Integer billCycleDay;
+ private final DefaultBillCycleDay billCycleDay;
private final String currency;
private final UUID paymentMethodId;
private final String timeZone;
@@ -145,7 +147,7 @@ public class DefaultAccountCreationEvent implements AccountCreationEvent {
d.getName(),
d.getFirstNameLength(),
d.getEmail(),
- d.getBillCycleDay(),
+ new DefaultBillCycleDay(d.getBillCycleDay()),
d.getCurrency() != null ? d.getCurrency().name() : null,
d.getPaymentMethodId(),
d.getTimeZone() != null ? d.getTimeZone().getID() : null,
@@ -167,7 +169,7 @@ public class DefaultAccountCreationEvent implements AccountCreationEvent {
@JsonProperty("name") final String name,
@JsonProperty("firstNameLength") final Integer firstNameLength,
@JsonProperty("email") final String email,
- @JsonProperty("billCycleDay") final Integer billCycleDay,
+ @JsonProperty("billCycleDay") final DefaultBillCycleDay billCycleDay,
@JsonProperty("currency") final String currency,
@JsonProperty("paymentMethodId") final UUID paymentMethodId,
@JsonProperty("timeZone") final String timeZone,
@@ -225,7 +227,7 @@ public class DefaultAccountCreationEvent implements AccountCreationEvent {
}
@Override
- public Integer getBillCycleDay() {
+ public BillCycleDay getBillCycleDay() {
return billCycleDay;
}
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountBinder.java b/account/src/main/java/com/ning/billing/account/dao/AccountBinder.java
index a170b64..3a413f0 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountBinder.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountBinder.java
@@ -48,7 +48,8 @@ public @interface AccountBinder {
q.bind("firstNameLength", account.getFirstNameLength());
final Currency currency = account.getCurrency();
q.bind("currency", (currency == null) ? null : currency.toString());
- q.bind("billingCycleDay", account.getBillCycleDay());
+ q.bind("billingCycleDayLocal", account.getBillCycleDay().getDayOfMonthLocal());
+ q.bind("billingCycleDayUTC", account.getBillCycleDay().getDayOfMonthUTC());
q.bind("paymentMethodId", account.getPaymentMethodId() != null ? account.getPaymentMethodId().toString() : null);
final DateTimeZone timeZone = account.getTimeZone();
q.bind("timeZone", (timeZone == null) ? null : timeZone.toString());
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountHistoryBinder.java b/account/src/main/java/com/ning/billing/account/dao/AccountHistoryBinder.java
index 475bf26..7e99fa6 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountHistoryBinder.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountHistoryBinder.java
@@ -53,7 +53,8 @@ public @interface AccountHistoryBinder {
q.bind("firstNameLength", account.getFirstNameLength());
final Currency currency = account.getCurrency();
q.bind("currency", (currency == null) ? null : currency.toString());
- q.bind("billingCycleDay", account.getBillCycleDay());
+ q.bind("billingCycleDayLocal", account.getBillCycleDay().getDayOfMonthLocal());
+ q.bind("billingCycleDayUTC", account.getBillCycleDay().getDayOfMonthUTC());
q.bind("paymentMethodId", account.getPaymentMethodId() != null ? account.getPaymentMethodId().toString() : null);
final DateTimeZone timeZone = account.getTimeZone();
q.bind("timeZone", (timeZone == null) ? null : timeZone.toString());
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java b/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java
index f443993..90a6b25 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountMapper.java
@@ -26,6 +26,7 @@ import org.skife.jdbi.v2.tweak.ResultSetMapper;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.DefaultAccount;
+import com.ning.billing.account.api.DefaultBillCycleDay;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.util.dao.MapperBase;
@@ -37,7 +38,8 @@ public class AccountMapper extends MapperBase implements ResultSetMapper<Account
final String email = result.getString("email");
final String name = result.getString("name");
final int firstNameLength = result.getInt("first_name_length");
- final int billingCycleDay = result.getInt("billing_cycle_day");
+ final int billingCycleDayLocal = result.getInt("billing_cycle_day_local");
+ final int billingCycleDayUTC = result.getInt("billing_cycle_day_utc");
final String currencyString = result.getString("currency");
final Currency currency = (currencyString == null) ? null : Currency.valueOf(currencyString);
@@ -62,7 +64,7 @@ public class AccountMapper extends MapperBase implements ResultSetMapper<Account
final Boolean isNotifiedForInvoices = result.getBoolean("is_notified_for_invoices");
return new DefaultAccount(id, externalKey, email, name, firstNameLength, currency,
- billingCycleDay, paymentMethodId, timeZone, locale,
+ new DefaultBillCycleDay(billingCycleDayLocal, billingCycleDayUTC), paymentMethodId, timeZone, locale,
address1, address2, companyName, city, stateOrProvince, country, postalCode, phone,
isMigrated, isNotifiedForInvoices);
}
diff --git a/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg b/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg
index dd7b8da..c6f3c83 100644
--- a/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg
+++ b/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg
@@ -7,7 +7,8 @@ accountFields(prefix) ::= <<
<prefix>name,
<prefix>first_name_length,
<prefix>currency,
- <prefix>billing_cycle_day,
+ <prefix>billing_cycle_day_local,
+ <prefix>billing_cycle_day_utc,
<prefix>payment_method_id,
<prefix>time_zone,
<prefix>locale,
@@ -31,8 +32,8 @@ create() ::= <<
INSERT INTO accounts
(<accountFields()>)
VALUES
- (:id, :externalKey, :email, :name, :firstNameLength, :currency, :billingCycleDay,
- :paymentMethodId, :timeZone, :locale,
+ (:id, :externalKey, :email, :name, :firstNameLength, :currency, :billingCycleDayLocal,
+ :billingCycleDayUTC, :paymentMethodId, :timeZone, :locale,
:address1, :address2, :companyName, :city, :stateOrProvince, :country, :postalCode, :phone,
:migrated, :isNotifiedForInvoices, :userName, :createdDate, :userName, :updatedDate);
>>
@@ -40,8 +41,8 @@ create() ::= <<
update() ::= <<
UPDATE accounts
SET email = :email, name = :name, first_name_length = :firstNameLength,
- currency = :currency, billing_cycle_day = :billingCycleDay, payment_method_id = :paymentMethodId,
- time_zone = :timeZone, locale = :locale,
+ currency = :currency, billing_cycle_day_local = :billingCycleDayLocal, billing_cycle_day_utc = :billingCycleDayUTC,
+ payment_method_id = :paymentMethodId, time_zone = :timeZone, locale = :locale,
address1 = :address1, address2 = :address2, company_name = :companyName, city = :city, state_or_province = :stateOrProvince,
country = :country, postal_code = :postalCode, phone = :phone,
is_notified_for_invoices = :isNotifiedForInvoices, updated_date = :updatedDate, updated_by = :userName
@@ -56,7 +57,8 @@ historyFields() ::= <<
name,
first_name_length,
currency,
- billing_cycle_day,
+ billing_cycle_day_local,
+ billing_cycle_day_utc,
payment_method_id,
time_zone,
locale,
@@ -91,7 +93,7 @@ insertHistoryFromTransaction() ::= <<
INSERT INTO account_history(<historyFields()>)
VALUES
(:recordId, :id, :externalKey, :email, :name, :firstNameLength, :currency,
- :billingCycleDay, :paymentMethodId, :timeZone, :locale,
+ :billingCycleDayLocal, :billingCycleDayUTC, :paymentMethodId, :timeZone, :locale,
:address1, :address2, :companyName, :city, :stateOrProvince,
:country, :postalCode, :phone, :migrated, :isNotifiedForInvoices, :changeType, :userName, :createdDate);
>>
diff --git a/account/src/main/resources/com/ning/billing/account/ddl.sql b/account/src/main/resources/com/ning/billing/account/ddl.sql
index 17e344a..fe9ec44 100644
--- a/account/src/main/resources/com/ning/billing/account/ddl.sql
+++ b/account/src/main/resources/com/ning/billing/account/ddl.sql
@@ -7,7 +7,8 @@ CREATE TABLE accounts (
name varchar(100) NOT NULL,
first_name_length int NOT NULL,
currency char(3) DEFAULT NULL,
- billing_cycle_day int DEFAULT NULL,
+ billing_cycle_day_local int DEFAULT NULL,
+ billing_cycle_day_utc int DEFAULT NULL,
payment_method_id char(36) DEFAULT NULL,
time_zone varchar(50) DEFAULT NULL,
locale varchar(5) DEFAULT NULL,
@@ -25,6 +26,7 @@ CREATE TABLE accounts (
created_by varchar(50) NOT NULL,
updated_date datetime DEFAULT NULL,
updated_by varchar(50) DEFAULT NULL,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX accounts_id ON accounts(id);
@@ -40,7 +42,8 @@ CREATE TABLE account_history (
name varchar(100) NOT NULL,
first_name_length int NOT NULL,
currency char(3) DEFAULT NULL,
- billing_cycle_day int DEFAULT NULL,
+ billing_cycle_day_local int DEFAULT NULL,
+ billing_cycle_day_utc int DEFAULT NULL,
payment_method_id char(36) DEFAULT NULL,
time_zone varchar(50) DEFAULT NULL,
locale varchar(5) DEFAULT NULL,
@@ -57,6 +60,7 @@ CREATE TABLE account_history (
change_type char(6) NOT NULL,
updated_by varchar(50) NOT NULL,
date datetime NOT NULL,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(history_record_id)
) ENGINE=innodb;
CREATE INDEX account_history_record_id ON account_history(record_id);
@@ -71,6 +75,8 @@ CREATE TABLE account_emails (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX account_email_id ON account_emails(id);
@@ -86,6 +92,8 @@ CREATE TABLE account_email_history (
change_type char(6) NOT NULL,
updated_by varchar(50) NOT NULL,
date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(history_record_id)
) ENGINE=innodb;
CREATE INDEX account_email_record_id ON account_email_history(record_id);
diff --git a/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApi.java b/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApi.java
index 6de32f6..d6c804a 100644
--- a/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApi.java
+++ b/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApi.java
@@ -27,8 +27,10 @@ import org.testng.annotations.Test;
import com.ning.billing.account.AccountTestSuite;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.account.api.DefaultAccount;
import com.ning.billing.account.api.DefaultAccountEmail;
+import com.ning.billing.account.api.DefaultBillCycleDay;
import com.ning.billing.account.dao.AccountDao;
import com.ning.billing.account.dao.AccountEmailDao;
import com.ning.billing.account.dao.MockAccountDao;
@@ -61,7 +63,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuite {
final String name = UUID.randomUUID().toString();
final Integer firstNameLength = Integer.MAX_VALUE;
final Currency currency = Currency.BRL;
- final Integer billCycleDay = Integer.MIN_VALUE;
+ final BillCycleDay billCycleDay = new DefaultBillCycleDay(Integer.MIN_VALUE, Integer.MAX_VALUE);
final UUID paymentMethodId = UUID.randomUUID();
final DateTimeZone timeZone = DateTimeZone.UTC;
final String locale = UUID.randomUUID().toString();
diff --git a/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java b/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
index a15d101..34bc971 100644
--- a/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
+++ b/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
@@ -26,6 +26,7 @@ import org.testng.annotations.Test;
import com.ning.billing.account.AccountTestSuite;
import com.ning.billing.account.api.AccountChangeEvent;
import com.ning.billing.account.api.ChangedField;
+import com.ning.billing.account.api.DefaultBillCycleDay;
import com.ning.billing.account.api.DefaultChangedField;
import com.ning.billing.account.api.user.DefaultAccountCreationEvent.DefaultAccountData;
import com.ning.billing.util.jackson.ObjectMapper;
@@ -49,13 +50,12 @@ public class TestEventJson extends AccountTestSuite {
@Test(groups = "fast")
public void testAccountCreationEvent() throws Exception {
- final DefaultAccountData data = new DefaultAccountData("dsfdsf", "bobo", 3, "bobo@yahoo.com", 12, "USD", UUID.randomUUID(),
+ final DefaultAccountData data = new DefaultAccountData("dsfdsf", "bobo", 3, "bobo@yahoo.com", new DefaultBillCycleDay(12), "USD", UUID.randomUUID(),
"UTC", "US", "21 avenue", "", "Gling", "San Franciso", "CA", "94110", "USA", "4126789887", false, false);
final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID(), UUID.randomUUID());
-
final String json = mapper.writeValueAsString(e);
- final Class<?> claz = Class.forName(DefaultAccountCreationEvent.class.getName());
- final Object obj = mapper.readValue(json, claz);
+
+ final Object obj = mapper.readValue(json, DefaultAccountCreationEvent.class);
Assert.assertTrue(obj.equals(e));
}
}
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
index 5d457e2..06d4bb9 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
@@ -32,7 +32,10 @@ import com.ning.billing.account.api.AccountData;
import com.ning.billing.account.api.AccountEmail;
import com.ning.billing.account.api.DefaultAccount;
import com.ning.billing.account.api.DefaultAccountEmail;
+import com.ning.billing.account.api.DefaultBillCycleDay;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.mock.MockAccountBuilder;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.billing.util.api.TagApiException;
import com.ning.billing.util.customfield.CustomField;
import com.ning.billing.util.customfield.StringCustomField;
@@ -69,7 +72,7 @@ public class TestAccountDao extends AccountDaoTestBase {
final int firstNameLength = firstName.length();
return new DefaultAccount(UUID.randomUUID(), thisKey, thisEmail, name, firstNameLength, Currency.USD,
- billCycleDay, UUID.randomUUID(), timeZone, locale,
+ new DefaultBillCycleDay(billCycleDay, billCycleDay), UUID.randomUUID(), timeZone, locale,
null, null, null, null, null, null, null, // add null address fields
phone, false, false);
}
@@ -186,102 +189,11 @@ public class TestAccountDao extends AccountDaoTestBase {
final Account account = createTestAccount(1);
accountDao.create(account, context);
- final AccountData accountData = new AccountData() {
- @Override
- public String getExternalKey() {
- return account.getExternalKey();
- }
-
- @Override
- public String getName() {
- return "Jane Doe";
- }
-
- @Override
- public Integer getFirstNameLength() {
- return 4;
- }
-
- @Override
- public String getEmail() {
- return account.getEmail();
- }
-
- @Override
- public String getPhone() {
- return account.getPhone();
- }
-
- @Override
- public Boolean isMigrated() {
- return false;
- }
-
- @Override
- public Boolean isNotifiedForInvoices() {
- return false;
- }
-
- @Override
- public Integer getBillCycleDay() {
- return account.getBillCycleDay();
- }
-
- @Override
- public Currency getCurrency() {
- return account.getCurrency();
- }
-
- @Override
- public UUID getPaymentMethodId() {
- return account.getPaymentMethodId();
- }
-
- @Override
- public DateTimeZone getTimeZone() {
- return DateTimeZone.forID("Australia/Darwin");
- }
-
- @Override
- public String getLocale() {
- return "FR-CA";
- }
-
- @Override
- public String getAddress1() {
- return null;
- }
-
- @Override
- public String getAddress2() {
- return null;
- }
-
- @Override
- public String getCompanyName() {
- return null;
- }
-
- @Override
- public String getCity() {
- return null;
- }
-
- @Override
- public String getStateOrProvince() {
- return null;
- }
-
- @Override
- public String getPostalCode() {
- return null;
- }
-
- @Override
- public String getCountry() {
- return null;
- }
- };
+ final AccountData accountData = new MockAccountBuilder(account).migrated(false)
+ .isNotifiedForInvoices(false)
+ .timeZone(DateTimeZone.forID("Australia/Darwin"))
+ .locale("FR-CA")
+ .build();
final Account updatedAccount = new DefaultAccount(account.getId(), accountData);
accountDao.update(updatedAccount, context);
@@ -309,7 +221,7 @@ public class TestAccountDao extends AccountDaoTestBase {
public void testAddingContactInformation() throws Exception {
final UUID accountId = UUID.randomUUID();
final DefaultAccount account = new DefaultAccount(accountId, "extKey123456", "myemail123456@glam.com",
- "John Smith", 4, Currency.USD, 15, null,
+ "John Smith", 4, Currency.USD, new DefaultBillCycleDay(15), null,
DateTimeZone.forID("America/Cambridge_Bay"), "EN-CA",
null, null, null, null, null, null, null, null, false, false);
accountDao.create(account, context);
@@ -324,7 +236,7 @@ public class TestAccountDao extends AccountDaoTestBase {
final String phone = "18001112222";
final DefaultAccount updatedAccount = new DefaultAccount(accountId, "extKey123456", "myemail123456@glam.com",
- "John Smith", 4, Currency.USD, 15, null,
+ "John Smith", 4, Currency.USD, new DefaultBillCycleDay(15), null,
DateTimeZone.forID("America/Cambridge_Bay"), "EN-CA",
address1, address2, companyName, city, stateOrProvince, country,
postalCode, phone, false, false);
@@ -351,14 +263,14 @@ public class TestAccountDao extends AccountDaoTestBase {
final String originalExternalKey = "extKey1337";
final DefaultAccount account = new DefaultAccount(accountId, originalExternalKey, "myemail1337@glam.com",
- "John Smith", 4, Currency.USD, 15, null,
+ "John Smith", 4, Currency.USD, new DefaultBillCycleDay(15), null,
null, null, null, null, null, null, null, null, null, null,
false, false);
accountDao.create(account, context);
final String buggyKey = "extKey1338";
final DefaultAccount updatedAccountData = new DefaultAccount(accountId, buggyKey, "myemail1337@glam.com",
- "John Smith", 4, Currency.USD, 15, null,
+ "John Smith", 4, Currency.USD, new DefaultBillCycleDay(15), null,
null, null, null, null, null, null, null, null, null, null,
false, false);
accountDao.update(updatedAccountData, context);
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..3c0a2c6 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -33,6 +33,8 @@ create table bst (
, next_currency varchar(50) default null
, next_start_date bigint default null
, next_state varchar(50) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Business Subscription Transitions, track bundles lifecycle';
create index bst_key_index on bst (external_key, requested_timestamp asc);
@@ -46,13 +48,15 @@ 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
, credit_card_type varchar(50) default null
, billing_address_country varchar(50) default null
, currency char(50) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Business ACcounts, keep a record of all accounts';
create unique index bac_key_index on bac (account_key);
@@ -66,13 +70,15 @@ 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'
, amount_charged numeric(10, 4) default 0 comment 'Sums of the invoice items amount'
, amount_credited numeric(10, 4) default 0 comment 'Sums of the credit items'
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Business INvoices, keep a record of generated invoices';
create unique index bin_key_index on bin (invoice_id);
@@ -92,10 +98,12 @@ 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
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Business Invoice Items, keep a record of all invoice items';
create unique index bii_key_index on bii (item_id);
@@ -122,6 +130,8 @@ create table bip (
, card_country varchar(50) default null
, invoice_payment_type varchar(50) default null
, linked_invoice_payment_id char(36) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Business Invoice Payments, track all payments';
create unique index bip_key_index on bip (payment_id);
@@ -135,6 +145,8 @@ create table bos (
, status varchar(50) not null
, start_date bigint default null
, end_date bigint default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Business Overdue Status, historical bundles overdue status';
create unique index bos_key_index on bos (external_key, status);
@@ -145,6 +157,8 @@ create table bac_tags (
, account_id char(36) not null
, account_key varchar(50) not null comment 'Account external key'
, name varchar(50) not null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Tags associated to accounts';
@@ -155,6 +169,8 @@ create table bac_fields (
, account_key varchar(50) not null comment 'Account external key'
, name varchar(50) not null
, value varchar(255) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Custom fields associated to accounts';
@@ -165,6 +181,8 @@ create table bst_tags (
, external_key varchar(50) not null comment 'Bundle external key'
, account_key varchar(50) not null comment 'Account external key'
, name varchar(50) not null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Tags associated to bundles';
@@ -176,6 +194,8 @@ create table bst_fields (
, account_key varchar(50) not null comment 'Account external key'
, name varchar(50) not null
, value varchar(255) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Custom fields associated to bundles';
@@ -184,6 +204,8 @@ create table bin_tags (
record_id int(11) unsigned not null auto_increment
, invoice_id char(36) not null
, name varchar(50) not null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Tags associated to invoices';
@@ -193,6 +215,8 @@ create table bin_fields (
, invoice_id char(36) not null
, name varchar(50) not null
, value varchar(255) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Custom fields associated to invoices';
@@ -201,6 +225,8 @@ create table bip_tags (
record_id int(11) unsigned not null auto_increment
, payment_id char(36) not null
, name varchar(50) not null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Tags associated to payments';
@@ -210,5 +236,7 @@ create table bip_fields (
, payment_id char(36) not null
, name varchar(50) not null
, value varchar(255) default null
+, account_record_id int(11) unsigned default null
+, tenant_record_id int(11) unsigned default null
, primary key(record_id)
) engine=innodb comment 'Custom fields associated to payments';
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/account/api/AccountData.java b/api/src/main/java/com/ning/billing/account/api/AccountData.java
index 055338b..6816c4f 100644
--- a/api/src/main/java/com/ning/billing/account/api/AccountData.java
+++ b/api/src/main/java/com/ning/billing/account/api/AccountData.java
@@ -31,7 +31,7 @@ public interface AccountData {
public String getEmail();
- public Integer getBillCycleDay();
+ public BillCycleDay getBillCycleDay();
public Currency getCurrency();
diff --git a/api/src/main/java/com/ning/billing/account/api/BillCycleDay.java b/api/src/main/java/com/ning/billing/account/api/BillCycleDay.java
new file mode 100644
index 0000000..1fc203d
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/account/api/BillCycleDay.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.account.api;
+
+public interface BillCycleDay {
+
+ int getDayOfMonthUTC();
+
+ int getDayOfMonthLocal();
+}
diff --git a/api/src/main/java/com/ning/billing/account/api/DefaultMutableAccountData.java b/api/src/main/java/com/ning/billing/account/api/DefaultMutableAccountData.java
index 566822a..694297b 100644
--- a/api/src/main/java/com/ning/billing/account/api/DefaultMutableAccountData.java
+++ b/api/src/main/java/com/ning/billing/account/api/DefaultMutableAccountData.java
@@ -24,12 +24,13 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.util.tag.TagStore;
public class DefaultMutableAccountData implements MutableAccountData {
+
private String externalKey;
private String email;
private String name;
private int firstNameLength;
private Currency currency;
- private int billCycleDay;
+ private BillCycleDay billCycleDay;
private UUID paymentMethodId;
private DateTimeZone timeZone;
private String locale;
@@ -45,7 +46,7 @@ public class DefaultMutableAccountData implements MutableAccountData {
private boolean isNotifiedForInvoices;
public DefaultMutableAccountData(final String externalKey, final String email, final String name,
- final int firstNameLength, final Currency currency, final int billCycleDay,
+ final int firstNameLength, final Currency currency, final BillCycleDay billCycleDay,
final UUID paymentMethodId, final TagStore tags, final DateTimeZone timeZone,
final String locale, final String address1, final String address2,
final String companyName, final String city, final String stateOrProvince,
@@ -96,289 +97,181 @@ public class DefaultMutableAccountData implements MutableAccountData {
this.isNotifiedForInvoices = accountData.isNotifiedForInvoices();
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getExternalKey()
- */
@Override
public String getExternalKey() {
return externalKey;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getEmail()
- */
@Override
public String getEmail() {
return email;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getName()
- */
@Override
public String getName() {
return name;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getFirstNameLength()
- */
@Override
public Integer getFirstNameLength() {
return firstNameLength;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getCurrency()
- */
@Override
public Currency getCurrency() {
return currency;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getBillCycleDay()
- */
@Override
- public Integer getBillCycleDay() {
+ public BillCycleDay getBillCycleDay() {
return billCycleDay;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getPaymentProviderName()
- */
@Override
public UUID getPaymentMethodId() {
return paymentMethodId;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getTimeZone()
- */
@Override
public DateTimeZone getTimeZone() {
return timeZone;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getLocale()
- */
@Override
public String getLocale() {
return locale;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getAddress1()
- */
@Override
public String getAddress1() {
return address1;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getAddress2()
- */
@Override
public String getAddress2() {
return address2;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getCompanyName()
- */
@Override
public String getCompanyName() {
return companyName;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getCity()
- */
@Override
public String getCity() {
return city;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getStateOrProvince()
- */
@Override
public String getStateOrProvince() {
return stateOrProvince;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getCountry()
- */
@Override
public String getCountry() {
return country;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getPostalCode()
- */
@Override
public String getPostalCode() {
return postalCode;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getPhone()
- */
@Override
public String getPhone() {
return phone;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#isMigrated()
- */
@Override
public Boolean isMigrated() {
return isMigrated;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#getSendInvoiceEmails()
- */
@Override
public Boolean isNotifiedForInvoices() {
return isNotifiedForInvoices;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setExternalKey(java.lang.String)
- */
@Override
public void setExternalKey(final String externalKey) {
this.externalKey = externalKey;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setEmail(java.lang.String)
- */
@Override
public void setEmail(final String email) {
this.email = email;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setName(java.lang.String)
- */
@Override
public void setName(final String name) {
this.name = name;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setFirstNameLength(int)
- */
@Override
public void setFirstNameLength(final int firstNameLength) {
this.firstNameLength = firstNameLength;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setCurrency(com.ning.billing.catalog.api.Currency)
- */
@Override
public void setCurrency(final Currency currency) {
this.currency = currency;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setBillCycleDay(int)
- */
@Override
- public void setBillCycleDay(final int billCycleDay) {
+ public void setBillCycleDay(final BillCycleDay billCycleDay) {
this.billCycleDay = billCycleDay;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setPaymentProviderName(java.lang.String)
- */
@Override
public void setPaymentMethodId(final UUID paymentMethodId) {
this.paymentMethodId = paymentMethodId;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setTimeZone(org.joda.time.DateTimeZone)
- */
@Override
public void setTimeZone(final DateTimeZone timeZone) {
this.timeZone = timeZone;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setLocale(java.lang.String)
- */
@Override
public void setLocale(final String locale) {
this.locale = locale;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setAddress1(java.lang.String)
- */
@Override
public void setAddress1(final String address1) {
this.address1 = address1;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setAddress2(java.lang.String)
- */
@Override
public void setAddress2(final String address2) {
this.address2 = address2;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setCompanyName(java.lang.String)
- */
@Override
public void setCompanyName(final String companyName) {
this.companyName = companyName;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setCity(java.lang.String)
- */
@Override
public void setCity(final String city) {
this.city = city;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setStateOrProvince(java.lang.String)
- */
@Override
public void setStateOrProvince(final String stateOrProvince) {
this.stateOrProvince = stateOrProvince;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setCountry(java.lang.String)
- */
@Override
public void setCountry(final String country) {
this.country = country;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setPostalCode(java.lang.String)
- */
@Override
public void setPostalCode(final String postalCode) {
this.postalCode = postalCode;
}
- /* (non-Javadoc)
- * @see com.ning.billing.account.api.MutableAccountData#setPhone(java.lang.String)
- */
@Override
public void setPhone(final String phone) {
this.phone = phone;
@@ -393,6 +286,4 @@ public class DefaultMutableAccountData implements MutableAccountData {
public void setIsNotifiedForInvoices(final boolean isNotifiedForInvoices) {
this.isNotifiedForInvoices = isNotifiedForInvoices;
}
-
-
}
diff --git a/api/src/main/java/com/ning/billing/account/api/MutableAccountData.java b/api/src/main/java/com/ning/billing/account/api/MutableAccountData.java
index fea8c8b..b1716ec 100644
--- a/api/src/main/java/com/ning/billing/account/api/MutableAccountData.java
+++ b/api/src/main/java/com/ning/billing/account/api/MutableAccountData.java
@@ -33,7 +33,7 @@ public interface MutableAccountData extends AccountData {
public void setCurrency(Currency currency);
- public void setBillCycleDay(int billCycleDay);
+ public void setBillCycleDay(BillCycleDay billCycleDay);
public void setPaymentMethodId(UUID paymentMethodId);
@@ -61,4 +61,4 @@ public interface MutableAccountData extends AccountData {
public void setIsNotifiedForInvoices(boolean isNotifiedForInvoices);
-}
\ No newline at end of file
+}
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..48607a0 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;
@@ -39,6 +42,7 @@ import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountData;
import com.ning.billing.account.api.AccountService;
import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.analytics.AnalyticsListener;
import com.ning.billing.analytics.api.user.DefaultAnalyticsUserApi;
import com.ning.billing.api.TestApiListener;
@@ -60,6 +64,8 @@ import com.ning.billing.invoice.api.InvoiceUserApi;
import com.ning.billing.invoice.generator.InvoiceDateUtils;
import com.ning.billing.invoice.model.InvoicingConfiguration;
import com.ning.billing.junction.plumbing.api.BlockingSubscription;
+import com.ning.billing.mock.MockAccountBuilder;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.billing.overdue.wrapper.OverdueWrapperFactory;
import com.ning.billing.payment.api.PaymentApi;
import com.ning.billing.payment.api.PaymentMethodPlugin;
@@ -205,7 +211,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 +225,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 +244,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) {
@@ -280,102 +285,17 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
}
protected AccountData getAccountData(final int billingDay) {
- final String someRandomKey = UUID.randomUUID().toString();
- return new AccountData() {
- @Override
- public String getName() {
- return "firstName lastName";
- }
-
- @Override
- public Integer getFirstNameLength() {
- return "firstName".length();
- }
-
- @Override
- public String getEmail() {
- return someRandomKey + "@laposte.fr";
- }
-
- @Override
- public String getPhone() {
- return "4152876341";
- }
-
- @Override
- public Boolean isMigrated() {
- return false;
- }
-
- @Override
- public Boolean isNotifiedForInvoices() {
- return false;
- }
-
- @Override
- public String getExternalKey() {
- return someRandomKey;
- }
-
- @Override
- public Integer getBillCycleDay() {
- return billingDay;
- }
-
- @Override
- public Currency getCurrency() {
- return Currency.USD;
- }
-
- @Override
- public UUID getPaymentMethodId() {
- return null;
- }
-
- @Override
- public DateTimeZone getTimeZone() {
- return DateTimeZone.UTC;
- }
-
- @Override
- public String getLocale() {
- return null;
- }
-
- @Override
- public String getAddress1() {
- return null;
- }
-
- @Override
- public String getAddress2() {
- return null;
- }
-
- @Override
- public String getCompanyName() {
- return null;
- }
-
- @Override
- public String getCity() {
- return null;
- }
-
- @Override
- public String getStateOrProvince() {
- return null;
- }
-
- @Override
- public String getPostalCode() {
- return null;
- }
-
- @Override
- public String getCountry() {
- return null;
- }
- };
+ return new MockAccountBuilder().name(UUID.randomUUID().toString().substring(1, 8))
+ .firstNameLength(6)
+ .email(UUID.randomUUID().toString().substring(1, 8))
+ .phone(UUID.randomUUID().toString().substring(1, 8))
+ .migrated(false)
+ .isNotifiedForInvoices(false)
+ .externalKey(UUID.randomUUID().toString().substring(1, 8))
+ .billingCycleDay(new MockBillCycleDay(billingDay))
+ .currency(Currency.USD)
+ .paymentMethodId(UUID.randomUUID())
+ .timeZone(DateTimeZone.UTC)
+ .build();
}
}
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/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql b/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
index 66628e8..2b604e7 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
@@ -19,6 +19,8 @@ CREATE TABLE subscription_events (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX subscription_events_id ON subscription_events(id);
@@ -42,6 +44,8 @@ CREATE TABLE subscriptions (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX subscriptions_id ON subscriptions(id);
@@ -54,6 +58,8 @@ CREATE TABLE bundles (
external_key varchar(64) NOT NULL,
account_id char(36) NOT NULL,
last_sys_update_date datetime,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX bundles_id ON bundles(id);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java
index 55115be..69ece03 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java
@@ -25,6 +25,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Period;
+import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
@@ -36,6 +37,7 @@ import org.testng.annotations.BeforeMethod;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.api.TestApiListener;
import com.ning.billing.api.TestApiListener.NextEvent;
import com.ning.billing.api.TestListenerStatus;
@@ -67,6 +69,7 @@ import com.ning.billing.entitlement.events.EntitlementEvent;
import com.ning.billing.entitlement.events.phase.PhaseEvent;
import com.ning.billing.entitlement.events.user.ApiEvent;
import com.ning.billing.entitlement.events.user.ApiEventType;
+import com.ning.billing.mock.MockAccountBuilder;
import com.ning.billing.util.bus.BusService;
import com.ning.billing.util.bus.DefaultBusService;
import com.ning.billing.util.callcontext.CallContext;
@@ -169,7 +172,21 @@ public abstract class TestApiBase extends EntitlementTestSuiteWithEmbeddedDB imp
private void init() throws Exception {
((DefaultCatalogService) catalogService).loadCatalog();
- accountData = getAccountData();
+ final BillCycleDay billCycleDay = Mockito.mock(BillCycleDay.class);
+ Mockito.when(billCycleDay.getDayOfMonthUTC()).thenReturn(1);
+ accountData = new MockAccountBuilder().name(UUID.randomUUID().toString())
+ .firstNameLength(6)
+ .email(UUID.randomUUID().toString())
+ .phone(UUID.randomUUID().toString())
+ .migrated(false)
+ .isNotifiedForInvoices(false)
+ .externalKey(UUID.randomUUID().toString())
+ .billingCycleDay(billCycleDay)
+ .currency(Currency.USD)
+ .paymentMethodId(UUID.randomUUID())
+ .timeZone(DateTimeZone.forID("Europe/Paris"))
+ .build();
+
assertNotNull(accountData);
catalog = catalogService.getFullCatalog();
assertNotNull(catalog);
@@ -362,106 +379,6 @@ public abstract class TestApiBase extends EntitlementTestSuiteWithEmbeddedDB imp
return result;
}
- protected AccountData getAccountData() {
- final AccountData accountData = new AccountData() {
- @Override
- public String getName() {
- return "firstName lastName";
- }
-
- @Override
- public Integer getFirstNameLength() {
- return "firstName".length();
- }
-
- @Override
- public String getEmail() {
- return "accountName@yahoo.com";
- }
-
- @Override
- public String getPhone() {
- return "4152876341";
- }
-
- @Override
- public Boolean isMigrated() {
- return false;
- }
-
- @Override
- public Boolean isNotifiedForInvoices() {
- return false;
- }
-
- @Override
- public String getExternalKey() {
- return "k123456";
- }
-
- @Override
- public Integer getBillCycleDay() {
- return 1;
- }
-
- @Override
- public Currency getCurrency() {
- return Currency.USD;
- }
-
- @Override
- public UUID getPaymentMethodId() {
- return UUID.randomUUID();
- }
-
- @Override
- public DateTimeZone getTimeZone() {
- return DateTimeZone.forID("Europe/Paris");
- }
-
- @Override
- public String getLocale() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getAddress1() {
- return null;
- }
-
- @Override
- public String getAddress2() {
- return null;
- }
-
- @Override
- public String getCompanyName() {
- return null;
- }
-
- @Override
- public String getCity() {
- return null;
- }
-
- @Override
- public String getStateOrProvince() {
- return null;
- }
-
- @Override
- public String getPostalCode() {
- return null;
- }
-
- @Override
- public String getCountry() {
- return null;
- }
- };
- return accountData;
- }
-
protected PlanPhaseSpecifier getProductSpecifier(final String productName, final String priceList,
final BillingPeriod term,
@Nullable final PhaseType phaseType) {
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 75eee24..c6e57c7 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.TagHandler;
import com.ning.billing.invoice.notification.NextBillingDateNotifier;
@@ -26,6 +25,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";
@@ -42,7 +43,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 513dae0..2729faa 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.ErrorCode;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
@@ -35,7 +34,10 @@ 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;
@Inject
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..f007eac 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,11 +66,11 @@ 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);
- dao.create(migrationInvoice, account.getBillCycleDay(), context);
+ dao.create(migrationInvoice, account.getBillCycleDay().getDayOfMonthUTC(), context);
return migrationInvoice.getId();
}
}
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 3228d1d..5ee9262 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;
@@ -41,7 +41,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;
@@ -61,7 +64,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);
}
@@ -87,15 +90,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 {
@@ -115,7 +125,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
@Override
public InvoiceItem getCreditById(final UUID creditId) throws InvoiceApiException {
- InvoiceItem creditItem = dao.getCreditById(creditId);
+ final InvoiceItem creditItem = dao.getCreditById(creditId);
if (creditItem == null) {
throw new InvoiceApiException(ErrorCode.INVOICE_NO_SUCH_CREDIT, creditId);
}
@@ -123,22 +133,20 @@ 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 insertCreditForInvoice(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 {
if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) {
throw new InvoiceApiException(ErrorCode.CREDIT_AMOUNT_INVALID, amount);
}
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);
@@ -149,4 +157,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 255a683..7b6489d 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;
@@ -31,6 +32,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
@@ -100,11 +102,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);
@@ -150,7 +152,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
}
@Override
- public void create(final Invoice invoice, final int billCycleDay, final CallContext context) {
+ public void create(final Invoice invoice, final int billCycleDayUTC, final CallContext context) {
invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
@Override
public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
@@ -171,7 +173,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
audits.addAll(createAudits(TableName.INVOICE_ITEMS, recordIdList));
final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
- notifyOfFutureBillingEvents(transactional, invoice.getAccountId(), billCycleDay, recurringInvoiceItems);
+ notifyOfFutureBillingEvents(transactional, invoice.getAccountId(), billCycleDayUTC, recurringInvoiceItems);
final List<InvoicePayment> invoicePayments = invoice.getPayments();
final InvoicePaymentSqlDao invoicePaymentSqlDao = transactional.become(InvoicePaymentSqlDao.class);
@@ -256,7 +258,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 {
@@ -343,7 +345,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(), context.getCreatedDate().toLocalDate(), cbaAdjAmount, invoice.getCurrency());
transInvoiceItemDao.create(cbaAdjItem, context);
}
final BigDecimal requestedPositiveAmountAfterCbaAdj = requestedPositiveAmount.add(cbaAdjAmount);
@@ -352,7 +354,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(), context.getCreatedDate().toLocalDate(), requestedPositiveAmountToAdjust.negate(), invoice.getCurrency());
transInvoiceItemDao.create(adjItem, context);
}
}
@@ -431,9 +433,8 @@ public class DefaultInvoiceDao implements InvoiceDao {
@Override
public InvoiceItem insertCredit(final UUID accountId, final UUID invoiceId, final BigDecimal positiveCreditAmount,
- final DateTime effectiveDate, final Currency currency,
+ final LocalDate effectiveDate, final Currency currency,
final CallContext context) {
-
return invoiceSqlDao.inTransaction(new Transaction<InvoiceItem, InvoiceSqlDao>() {
@Override
public InvoiceItem inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
@@ -457,7 +458,8 @@ public class DefaultInvoiceDao implements InvoiceDao {
}
// If invoice balance becomes negative we add some CBA item
if (invoice.getBalance().compareTo(BigDecimal.ZERO) < 0) {
- final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate(), invoice.getBalance().negate(), invoice.getCurrency());
+ final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(),
+ invoice.getBalance().negate(), invoice.getCurrency());
transInvoiceItemDao.create(cbaAdjItem, context);
}
@@ -529,7 +531,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
invoice.addPayments(invoicePayments);
}
- private void notifyOfFutureBillingEvents(final InvoiceSqlDao dao, final UUID accountId, final int billCycleDay, final List<InvoiceItem> invoiceItems) {
+ private void notifyOfFutureBillingEvents(final InvoiceSqlDao dao, final UUID accountId, final int billCycleDayUTC, final List<InvoiceItem> invoiceItems) {
UUID subscriptionForNextNotification = null;
boolean shouldBeNotified = false;
for (final InvoiceItem item : invoiceItems) {
@@ -549,8 +551,8 @@ 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
- final DateTime nextNotificationDateTime = InvoiceDateUtils.calculateBillingCycleDateAfter(clock.getUTCNow(), billCycleDay);
+ // spread the load.
+ final DateTime nextNotificationDateTime = InvoiceDateUtils.calculateBillingCycleDateAfter(clock.getUTCNow(), billCycleDayUTC);
// 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..9e0d827 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,8 +20,9 @@ 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.account.api.BillCycleDay;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
@@ -31,7 +32,8 @@ 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);
+
+ void create(final Invoice invoice, final int billCycleDayUTC, final CallContext context);
Invoice getById(final UUID id);
@@ -41,7 +43,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 +57,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 +84,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..a2f255f 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,29 +16,149 @@
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;
}
- final DateTime tzAdjustedStartDate = input.toDateTime(timeZone);
- return new DateTime(tzAdjustedStartDate.getYear(), tzAdjustedStartDate.getMonthOfYear(), tzAdjustedStartDate.getDayOfMonth(), 0, 0, timeZone);
+ 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;
+ }
}
- // Note: date has to be in UTC
- public static DateTime calculateBillingCycleDateOnOrAfter(final DateTime date, final int billingCycleDay) {
+ 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;
+ }
+
+ 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 billingCycleDayLocal) {
+ final DateTime tmp = new DateTime(date.toDateTimeAtStartOfDay(), accountTimeZone);
+ final DateTime proposedDateTime = calculateBillingCycleDateOnOrAfter(tmp, billingCycleDayLocal);
+
+ return new LocalDate(proposedDateTime, accountTimeZone);
+ }
+
+ public static LocalDate calculateBillingCycleDateAfter(final LocalDate date, final DateTimeZone accountTimeZone,
+ final int billingCycleDayLocal) {
+ final DateTime tmp = new DateTime(date.toDateTimeAtStartOfDay(), accountTimeZone);
+ final DateTime proposedDateTime = calculateBillingCycleDateAfter(tmp, billingCycleDayLocal);
+
+ return new LocalDate(proposedDateTime, accountTimeZone);
+ }
+
+ public static DateTime calculateBillingCycleDateOnOrAfter(final DateTime date, final int billingCycleDayLocal) {
final int lastDayOfMonth = date.dayOfMonth().getMaximumValue();
final MutableDateTime tmp = date.toMutableDateTime();
- if (billingCycleDay > lastDayOfMonth) {
+ if (billingCycleDayLocal > lastDayOfMonth) {
tmp.setDayOfMonth(lastDayOfMonth);
} else {
- tmp.setDayOfMonth(billingCycleDay);
+ tmp.setDayOfMonth(billingCycleDayLocal);
}
DateTime proposedDate = tmp.toDateTime();
@@ -48,13 +168,12 @@ public class InvoiceDateUtils {
return proposedDate;
}
- // Note: date has to be in UTC
- public static DateTime calculateBillingCycleDateAfter(final DateTime date, final int billingCycleDay) {
- DateTime proposedDate = calculateBillingCycleDateOnOrAfter(date, billingCycleDay);
-
+ public static DateTime calculateBillingCycleDateAfter(final DateTime date, final int billingCycleDayLocal) {
+ DateTime proposedDate = calculateBillingCycleDateOnOrAfter(date, billingCycleDayLocal);
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 693f68f..9a5bdad 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;
@@ -45,7 +44,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..694330d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -24,14 +24,16 @@ 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;
import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.entitlement.api.billing.BillingEvent;
import com.ning.billing.entitlement.api.billing.EntitlementBillingApiException;
@@ -41,8 +43,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 +62,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 +143,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 +156,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 {
@@ -172,7 +178,7 @@ public class InvoiceDispatcher {
}
outputDebugData(billingEvents, invoices);
if (!dryRun) {
- invoiceDao.create(invoice, account.getBillCycleDay(), context);
+ invoiceDao.create(invoice, account.getBillCycleDay().getDayOfMonthUTC(), context);
final List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
@@ -180,7 +186,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);
}
@@ -197,10 +203,11 @@ public class InvoiceDispatcher {
}
}
- private void setChargedThroughDates(final int billCycleDay,
+ private void setChargedThroughDates(final BillCycleDay billCycleDay,
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);
@@ -222,18 +229,23 @@ public class InvoiceDispatcher {
}
}
- private void addInvoiceItemsToChargeThroughDates(final int billCycleDay,
+ private void addInvoiceItemsToChargeThroughDates(final BillCycleDay billCycleDay,
final Map<UUID, DateTime> chargeThroughDates,
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)) {
- // The CTD should always align with the BCD - note that the BCD is computed from UTC, hence we
- // can't use endDate as a CTD here
- chargeThroughDates.put(subscriptionId, InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(endDate, billCycleDay));
+ // The CTD should always align with the BCD
+ chargeThroughDates.put(subscriptionId, InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(endDate, billCycleDay.getDayOfMonthLocal()));
}
} else {
chargeThroughDates.put(subscriptionId, 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..5a6c063 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -10,14 +10,16 @@ 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,
linked_item_id char(36),
created_by varchar(50) NOT NULL,
created_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
@@ -31,12 +33,14 @@ 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,
created_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX invoices_id ON invoices(id);
@@ -56,6 +60,8 @@ CREATE TABLE invoice_payments (
linked_invoice_payment_id char(36) DEFAULT NULL,
created_by varchar(50) NOT NULL,
created_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX invoice_payments_id ON invoice_payments(id);
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..c8c3e71 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;
@@ -57,6 +58,7 @@ import com.ning.billing.invoice.notification.NullInvoiceNotifier;
import com.ning.billing.invoice.tests.InvoicingTestBase;
import com.ning.billing.junction.api.BillingApi;
import com.ning.billing.junction.api.BillingEventSet;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.billing.util.bus.BusService;
import com.ning.billing.util.bus.DefaultBusService;
import com.ning.billing.util.callcontext.CallContext;
@@ -101,7 +103,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 +123,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);
@@ -129,7 +131,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(accountId);
Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
- Mockito.when(account.getBillCycleDay()).thenReturn(31);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(31));
migrationInvoiceId = createAndCheckMigrationInvoice();
regularInvoiceId = generateRegularInvoice();
@@ -210,7 +212,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..09c196b 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,8 +24,11 @@ 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.account.api.BillCycleDay;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
@@ -53,7 +56,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 +104,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 +192,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 +264,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 +277,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 70501c0..083a3c8 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.Assert;
import org.testng.annotations.Test;
@@ -74,8 +76,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);
@@ -93,12 +95,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);
@@ -131,39 +133,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();
@@ -177,16 +146,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);
@@ -205,7 +174,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();
@@ -253,35 +222,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();
@@ -289,15 +258,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);
@@ -329,16 +298,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);
@@ -356,24 +325,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();
@@ -392,15 +361,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);
@@ -421,28 +390,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);
}
@@ -450,12 +419,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");
@@ -480,12 +449,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");
@@ -493,7 +462,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);
@@ -504,12 +473,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");
@@ -529,8 +498,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");
@@ -555,12 +524,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");
@@ -621,12 +590,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");
@@ -634,7 +603,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);
@@ -665,7 +634,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);
@@ -688,12 +657,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");
@@ -701,7 +670,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);
@@ -731,7 +700,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);
@@ -741,7 +710,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);
@@ -751,7 +720,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),
@@ -763,7 +732,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);
@@ -778,7 +747,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
final UUID accountId = UUID.randomUUID();
- final DateTime effectiveDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+ final LocalDate effectiveDate = new LocalDate(2011, 3, 1);
final BigDecimal creditAmount = new BigDecimal("5.0");
@@ -838,22 +807,21 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
// Crete one invoice with a fixed invoice item
- final DateTime targetDate = new DateTime(2011, 2, 15, 0, 0, 0, 0);
- final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+ final LocalDate targetDate = new LocalDate(2011, 2, 15);
+ final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, 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 BigDecimal amount1 = new BigDecimal("5.0");
// 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);
// Create the credit item
- final DateTime effectiveDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+ final LocalDate effectiveDate = new LocalDate(2011, 3, 1);
invoiceDao.insertCredit(accountId, invoice1.getId(), creditAmount, effectiveDate, Currency.USD, context);
@@ -882,12 +850,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");
@@ -900,23 +868,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");
@@ -924,11 +892,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);
}
@@ -942,7 +910,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
@@ -953,7 +921,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);
@@ -961,7 +929,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);
@@ -971,7 +939,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);
@@ -979,7 +947,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);
@@ -1002,7 +970,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,
@@ -1010,8 +978,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);
@@ -1041,7 +1009,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,
@@ -1050,7 +1018,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);
@@ -1066,7 +1034,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);
@@ -1076,7 +1044,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);
@@ -1087,7 +1055,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);
}
@@ -1106,7 +1074,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,
@@ -1121,7 +1089,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);
@@ -1137,8 +1105,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();
@@ -1160,7 +1128,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());
@@ -1171,7 +1139,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());
@@ -1198,7 +1166,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);
@@ -1229,7 +1197,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/TestInvoiceDispatcher.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
index 97e1335..1721788 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -30,7 +30,6 @@ import org.testng.annotations.BeforeSuite;
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.AccountApiException;
import com.ning.billing.account.api.AccountUserApi;
@@ -54,6 +53,7 @@ import com.ning.billing.invoice.notification.NullInvoiceNotifier;
import com.ning.billing.invoice.tests.InvoicingTestBase;
import com.ning.billing.junction.api.BillingApi;
import com.ning.billing.junction.api.BillingEventSet;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.billing.util.bus.BusService;
import com.ning.billing.util.bus.DefaultBusService;
import com.ning.billing.util.callcontext.CallContext;
@@ -63,8 +63,11 @@ import com.ning.billing.util.callcontext.UserType;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.globallocker.GlobalLocker;
+import com.google.inject.Inject;
+
@Guice(modules = {MockModule.class})
public class TestInvoiceDispatcher extends InvoicingTestBase {
+
private final Logger log = LoggerFactory.getLogger(TestInvoiceDispatcher.class);
@Inject
@@ -93,7 +96,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
private CallContext context;
- @BeforeSuite(groups = {"slow"})
+ @BeforeSuite(groups = "slow")
public void setup() throws Exception {
notifier.initialize();
notifier.start();
@@ -103,7 +106,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
busService.getBus().start();
}
- @AfterClass(groups = {"slow"})
+ @AfterClass(groups = "slow")
public void tearDown() {
try {
((DefaultBusService) busService).stopBus();
@@ -113,7 +116,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
}
}
- @Test(groups = {"slow"}, enabled = true)
+ @Test(groups = "slow")
public void testDryRunInvoice() throws InvoiceApiException, AccountApiException {
final UUID accountId = UUID.randomUUID();
final UUID subscriptionId = UUID.randomUUID();
@@ -125,7 +128,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(accountId);
Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
- Mockito.when(account.getBillCycleDay()).thenReturn(30);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(30));
final Subscription subscription = Mockito.mock(Subscription.class);
Mockito.when(subscription.getId()).thenReturn(subscriptionId);
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/AccountJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJson.java
index 4af8944..736fba2 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountJson.java
@@ -20,12 +20,14 @@ import java.util.UUID;
import org.joda.time.DateTimeZone;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.catalog.api.Currency;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
public class AccountJson extends AccountJsonSimple {
// STEPH Missing city, locale, postalCode from https://home.ninginc.com:8443/display/REVINFRA/Killbill+1.0+APIs
@@ -35,7 +37,7 @@ public class AccountJson extends AccountJsonSimple {
private final String email;
- private final Integer billCycleDay;
+ private final BillCycleDayJson billCycleDayJson;
private final String currency;
@@ -55,13 +57,12 @@ public class AccountJson extends AccountJsonSimple {
private final String phone;
-
public AccountJson(final Account account) {
super(account.getId().toString(), account.getExternalKey());
this.name = account.getName();
this.length = account.getFirstNameLength();
this.email = account.getEmail();
- this.billCycleDay = account.getBillCycleDay();
+ this.billCycleDayJson = new BillCycleDayJson(account.getBillCycleDay());
this.currency = account.getCurrency() != null ? account.getCurrency().toString() : null;
this.paymentMethodId = account.getPaymentMethodId() != null ? account.getPaymentMethodId().toString() : null;
this.timeZone = account.getTimeZone().toString();
@@ -157,8 +158,22 @@ public class AccountJson extends AccountJsonSimple {
}
@Override
- public Integer getBillCycleDay() {
- return billCycleDay;
+ public BillCycleDay getBillCycleDay() {
+ if (billCycleDayJson == null) {
+ return null;
+ }
+
+ return new BillCycleDay() {
+ @Override
+ public int getDayOfMonthUTC() {
+ return billCycleDayJson.getDayOfMonthUTC();
+ }
+
+ @Override
+ public int getDayOfMonthLocal() {
+ return billCycleDayJson.getDayOfMonthLocal();
+ }
+ };
}
@Override
@@ -180,7 +195,7 @@ public class AccountJson extends AccountJsonSimple {
this.name = null;
this.length = null;
this.email = null;
- this.billCycleDay = null;
+ this.billCycleDayJson = null;
this.currency = null;
this.paymentMethodId = null;
this.timeZone = null;
@@ -198,7 +213,7 @@ public class AccountJson extends AccountJsonSimple {
@JsonProperty("firstNameLength") final Integer length,
@JsonProperty("externalKey") final String externalKey,
@JsonProperty("email") final String email,
- @JsonProperty("billingDay") final Integer billCycleDay,
+ @JsonProperty("billCycleDay") final BillCycleDayJson billCycleDay,
@JsonProperty("currency") final String currency,
@JsonProperty("paymentMethodId") final String paymentMethodId,
@JsonProperty("timezone") final String timeZone,
@@ -212,7 +227,7 @@ public class AccountJson extends AccountJsonSimple {
this.name = name;
this.length = length;
this.email = email;
- this.billCycleDay = billCycleDay;
+ this.billCycleDayJson = billCycleDay;
this.currency = currency;
this.paymentMethodId = paymentMethodId;
this.timeZone = timeZone;
@@ -236,8 +251,8 @@ public class AccountJson extends AccountJsonSimple {
return email;
}
- public Integer getBillCycleDay() {
- return billCycleDay;
+ public BillCycleDayJson getBillCycleDay() {
+ return billCycleDayJson;
}
public String getCurrency() {
@@ -281,28 +296,28 @@ public class AccountJson extends AccountJsonSimple {
final int prime = 31;
int result = 1;
result = prime * result
- + ((accountId == null) ? 0 : accountId.hashCode());
+ + ((accountId == null) ? 0 : accountId.hashCode());
result = prime * result
- + ((address1 == null) ? 0 : address1.hashCode());
+ + ((address1 == null) ? 0 : address1.hashCode());
result = prime * result
- + ((address2 == null) ? 0 : address2.hashCode());
+ + ((address2 == null) ? 0 : address2.hashCode());
result = prime * result
- + ((billCycleDay == null) ? 0 : billCycleDay.hashCode());
+ + ((billCycleDayJson == null) ? 0 : billCycleDayJson.hashCode());
result = prime * result + ((company == null) ? 0 : company.hashCode());
result = prime * result + ((country == null) ? 0 : country.hashCode());
result = prime * result
- + ((currency == null) ? 0 : currency.hashCode());
+ + ((currency == null) ? 0 : currency.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result
- + ((externalKey == null) ? 0 : externalKey.hashCode());
+ + ((externalKey == null) ? 0 : externalKey.hashCode());
result = prime * result + ((length == null) ? 0 : length.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result
- + ((paymentMethodId == null) ? 0 : paymentMethodId.hashCode());
+ + ((paymentMethodId == null) ? 0 : paymentMethodId.hashCode());
result = prime * result + ((phone == null) ? 0 : phone.hashCode());
result = prime * result + ((state == null) ? 0 : state.hashCode());
result = prime * result
- + ((timeZone == null) ? 0 : timeZone.hashCode());
+ + ((timeZone == null) ? 0 : timeZone.hashCode());
return result;
}
@@ -332,11 +347,11 @@ public class AccountJson extends AccountJsonSimple {
} else if (!address2.equals(other.address2)) {
return false;
}
- if (billCycleDay == null) {
- if (other.billCycleDay != null) {
+ if (billCycleDayJson == null) {
+ if (other.billCycleDayJson != null) {
return false;
}
- } else if (!billCycleDay.equals(other.billCycleDay)) {
+ } else if (!billCycleDayJson.equals(other.billCycleDayJson)) {
return false;
}
if (company == null) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BillCycleDayJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BillCycleDayJson.java
new file mode 100644
index 0000000..5e83249
--- /dev/null
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BillCycleDayJson.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.jaxrs.json;
+
+import com.ning.billing.account.api.BillCycleDay;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class BillCycleDayJson {
+
+ private final int dayOfMonthLocal;
+ private final int dayOfMonthUTC;
+
+ @JsonCreator
+ public BillCycleDayJson(@JsonProperty("dayOfMonthLocal") final int dayOfMonthLocal,
+ @JsonProperty("dayOfMonthUTC") final int dayOfMonthUTC) {
+ this.dayOfMonthLocal = dayOfMonthLocal;
+ this.dayOfMonthUTC = dayOfMonthUTC;
+ }
+
+ public BillCycleDayJson(final BillCycleDay billCycleDay) {
+ this(billCycleDay.getDayOfMonthLocal(), billCycleDay.getDayOfMonthUTC());
+ }
+
+ public int getDayOfMonthUTC() {
+ return dayOfMonthUTC;
+ }
+
+ public int getDayOfMonthLocal() {
+ return dayOfMonthLocal;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("{\"dayOfMonthLocal\":").append(dayOfMonthLocal);
+ sb.append(",\"dayOfMonthUTC\":").append(dayOfMonthUTC);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final BillCycleDayJson that = (BillCycleDayJson) o;
+
+ if (dayOfMonthLocal != that.dayOfMonthLocal) return false;
+ if (dayOfMonthUTC != that.dayOfMonthUTC) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = dayOfMonthLocal;
+ result = 31 * result + dayOfMonthUTC;
+ return result;
+ }
+}
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 4d016a8..f5711d7 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
@@ -27,6 +27,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.UUID;
+import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,7 +70,8 @@ public class CreditResource implements JaxrsResource {
public Response getCredit(@PathParam("creditId") final String creditId) {
try {
final InvoiceItem credit = invoiceUserApi.getCreditById(UUID.fromString(creditId));
- 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) {
if (e.getCode() == ErrorCode.INVOICE_NO_SUCH_CREDIT.getCode()) {
@@ -77,6 +79,9 @@ public class CreditResource implements JaxrsResource {
} else {
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).type(MediaType.TEXT_PLAIN_TYPE).build();
}
+ } catch (AccountApiException e) {
+ log.warn(String.format("Failed to locate account for credit id %s", creditId), e);
+ return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).type(MediaType.TEXT_PLAIN_TYPE).build();
}
}
@@ -94,8 +99,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/TestAccountJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestAccountJson.java
index f06c4ea..d787fc8 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestAccountJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestAccountJson.java
@@ -22,13 +22,16 @@ import org.joda.time.DateTimeZone;
import org.testng.Assert;
import org.testng.annotations.Test;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.ning.billing.account.api.Account;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.jaxrs.JaxrsTestSuite;
import com.ning.billing.mock.MockAccountBuilder;
+import com.ning.billing.mock.api.MockBillCycleDay;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
public class TestAccountJson extends JaxrsTestSuite {
+
private static final ObjectMapper mapper = new ObjectMapper();
@Test(groups = "fast")
@@ -38,7 +41,7 @@ public class TestAccountJson extends JaxrsTestSuite {
final Integer length = 12;
final String externalKey = UUID.randomUUID().toString();
final String email = UUID.randomUUID().toString();
- final Integer billCycleDay = 6;
+ final BillCycleDayJson billCycleDay = new BillCycleDayJson(6, 6);
final String currency = UUID.randomUUID().toString();
final String paymentMethodId = UUID.randomUUID().toString();
final String timeZone = UUID.randomUUID().toString();
@@ -71,13 +74,13 @@ public class TestAccountJson extends JaxrsTestSuite {
final String asJson = mapper.writeValueAsString(accountJson);
Assert.assertEquals(asJson, "{\"accountId\":\"" + accountJson.getAccountId() + "\",\"name\":\"" + accountJson.getName() + "\"," +
- "\"externalKey\":\"" + accountJson.getExternalKey() + "\",\"email\":\"" + accountJson.getEmail() + "\"," +
- "\"currency\":\"" + accountJson.getCurrency() + "\",\"paymentMethodId\":\"" + accountJson.getPaymentMethodId() + "\"," +
- "\"address1\":\"" + accountJson.getAddress1() + "\",\"address2\":\"" + accountJson.getAddress2() + "\"," +
- "\"company\":\"" + accountJson.getCompany() + "\",\"state\":\"" + accountJson.getState() + "\"," +
- "\"country\":\"" + accountJson.getCountry() + "\",\"phone\":\"" + accountJson.getPhone() + "\"," +
- "\"length\":" + accountJson.getLength() + ",\"billCycleDay\":" + accountJson.getBillCycleDay() + "," +
- "\"timeZone\":\"" + accountJson.getTimeZone() + "\"}");
+ "\"externalKey\":\"" + accountJson.getExternalKey() + "\",\"email\":\"" + accountJson.getEmail() + "\"," +
+ "\"billCycleDay\":" + accountJson.getBillCycleDay() + "," +
+ "\"currency\":\"" + accountJson.getCurrency() + "\",\"paymentMethodId\":\"" + accountJson.getPaymentMethodId() + "\"," +
+ "\"address1\":\"" + accountJson.getAddress1() + "\",\"address2\":\"" + accountJson.getAddress2() + "\"," +
+ "\"company\":\"" + accountJson.getCompany() + "\",\"state\":\"" + accountJson.getState() + "\"," +
+ "\"country\":\"" + accountJson.getCountry() + "\",\"phone\":\"" + accountJson.getPhone() + "\"," +
+ "\"length\":" + accountJson.getLength() + ",\"timeZone\":\"" + accountJson.getTimeZone() + "\"}");
final AccountJson fromJson = mapper.readValue(asJson, AccountJson.class);
Assert.assertEquals(fromJson, accountJson);
@@ -88,7 +91,8 @@ public class TestAccountJson extends JaxrsTestSuite {
final MockAccountBuilder accountBuilder = new MockAccountBuilder();
accountBuilder.address1(UUID.randomUUID().toString());
accountBuilder.address2(UUID.randomUUID().toString());
- accountBuilder.billingCycleDay(4);
+ final int bcd = 4;
+ accountBuilder.billingCycleDay(new MockBillCycleDay(bcd));
accountBuilder.city(UUID.randomUUID().toString());
accountBuilder.companyName(UUID.randomUUID().toString());
accountBuilder.country(UUID.randomUUID().toString());
@@ -110,7 +114,7 @@ public class TestAccountJson extends JaxrsTestSuite {
final AccountJson accountJson = new AccountJson(account);
Assert.assertEquals(accountJson.getAddress1(), account.getAddress1());
Assert.assertEquals(accountJson.getAddress2(), account.getAddress2());
- Assert.assertEquals((int) accountJson.getBillCycleDay(), (int) account.getBillCycleDay());
+ Assert.assertEquals(accountJson.getBillCycleDay().toString(), "{\"dayOfMonthLocal\":" + bcd + ",\"dayOfMonthUTC\":" + bcd + "}");
Assert.assertEquals(accountJson.getCountry(), account.getCountry());
Assert.assertEquals(accountJson.getCompany(), account.getCompanyName());
Assert.assertEquals(accountJson.getCurrency(), account.getCurrency().toString());
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/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java
index 40c713d..3f3bf50 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingAccount.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import org.joda.time.DateTimeZone;
import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.account.api.MutableAccountData;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.junction.api.BlockingApi;
@@ -62,7 +63,7 @@ public class BlockingAccount implements Account {
}
@Override
- public Integer getBillCycleDay() {
+ public BillCycleDay getBillCycleDay() {
return account.getBillCycleDay();
}
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
index 2538869..baf703f 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
@@ -17,13 +17,14 @@
package com.ning.billing.junction.plumbing.billing;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
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;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.catalog.api.BillingAlignment;
import com.ning.billing.catalog.api.Catalog;
import com.ning.billing.catalog.api.CatalogApiException;
@@ -39,7 +40,10 @@ import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
import com.ning.billing.entitlement.api.user.Subscription;
import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.google.inject.Inject;
+
public class BillCycleDayCalculator {
+
private static final Logger log = LoggerFactory.getLogger(BillCycleDayCalculator.class);
private final CatalogService catalogService;
@@ -52,7 +56,7 @@ public class BillCycleDayCalculator {
this.entitlementApi = entitlementApi;
}
- protected int calculateBcd(final SubscriptionBundle bundle, final Subscription subscription, final EffectiveSubscriptionEvent transition, final Account account)
+ protected BillCycleDay calculateBcd(final SubscriptionBundle bundle, final Subscription subscription, final EffectiveSubscriptionEvent transition, final Account account)
throws CatalogApiException, AccountApiException, EntitlementUserApiException {
final Catalog catalog = catalogService.getFullCatalog();
@@ -76,11 +80,11 @@ public class BillCycleDayCalculator {
phase.getPhaseType()),
transition.getRequestedTransitionTime());
- int result = -1;
+ BillCycleDay result = null;
switch (alignment) {
case ACCOUNT:
result = account.getBillCycleDay();
- if (result == 0) {
+ if (result.getDayOfMonthUTC() == 0) {
result = calculateBcdFromSubscription(subscription, plan, account);
}
break;
@@ -99,22 +103,40 @@ public class BillCycleDayCalculator {
break;
}
- if (result == -1) {
+ if (result == null) {
throw new CatalogApiException(ErrorCode.CAT_INVALID_BILLING_ALIGNMENT, alignment.toString());
}
return result;
}
- private int calculateBcdFromSubscription(final Subscription subscription, final Plan plan, final Account account) throws AccountApiException {
+ private BillCycleDay calculateBcdFromSubscription(final Subscription subscription, final Plan plan, final Account account) throws AccountApiException {
final DateTime date = plan.dateOfFirstRecurringNonZeroCharge(subscription.getStartDate());
- // There are really two kind of billCycleDay:
+ // There are really two kinds of billCycleDay:
// - a System billingCycleDay which should be computed from UTC time (in order to get the correct notification time at
// the end of each service period)
// - a User billingCycleDay which should align with the account timezone
- //
- // TODO At this point we only compute the system one; should we need two fields in the account table
- //return date.toDateTime(account.getTimeZone()).getDayOfMonth();
- return date.getDayOfMonth();
+ return new CalculatedBillCycleDay(account.getTimeZone(), date);
+ }
+
+ private static final class CalculatedBillCycleDay implements BillCycleDay {
+
+ private final DateTime bcdTimeUTC;
+ private final DateTimeZone accountTimeZone;
+
+ private CalculatedBillCycleDay(final DateTimeZone accountTimeZone, final DateTime bcdTimeUTC) {
+ this.accountTimeZone = accountTimeZone;
+ this.bcdTimeUTC = bcdTimeUTC;
+ }
+
+ @Override
+ public int getDayOfMonthUTC() {
+ return bcdTimeUTC.getDayOfMonth();
+ }
+
+ @Override
+ public int getDayOfMonthLocal() {
+ return bcdTimeUTC.toDateTime(accountTimeZone).getDayOfMonth();
+ }
}
}
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java
index 2a2c3f3..3c1cf31 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingApi.java
@@ -29,6 +29,7 @@ import com.ning.billing.ErrorCode;
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.account.api.BillCycleDay;
import com.ning.billing.account.api.MutableAccountData;
import com.ning.billing.catalog.api.CatalogApiException;
import com.ning.billing.catalog.api.CatalogService;
@@ -137,15 +138,15 @@ public class DefaultBillingApi implements BillingApi {
for (final Subscription subscription : subscriptions) {
for (final EffectiveSubscriptionEvent transition : subscription.getBillingTransitions()) {
try {
- final int bcd = bcdCalculator.calculateBcd(bundle, subscription, transition, account);
+ final BillCycleDay bcd = bcdCalculator.calculateBcd(bundle, subscription, transition, account);
- if (account.getBillCycleDay() == 0) {
+ if (account.getBillCycleDay().getDayOfMonthUTC() == 0) {
final MutableAccountData modifiedData = account.toMutableAccountData();
modifiedData.setBillCycleDay(bcd);
accountApi.updateAccount(account.getExternalKey(), modifiedData, context);
}
- final BillingEvent event = new DefaultBillingEvent(account, transition, subscription, bcd, account.getCurrency(), catalogService.getFullCatalog());
+ final BillingEvent event = new DefaultBillingEvent(account, transition, subscription, bcd.getDayOfMonthUTC(), account.getCurrency(), catalogService.getFullCatalog());
result.add(event);
} catch (CatalogApiException e) {
log.error("Failing to identify catalog components while creating BillingEvent from transition: " +
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
index 5364b18..d35f4fe 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
@@ -51,10 +51,10 @@ public class DefaultBillingEvent implements BillingEvent {
private final Long totalOrdering;
private final DateTimeZone timeZone;
- public DefaultBillingEvent(final Account account, final EffectiveSubscriptionEvent transition, final Subscription subscription, final int billCycleDay, final Currency currency, final Catalog catalog) throws CatalogApiException {
+ public DefaultBillingEvent(final Account account, final EffectiveSubscriptionEvent transition, final Subscription subscription, final int billCycleDayUTC, final Currency currency, final Catalog catalog) throws CatalogApiException {
this.account = account;
- this.billCycleDay = billCycleDay;
+ this.billCycleDay = billCycleDayUTC;
this.subscription = subscription;
effectiveDate = transition.getEffectiveTransitionTime();
final String planPhaseName = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
diff --git a/junction/src/main/resources/com/ning/billing/junction/ddl.sql b/junction/src/main/resources/com/ning/billing/junction/ddl.sql
index 92b3437..d7c595b 100644
--- a/junction/src/main/resources/com/ning/billing/junction/ddl.sql
+++ b/junction/src/main/resources/com/ning/billing/junction/ddl.sql
@@ -10,6 +10,8 @@ CREATE TABLE blocking_states (
block_entitlement bool NOT NULL,
block_billing bool NOT NULL,
created_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE INDEX blocking_states_id ON blocking_states(id);
\ No newline at end of file
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
index ad6522c..8a290d9 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
@@ -70,6 +70,7 @@ import com.ning.billing.junction.api.DefaultBlockingState;
import com.ning.billing.lifecycle.KillbillService.ServiceException;
import com.ning.billing.mock.MockEffectiveSubscriptionEvent;
import com.ning.billing.mock.MockSubscription;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.billing.util.api.TagUserApi;
import com.ning.billing.util.callcontext.CallContextFactory;
import com.ning.billing.util.callcontext.DefaultCallContextFactory;
@@ -217,7 +218,7 @@ public class TestBillingApi extends JunctionTestSuite {
final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(32);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(32));
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
@@ -247,7 +248,7 @@ public class TestBillingApi extends JunctionTestSuite {
effectiveSubscriptionTransitions.add(t);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(1);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(1));
Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
@@ -283,7 +284,7 @@ public class TestBillingApi extends JunctionTestSuite {
final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(32);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(32));
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
@@ -317,7 +318,7 @@ public class TestBillingApi extends JunctionTestSuite {
effectiveSubscriptionTransitions.add(t);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(1);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(1));
Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
@@ -357,7 +358,7 @@ public class TestBillingApi extends JunctionTestSuite {
final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(32);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(32));
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
Mockito.when(accountApi.getAccountById(Mockito.<UUID>any())).thenReturn(account);
@@ -429,7 +430,7 @@ public class TestBillingApi extends JunctionTestSuite {
final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(32);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(32));
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
Mockito.when(accountApi.getAccountById(Mockito.<UUID>any())).thenReturn(account);
@@ -471,7 +472,7 @@ public class TestBillingApi extends JunctionTestSuite {
final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
final Account account = Mockito.mock(Account.class);
- Mockito.when(account.getBillCycleDay()).thenReturn(32);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(32));
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
Mockito.when(account.getId()).thenReturn(UUID.randomUUID());
Mockito.when(accountApi.getAccountById(Mockito.<UUID>any())).thenReturn(account);
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 b964bfd..46f2cfd 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
@@ -406,7 +406,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);
@@ -418,7 +418,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/main/resources/com/ning/billing/payment/ddl.sql b/payment/src/main/resources/com/ning/billing/payment/ddl.sql
index a652b58..6d184f5 100644
--- a/payment/src/main/resources/com/ning/billing/payment/ddl.sql
+++ b/payment/src/main/resources/com/ning/billing/payment/ddl.sql
@@ -16,6 +16,8 @@ CREATE TABLE payments (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE UNIQUE INDEX payments_id ON payments(id);
@@ -39,6 +41,8 @@ CREATE TABLE payment_history (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (history_record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE INDEX payment_history_record_id ON payment_history(record_id);
@@ -56,6 +60,8 @@ CREATE TABLE payment_attempts (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE UNIQUE INDEX payment_attempts_id ON payment_attempts(id);
@@ -75,6 +81,8 @@ CREATE TABLE payment_attempt_history (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (history_record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE INDEX payment_attempt_history_record_id ON payment_attempt_history(record_id);
@@ -92,6 +100,8 @@ CREATE TABLE payment_methods (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE UNIQUE INDEX payment_methods_id ON payment_methods(id);
@@ -111,6 +121,8 @@ CREATE TABLE payment_method_history (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (history_record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE UNIQUE INDEX payment_method_history_record_id ON payment_method_history(record_id);
@@ -129,6 +141,8 @@ CREATE TABLE refunds (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE UNIQUE INDEX refunds_id ON refunds(id);
@@ -150,6 +164,8 @@ CREATE TABLE refund_history (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY (history_record_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE INDEX refund_history_record_id ON refund_history(record_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..af509ab 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;
@@ -29,6 +30,7 @@ import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceCreationEvent;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.billing.payment.api.PaymentApi;
import com.ning.billing.payment.api.PaymentMethodPlugin;
import com.ning.billing.payment.glue.PaymentTestModuleWithMocks;
@@ -39,6 +41,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 +49,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) {
@@ -101,7 +107,7 @@ public class TestHelper {
Mockito.when(account.getPhone()).thenReturn("123-456-7890");
Mockito.when(account.getEmail()).thenReturn(email);
Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
- Mockito.when(account.getBillCycleDay()).thenReturn(1);
+ Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(1));
Mockito.when(account.isMigrated()).thenReturn(false);
Mockito.when(account.isNotifiedForInvoices()).thenReturn(false);
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/TestAccount.java b/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java
index b3f30ff..791da29 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java
@@ -40,6 +40,7 @@ import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.ProductCategory;
import com.ning.billing.jaxrs.json.AccountJson;
import com.ning.billing.jaxrs.json.AccountTimelineJson;
+import com.ning.billing.jaxrs.json.BillCycleDayJson;
import com.ning.billing.jaxrs.json.BundleJsonNoSubscriptions;
import com.ning.billing.jaxrs.json.CustomFieldJson;
import com.ning.billing.jaxrs.json.PaymentJsonSimple;
@@ -48,6 +49,7 @@ import com.ning.billing.jaxrs.json.RefundJson;
import com.ning.billing.jaxrs.json.SubscriptionJsonNoEvents;
import com.ning.billing.jaxrs.json.TagDefinitionJson;
import com.ning.billing.jaxrs.resources.JaxrsResource;
+import com.ning.billing.mock.api.MockBillCycleDay;
import com.ning.http.client.Response;
@@ -71,7 +73,8 @@ public class TestAccount extends TestJaxrsBase {
// Update Account
final AccountJson newInput = new AccountJson(objFromJson.getAccountId(),
- "zozo", 4, objFromJson.getExternalKey(), "rr@google.com", 18, "EUR", null, "UTC", "bl1", "bh2", "", "ca", "usa", "415-255-2991");
+ "zozo", 4, objFromJson.getExternalKey(), "rr@google.com", new BillCycleDayJson(18, 18),
+ "EUR", null, "UTC", "bl1", "bh2", "", "ca", "usa", "415-255-2991");
baseJson = mapper.writeValueAsString(newInput);
final String uri = JaxrsResource.ACCOUNTS_PATH + "/" + objFromJson.getAccountId();
response = doPut(uri, baseJson, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
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/TestJaxrsBase.java b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
index b862741..9153cd5 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
@@ -47,6 +47,7 @@ import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.google.inject.Module;
import com.ning.billing.KillbillTestSuiteWithEmbeddedDB;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.account.glue.AccountModule;
import com.ning.billing.analytics.setup.AnalyticsModule;
import com.ning.billing.api.TestApiListener;
@@ -63,6 +64,7 @@ import com.ning.billing.invoice.api.InvoiceNotifier;
import com.ning.billing.invoice.glue.DefaultInvoiceModule;
import com.ning.billing.invoice.notification.NullInvoiceNotifier;
import com.ning.billing.jaxrs.json.AccountJson;
+import com.ning.billing.jaxrs.json.BillCycleDayJson;
import com.ning.billing.jaxrs.json.BundleJsonNoSubscriptions;
import com.ning.billing.jaxrs.json.PaymentMethodJson;
import com.ning.billing.jaxrs.json.PaymentMethodJson.PaymentMethodPluginDetailJson;
@@ -512,7 +514,7 @@ public class TestJaxrsBase extends ServerTestSuiteWithEmbeddedDB {
final String accountId = UUID.randomUUID().toString();
final int length = 4;
// Let junction figure it out
- final int billCycleDay = 0;
+ final BillCycleDayJson billCycleDay = null;
final String currency = "USD";
final String timeZone = "UTC";
final String address1 = "12 rue des ecoles";
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/main/resources/com/ning/billing/util/ddl.sql b/util/src/main/resources/com/ning/billing/util/ddl.sql
index acb8d69..b7a00f9 100644
--- a/util/src/main/resources/com/ning/billing/util/ddl.sql
+++ b/util/src/main/resources/com/ning/billing/util/ddl.sql
@@ -10,6 +10,8 @@ CREATE TABLE custom_fields (
created_date datetime NOT NULL,
updated_by varchar(50) DEFAULT NULL,
updated_date datetime DEFAULT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX custom_fields_id ON custom_fields(id);
@@ -28,12 +30,13 @@ CREATE TABLE custom_field_history (
updated_by varchar(50) NOT NULL,
date datetime NOT NULL,
change_type char(6) NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(history_record_id)
) ENGINE=innodb;
CREATE INDEX custom_field_history_record_id ON custom_field_history(record_id);
CREATE INDEX custom_field_history_object_id_object_type ON custom_fields(object_id, object_type);
-DROP TABLE IF EXISTS tag_descriptions;
DROP TABLE IF EXISTS tag_definitions;
CREATE TABLE tag_definitions (
record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -44,6 +47,7 @@ CREATE TABLE tag_definitions (
created_date datetime NOT NULL,
updated_by varchar(50) NOT NULL,
updated_date datetime NOT NULL,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX tag_definitions_id ON tag_definitions(id);
@@ -60,6 +64,7 @@ CREATE TABLE tag_definition_history (
change_type char(6) NOT NULL,
updated_by varchar(50) NOT NULL,
date datetime NOT NULL,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(history_record_id)
) ENGINE=innodb;
CREATE INDEX tag_definition_history_id ON tag_definition_history(id);
@@ -75,6 +80,8 @@ CREATE TABLE tags (
object_type varchar(30) NOT NULL,
created_by varchar(50) NOT NULL,
created_date datetime NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE = innodb;
CREATE UNIQUE INDEX tags_id ON tags(id);
@@ -92,6 +99,8 @@ CREATE TABLE tag_history (
updated_by varchar(50) NOT NULL,
date datetime NOT NULL,
change_type char(6) NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(history_record_id)
) ENGINE = innodb;
CREATE INDEX tag_history_record_id ON tag_history(record_id);
@@ -104,13 +113,15 @@ CREATE TABLE notifications (
created_date datetime NOT NULL,
class_name varchar(256) NOT NULL,
account_id char(36),
- notification_key varchar(2048) NOT NULL,
- creating_owner char(50) NOT NULL,
+ notification_key varchar(2048) NOT NULL,
+ creating_owner char(50) NOT NULL,
effective_date datetime NOT NULL,
queue_name char(64) NOT NULL,
processing_owner char(50) DEFAULT NULL,
processing_available_date datetime DEFAULT NULL,
processing_state varchar(14) DEFAULT 'AVAILABLE',
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE UNIQUE INDEX notifications_id ON notifications(id);
@@ -124,6 +135,8 @@ CREATE TABLE claimed_notifications (
owner_id varchar(64) NOT NULL,
claimed_date datetime NOT NULL,
notification_id char(36) NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
@@ -138,6 +151,8 @@ CREATE TABLE audit_log (
reason_code varchar(20) DEFAULT NULL,
comments varchar(255) DEFAULT NULL,
user_token char(36),
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(id)
) ENGINE=innodb;
CREATE INDEX audit_log_fetch_record ON audit_log(table_name, record_id);
@@ -153,6 +168,8 @@ CREATE TABLE bus_events (
processing_owner char(50) DEFAULT NULL,
processing_available_date datetime DEFAULT NULL,
processing_state varchar(14) DEFAULT 'AVAILABLE',
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
) ENGINE=innodb;
CREATE INDEX `idx_bus_where` ON bus_events (`processing_state`,`processing_owner`,`creating_owner`,`processing_available_date`);
@@ -163,5 +180,7 @@ CREATE TABLE claimed_bus_events (
owner_id varchar(64) NOT NULL,
claimed_date datetime NOT NULL,
bus_event_id char(36) NOT NULL,
+ account_record_id int(11) unsigned default null,
+ tenant_record_id int(11) unsigned default null,
PRIMARY KEY(record_id)
-) ENGINE=innodb;
\ No newline at end of file
+) ENGINE=innodb;
diff --git a/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java b/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java
index a1b64f4..6cb1852 100644
--- a/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java
+++ b/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java
@@ -108,10 +108,14 @@ public class MysqlTestingHelper {
throw new IllegalStateException("MySQL did not start.");
} else {
log.info("MySQL running on port " + mysqldResource.getPort());
- log.info(String.format("To connect to it: mysql -u%s -p%s -P%s -S%s/mysql.sock %s", USERNAME, PASSWORD, port, dataDir, DB_NAME));
+ log.info("To connect to it: " + getConnectionString());
}
}
+ public String getConnectionString() {
+ return String.format("mysql -u%s -p%s -P%s -S%s/mysql.sock %s", USERNAME, PASSWORD, port, dataDir, DB_NAME);
+ }
+
public void cleanupTable(final String table) {
if (!isUsingLocalInstance() && (mysqldResource == null || !mysqldResource.isRunning())) {
diff --git a/util/src/test/java/com/ning/billing/KillbillTestSuite.java b/util/src/test/java/com/ning/billing/KillbillTestSuite.java
index 0d8edb2..9f6d924 100644
--- a/util/src/test/java/com/ning/billing/KillbillTestSuite.java
+++ b/util/src/test/java/com/ning/billing/KillbillTestSuite.java
@@ -25,8 +25,11 @@ import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
public class KillbillTestSuite {
+
// Use the simple name here to save screen real estate
- private static final Logger log = LoggerFactory.getLogger(KillbillTestSuite.class.getSimpleName());
+ protected static final Logger log = LoggerFactory.getLogger(KillbillTestSuite.class.getSimpleName());
+
+ private boolean hasFailed = false;
@BeforeMethod(alwaysRun = true)
public void startTestSuite(final Method method) throws Exception {
@@ -39,7 +42,15 @@ public class KillbillTestSuite {
public void endTestSuite(final Method method, final ITestResult result) throws Exception {
log.info("***************************************************************************************************");
log.info("*** Ending test {}:{} {} ({} s.)", new Object[]{method.getDeclaringClass().getName(), method.getName(),
- result.isSuccess() ? "SUCCESS" : "!!! FAILURE !!!", (result.getEndMillis() - result.getStartMillis()) / 1000});
+ result.isSuccess() ? "SUCCESS" : "!!! FAILURE !!!",
+ (result.getEndMillis() - result.getStartMillis()) / 1000});
log.info("***************************************************************************************************");
+ if (!hasFailed && !result.isSuccess()) {
+ hasFailed = true;
+ }
+ }
+
+ public boolean hasFailed() {
+ return hasFailed;
}
}
diff --git a/util/src/test/java/com/ning/billing/KillbillTestSuiteWithEmbeddedDB.java b/util/src/test/java/com/ning/billing/KillbillTestSuiteWithEmbeddedDB.java
index 16eada2..9b409d8 100644
--- a/util/src/test/java/com/ning/billing/KillbillTestSuiteWithEmbeddedDB.java
+++ b/util/src/test/java/com/ning/billing/KillbillTestSuiteWithEmbeddedDB.java
@@ -50,6 +50,14 @@ public class KillbillTestSuiteWithEmbeddedDB extends KillbillTestSuite {
@AfterSuite(groups = "slow")
public void shutdownMysqlAfterTestSuite() throws IOException, ClassNotFoundException, SQLException, URISyntaxException {
+ if (hasFailed()) {
+ log.error("*************************************************************************************************");
+ log.error("*** TESTS HAVE FAILED - LEAVING MySQL RUNNING FOR DEBUGGING - MAKE SURE TO KILL IT ONCE DONE ****");
+ log.error(helper.getConnectionString());
+ log.error("*************************************************************************************************");
+ return;
+ }
+
try {
helper.stopMysql();
} catch (Exception ignored) {
diff --git a/util/src/test/java/com/ning/billing/mock/api/MockAccountUserApi.java b/util/src/test/java/com/ning/billing/mock/api/MockAccountUserApi.java
index 0d80e4e..53d0596 100644
--- a/util/src/test/java/com/ning/billing/mock/api/MockAccountUserApi.java
+++ b/util/src/test/java/com/ning/billing/mock/api/MockAccountUserApi.java
@@ -28,6 +28,7 @@ import com.ning.billing.account.api.AccountApiException;
import com.ning.billing.account.api.AccountData;
import com.ning.billing.account.api.AccountEmail;
import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.account.api.MigrationAccountData;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.mock.MockAccountBuilder;
@@ -42,7 +43,7 @@ public class MockAccountUserApi implements AccountUserApi {
final String name,
final int firstNameLength,
final Currency currency,
- final int billCycleDay,
+ final BillCycleDay billCycleDay,
final UUID paymentMethodId,
final DateTimeZone timeZone,
final String locale,
diff --git a/util/src/test/java/com/ning/billing/mock/api/MockBillCycleDay.java b/util/src/test/java/com/ning/billing/mock/api/MockBillCycleDay.java
new file mode 100644
index 0000000..c5167ee
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/mock/api/MockBillCycleDay.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.mock.api;
+
+import com.ning.billing.account.api.BillCycleDay;
+
+public class MockBillCycleDay implements BillCycleDay {
+
+ private final int billCycleDay;
+
+ public MockBillCycleDay(final int billCycleDay) {
+ this.billCycleDay = billCycleDay;
+ }
+
+ @Override
+ public int getDayOfMonthUTC() {
+ return billCycleDay;
+ }
+
+ @Override
+ public int getDayOfMonthLocal() {
+ return billCycleDay;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("MockBillCycleDay");
+ sb.append("{billCycleDay=").append(billCycleDay);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final MockBillCycleDay that = (MockBillCycleDay) o;
+
+ if (billCycleDay != that.billCycleDay) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return billCycleDay;
+ }
+}
diff --git a/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java b/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
index 0985646..01d5257 100644
--- a/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
+++ b/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
@@ -22,6 +22,7 @@ import org.joda.time.DateTimeZone;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.BillCycleDay;
import com.ning.billing.account.api.MutableAccountData;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.junction.api.BlockingState;
@@ -33,7 +34,7 @@ public class MockAccountBuilder {
private String name = "";
private int firstNameLength;
private Currency currency = Currency.USD;
- private int billingCycleDay;
+ private BillCycleDay billingCycleDay;
private UUID paymentMethodId;
private DateTimeZone timeZone = DateTimeZone.UTC;
private String locale = "";
@@ -99,7 +100,7 @@ public class MockAccountBuilder {
return this;
}
- public MockAccountBuilder billingCycleDay(final int billingCycleDay) {
+ public MockAccountBuilder billingCycleDay(final BillCycleDay billingCycleDay) {
this.billingCycleDay = billingCycleDay;
return this;
}
@@ -200,7 +201,7 @@ public class MockAccountBuilder {
}
@Override
- public Integer getBillCycleDay() {
+ public BillCycleDay getBillCycleDay() {
return billingCycleDay;
}
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));
}