killbill-aplcache

#545 - Added new control of the attribute plansAllowedInBundle,

8/30/2016 1:38:31 PM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
index 8a9a799..30fccac 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
@@ -41,6 +41,7 @@ import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
 
 import org.joda.time.LocalDate;
+import org.killbill.billing.ErrorCode;
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountApiException;
@@ -63,6 +64,7 @@ import org.killbill.billing.entitlement.api.Subscription;
 import org.killbill.billing.entitlement.api.SubscriptionApi;
 import org.killbill.billing.entitlement.api.SubscriptionApiException;
 import org.killbill.billing.entitlement.api.SubscriptionBundle;
+import org.killbill.billing.entitlement.api.SubscriptionEvent;
 import org.killbill.billing.events.BlockingTransitionInternalEvent;
 import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
 import org.killbill.billing.events.InvoiceCreationInternalEvent;
@@ -202,6 +204,21 @@ public class SubscriptionResource extends JaxRsResourceBase {
                                                 new PlanPhaseSpecifier(entitlement.getProductName(),
                                                                        BillingPeriod.valueOf(entitlement.getBillingPeriod()), entitlement.getPriceList(), phaseType);
 
+                // verify the number of subscriptions (of the same kind) allowed per bundle
+                if (createAddOnEntitlement) {
+                    String currentPlanName = entitlement.getPlanName() != null ? entitlement.getPlanName() :
+                                             entitlement.getProductName() + "-" + entitlement.getBillingPeriod();
+                    int existingSubscriptions = countExistingAddOnsWithSamePlanName(
+                            subscriptionApi.getSubscriptionBundle(getBundleIdForAddOnCreation(entitlement), callContext).getSubscriptions(), currentPlanName);
+                    Entitlement entitlementForId = entitlementApi.getEntitlementForId(getBundleIdForAddOnCreation(entitlement), callContext);
+                    if (entitlementForId.getLastActivePlan() != null
+                            && entitlementForId.getLastActivePlan().getPlansAllowedInBundle() != -1
+                            && existingSubscriptions == entitlementForId.getLastActivePlan().getPlansAllowedInBundle()) {
+                        // a new ADD_ON subscription of the same plan can't be added because it has reached its limit by bundle
+                        throw new EntitlementApiException(ErrorCode.SUB_CREATE_AO_MAX_PLAN_ALLOWED_BY_BUNDLE, currentPlanName);
+                    }
+                }
+
                 final LocalDate resolvedEntitlementDate = requestedDate != null ? toLocalDate(requestedDate) : toLocalDate(entitlementDate);
                 final LocalDate resolvedBillingDate = requestedDate != null ? toLocalDate(requestedDate) : toLocalDate(billingDate);
                 final List<PlanPhasePriceOverride> overrides = PhasePriceOverrideJson.toPlanPhasePriceOverrides(entitlement.getPriceOverrides(), spec, account.getCurrency());
@@ -239,6 +256,27 @@ public class SubscriptionResource extends JaxRsResourceBase {
         return callCompletionCreation.withSynchronization(callback, timeoutSec, callCompletion, callContext);
     }
 
+    private int countExistingAddOnsWithSamePlanName(final List<Subscription> subscriptionsForBundle, final String planName) {
+        int countExistingAddOns = 0;
+        for (Subscription subscription : subscriptionsForBundle) {
+            if (getSubscriptionPlanName(subscription).equalsIgnoreCase(planName)
+                    && subscription.getLastActiveProductCategory() != null
+                    && ProductCategory.ADD_ON.toString().equals(subscription.getLastActiveProductCategory().toString())) {
+                countExistingAddOns++;
+            }
+        }
+        return countExistingAddOns;
+    }
+
+    private String getSubscriptionPlanName(final Subscription subscription) {
+        final SubscriptionEvent firstEvent = subscription.getSubscriptionEvents().isEmpty() ? null : subscription.getSubscriptionEvents().get(0);
+        if (subscription.getLastActivePlan() == null) {
+            return firstEvent == null ? "" : firstEvent.getNextPlan().getName();
+        } else {
+            return subscription.getLastActivePlan().getName();
+        }
+    }
+
     @TimedResource
     @POST
     @Path("/createEntitlementWithAddOns")

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index 3520760..8c91c40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.126</version>
+        <version>0.127-SNAPSHOT</version>
     </parent>
     <artifactId>killbill</artifactId>
     <version>0.17.3-SNAPSHOT</version>