diff --git a/invoice/src/main/java/org/killbill/billing/invoice/generator/InvoiceDateUtils.java b/invoice/src/main/java/org/killbill/billing/invoice/generator/InvoiceDateUtils.java
index 11c8d5d..e7fabb4 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/generator/InvoiceDateUtils.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/generator/InvoiceDateUtils.java
@@ -31,6 +31,25 @@ import com.google.common.annotations.VisibleForTesting;
public class InvoiceDateUtils {
+ 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 BigDecimal calculateProRationBeforeFirstBillingPeriod(final LocalDate startDate, final LocalDate nextBillingCycleDate,
+ final BillingPeriod billingPeriod) {
+ final LocalDate previousBillingCycleDate = nextBillingCycleDate.minus(billingPeriod.getPeriod());
+ return calculateProrationBetweenDates(startDate, nextBillingCycleDate, previousBillingCycleDate, nextBillingCycleDate);
+ }
+
+ 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.plus(billingPeriod.getPeriod());
+ return calculateProrationBetweenDates(previousBillThroughDate, endDate, previousBillThroughDate, nextBillThroughDate);
+ }
+
/**
* Called internally to calculate proration or when we recalculate approximate repair amount
*
@@ -38,9 +57,8 @@ public class InvoiceDateUtils {
* @param endDate end date of the prorated interval
* @param previousBillingCycleDate start date of the period
* @param nextBillingCycleDate end date of the period
- * @return
*/
- public static BigDecimal calculateProrationBetweenDates(final LocalDate startDate, final LocalDate endDate, final LocalDate previousBillingCycleDate, final LocalDate nextBillingCycleDate) {
+ private static BigDecimal calculateProrationBetweenDates(final LocalDate startDate, final LocalDate endDate, final LocalDate previousBillingCycleDate, final LocalDate nextBillingCycleDate) {
final int daysBetween = Days.daysBetween(previousBillingCycleDate, nextBillingCycleDate).getDays();
return calculateProrationBetweenDates(startDate, endDate, daysBetween);
}
@@ -55,68 +73,4 @@ public class InvoiceDateUtils {
return days.divide(daysInPeriod, KillBillMoney.MAX_SCALE, KillBillMoney.ROUNDING_METHOD);
}
-
- public static BigDecimal calculateProRationBeforeFirstBillingPeriod(final LocalDate startDate, final LocalDate nextBillingCycleDate,
- final BillingPeriod billingPeriod) {
- final LocalDate previousBillingCycleDate = nextBillingCycleDate.plusMonths(-billingPeriod.getNumberOfMonths());
-
- return calculateProrationBetweenDates(startDate, nextBillingCycleDate, previousBillingCycleDate, nextBillingCycleDate);
- }
-
- 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 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 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());
- return calculateProrationBetweenDates(previousBillThroughDate, endDate, previousBillThroughDate, nextBillThroughDate);
- }
-
- @VisibleForTesting
- static LocalDate calculateBillingCycleDateOnOrAfter(final LocalDate date, final int billingCycleDayLocal) {
- final int lastDayOfMonth = date.dayOfMonth().getMaximumValue();
-
- final LocalDate fixedDate;
- if (billingCycleDayLocal > lastDayOfMonth) {
- fixedDate = new LocalDate(date.getYear(), date.getMonthOfYear(), lastDayOfMonth, date.getChronology());
- } else {
- fixedDate = new LocalDate(date.getYear(), date.getMonthOfYear(), billingCycleDayLocal, date.getChronology());
- }
-
- LocalDate proposedDate = fixedDate;
- while (proposedDate.isBefore(date)) {
- proposedDate = proposedDate.plusMonths(1);
- }
- return proposedDate;
- }
-
- public static LocalDate calculateBillingCycleDateAfter(final LocalDate date, final int billingCycleDayLocal) {
- LocalDate proposedDate = calculateBillingCycleDateOnOrAfter(date, billingCycleDayLocal);
- if (date.compareTo(proposedDate) == 0) {
- proposedDate = proposedDate.plusMonths(1);
- }
- return proposedDate;
- }
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceDateUtils.java b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceDateUtils.java
index 01ed54d..10fd69f 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceDateUtils.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceDateUtils.java
@@ -31,13 +31,6 @@ import org.killbill.billing.invoice.InvoiceTestSuiteNoDB;
public class TestInvoiceDateUtils extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
- public void testNextBCDShouldNotBeInThePast() throws Exception {
- final LocalDate from = new LocalDate("2012-07-16");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 15);
- Assert.assertEquals(to, new LocalDate("2012-08-15"));
- }
-
- @Test(groups = "fast")
public void testProRationAfterLastBillingCycleDate() throws Exception {
final LocalDate endDate = new LocalDate("2012-06-02");
final LocalDate previousBillThroughDate = new LocalDate("2012-03-02");
@@ -46,58 +39,6 @@ public class TestInvoiceDateUtils extends InvoiceTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testBeforeBCDWithAfter() throws Exception {
- final LocalDate from = new LocalDate("2012-03-02");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, 3);
- Assert.assertEquals(to, new LocalDate("2012-03-03"));
- }
-
- @Test(groups = "fast")
- public void testEqualBCDWithAfter() throws Exception {
- final LocalDate from = new LocalDate("2012-03-03");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, 3);
- Assert.assertEquals(to, new LocalDate("2012-04-03"));
- }
-
- @Test(groups = "fast")
- public void testAfterBCDWithAfter() throws Exception {
- final LocalDate from = new LocalDate("2012-03-04");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateAfter(from, 3);
- Assert.assertEquals(to, new LocalDate("2012-04-03"));
- }
-
- @Test(groups = "fast")
- public void testBeforeBCDWithOnOrAfter() throws Exception {
- final LocalDate from = new LocalDate("2012-03-02");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 3);
- Assert.assertEquals(to, new LocalDate("2012-03-03"));
- }
-
- @Test(groups = "fast")
- public void testEqualBCDWithOnOrAfter() throws Exception {
- final LocalDate from = new LocalDate("2012-03-03");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 3);
- Assert.assertEquals(to, new LocalDate("2012-03-03"));
- }
-
- @Test(groups = "fast")
- public void testAfterBCDWithOnOrAfter() throws Exception {
- final LocalDate from = new LocalDate("2012-03-04");
- final LocalDate to = InvoiceDateUtils.calculateBillingCycleDateOnOrAfter(from, 3);
- Assert.assertEquals(to, new LocalDate("2012-04-03"));
- }
-
- @Test(groups = "fast")
- public void testEffectiveEndDate() throws Exception {
- final LocalDate firstBCD = new LocalDate(2012, 7, 16);
- final LocalDate targetDate = new LocalDate(2012, 8, 16);
- final BillingPeriod billingPeriod = BillingPeriod.MONTHLY;
- final LocalDate effectiveEndDate = InvoiceDateUtils.calculateEffectiveEndDate(firstBCD, targetDate, billingPeriod);
- // TODO should that be 2012-09-15?
- Assert.assertEquals(effectiveEndDate, new LocalDate(2012, 9, 16));
- }
-
- @Test(groups = "fast")
public void testCalculateNbOfBillingPeriods() throws Exception {
final LocalDate firstBCD = new LocalDate(2012, 7, 16);
final LocalDate lastBCD = new LocalDate(2012, 9, 16);