killbill-memoizeit

subscription: fix handling of CHANGE_OF_PLAN alignment in

1/21/2015 7:02:04 PM

Details

diff --git a/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java b/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java
index 345388f..16a32fa 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/alignment/PlanAligner.java
@@ -151,7 +151,7 @@ public class PlanAligner extends BaseAligner {
      */
     public TimedPhase getNextTimedPhase(final DefaultSubscriptionBase subscription, final DateTime requestedDate, final DateTime effectiveDate, final InternalTenantContext context) {
         try {
-            final SubscriptionBaseTransitionData lastPlanTransition = subscription.getInitialTransitionForCurrentPlan();
+            final SubscriptionBaseTransitionData lastPlanTransition = subscription.getLastTransitionForCurrentPlan();
             if (effectiveDate.isBefore(lastPlanTransition.getEffectiveTransitionTime())) {
                 throw new SubscriptionBaseError(String.format("Cannot specify an effectiveDate prior to last Plan Change, subscription = %s, effectiveDate = %s",
                                                          subscription.getId(), effectiveDate));
@@ -182,6 +182,7 @@ public class PlanAligner extends BaseAligner {
                                                  lastPlanTransition.getNextPriceList().getName(),
                                                  requestedDate,
                                                  effectiveDate,
+                                                 lastPlanTransition.getEffectiveTransitionTime(),
                                                  WhichPhase.NEXT,
                                                  context);
                 default:
@@ -240,6 +241,8 @@ public class PlanAligner extends BaseAligner {
                                      nextPriceList,
                                      requestedDate,
                                      effectiveDate,
+                                     // This method is only called while doing the change, hence we want to pass the change effective date
+                                     effectiveDate,
                                      which,
                                      context);
     }
@@ -253,6 +256,7 @@ public class PlanAligner extends BaseAligner {
                                              final String priceList,
                                              final DateTime requestedDate,
                                              final DateTime effectiveDate,
+                                             final DateTime lastOrCurrentChangeEffectiveDate,
                                              final WhichPhase which,
                                              final InternalTenantContext context) throws CatalogApiException, SubscriptionBaseApiException {
         final Catalog catalog = catalogService.getFullCatalog(context);
@@ -278,7 +282,7 @@ public class PlanAligner extends BaseAligner {
                 planStartDate = bundleStartDate;
                 break;
             case CHANGE_OF_PLAN:
-                planStartDate = effectiveDate;
+                planStartDate = lastOrCurrentChangeEffectiveDate;
                 break;
             case CHANGE_OF_PRICELIST:
                 throw new SubscriptionBaseError(String.format("Not implemented yet %s", alignment));
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
index 2f46463..3f2f06b 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
@@ -457,7 +457,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     }
 
 
-    public SubscriptionBaseTransitionData getInitialTransitionForCurrentPlan() {
+    public SubscriptionBaseTransitionData getLastTransitionForCurrentPlan() {
         if (transitions == null) {
             throw new SubscriptionBaseError(String.format("No transitions for subscription %s", getId()));
         }