killbill-memoizeit
Changes
entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java 17(+10 -7)
Details
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
index e708803..f77fdad 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
@@ -187,7 +187,7 @@ public class TestBasic {
}
private void testBasePlanComplete(int billingDay) throws Exception {
- long DELAY = 5000 * 10;
+ long DELAY = 5000;
Account account = accountUserApi.createAccount(getAccountData(billingDay), null, null);
assertNotNull(account);
@@ -240,8 +240,6 @@ public class TestBasic {
busHandler.pushExpectedEvent(NextEvent.PHASE);
busHandler.pushExpectedEvent(NextEvent.INVOICE);
clock.setDeltaFromReality(AT_LEAST_ONE_MONTH_MS);
-
- Thread.sleep(600000);
assertTrue(busHandler.isCompleted(DELAY));
//
@@ -250,6 +248,7 @@ public class TestBasic {
newTerm = BillingPeriod.MONTHLY;
newPlanSetName = PriceListSet.DEFAULT_PRICELIST_NAME;
newProductName = "Pistol";
+ subscription = (SubscriptionData) entitlementUserApi.getSubscriptionFromId(subscription.getId());
subscription.changePlan(newProductName, newTerm, newPlanSetName, clock.getUTCNow());
log.info("testSimple has passed third busHandler checkpoint (no events)");
@@ -258,8 +257,8 @@ public class TestBasic {
//
busHandler.pushExpectedEvent(NextEvent.CHANGE);
busHandler.pushExpectedEvent(NextEvent.INVOICE);
- clock.addDeltaFromReality(ctd.getMillis() - clock.getUTCNow().getMillis());
- //clock.setDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
+ //clock.addDeltaFromReality(ctd.getMillis() - clock.getUTCNow().getMillis());
+ clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
assertTrue(busHandler.isCompleted(DELAY));
log.info("testSimple passed fourth busHandler checkpoint.");
@@ -269,8 +268,8 @@ public class TestBasic {
int maxCycles = 3;
DateTime lastCtd = null;
do {
- clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
busHandler.pushExpectedEvent(NextEvent.INVOICE);
+ clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
assertTrue(busHandler.isCompleted(DELAY));
lastCtd = checkAndGetCTD(subscription.getId());
} while (maxCycles-- > 0);
@@ -278,11 +277,12 @@ public class TestBasic {
//
// FINALLY CANCEL SUBSCRIPTION EOT
//
+ subscription = (SubscriptionData) entitlementUserApi.getSubscriptionFromId(subscription.getId());
subscription.cancel(clock.getUTCNow(), false);
// MOVE AFTER CANCEL DATE AND EXPECT EVENT : NextEvent.CANCEL
busHandler.pushExpectedEvent(NextEvent.CANCEL);
- Interval it = new Interval(lastCtd, clock.getUTCNow());
+ Interval it = new Interval(clock.getUTCNow(), lastCtd);
clock.addDeltaFromReality(it.toDurationMillis());
assertTrue(busHandler.isCompleted(DELAY));
@@ -292,7 +292,13 @@ public class TestBasic {
busHandler.reset();
clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
assertTrue(busHandler.isCompleted(DELAY));
- lastCtd = checkAndGetCTD(subscription.getId());
+
+
+ subscription = (SubscriptionData) entitlementUserApi.getSubscriptionFromId(subscription.getId());
+ lastCtd = subscription.getChargedThroughDate();
+ assertNotNull(lastCtd);
+ log.info("Checking CTD: " + lastCtd.toString() + "; clock is " + clock.getUTCNow().toString());
+ assertTrue(lastCtd.isBefore(clock.getUTCNow()));
}
@Test(enabled=false)
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java
index d006776..54f4b4c 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java
@@ -121,6 +121,9 @@ public class TestBusHandler {
public boolean isCompleted(long timeout) {
synchronized (this) {
+ if (completed) {
+ return completed;
+ }
try {
wait(timeout);
} catch (Exception ignore) {
diff --git a/beatrix/src/test/resources/resource.properties b/beatrix/src/test/resources/resource.properties
index cc82754..d63334b 100644
--- a/beatrix/src/test/resources/resource.properties
+++ b/beatrix/src/test/resources/resource.properties
@@ -2,5 +2,6 @@ killbill.catalog.uri=file:src/test/resources/catalogSample.xml
killbill.entitlement.dao.claim.time=60000
killbill.entitlement.dao.ready.max=1
killbill.entitlement.engine.notifications.sleep=500
+user.timezone=UTC
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
index dd8f92a..11c5a79 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
@@ -31,7 +31,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransition.Subscription
public class DefaultBillingEvent implements BillingEvent {
Logger log = LoggerFactory.getLogger(DefaultBillingEvent.class);
-
+
final private int billCycleDay;
final private Subscription subscription;
final private DateTime effectiveDate;
@@ -48,15 +48,18 @@ public class DefaultBillingEvent implements BillingEvent {
this.billCycleDay = billCycleDay;
this.subscription = subscription;
effectiveDate = transition.getEffectiveTransitionTime();
- planPhase = transition.getNextPhase();
- plan = transition.getNextPlan();
- fixedPrice = (transition.getNextPhase() == null) ? null :
+ planPhase = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+ transition.getNextPhase() : transition.getPreviousPhase();
+ plan = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+ transition.getNextPlan() : transition.getPreviousPlan();
+ fixedPrice = (transition.getNextPhase() == null) ? null :
transition.getNextPhase().getFixedPrice();
recurringPrice = (transition.getNextPhase() == null) ? null :
transition.getNextPhase().getRecurringPrice();
description = transition.getTransitionType().toString();
- billingModeType=BillingModeType.IN_ADVANCE;
- billingPeriod = transition.getNextPhase().getBillingPeriod();
+ billingModeType = BillingModeType.IN_ADVANCE;
+ billingPeriod = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+ transition.getNextPhase().getBillingPeriod() : transition.getPreviousPhase().getBillingPeriod();
type = transition.getTransitionType();
}
@@ -90,7 +93,7 @@ public class DefaultBillingEvent implements BillingEvent {
return hashCode() - e1.hashCode();
}
}
- }
+ }
}
@Override
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
index efda54c..a5199a9 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
@@ -32,6 +32,7 @@ import com.ning.billing.entitlement.api.user.Subscription;
import com.ning.billing.entitlement.api.user.SubscriptionBundle;
import com.ning.billing.entitlement.api.user.SubscriptionData;
import com.ning.billing.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
import com.ning.billing.entitlement.api.user.SubscriptionTransition;
import com.ning.billing.entitlement.engine.dao.EntitlementDao;
import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao;
@@ -50,7 +51,7 @@ import java.util.UUID;
public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
private static final Logger log = LoggerFactory.getLogger(DefaultEntitlementBillingApi.class);
-
+
private final EntitlementDao dao;
private final AccountUserApi accountApi;
private final CatalogService catalogService;
@@ -66,7 +67,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
@Override
public SortedSet<BillingEvent> getBillingEventsForAccount(
final UUID accountId) {
-
+
List<SubscriptionBundle> bundles = dao.getSubscriptionBundleForAccount(accountId);
List<Subscription> subscriptions = new ArrayList<Subscription>();
for (final SubscriptionBundle bundle: bundles) {
@@ -80,7 +81,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
BillingEvent event = new DefaultBillingEvent(transition, subscription, calculateBCD(transition, accountId));
result.add(event);
} catch (CatalogApiException e) {
- log.error("Failing to identify catalog components while creating BillingEvent from transition: " +
+ log.error("Failing to identify catalog components while creating BillingEvent from transition: " +
transition.getId().toString(), e);
} catch (Exception e) {
log.warn("Failed while getting BillingEvent", e);
@@ -97,26 +98,28 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
private int calculateBCD(final SubscriptionTransition transition, final UUID accountId) throws CatalogApiException {
Catalog catalog = catalogService.getFullCatalog();
- Plan plan = transition.getNextPlan();
+ Plan plan = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+ transition.getNextPlan() : transition.getPreviousPlan();
Product product = plan.getProduct();
- PlanPhase phase = transition.getNextPhase();
-
+ PlanPhase phase = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+ transition.getNextPhase() : transition.getPreviousPhase();
+
BillingAlignment alignment = catalog.billingAlignment(
new PlanPhaseSpecifier(product.getName(),
- product.getCategory(),
- phase.getBillingPeriod(),
- transition.getNextPriceList(),
- phase.getPhaseType()),
+ product.getCategory(),
+ phase.getBillingPeriod(),
+ transition.getNextPriceList(),
+ phase.getPhaseType()),
transition.getRequestedTransitionTime());
int result = 0;
Account account = accountApi.getAccountById(accountId);
switch (alignment) {
- case ACCOUNT :
+ case ACCOUNT :
result = account.getBillCycleDay();
break;
- case BUNDLE :
+ case BUNDLE :
SubscriptionBundle bundle = dao.getSubscriptionBundleFromId(transition.getBundleId());
//TODO result = bundle.getStartDate().toDateTime(account.getTimeZone()).getDayOfMonth();
result = bundle.getStartDate().getDayOfMonth();
@@ -131,9 +134,9 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
throw new CatalogApiException(ErrorCode.CAT_INVALID_BILLING_ALIGNMENT, alignment.toString());
}
return result;
-
+
}
-
+
@Override
public void setChargedThroughDate(final UUID subscriptionId, final DateTime ctd) {
SubscriptionData subscription = (SubscriptionData) dao.getSubscriptionFromId(subscriptionId);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java b/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
index 9a4c13b..b1e2fa9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
@@ -34,7 +34,7 @@ public class DateRange {
*/
public boolean contains(DateTime date) {
if (endDate == null) {
- return date.compareTo(startDate) == 0;
+ return date.compareTo(startDate) >= 0;
}
return !date.isBefore(startDate) && !date.isAfter(endDate);
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 a8b7c88..c83be80 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
@@ -214,6 +214,7 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
event.getPlan().getName(), event.getPlanPhase().getName(), event.getEffectiveDate(),
billThroughDate, amount, rate, fixedAmount, currency);
items.add(item);
+ System.out.println(item);
}
private BigDecimal calculateNumberOfBillingPeriods(final BillingEvent event, final DateTime targetDate){
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java
index 439833a..1c1cdef 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java
@@ -36,7 +36,7 @@ public class DefaultInvoiceItem implements InvoiceItem {
private DateTime endDate;
private BigDecimal recurringAmount;
private final BigDecimal recurringRate;
- private BigDecimal fixedAmount;
+ private final BigDecimal fixedAmount;
private final Currency currency;
public DefaultInvoiceItem(UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
@@ -223,7 +223,7 @@ public class DefaultInvoiceItem implements InvoiceItem {
if ((value1 != null) && (value2 == null)) {return false;}
if ((value1 != null) && (value2 != null)) {
- if (!value1.equals(value2)) {return false;}
+ if (value1.compareTo(value2) != 0) {return false;}
}
return true;
@@ -271,7 +271,11 @@ public class DefaultInvoiceItem implements InvoiceItem {
sb.append("planName = ").append(planName).append(", ");
sb.append("phaseName = ").append(phaseName).append(", ");
sb.append("startDate = ").append(startDate.toString()).append(", ");
- sb.append("endDate = ").append(startDate.toString()).append(", ");
+ if (endDate != null) {
+ sb.append("endDate = ").append(endDate.toString()).append(", ");
+ } else {
+ sb.append("endDate = null");
+ }
sb.append("recurringAmount = ");
if (recurringAmount == null) {
sb.append("null");