Details
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 f35d53e..e9f14b9 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
@@ -69,10 +69,15 @@ public class InvoiceDateUtils {
if (proposedDate.dayOfMonth().get() < billingCycleDay) {
final int lastDayOfTheMonth = proposedDate.dayOfMonth().getMaximumValue();
if (lastDayOfTheMonth < billingCycleDay) {
- return new LocalDate(proposedDate.getYear(), proposedDate.getMonthOfYear(), lastDayOfTheMonth);
+ proposedDate = new LocalDate(proposedDate.getYear(), proposedDate.getMonthOfYear(), lastDayOfTheMonth);
} else {
- return new LocalDate(proposedDate.getYear(), proposedDate.getMonthOfYear(), billingCycleDay);
+ proposedDate = new LocalDate(proposedDate.getYear(), proposedDate.getMonthOfYear(), billingCycleDay);
}
+ }
+
+ if (proposedDate.isBefore(previousBillCycleDate)) {
+ // Make sure not to go too far in the past
+ return previousBillCycleDate;
} else {
return proposedDate;
}
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 fed28f8..07e385b 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
@@ -74,6 +74,7 @@ public class InAdvanceBillingMode implements BillingMode {
} else {
effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, billingPeriod);
}
+
final LocalDate lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDayLocal, billingPeriod);
final int numberOfWholeBillingPeriods = calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
final int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
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 a496d14..5d419a0 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
@@ -28,13 +28,14 @@ import com.ning.billing.catalog.api.BillingPeriod;
public class TestInvoiceDateUtils {
@Test(groups = "fast")
- public void testLastBCDShouldBeInThePast() throws Exception {
+ public void testLastBCDShouldNotBeBeforePreviousBCD() throws Exception {
final LocalDate from = new LocalDate("2012-07-16");
final LocalDate previousBCD = new LocalDate("2012-08-15");
final int bcdLocal = 15;
final LocalDate lastBCD = InvoiceDateUtils.calculateLastBillingCycleDateBefore(from, previousBCD, bcdLocal, BillingPeriod.MONTHLY);
- Assert.assertEquals(lastBCD, new LocalDate("2012-07-15"));
+ Assert.assertEquals(lastBCD, new LocalDate("2012-08-15"));
}
+
@Test(groups = "fast")
public void testNextBCDShouldNotBeInThePast() throws Exception {
final LocalDate from = new LocalDate("2012-07-16");