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 1dd9003..44d7fe9 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
@@ -166,9 +166,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
}
final SubscriptionBaseTransition pendingTransition = getPendingTransition();
- if (pendingTransition != null &&
- (pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.CREATE) ||
- pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.TRANSFER))) {
+ if (pendingTransition != null) {
return EntitlementState.PENDING;
}
throw new IllegalStateException("Should return a valid EntitlementState");
@@ -198,6 +196,15 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
: getPreviousTransition().getNextPhase();
}
+ public PlanPhase getCurrentOrPendingPhase() {
+ if (getState() == EntitlementState.PENDING) {
+ return getPendingTransition().getNextPhase();
+ } else {
+ return getCurrentPhase();
+ }
+ }
+
+
@Override
public Plan getCurrentPlan() {
return (getPreviousTransition() == null) ? null
@@ -293,7 +300,21 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
final SubscriptionBaseTransitionDataIterator it = new SubscriptionBaseTransitionDataIterator(
clock, transitions, Order.ASC_FROM_PAST,
Visibility.ALL, TimeLimit.FUTURE_ONLY);
- return it.hasNext() ? it.next() : null;
+
+ final SubscriptionBaseTransition initialPendingTransition = it.hasNext() ? it.next() : null;
+
+ // If we have multiple change aligning on the startDate we return the latest to ensure that we get access to right Plan
+ // TODO : However, this means this initial PENDING transition could be a CHANGE (which could confuse some clients, unclear)
+ SubscriptionBaseTransition result = initialPendingTransition;
+ while (it.hasNext()) {
+ final SubscriptionBaseTransition next = it.next();
+ if (next.getTransitionType() == SubscriptionBaseTransitionType.CHANGE && initialPendingTransition.getEffectiveTransitionTime().compareTo(next.getEffectiveTransitionTime()) == 0) {
+ result = next;
+ } else {
+ break;
+ }
+ }
+ return result;
}
@Override