killbill-memoizeit

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/AccountMigrationData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/AccountMigrationData.java
index 560516e..4949d4b 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/AccountMigrationData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/AccountMigrationData.java
@@ -18,6 +18,8 @@ package com.ning.billing.entitlement.api.migration;
 
 import java.util.List;
 
+import org.joda.time.DateTime;
+
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory.SubscriptionBuilder;
 import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
@@ -64,14 +66,13 @@ public class AccountMigrationData {
         private final List<EntitlementEvent> initialEvents;
 
         public SubscriptionMigrationData(final SubscriptionData data,
-                                         final List<EntitlementEvent> initialEvents) {
+                                         final List<EntitlementEvent> initialEvents,
+                                         final DateTime ctd) {
             super();
             // Set CTD to subscription object from MIGRATION_BILLING event
             final SubscriptionBuilder builder = new SubscriptionBuilder(data);
-            for (final EntitlementEvent cur : initialEvents) {
-                if (cur instanceof ApiEventMigrateBilling) {
-                    builder.setChargedThroughDate(cur.getEffectiveDate());
-                }
+            if (ctd != null) {
+                builder.setChargedThroughDate(ctd);
             }
             this.data = new SubscriptionData(builder);
             this.initialEvents = initialEvents;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
index 21f7e7a..1ea22b7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
@@ -142,7 +142,7 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
                                                                                      .setBundleStartDate(migrationStartDate)
                                                                                      .setAlignStartDate(migrationStartDate),
                                                                              emptyEvents);
-        return new SubscriptionMigrationData(subscriptionData, toEvents(subscriptionData, now, ctd, events, context));
+        return new SubscriptionMigrationData(subscriptionData, toEvents(subscriptionData, now, ctd, events, context), ctd);
     }
 
     private SubscriptionMigrationData createSubscriptionMigrationDataWithBundleDate(final UUID bundleId, final ProductCategory productCategory,
@@ -158,12 +158,13 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
                                                                                      .setBundleStartDate(bundleStartDate)
                                                                                      .setAlignStartDate(migrationStartDate),
                                                                              emptyEvents);
-        return new SubscriptionMigrationData(subscriptionData, toEvents(subscriptionData, now, ctd, events, context));
+        return new SubscriptionMigrationData(subscriptionData, toEvents(subscriptionData, now, ctd, events, context), ctd);
     }
 
     private List<EntitlementEvent> toEvents(final SubscriptionData subscriptionData, final DateTime now, final DateTime ctd, final TimedMigration[] migrationEvents, final CallContext context) {
         ApiEventMigrateEntitlement creationEvent = null;
         final List<EntitlementEvent> events = new ArrayList<EntitlementEvent>(migrationEvents.length);
+        DateTime subsciptionCancelledDate = null;
         for (final TimedMigration cur : migrationEvents) {
 
             if (cur.getEventType() == EventType.PHASE) {
@@ -194,6 +195,7 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
                         events.add(new ApiEventChange(builder));
                         break;
                     case CANCEL:
+                        subsciptionCancelledDate = cur.getEventTime();
                         events.add(new ApiEventCancel(builder));
                         break;
                     default:
@@ -206,7 +208,9 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
         if (creationEvent == null || ctd == null) {
             throw new EntitlementError(String.format("Could not create migration billing event ctd = %s", ctd));
         }
-        events.add(new ApiEventMigrateBilling(creationEvent, ctd));
+        if (subsciptionCancelledDate == null || subsciptionCancelledDate.isAfter(ctd)) {
+            events.add(new ApiEventMigrateBilling(creationEvent, ctd));
+        }
         Collections.sort(events, new Comparator<EntitlementEvent>() {
             int compForApiType(final EntitlementEvent o1, final EntitlementEvent o2, final ApiEventType type) {
                 ApiEventType apiO1 = null;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/transfer/DefaultEntitlementTransferApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/transfer/DefaultEntitlementTransferApi.java
index b3f5277..bacb6f6 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/transfer/DefaultEntitlementTransferApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/transfer/DefaultEntitlementTransferApi.java
@@ -253,7 +253,7 @@ public class DefaultEntitlementTransferApi implements EntitlementTransferApi {
                 ImmutableList.<EntitlementEvent>of());
 
                 final List<EntitlementEvent> events = toEvents(existingEvents, subscriptionData, effectiveTransferDate, context);
-                final SubscriptionMigrationData curData = new SubscriptionMigrationData(subscriptionData, events);
+                final SubscriptionMigrationData curData = new SubscriptionMigrationData(subscriptionData, events, null);
                 subscriptionMigrationDataList.add(curData);
             }
             BundleMigrationData bundleMigrationData = new BundleMigrationData(subscriptionBundleData, subscriptionMigrationDataList);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java
index 2d2a451..0e6bfe2 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java
@@ -153,7 +153,8 @@ public abstract class TestMigration extends TestApiBase {
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-annual");
             assertEquals(subscription.getChargedThroughDate(), startDate.plusYears(1));
 
-            testListener.pushExpectedEvent(NextEvent.MIGRATE_BILLING);
+            // The MIGRATE_BILLING will not be there because the subscription is cancelled at the same date so no BILLING should occur
+            //testListener.pushExpectedEvent(NextEvent.MIGRATE_BILLING);
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
             final Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusYears(1));