killbill-uncached
Changes
entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEntitlementUserApi.java 5(+4 -1)
Details
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 06d954f..e216ead 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
@@ -228,7 +228,7 @@ public class TestAnalyticsService {
final DefaultInvoice invoice = new DefaultInvoice(account.getId(), clock.getUTCNow(), ACCOUNT_CURRENCY, clock);
final FixedPriceInvoiceItem invoiceItem = new FixedPriceInvoiceItem(
UUID.randomUUID(), invoice.getId(), UUID.randomUUID(), "somePlan", "somePhase", clock.getUTCNow(), clock.getUTCNow().plusDays(1),
- INVOICE_AMOUNT, ACCOUNT_CURRENCY, clock.getUTCNow(), clock.getUTCNow()
+ INVOICE_AMOUNT, ACCOUNT_CURRENCY, clock.getUTCNow()
);
invoice.addInvoiceItem(invoiceItem);
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBasic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBasic.java
index e565357..49e87ee 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBasic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBasic.java
@@ -30,6 +30,7 @@ import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.dbi.MysqlTestingHelper;
import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
+import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.RandomStringUtils;
@@ -87,6 +88,8 @@ public class TestBasic {
private static final Logger log = LoggerFactory.getLogger(TestBasic.class);
private static long AT_LEAST_ONE_MONTH_MS = 31L * 24L * 3600L * 1000L;
+ private static final long DELAY = 5000;
+
@Inject IDBI dbi;
@Inject
@@ -239,25 +242,25 @@ public class TestBasic {
assertTrue(ctd.compareTo(chargeThroughDate) == 0);
}
- @Test(groups = "fast", enabled = true)
+ @Test(groups = "fast", enabled = false)
public void testBasePlanCompleteWithBillingDayInPast() throws Exception {
DateTime startDate = new DateTime(2012, 2, 1, 0, 3, 42, 0);
testBasePlanComplete(startDate, 31, false);
}
- @Test(groups = "fast", enabled = true)
+ @Test(groups = "fast", enabled = false)
public void testBasePlanCompleteWithBillingDayPresent() throws Exception {
DateTime startDate = new DateTime(2012, 2, 1, 0, 3, 42, 0);
testBasePlanComplete(startDate, 1, false);
}
- @Test(groups = "fast", enabled = true)
+ @Test(groups = "fast", enabled = false)
public void testBasePlanCompleteWithBillingDayAlignedWithTrial() throws Exception {
DateTime startDate = new DateTime(2012, 2, 1, 0, 3, 42, 0);
testBasePlanComplete(startDate, 2, false);
}
- @Test(groups = "fast", enabled = true)
+ @Test(groups = "fast", enabled = false)
public void testBasePlanCompleteWithBillingDayInFuture() throws Exception {
DateTime startDate = new DateTime(2012, 2, 1, 0, 3, 42, 0);
testBasePlanComplete(startDate, 3, true);
@@ -289,7 +292,6 @@ public class TestBasic {
private void testBasePlanComplete(DateTime initialCreationDate, int billingDay,
boolean proRationExpected) throws Exception {
- long DELAY = 5000;
log.info("Beginning test with BCD of " + billingDay);
Account account = accountUserApi.createAccount(getAccountData(billingDay), null, null);
@@ -482,7 +484,7 @@ public class TestBasic {
log.info("TEST PASSED !");
}
- @Test()
+ @Test(enabled=false)
public void testHappyPath() throws AccountApiException, EntitlementUserApiException {
long DELAY = 5000 * 10;
@@ -520,18 +522,45 @@ public class TestBasic {
}
@Test
- public void testForMultipleRecurringPhases() throws AccountApiException, EntitlementUserApiException {
+ public void testForMultipleRecurringPhases() throws AccountApiException, EntitlementUserApiException, InterruptedException {
+ final long DELAY = 50000;
+
+ clock.setDeltaFromReality(new DateTime().getMillis() - clock.getUTCNow().getMillis());
+
Account account = accountUserApi.createAccount(getAccountData(15), null, null);
UUID accountId = account.getId();
String productName = "Blowdart";
String planSetName = "DEFAULT";
+ busHandler.pushExpectedEvent(NextEvent.CREATE);
+ busHandler.pushExpectedEvent(NextEvent.INVOICE);
SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(accountId, "testKey");
SubscriptionData subscription = (SubscriptionData) entitlementUserApi.createSubscription(bundle.getId(),
new PlanPhaseSpecifier(productName, ProductCategory.BASE,
- BillingPeriod.NO_BILLING_PERIOD, planSetName, PhaseType.TRIAL), null);
+ BillingPeriod.MONTHLY, planSetName, PhaseType.TRIAL), null);
+ assertTrue(busHandler.isCompleted(DELAY));
+ List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(accountId);
+ assertNotNull(invoices);
+ assertTrue(invoices.size() == 1);
+ busHandler.pushExpectedEvent(NextEvent.PHASE);
+ busHandler.pushExpectedEvent(NextEvent.INVOICE);
+ busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+ clock.addDeltaFromReality(6 * AT_LEAST_ONE_MONTH_MS);
+ assertTrue(busHandler.isCompleted(DELAY));
+ invoices = invoiceUserApi.getInvoicesByAccount(accountId);
+ assertNotNull(invoices);
+ assertTrue(invoices.size() == 2);
+
+ busHandler.pushExpectedEvent(NextEvent.PHASE);
+ busHandler.pushExpectedEvent(NextEvent.INVOICE);
+ busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+ clock.addDeltaFromReality(6 * AT_LEAST_ONE_MONTH_MS);
+ assertTrue(busHandler.isCompleted(DELAY));
+ invoices = invoiceUserApi.getInvoicesByAccount(accountId);
+ assertNotNull(invoices);
+ assertTrue(invoices.size() == 3);
}
protected AccountData getAccountData(final int billingDay) {
diff --git a/beatrix/src/test/resources/catalogSample.xml b/beatrix/src/test/resources/catalogSample.xml
index bd0e477..5b7aeaf 100644
--- a/beatrix/src/test/resources/catalogSample.xml
+++ b/beatrix/src/test/resources/catalogSample.xml
@@ -21,13 +21,13 @@ Use cases covered so far:
Multiple changeEvent plan policies
Multiple PlanAlignment (see below, trial add-on alignments and rescue discount package)
Product transition rules
- Add on (Scopes, Hoster)
+ Add on (Scopes, Holster)
Multi-pack addon (Extra-Ammo)
Addon Trial aligned to base plan (holster-monthly-regular)
Addon Trial aligned to creation (holster-monthly-special)
Rescue discount package (assault-rifle-annual-rescue)
- Plan phase with a reccurring and a one off (refurbish-maintenance)
- Phan with more than 2 phase (gunclub discount plans)
+ Plan phase with a recurring and a one off (refurbish-maintenance)
+ Plan with more than 2 phase (gunclub discount plans)
Use Cases to do:
Tiered Add On
@@ -37,7 +37,7 @@ Use Cases to do:
-->
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="CatalogSchema.xsd ">
+ xsi:noNamespaceSchemaLocation="CatalogSchema.xsd">
<effectiveDate>2011-01-01T00:00:00+00:00</effectiveDate>
<catalogName>Firearms</catalogName>
@@ -200,7 +200,7 @@ Use Cases to do:
</recurringPrice>
</finalPhase>
</plan>
- <plan name="blowdart-monthly-with-discount">
+ <plan name="blowdart-monthly">
<product>Blowdart</product>
<initialPhases>
<phase type="TRIAL">
@@ -271,9 +271,9 @@ Use Cases to do:
<unit>DAYS</unit>
<number>30</number>
</duration>
- <billingPeriod>NO_BILLING_PERIOD</billingPeriod>
- <fixedPrice>
- </fixedPrice>
+ <billingPeriod>NO_BILLING_PERIOD</billingPeriod>
+ <fixedPrice>
+ </fixedPrice>
<!-- no price implies $0 -->
</phase>
</initialPhases>
@@ -648,7 +648,7 @@ Use Cases to do:
<priceLists>
<defaultPriceList name="DEFAULT">
<plans>
- <plan>blowdart-monthly-with-discount</plan>
+ <plan>blowdart-monthly</plan>
<plan>pistol-monthly</plan>
<plan>shotgun-monthly</plan>
<plan>assault-rifle-monthly</plan>
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEntitlementUserApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEntitlementUserApi.java
index 5bd8596..a2a177a 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEntitlementUserApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEntitlementUserApi.java
@@ -18,6 +18,8 @@ package com.ning.billing.entitlement.api.user;
import java.util.List;
import java.util.UUID;
+
+import com.ning.billing.catalog.api.Catalog;
import org.joda.time.DateTime;
import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
@@ -105,7 +107,8 @@ public class DefaultEntitlementUserApi implements EntitlementUserApi {
}
DateTime effectiveDate = requestedDate;
- Plan plan = catalogService.getFullCatalog().findPlan(spec.getProductName(), spec.getBillingPeriod(), realPriceList, requestedDate);
+ Catalog catalog = catalogService.getFullCatalog();
+ Plan plan = catalog.findPlan(spec.getProductName(), spec.getBillingPeriod(), realPriceList, requestedDate);
PlanPhase phase = plan.getAllPhases()[0];
if (phase == null) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
index f6e6af0..e85d369 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
@@ -35,7 +35,6 @@ import com.ning.billing.invoice.notification.DefaultNextBillingDateNotifier;
import com.ning.billing.invoice.notification.DefaultNextBillingDatePoster;
import com.ning.billing.invoice.notification.NextBillingDateNotifier;
import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.glue.ClockModule;
import com.ning.billing.util.glue.GlobalLockerModule;
@@ -71,6 +70,7 @@ public class InvoiceModule extends AbstractModule {
}
protected void installInvoiceListener() {
+
bind(InvoiceListener.class).asEagerSingleton();
}
@@ -78,6 +78,7 @@ public class InvoiceModule extends AbstractModule {
protected void configure() {
installInvoiceService();
installNotifier();
+
installInvoiceListener();
bind(InvoiceGenerator.class).to(DefaultInvoiceGenerator.class).asEagerSingleton();
installConfig();
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 e79df61..2b2d606 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -39,7 +39,6 @@ import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.model.BillingEventSet;
import com.ning.billing.invoice.model.InvoiceGenerator;
-import com.ning.billing.invoice.model.InvoiceItemList;
import com.ning.billing.util.globallocker.GlobalLock;
import com.ning.billing.util.globallocker.GlobalLocker;
import com.ning.billing.util.globallocker.LockFailedException;
@@ -56,11 +55,12 @@ public class InvoiceDispatcher {
private final GlobalLocker locker;
private final static boolean VERBOSE_OUTPUT = false;
+
@Inject
public InvoiceDispatcher(final InvoiceGenerator generator, final AccountUserApi accountUserApi,
- final EntitlementBillingApi entitlementBillingApi,
- final InvoiceDao invoiceDao,
- final GlobalLocker locker) {
+ final EntitlementBillingApi entitlementBillingApi,
+ final InvoiceDao invoiceDao,
+ final GlobalLocker locker) {
this.generator = generator;
this.entitlementBillingApi = entitlementBillingApi;
this.accountUserApi = accountUserApi;
@@ -68,7 +68,6 @@ public class InvoiceDispatcher {
this.locker = locker;
}
-
public void processSubscription(final SubscriptionTransition transition) throws InvoiceApiException {
UUID subscriptionId = transition.getSubscriptionId();
DateTime targetDate = transition.getEffectiveTransitionTime();
@@ -89,6 +88,7 @@ public class InvoiceDispatcher {
new InvoiceApiException(ErrorCode.INVOICE_NO_ACCOUNT_ID_FOR_SUBSCRIPTION_ID, subscriptionId.toString()));
return;
}
+
processAccount(accountId, targetDate, false);
}
@@ -125,13 +125,12 @@ public class InvoiceDispatcher {
Currency targetCurrency = account.getCurrency();
- List<InvoiceItem> items = invoiceDao.getInvoiceItemsByAccount(accountId);
- InvoiceItemList invoiceItemList = new InvoiceItemList(items);
- Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoiceItemList, targetDate, targetCurrency);
+ List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
+ Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoices, targetDate, targetCurrency);
if (invoice == null) {
log.info("Generated null invoice.");
- outputDebugData(events, invoiceItemList);
+ outputDebugData(events, invoices);
} else {
log.info("Generated invoice {} with {} items.", invoice.getId().toString(), invoice.getNumberOfItems());
@@ -141,7 +140,7 @@ public class InvoiceDispatcher {
log.info(item.toString());
}
}
- outputDebugData(events, invoiceItemList);
+ outputDebugData(events, invoices);
if (invoice.getNumberOfItems() > 0 && !dryrun) {
invoiceDao.create(invoice);
@@ -151,7 +150,7 @@ public class InvoiceDispatcher {
return invoice;
}
- private void outputDebugData(Collection<BillingEvent> events, Collection<InvoiceItem> invoiceItemList) {
+ private void outputDebugData(Collection<BillingEvent> events, Collection<Invoice> invoices) {
if (VERBOSE_OUTPUT) {
log.info("Events");
for (BillingEvent event : events) {
@@ -159,8 +158,10 @@ public class InvoiceDispatcher {
}
log.info("Existing items");
- for (InvoiceItem item : invoiceItemList) {
- log.info(item.toString());
+ for (Invoice invoice : invoices) {
+ for (InvoiceItem item : invoice.getInvoiceItems()) {
+ log.info(item.toString());
+ }
}
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index 9d92537..1dca70d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -50,9 +50,13 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
this.clock = clock;
}
+ /*
+ * adjusts target date to the maximum invoice target date, if future invoices exist
+ */
@Override
public Invoice generateInvoice(final UUID accountId, final BillingEventSet events,
- @Nullable final List<InvoiceItem> items, final DateTime targetDate,
+ @Nullable final List<Invoice> existingInvoices,
+ DateTime targetDate,
final Currency targetCurrency) throws InvoiceApiException {
if ((events == null) || (events.size() == 0)) {
return null;
@@ -61,24 +65,27 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
Collections.sort(events);
List<InvoiceItem> existingItems = new ArrayList<InvoiceItem>();
- if (items != null) {
- existingItems = new ArrayList<InvoiceItem>(items);
+ if (existingInvoices != null) {
+ for (Invoice invoice : existingInvoices) {
+ existingItems = new ArrayList<InvoiceItem>(invoice.getInvoiceItems());
+ }
+
Collections.sort(existingItems);
}
+ targetDate = adjustTargetDate(existingInvoices, targetDate);
+
DefaultInvoice invoice = new DefaultInvoice(accountId, targetDate, targetCurrency, clock);
UUID invoiceId = invoice.getId();
List<InvoiceItem> proposedItems = generateInvoiceItems(invoiceId, events, targetDate, targetCurrency);
- if (existingItems != null) {
- removeCancellingInvoiceItems(existingItems);
- removeDuplicatedInvoiceItems(proposedItems, existingItems);
+ removeCancellingInvoiceItems(existingItems);
+ removeDuplicatedInvoiceItems(proposedItems, existingItems);
- for (InvoiceItem existingItem : existingItems) {
- if (existingItem instanceof RecurringInvoiceItem) {
- RecurringInvoiceItem recurringItem = (RecurringInvoiceItem) existingItem;
- proposedItems.add(recurringItem.asCredit());
- }
+ for (InvoiceItem existingItem : existingItems) {
+ if (existingItem instanceof RecurringInvoiceItem) {
+ RecurringInvoiceItem recurringItem = (RecurringInvoiceItem) existingItem;
+ proposedItems.add(recurringItem.asCredit());
}
}
@@ -90,6 +97,18 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
}
}
+ private DateTime adjustTargetDate(final List<Invoice> existingInvoices, final DateTime targetDate) {
+ DateTime maxDate = targetDate;
+
+ for (Invoice invoice : existingInvoices) {
+ if (invoice.getTargetDate().isAfter(maxDate)) {
+ maxDate = invoice.getTargetDate();
+ }
+ }
+
+ return maxDate;
+ }
+
/*
* removes all matching items from both submitted collections
*/
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java
index 6bc6c9d..7e2b527 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java
@@ -19,7 +19,6 @@ package com.ning.billing.invoice.model;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.invoice.api.InvoiceItem;
import org.joda.time.DateTime;
import javax.annotation.Nullable;
@@ -27,5 +26,5 @@ import java.util.List;
import java.util.UUID;
public interface InvoiceGenerator {
- public Invoice generateInvoice(UUID accountId, BillingEventSet events, @Nullable List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) throws InvoiceApiException;
+ public Invoice generateInvoice(UUID accountId, BillingEventSet events, @Nullable List<Invoice> existingInvoices, DateTime targetDate, Currency targetCurrency) throws InvoiceApiException;
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
index 9d7805a..ebdc2f5 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
@@ -21,11 +21,9 @@ import static org.testng.Assert.fail;
import java.io.IOException;
-import com.google.inject.Inject;
import com.ning.billing.invoice.tests.InvoicingTestBase;
import org.apache.commons.io.IOUtils;
import org.skife.jdbi.v2.Handle;
-import org.skife.jdbi.v2.IDBI;
import org.skife.jdbi.v2.TransactionCallback;
import org.skife.jdbi.v2.TransactionStatus;
import org.testng.annotations.AfterClass;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index 1760449..9757c5b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -16,6 +16,7 @@
package com.ning.billing.invoice.dao;
+import com.google.inject.Inject;
import com.ning.billing.catalog.DefaultPrice;
import com.ning.billing.catalog.MockInternationalPrice;
import com.ning.billing.catalog.MockPlan;
@@ -34,10 +35,8 @@ import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.invoice.model.BillingEventSet;
import com.ning.billing.invoice.model.DefaultInvoice;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
import com.ning.billing.invoice.model.DefaultInvoicePayment;
import com.ning.billing.invoice.model.InvoiceGenerator;
-import com.ning.billing.invoice.model.InvoiceItemList;
import com.ning.billing.invoice.model.RecurringInvoiceItem;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.clock.DefaultClock;
@@ -59,6 +58,13 @@ import static org.testng.Assert.assertTrue;
public class InvoiceDaoTests extends InvoiceDaoTestBase {
private final int NUMBER_OF_DAY_BETWEEN_RETRIES = 8;
private final Clock clock = new DefaultClock();
+ private final InvoiceGenerator generator;
+
+ @Inject
+ public InvoiceDaoTests(InvoiceGenerator generator) {
+ super();
+ this.generator = generator;
+ }
@Test
public void testCreationAndRetrievalByAccount() {
@@ -495,11 +501,8 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
*/
@Test
public void testInvoiceGenerationForImmediateChanges() throws InvoiceApiException {
-
- InvoiceGenerator generator = new DefaultInvoiceGenerator(clock);
-
UUID accountId = UUID.randomUUID();
- InvoiceItemList invoiceItemList = new InvoiceItemList();
+ List<Invoice> invoiceList = new ArrayList<Invoice>();
DateTime targetDate = new DateTime(2011, 2, 16, 0, 0, 0, 0);
// generate first invoice
@@ -517,9 +520,9 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
BillingEventSet events = new BillingEventSet();
events.add(event1);
- Invoice invoice1 = generator.generateInvoice(accountId, events, invoiceItemList, targetDate, Currency.USD);
+ Invoice invoice1 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
assertEquals(invoice1.getBalance(), TEN);
- invoiceItemList.addAll(invoice1.getInvoiceItems());
+ invoiceList.add(invoice1);
// generate second invoice
DefaultPrice price2 = new DefaultPrice(TWENTY, Currency.USD);
@@ -535,9 +538,9 @@ public class InvoiceDaoTests 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
- Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceItemList, targetDate, Currency.USD);
+ Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
assertEquals(invoice2.getBalance(), FIVE);
- invoiceItemList.addAll(invoice2.getInvoiceItems());
+ invoiceList.add(invoice2);
invoiceDao.create(invoice1);
invoiceDao.create(invoice2);
@@ -566,7 +569,6 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
events.add(event);
DateTime targetDate = buildDateTime(2011, 1, 15);
- InvoiceGenerator generator = new DefaultInvoiceGenerator(clock);
Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
// expect one pro-ration item and one full-period item
@@ -595,13 +597,13 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
BillingEventSet events = new BillingEventSet();
events.add(event1);
- InvoiceGenerator generator = new DefaultInvoiceGenerator(clock);
Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, null, effectiveDate1, Currency.USD);
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
assertEquals(invoice1.getTotalAmount().compareTo(ZERO), 0);
- List<InvoiceItem> existingItems = invoice1.getInvoiceItems();
+ List<Invoice> invoiceList = new ArrayList<Invoice>();
+ invoiceList.add(invoice1);
DateTime effectiveDate2 = effectiveDate1.plusDays(30);
BillingEvent event2 = new DefaultBillingEvent(subscription, effectiveDate2, plan, phase2, null,
@@ -609,15 +611,15 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
"testEvent2", SubscriptionTransitionType.CHANGE);
events.add(event2);
- Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, existingItems, effectiveDate2, Currency.USD);
+ Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, invoiceList, effectiveDate2, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
assertEquals(invoice2.getTotalAmount().compareTo(cheapAmount), 0);
- existingItems.addAll(invoice2.getInvoiceItems());
+ invoiceList.add(invoice2);
DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
- Invoice invoice3 = generator.generateInvoice(UUID.randomUUID(), events, existingItems, effectiveDate3, Currency.USD);
+ Invoice invoice3 = generator.generateInvoice(UUID.randomUUID(), events, invoiceList, effectiveDate3, Currency.USD);
assertNotNull(invoice3);
assertEquals(invoice3.getNumberOfItems(), 1);
assertEquals(invoice3.getTotalAmount().compareTo(cheapAmount), 0);
@@ -625,7 +627,6 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
@Test
public void testInvoiceForEmptyEventSet() throws InvoiceApiException {
- InvoiceGenerator generator = new DefaultInvoiceGenerator(clock);
BillingEventSet events = new BillingEventSet();
Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new DateTime(), Currency.USD);
assertNull(invoice);
@@ -658,7 +659,6 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
"testEvent2", SubscriptionTransitionType.CHANGE);
events.add(event2);
- InvoiceGenerator generator = new DefaultInvoiceGenerator(clock);
Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, effectiveDate2, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -702,7 +702,6 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
// BillingEventSet events = new BillingEventSet();
// events.add(creationEvent);
//
-// InvoiceGenerator generator = new DefaultInvoiceGenerator();
// InvoiceItemList existingItems;
//
// existingItems = new InvoiceItemList(invoiceDao.getInvoiceItemsByAccount(accountId));
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
index bb9094e..f09fe31 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
@@ -18,6 +18,7 @@ package com.ning.billing.invoice.glue;
import java.io.IOException;
+import com.ning.billing.invoice.api.InvoiceUserApi;
import com.ning.billing.invoice.api.test.InvoiceTestApi;
import com.ning.billing.invoice.api.test.DefaultInvoiceTestApi;
import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 136eeb5..3d4f6bb 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -16,6 +16,7 @@
package com.ning.billing.invoice.tests;
+import com.google.inject.Inject;
import com.ning.billing.catalog.DefaultPrice;
import com.ning.billing.catalog.MockInternationalPrice;
import com.ning.billing.catalog.MockPlan;
@@ -37,19 +38,17 @@ import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.dao.MockSubscription;
import com.ning.billing.invoice.model.BillingEventSet;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
import com.ning.billing.invoice.model.InvoiceGenerator;
import com.ning.billing.invoice.model.InvoiceItemList;
import com.ning.billing.invoice.model.RecurringInvoiceItem;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
import org.joda.time.DateTime;
import org.testng.annotations.Test;
import javax.annotation.Nullable;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -59,12 +58,18 @@ import static org.testng.Assert.assertNull;
@Test(groups = {"fast", "invoicing", "invoiceGenerator"})
public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
- private final InvoiceGenerator generator = new DefaultInvoiceGenerator(new DefaultClock());
+ private final InvoiceGenerator generator;
+
+ @Inject
+ public DefaultInvoiceGeneratorTests(InvoiceGenerator generator) {
+ super();
+ this.generator = generator;
+ }
@Test
public void testWithNullEventSetAndNullInvoiceSet() throws InvoiceApiException {
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, new BillingEventSet(), new InvoiceItemList(), new DateTime(), Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
assertNull(invoice);
}
@@ -73,9 +78,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
public void testWithEmptyEventSet() throws InvoiceApiException {
BillingEventSet events = new BillingEventSet();
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, new DateTime(), Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, events, null, new DateTime(), Currency.USD);
assertNull(invoice);
}
@@ -94,11 +98,9 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
events.add(event);
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
-
DateTime targetDate = buildDateTime(2011, 10, 3);
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -119,11 +121,9 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 15);
events.add(event);
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
-
DateTime targetDate = buildDateTime(2011, 10, 3);
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -154,10 +154,9 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan2, phase2, 1);
events.add(event2);
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 10, 3);
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 2);
@@ -181,10 +180,9 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 15), plan1, phase2, 15);
events.add(event2);
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 12, 3);
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 4);
@@ -224,10 +222,9 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEvent event3 = createBillingEvent(sub.getId(), buildDateTime(2011, 11, 1), plan1, phase3, 1);
events.add(event3);
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 12, 3);
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+ Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), 4);
@@ -251,11 +248,11 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
DateTime targetDate = buildDateTime(2011, 12, 1);
UUID accountId = UUID.randomUUID();
Invoice invoice1 = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
- InvoiceItemList existingInvoiceItems = new InvoiceItemList();
- existingInvoiceItems.addAll(invoice1.getInvoiceItems());
+ List<Invoice> existingInvoices = new ArrayList<Invoice>();
+ existingInvoices.add(invoice1);
targetDate = buildDateTime(2011, 12, 3);
- Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+ Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoices, targetDate, Currency.USD);
assertNull(invoice2);
}
@@ -311,114 +308,114 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
DateTime plan5CancelDate = buildDateTime(2011, 10, 7);
BigDecimal expectedAmount;
- InvoiceItemList invoiceItems = new InvoiceItemList();
+ List<Invoice> invoices = new ArrayList<Invoice>();
BillingEventSet events = new BillingEventSet();
// on 1/5/2011, create subscription 1 (trial)
events.add(createBillingEvent(subscriptionId1, plan1StartDate, plan1, plan1Phase1, 5));
expectedAmount = EIGHT;
- testInvoiceGeneration(events, invoiceItems, plan1StartDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan1StartDate, 1, expectedAmount);
// on 2/5/2011, invoice subscription 1 (trial)
expectedAmount = EIGHT;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 2, 5) , 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 2, 5) , 1, expectedAmount);
// on 3/5/2011, invoice subscription 1 (trial)
expectedAmount = EIGHT;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 3, 5), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 3, 5), 1, expectedAmount);
// on 3/10/2011, create subscription 2 (trial)
events.add(createBillingEvent(subscriptionId2, plan2StartDate, plan2, plan2Phase1, 10));
expectedAmount = TWENTY;
- testInvoiceGeneration(events, invoiceItems, plan2StartDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan2StartDate, 1, expectedAmount);
// on 4/5/2011, invoice subscription 1 (discount)
events.add(createBillingEvent(subscriptionId1, plan1PhaseChangeDate, plan1, plan1Phase2, 5));
expectedAmount = TWELVE;
- testInvoiceGeneration(events, invoiceItems, plan1PhaseChangeDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan1PhaseChangeDate, 1, expectedAmount);
// on 4/10/2011, invoice subscription 2 (trial)
expectedAmount = TWENTY;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 4, 10), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 4, 10), 1, expectedAmount);
// on 4/29/2011, cancel subscription 1
events.add(createBillingEvent(subscriptionId1, plan1CancelDate, plan1, plan1Phase3, 5));
expectedAmount = TWELVE.multiply(SIX.divide(THIRTY, NUMBER_OF_DECIMALS, ROUNDING_METHOD)).negate().setScale(NUMBER_OF_DECIMALS);
- testInvoiceGeneration(events, invoiceItems, plan1CancelDate, 2, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan1CancelDate, 2, expectedAmount);
// on 5/10/2011, invoice subscription 2 (trial)
expectedAmount = TWENTY;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 5, 10), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 5, 10), 1, expectedAmount);
// on 5/20/2011, create subscription 3 (monthly)
events.add(createBillingEvent(subscriptionId3, plan3StartDate, plan3, plan3Phase1, 20));
expectedAmount = TEN;
- testInvoiceGeneration(events, invoiceItems, plan3StartDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan3StartDate, 1, expectedAmount);
// on 6/7/2011, create subscription 4
events.add(createBillingEvent(subscriptionId4, plan4StartDate, plan4a, plan4aPhase1, 7));
expectedAmount = FIFTEEN;
- testInvoiceGeneration(events, invoiceItems, plan4StartDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan4StartDate, 1, expectedAmount);
// on 6/10/2011, invoice subscription 2 (discount)
events.add(createBillingEvent(subscriptionId2, plan2PhaseChangeToDiscountDate, plan2, plan2Phase2, 10));
expectedAmount = THIRTY;
- testInvoiceGeneration(events, invoiceItems, plan2PhaseChangeToDiscountDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan2PhaseChangeToDiscountDate, 1, expectedAmount);
// on 6/20/2011, invoice subscription 3 (monthly)
expectedAmount = TEN;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 6, 20), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 6, 20), 1, expectedAmount);
// on 6/21/2011, create add-on (subscription 5)
events.add(createBillingEvent(subscriptionId5, plan5StartDate, plan5, plan5Phase1, 10));
expectedAmount = TWENTY.multiply(NINETEEN).divide(THIRTY, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
- testInvoiceGeneration(events, invoiceItems, plan5StartDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan5StartDate, 1, expectedAmount);
// on 7/7/2011, invoice subscription 4 (plan 1)
expectedAmount = FIFTEEN;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 7, 7), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 7, 7), 1, expectedAmount);
// on 7/10/2011, invoice subscription 2 (discount), invoice subscription 5
expectedAmount = THIRTY.add(TWENTY);
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 7, 10), 2, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 7, 10), 2, expectedAmount);
// on 7/20/2011, invoice subscription 3 (monthly)
expectedAmount = TEN;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 7, 20), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 7, 20), 1, expectedAmount);
// on 7/31/2011, convert subscription 3 to annual
events.add(createBillingEvent(subscriptionId3, plan3UpgradeToAnnualDate, plan3, plan3Phase2, 31));
expectedAmount = ONE_HUNDRED.subtract(TEN);
expectedAmount = expectedAmount.add(TEN.multiply(ELEVEN.divide(THIRTY_ONE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD)));
expectedAmount = expectedAmount.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
- testInvoiceGeneration(events, invoiceItems, plan3UpgradeToAnnualDate, 3, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan3UpgradeToAnnualDate, 3, expectedAmount);
// on 8/7/2011, invoice subscription 4 (plan 2)
events.add(createBillingEvent(subscriptionId4, plan4ChangeOfPlanDate, plan4b, plan4bPhase1, 7));
expectedAmount = TWENTY_FOUR;
- testInvoiceGeneration(events, invoiceItems, plan4ChangeOfPlanDate, 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan4ChangeOfPlanDate, 1, expectedAmount);
// on 8/10/2011, invoice plan 2 (discount), invoice subscription 5
expectedAmount = THIRTY.add(TWENTY);
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 8, 10), 2, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 8, 10), 2, expectedAmount);
// on 9/7/2011, invoice subscription 4 (plan 2)
expectedAmount = TWENTY_FOUR;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 9, 7), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 9, 7), 1, expectedAmount);
// on 9/10/2011, invoice plan 2 (evergreen), invoice subscription 5
events.add(createBillingEvent(subscriptionId2, plan2PhaseChangeToEvergreenDate, plan2, plan2Phase3, 10));
expectedAmount = FORTY.add(TWENTY);
- testInvoiceGeneration(events, invoiceItems, plan2PhaseChangeToEvergreenDate, 2, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan2PhaseChangeToEvergreenDate, 2, expectedAmount);
// on 10/7/2011, invoice subscription 4 (plan 2), cancel subscription 5
events.add(createBillingEvent(subscriptionId5, plan5CancelDate, plan5, plan5Phase2, 10));
expectedAmount = TWENTY_FOUR.add(TWENTY.multiply(THREE.divide(THIRTY)).negate().setScale(NUMBER_OF_DECIMALS));
- testInvoiceGeneration(events, invoiceItems, plan5CancelDate, 3, expectedAmount);
+ testInvoiceGeneration(events, invoices, plan5CancelDate, 3, expectedAmount);
// on 10/10/2011, invoice plan 2 (evergreen)
expectedAmount = FORTY ;
- testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 10, 10), 1, expectedAmount);
+ testInvoiceGeneration(events, invoices, buildDateTime(2011, 10, 10), 1, expectedAmount);
}
@Test
@@ -482,7 +479,9 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
assertNotNull(invoice1);
assertEquals(invoice1.getNumberOfItems(), 1);
- Invoice invoice2 = generator.generateInvoice(accountId, events, invoice1.getInvoiceItems(), new DateTime("2012-04-05T00:01:00.000-08:00"), Currency.USD);
+ List<Invoice> invoiceList = new ArrayList<Invoice>();
+ invoiceList.add(invoice1);
+ Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, new DateTime("2012-04-05T00:01:00.000-08:00"), Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
FixedPriceInvoiceItem item = (FixedPriceInvoiceItem) invoice2.getInvoiceItems().get(0);
@@ -511,13 +510,14 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
assertEquals(invoice1.getNumberOfItems(), 2);
assertEquals(invoice1.getTotalAmount(), FIFTEEN);
- List<InvoiceItem> existingItems = invoice1.getInvoiceItems();
+ List<Invoice> invoiceList = new ArrayList<Invoice>();
+ invoiceList.add(invoice1);
// move forward in time one billing period
DateTime currentDate = startDate.plusMonths(1);
// ensure that only the recurring price is invoiced
- Invoice invoice2 = generator.generateInvoice(accountId, events, existingItems, currentDate, Currency.USD);
+ Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, currentDate, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
assertEquals(invoice2.getTotalAmount(), FIVE);
@@ -546,7 +546,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
assertEquals(invoice1.getNumberOfItems(), 1);
assertEquals(invoice1.getTotalAmount(), fixedCost1);
- List<InvoiceItem> existingItems = invoice1.getInvoiceItems();
+ List<Invoice> invoiceList = new ArrayList<Invoice>();
+ invoiceList.add(invoice1);
// move forward in time one billing period
DateTime phaseChangeDate = startDate.plusMonths(1);
@@ -554,12 +555,67 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
events.add(event2);
// ensure that a single invoice item is generated for the fixed cost
- Invoice invoice2 = generator.generateInvoice(accountId, events, existingItems, phaseChangeDate, Currency.USD);
+ Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, phaseChangeDate, Currency.USD);
assertNotNull(invoice2);
assertEquals(invoice2.getNumberOfItems(), 1);
assertEquals(invoice2.getTotalAmount(), fixedCost2);
}
+ @Test
+ public void testNutsFailure() throws InvoiceApiException {
+ BillingEventSet events = new BillingEventSet();
+ UUID subscriptionId = UUID.randomUUID();
+ UUID accountId = UUID.randomUUID();
+ final int BILL_CYCLE_DAY = 15;
+
+ // create subscription with a zero-dollar trial, a monthly discount period and a monthly evergreen
+ Plan plan1 = new MockPlan();
+ PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
+ final BigDecimal DISCOUNT_PRICE = new BigDecimal("9.95");
+ PlanPhase phase2 = createMockMonthlyPlanPhase(DISCOUNT_PRICE, null, PhaseType.DISCOUNT);
+ PlanPhase phase3 = createMockMonthlyPlanPhase(new BigDecimal("19.95"), null, PhaseType.EVERGREEN);
+
+ // set up billing events
+ DateTime creationDate = new DateTime(2012, 3, 6, 21, 36, 18, 896);
+ events.add(createBillingEvent(subscriptionId, creationDate, plan1, phase1, BILL_CYCLE_DAY));
+
+ // trialPhaseEndDate = 2012/4/5
+ DateTime trialPhaseEndDate = creationDate.plusDays(30);
+ events.add(createBillingEvent(subscriptionId, trialPhaseEndDate, plan1, phase2, BILL_CYCLE_DAY));
+
+ // discountPhaseEndDate = 2012/10/5
+ DateTime discountPhaseEndDate = trialPhaseEndDate.plusMonths(6);
+ events.add(createBillingEvent(subscriptionId, discountPhaseEndDate, plan1, phase3, BILL_CYCLE_DAY));
+
+ Invoice invoice1 = generator.generateInvoice(accountId, events, null, creationDate, Currency.USD);
+ assertNotNull(invoice1);
+ assertEquals(invoice1.getNumberOfItems(), 1);
+ assertEquals(invoice1.getTotalAmount().compareTo(ZERO), 0);
+
+ List<Invoice> invoiceList = new ArrayList<Invoice>();
+ invoiceList.add(invoice1);
+
+ Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, trialPhaseEndDate, Currency.USD);
+ assertNotNull(invoice2);
+ assertEquals(invoice2.getNumberOfItems(), 1);
+ assertEquals(invoice2.getInvoiceItems().get(0).getStartDate().compareTo(trialPhaseEndDate), 0);
+ assertEquals(invoice2.getTotalAmount().compareTo(new BigDecimal("3.2097")), 0);
+
+ invoiceList.add(invoice2);
+ DateTime targetDate = trialPhaseEndDate.toMutableDateTime().dayOfMonth().set(BILL_CYCLE_DAY).toDateTime();
+ Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+ assertNotNull(invoice3);
+ assertEquals(invoice3.getNumberOfItems(), 1);
+ assertEquals(invoice3.getInvoiceItems().get(0).getStartDate().compareTo(targetDate), 0);
+ assertEquals(invoice3.getTotalAmount().compareTo(DISCOUNT_PRICE), 0);
+
+ invoiceList.add(invoice3);
+ targetDate = targetDate.plusMonths(6);
+ Invoice invoice4 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+ assertNotNull(invoice4);
+ assertEquals(invoice4.getNumberOfItems(), 17);
+ }
+
private MockPlanPhase createMockMonthlyPlanPhase() {
return new MockPlanPhase(null, null, BillingPeriod.MONTHLY);
}
@@ -597,16 +653,16 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
billCycleDay, BillingModeType.IN_ADVANCE,"Test", SubscriptionTransitionType.CREATE);
}
- private void testInvoiceGeneration(final BillingEventSet events, final InvoiceItemList existingInvoiceItems,
+ private void testInvoiceGeneration(final BillingEventSet events, final List<Invoice> existingInvoices,
final DateTime targetDate, final int expectedNumberOfItems,
final BigDecimal expectedAmount) throws InvoiceApiException {
Currency currency = Currency.USD;
UUID accountId = UUID.randomUUID();
- Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, currency);
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoices, targetDate, currency);
assertNotNull(invoice);
assertEquals(invoice.getNumberOfItems(), expectedNumberOfItems);
- existingInvoiceItems.addAll(invoice.getInvoiceItems());
+ existingInvoices.add(invoice);
assertEquals(invoice.getTotalAmount(), expectedAmount);
}
diff --git a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
index 99870b7..20f4b7f 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
@@ -88,6 +88,5 @@ public class TestPaymentProvider {
assertFalse(paymentInfoReceiver.getProcessedPayments().isEmpty());
assertTrue(paymentInfoReceiver.getErrors().isEmpty());
-
}
}
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 6a08eb5..e82f678 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
@@ -115,7 +115,6 @@ public class TestRetryService {
amount,
new BigDecimal("1.0"),
Currency.USD,
- new DateTime(DateTimeZone.UTC),
new DateTime(DateTimeZone.UTC)));
mockPaymentProviderPlugin.makeNextInvoiceFail();
@@ -158,7 +157,6 @@ public class TestRetryService {
amount,
new BigDecimal("1.0"),
Currency.USD,
- new DateTime(DateTimeZone.UTC),
new DateTime(DateTimeZone.UTC)));
DateTime nextRetryDate = new DateTime(DateTimeZone.UTC).minusDays(1);