killbill-memoizeit

junction: Additional cleanup into DefaultBillingEvent (remove

3/8/2019 4:10:48 PM

Details

diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
index 8452ca2..391dbfe 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
@@ -254,7 +254,7 @@ public class BlockingCalculator {
         final SubscriptionBaseTransitionType type = SubscriptionBaseTransitionType.START_BILLING_DISABLED;
         final Long totalOrdering = globaltotalOrder.getAndIncrement();
 
-        return new DefaultBillingEvent(((DefaultBillingEvent) previousEvent).getSubscription(), effectiveDate, true, plan, planPhase, fixedPrice, recurringPrice,
+        return new DefaultBillingEvent(((DefaultBillingEvent) previousEvent).getSubscription(), effectiveDate, plan, planPhase, fixedPrice, recurringPrice,
                                        currency,
                                        billingPeriod, billCycleDay,
                                        description, totalOrdering, type, true);
@@ -274,7 +274,7 @@ public class BlockingCalculator {
         final SubscriptionBaseTransitionType type = SubscriptionBaseTransitionType.END_BILLING_DISABLED;
         final Long totalOrdering = globaltotalOrder.getAndIncrement();
 
-        return new DefaultBillingEvent(((DefaultBillingEvent) previousEvent).getSubscription(), effectiveDate, true, plan, planPhase, fixedPrice, recurringPrice,
+        return new DefaultBillingEvent(((DefaultBillingEvent) previousEvent).getSubscription(), effectiveDate, plan, planPhase, fixedPrice, recurringPrice,
                                        currency,
                                        billingPeriod, billCycleDay,
                                        description, totalOrdering, type, false);
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
index 628ad61..bd977db 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
@@ -22,8 +22,6 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.joda.time.DateTime;
 import org.killbill.billing.catalog.api.BillingAlignment;
 import org.killbill.billing.catalog.api.BillingPeriod;
@@ -38,6 +36,7 @@ import org.killbill.billing.subscription.api.SubscriptionBase;
 import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
 import org.killbill.billing.subscription.api.user.SubscriptionBillingEvent;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
@@ -64,7 +63,7 @@ public class DefaultBillingEvent implements BillingEvent {
 
     private final List<Usage> usages;
 
-    private final boolean isDisableEvent;
+    private final boolean isCancelledOrBlocked;
 
     private final DateTime catalogEffectiveDate;
 
@@ -72,44 +71,41 @@ public class DefaultBillingEvent implements BillingEvent {
     // TODO Ugly, can that go completely ?
     private final SubscriptionBase subscription;
 
-    public DefaultBillingEvent(final SubscriptionBillingEvent transition,
+    public DefaultBillingEvent(final SubscriptionBillingEvent inputEvent,
                                final SubscriptionBase subscription,
                                final int billCycleDayLocal,
                                final BillingAlignment billingAlignment,
                                final Currency currency,
                                final Catalog catalog) throws CatalogApiException {
-        final boolean isActive = transition.getType() != SubscriptionBaseTransitionType.CANCEL;
 
         this.subscription = subscription;
 
         this.subscriptionId = subscription.getId();
         this.bundleId = subscription.getBundleId();
 
-        this.type = transition.getType();
-        this.plan = transition.getPlanName() != null ? catalog.findPlan(transition.getPlanName(), transition.getEffectiveDate(), subscription.getStartDate()) : null;
-        this.planPhase = transition.getPlanPhaseName() != null && this.plan != null ?  this.plan.findPhase(transition.getPlanPhaseName()) : null;
-        this.billingPeriod = getRecurringBillingPeriod(planPhase);
+        this.isCancelledOrBlocked = inputEvent.getType() == SubscriptionBaseTransitionType.CANCEL;
+
+        this.type = inputEvent.getType();
+        this.plan = catalog.findPlan(inputEvent.getPlanName(), inputEvent.getEffectiveDate(), subscription.getStartDate());
+        this.planPhase = this.plan.findPhase(inputEvent.getPlanPhaseName());
 
-        this.catalogEffectiveDate = plan == null ? null : new DateTime(plan.getCatalog().getEffectiveDate());
+        this.catalogEffectiveDate = new DateTime(plan.getCatalog().getEffectiveDate());
 
+        this.currency = currency;
         this.billCycleDayLocal = billCycleDayLocal;
         this.billingAlignment = billingAlignment;
-        this.currency = currency;
-        this.description = transition.getType().toString();
-        this.effectiveDate = transition.getEffectiveDate();
-        this.isDisableEvent = false;
-        this.totalOrdering = transition.getTotalOrdering();
-        this.usages = initializeUsage(isActive);
+        this.description = inputEvent.getType().toString();
+        this.effectiveDate = inputEvent.getEffectiveDate();
+        this.totalOrdering = inputEvent.getTotalOrdering();
 
+        this.billingPeriod = computeRecurringBillingPeriod();
         this.fixedPrice =  computeFixedPrice();
         this.recurringPrice = computeRecurringPrice();
-
-
+        this.usages = computeUsages();
     }
 
     public DefaultBillingEvent(final SubscriptionBase subscription,
                                final DateTime effectiveDate,
-                               final boolean isActive,
                                final Plan plan,
                                final PlanPhase planPhase,
                                final BigDecimal fixedPrice,
@@ -124,22 +120,25 @@ public class DefaultBillingEvent implements BillingEvent {
 
         this.subscription = subscription;
 
+
         this.subscriptionId = subscription.getId();
         this.bundleId = subscription.getBundleId();
         this.effectiveDate = effectiveDate;
+
+        this.isCancelledOrBlocked = isDisableEvent;
+
         this.plan = plan;
         this.planPhase = planPhase;
+        this.billingPeriod = billingPeriod;
         this.fixedPrice = fixedPrice;
         this.recurringPrice = recurringPrice;
         this.currency = currency;
-        this.billingPeriod = billingPeriod;
         this.billCycleDayLocal = billCycleDayLocal;
         this.description = description;
         this.type = type;
         this.totalOrdering = totalOrdering;
-        this.usages = initializeUsage(isActive);
-        this.isDisableEvent = isDisableEvent;
-        this.catalogEffectiveDate = plan != null ? new DateTime(plan.getCatalog().getEffectiveDate()) : null;
+        this.usages = computeUsages();
+        this.catalogEffectiveDate = new DateTime(plan.getCatalog().getEffectiveDate());
         this.billingAlignment = null;
     }
 
@@ -353,33 +352,30 @@ public class DefaultBillingEvent implements BillingEvent {
     }
 
     private BigDecimal computeFixedPrice() throws CatalogApiException {
-        if (type == SubscriptionBaseTransitionType.BCD_CHANGE || type == SubscriptionBaseTransitionType.CANCEL) {
+        if (isCancelledOrBlocked ||
+            type == SubscriptionBaseTransitionType.BCD_CHANGE /* We don't want to bill twice for the same fixed price */) {
             return null;
         }
-        return (planPhase != null && planPhase.getFixed() != null && planPhase.getFixed().getPrice() != null) ? planPhase.getFixed().getPrice().getPrice(currency) : null;
+        return (planPhase.getFixed() != null && planPhase.getFixed().getPrice() != null) ? planPhase.getFixed().getPrice().getPrice(currency) : null;
     }
 
     private BigDecimal computeRecurringPrice() throws CatalogApiException {
-        // TODO why is logic different than fixedPrice ?
-        if (isDisableEvent || type == SubscriptionBaseTransitionType.CANCEL) {
+        if (isCancelledOrBlocked) {
             return null;
         }
-        return (planPhase != null && planPhase.getRecurring() != null && planPhase.getRecurring().getRecurringPrice() != null) ? planPhase.getRecurring().getRecurringPrice().getPrice(currency) : null;
+        return (planPhase.getRecurring() != null && planPhase.getRecurring().getRecurringPrice() != null) ? planPhase.getRecurring().getRecurringPrice().getPrice(currency) : null;
     }
 
-    private BillingPeriod getRecurringBillingPeriod(@Nullable final PlanPhase nextPhase) {
-        if (nextPhase == null) {
-            return BillingPeriod.NO_BILLING_PERIOD;
-        }
-        return nextPhase.getRecurring() != null ? nextPhase.getRecurring().getBillingPeriod() : BillingPeriod.NO_BILLING_PERIOD;
+    private BillingPeriod computeRecurringBillingPeriod() {
+        return planPhase.getRecurring() != null ? planPhase.getRecurring().getBillingPeriod() : BillingPeriod.NO_BILLING_PERIOD;
     }
 
-    private List<Usage> initializeUsage(final boolean isActive) {
+    private List<Usage> computeUsages() {
         List<Usage> result = ImmutableList.<Usage>of();
-        if (!isActive) {
+        if (isCancelledOrBlocked) {
             return result;
         }
-        if (planPhase != null && planPhase.getUsages().length > 0) {
+        if (planPhase.getUsages().length > 0) {
             result = Lists.newArrayList();
             for (Usage usage : planPhase.getUsages()) {
                 result.add(usage);
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
index cbdd84f..a583d92 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
@@ -114,10 +114,10 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
     public void testInsertBlockingEventsForBundle() throws CatalogApiException {
         final DateTime now = clock.getUTCNow();
 
-        final BillingEvent A = createRealEvent(now.minusDays(1).minusHours(1), subscription1);
-        final BillingEvent B = createRealEvent(now.minusDays(1), subscription2);
-        final BillingEvent C = createRealEvent(now.plusDays(1), subscription2);
-        final BillingEvent D = createRealEvent(now.plusDays(3), subscription3);
+        final BillingEvent A = createRealEvent(subscription1, now.minusDays(1).minusHours(1));
+        final BillingEvent B = createRealEvent(subscription2, now.minusDays(1));
+        final BillingEvent C = createRealEvent(subscription2, now.plusDays(1));
+        final BillingEvent D = createRealEvent(subscription3, now.plusDays(3));
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
         billingEvents.add(A);
         billingEvents.add(B);
@@ -161,7 +161,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.minusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.eventsToRemove(disabledDuration, billingEvents);
 
@@ -177,8 +177,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        final BillingEvent e1 = createRealEvent(now.minusDays(1), subscription1);
-        final BillingEvent e2 = createRealEvent(now.plusDays(1), subscription1);
+        final BillingEvent e1 = createRealEvent(subscription1, now.minusDays(1));
+        final BillingEvent e2 = createRealEvent(subscription1, now.plusDays(1));
         billingEvents.add(e1);
         billingEvents.add(e2);
 
@@ -197,7 +197,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        final BillingEvent e1 = createRealEvent(now.plusDays(1), subscription1);
+        final BillingEvent e1 = createRealEvent(subscription1, now.plusDays(1));
         billingEvents.add(e1);
 
         final SortedSet<BillingEvent> results = blockingCalculator.eventsToRemove(disabledDuration, billingEvents);
@@ -215,7 +215,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        final BillingEvent e1 = createRealEvent(now, subscription1);
+        final BillingEvent e1 = createRealEvent(subscription1, now);
         billingEvents.add(e1);
 
         final SortedSet<BillingEvent> results = blockingCalculator.eventsToRemove(disabledDuration, billingEvents);
@@ -233,7 +233,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        final BillingEvent e1 = createRealEvent(now.minusDays(1), subscription1);
+        final BillingEvent e1 = createRealEvent(subscription1, now.minusDays(1));
         billingEvents.add(e1);
 
         final SortedSet<BillingEvent> results = blockingCalculator.eventsToRemove(disabledDuration, billingEvents);
@@ -250,8 +250,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        final BillingEvent e1 = createRealEvent(now.minusDays(1), subscription1);
-        final BillingEvent e2 = createRealEvent(now.plusDays(1), subscription1);
+        final BillingEvent e1 = createRealEvent(subscription1, now.minusDays(1));
+        final BillingEvent e2 = createRealEvent(subscription1, now.plusDays(1));
         billingEvents.add(e1);
         billingEvents.add(e2);
 
@@ -270,9 +270,9 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        final BillingEvent e1 = createRealEvent(now.minusDays(1), subscription1);
-        final BillingEvent e2 = createRealEvent(now.plusDays(1), subscription1);
-        final BillingEvent e3 = createRealEvent(now.plusDays(3), subscription1);
+        final BillingEvent e1 = createRealEvent(subscription1, now.minusDays(1));
+        final BillingEvent e2 = createRealEvent(subscription1, now.plusDays(1));
+        final BillingEvent e3 = createRealEvent(subscription1, now.plusDays(3));
         billingEvents.add(e1);
         billingEvents.add(e2);
         billingEvents.add(e3);
@@ -292,7 +292,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        final BillingEvent e2 = createRealEvent(now.plusDays(1), subscription1);
+        final BillingEvent e2 = createRealEvent(subscription1, now.plusDays(1));
         billingEvents.add(e2);
 
         final SortedSet<BillingEvent> results = blockingCalculator.eventsToRemove(disabledDuration, billingEvents);
@@ -311,8 +311,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
 
-        final BillingEvent e2 = createRealEvent(now.plusDays(1), subscription1);
-        final BillingEvent e3 = createRealEvent(now.plusDays(3), subscription1);
+        final BillingEvent e2 = createRealEvent(subscription1, now.plusDays(1));
+        final BillingEvent e3 = createRealEvent(subscription1, now.plusDays(3));
         billingEvents.add(e2);
         billingEvents.add(e3);
 
@@ -332,7 +332,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
 
-        final BillingEvent e3 = createRealEvent(now.plusDays(3), subscription1);
+        final BillingEvent e3 = createRealEvent(subscription1, now.plusDays(3));
 
         billingEvents.add(e3);
 
@@ -350,7 +350,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.minusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext),  internalCallContext);
 
@@ -371,8 +371,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
-        billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.minusDays(1)));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -393,7 +393,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -409,7 +409,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, null));
-        billingEvents.add(createRealEvent(now, subscription1));
+        billingEvents.add(createRealEvent(subscription1, now));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -425,7 +425,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.minusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -450,8 +450,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
-        billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.minusDays(1)));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -475,9 +475,9 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
-        billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
-        billingEvents.add(createRealEvent(now.plusDays(3), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.minusDays(1)));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(1)));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(3)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -501,7 +501,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -520,7 +520,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(1)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -539,7 +539,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
 
         disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
-        billingEvents.add(createRealEvent(now.plusDays(3), subscription1));
+        billingEvents.add(createRealEvent(subscription1, now.plusDays(3)));
 
         final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, catalogInternalApi.getFullCatalog(true, true, internalCallContext), internalCallContext);
 
@@ -552,10 +552,10 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
 
         final SortedSet<BillingEvent> events = new TreeSet<BillingEvent>();
 
-        events.add(createRealEvent(now.minusDays(10), subscription1));
-        events.add(createRealEvent(now.minusDays(6), subscription1));
-        events.add(createRealEvent(now.minusDays(5), subscription1));
-        events.add(createRealEvent(now.minusDays(1), subscription1));
+        events.add(createRealEvent(subscription1, now.minusDays(10)));
+        events.add(createRealEvent(subscription1, now.minusDays(6)));
+        events.add(createRealEvent(subscription1, now.minusDays(5)));
+        events.add(createRealEvent(subscription1, now.minusDays(1)));
 
         final BillingEvent minus11 = blockingCalculator.precedingBillingEventForSubscription(now.minusDays(11), events);
         assertNull(minus11);
@@ -590,7 +590,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
     @Test(groups = "fast")
     public void testCreateNewDisableEvent() throws CatalogApiException {
         final DateTime now = clock.getUTCNow();
-        final BillingEvent event = new MockBillingEvent();
+
+        final BillingEvent event = createRealEvent(subscription1, now);
 
         final BillingEvent result = blockingCalculator.createNewDisableEvent(now, event, null);
         assertEquals(result.getBillCycleDayLocal(), event.getBillCycleDayLocal());
@@ -610,7 +611,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
     @Test(groups = "fast")
     public void testCreateNewReenableEvent() throws CatalogApiException {
         final DateTime now = clock.getUTCNow();
-        final BillingEvent event = new MockBillingEvent();
+        final BillingEvent event = createRealEvent(subscription1, now);
 
         final BillingEvent result = blockingCalculator.createNewReenableEvent(now, event, null, internalCallContext);
         assertEquals(result.getBillCycleDayLocal(), event.getBillCycleDayLocal());
@@ -627,14 +628,6 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         assertEquals(result.getTotalOrdering(), (Long) (BlockingCalculator.getGlobalTotalOrder().get() - 1));
     }
 
-    private class MockBillingEvent extends DefaultBillingEvent {
-
-        public MockBillingEvent() throws CatalogApiException {
-            super(subscription1, clock.getUTCNow(), true, null, null, BigDecimal.ZERO, BigDecimal.ZERO, Currency.USD, BillingPeriod.ANNUAL,
-                  4, "", 3L, SubscriptionBaseTransitionType.CREATE, false);
-        }
-    }
-
     @Test(groups = "fast")
     public void testCreateBundleSubscriptionMap() {
         final SortedSet<BillingEvent> events = new TreeSet<BillingEvent>();
@@ -828,7 +821,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
         return createRealEvent( subscription, new DateTime(), SubscriptionBaseTransitionType.CREATE, totalOrdering);
     }
 
-    protected BillingEvent createRealEvent(final DateTime effectiveDate, final SubscriptionBase subscription) {
+    protected BillingEvent createRealEvent(final SubscriptionBase subscription, final DateTime effectiveDate) {
         return createRealEvent(subscription, effectiveDate, SubscriptionBaseTransitionType.CHANGE);
     }
 
@@ -859,7 +852,6 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
 
             return new DefaultBillingEvent(subscription,
                                            effectiveDate,
-                                           true,
                                            plan,
                                            planPhase,
                                            fixedPrice,
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
index 8aeab7e..9ae56ef 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
@@ -184,7 +184,7 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
         final Plan shotgun = new MockPlan();
         final PlanPhase shotgunMonthly = createMockMonthlyPlanPhase(null, BigDecimal.ZERO, PhaseType.TRIAL);
 
-        return new DefaultBillingEvent(sub, effectiveDate, true,
+        return new DefaultBillingEvent(sub, effectiveDate,
                                        shotgun, shotgunMonthly, BigDecimal.ZERO, BigDecimal.ZERO,
                                        Currency.USD, BillingPeriod.NO_BILLING_PERIOD, billCycleDay,
                                        "Test Event 1", totalOrdering, type, false);
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java
index 6ae9725..51f271a 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java
@@ -74,4 +74,17 @@ public class DefaultSubscriptionBillingEvent implements SubscriptionBillingEvent
     public Integer getBcdLocal() {
         return bcdLocal;
     }
+
+    @Override
+    public String toString() {
+        return "DefaultSubscriptionBillingEvent{" +
+               "type=" + type +
+               ", planName='" + planName + '\'' +
+               ", planPhaseName='" + planPhaseName + '\'' +
+               ", effectiveDate=" + effectiveDate +
+               ", totalOrdering=" + totalOrdering +
+               ", lastChangePlanDate=" + lastChangePlanDate +
+               ", bcdLocal=" + bcdLocal +
+               '}';
+    }
 }