killbill-aplcache
Changes
subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java 2(+1 -1)
subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java 18(+16 -2)
Details
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
index 4b17ee0..a7354f3 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
@@ -619,7 +619,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
switch (plan.getProduct().getCategory()) {
case BASE:
if (baseSubscription != null &&
- baseSubscription.getState() == EntitlementState.ACTIVE) {
+ (baseSubscription.getState() == EntitlementState.ACTIVE || baseSubscription.getState() == EntitlementState.PENDING)) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_BP_EXISTS, bundleId);
}
return effectiveDate;
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 6f04266..e365246 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
@@ -139,8 +139,22 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
@Override
public EntitlementState getState() {
- return (getPreviousTransition() == null) ? null
- : getPreviousTransition().getNextState();
+
+ final SubscriptionBaseTransition previousTransition = getPreviousTransition();
+ if (previousTransition != null) {
+ return previousTransition.getNextState();
+ }
+
+ final SubscriptionBaseTransition pendingTransition = getPendingTransition();
+ if (pendingTransition != null &&
+ (pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.CREATE) ||
+ pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.TRANSFER) ||
+ pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.MIGRATE_BILLING) ||
+ pendingTransition.getTransitionType().equals(SubscriptionBaseTransitionType.RE_CREATE))) {
+ return EntitlementState.PENDING;
+ }
+
+ throw new IllegalStateException("Should return a valid EntitlementState");
}
@Override
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
index b12935f..6a42db1 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
@@ -211,7 +211,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
@Override
public boolean cancel(final DefaultSubscriptionBase subscription, final CallContext context) throws SubscriptionBaseApiException {
final EntitlementState currentState = subscription.getState();
- if (currentState != null && currentState != EntitlementState.ACTIVE) {
+ if (currentState == EntitlementState.CANCELLED) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
}
final DateTime now = clock.getUTCNow();
@@ -237,7 +237,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
@Override
public boolean cancelWithRequestedDate(final DefaultSubscriptionBase subscription, final DateTime requestedDateWithMs, final CallContext context) throws SubscriptionBaseApiException {
final EntitlementState currentState = subscription.getState();
- if (currentState != null && currentState != EntitlementState.ACTIVE) {
+ if (currentState == EntitlementState.CANCELLED) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
}
final DateTime now = clock.getUTCNow();
@@ -250,7 +250,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
@Override
public boolean cancelWithPolicy(final DefaultSubscriptionBase subscription, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
final EntitlementState currentState = subscription.getState();
- if (currentState != null && currentState != EntitlementState.ACTIVE) {
+ if (currentState == EntitlementState.CANCELLED) {
throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java
index d85336b..816ba9f 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java
@@ -27,6 +27,7 @@ import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PriceListSet;
import org.killbill.billing.catalog.api.ProductCategory;
+import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
import org.killbill.billing.subscription.DefaultSubscriptionTestInitializer;
import org.killbill.billing.subscription.SubscriptionTestSuiteWithEmbeddedDB;
import org.killbill.billing.subscription.events.SubscriptionBaseEvent;
@@ -265,4 +266,30 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
assertListenerStatus();
}
+
+
+ @Test(groups = "slow")
+ public void testCreateSubscriptionInTheFuture() throws SubscriptionBaseApiException {
+ final DateTime init = clock.getUTCNow();
+
+ final String productName = "Shotgun";
+ final BillingPeriod term = BillingPeriod.MONTHLY;
+ final String planSetName = PriceListSet.DEFAULT_PRICELIST_NAME;
+
+
+ final DateTime futureCreationDate = init.plusDays(10);
+
+ DefaultSubscriptionBase subscription = (DefaultSubscriptionBase) subscriptionInternalApi.createSubscription(bundle.getId(),
+ testUtil.getProductSpecifier(productName, planSetName, term, null), null, futureCreationDate, internalCallContext);
+ assertListenerStatus();
+ assertNotNull(subscription);
+ assertEquals(subscription.getState(), EntitlementState.PENDING);
+
+ testListener.pushExpectedEvent(NextEvent.CREATE);
+ clock.addDays(10);
+ assertListenerStatus();
+
+ subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
+ assertEquals(subscription.getState(), EntitlementState.ACTIVE);
+ }
}