killbill-memoizeit

entitlement: delete more future cancellation events on uncancel Broaden

10/30/2013 12:51:08 PM

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
index 2bbb8f3..29b0d6a 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
@@ -234,13 +234,24 @@ public class DefaultEntitlement extends EntityBase implements Entitlement {
             throw new EntitlementApiException(ErrorCode.SUB_CANCEL_BAD_STATE, getId(), EntitlementState.CANCELLED);
         }
         final InternalCallContext contextWithValidAccountRecordId = internalCallContextFactory.createInternalCallContext(accountId, callContext);
-        final List<BlockingState> blockingStates = blockingStateDao.getBlockingHistoryForService(getId(), EntitlementService.ENTITLEMENT_SERVICE_NAME, contextWithValidAccountRecordId);
-        final Collection<BlockingState> futureEntitlementCancellationEvents = Collections2.filter(blockingStates, new Predicate<BlockingState>() {
+        final List<BlockingState> blockingStatesForAccount = blockingStateDao.getBlockingAllForAccountRecordId(contextWithValidAccountRecordId);
+        final Collection<BlockingState> futureEntitlementCancellationEvents = Collections2.filter(blockingStatesForAccount, new Predicate<BlockingState>() {
             @Override
             public boolean apply(final BlockingState input) {
+                // Delete all future cancellation events...
                 return EntitlementService.ENTITLEMENT_SERVICE_NAME.equals(input.getService()) &&
                        DefaultEntitlementApi.ENT_STATE_CANCELLED.equals(input.getStateName()) &&
-                       input.getEffectiveDate().isAfter(clock.getUTCNow());
+                       input.getEffectiveDate().isAfter(clock.getUTCNow()) &&
+                       (
+                               // ... for that subscription
+                               BlockingStateType.SUBSCRIPTION.equals(input.getType()) && input.getBlockedId().equals(getId()) ||
+                               // ... for the associated base subscription (to make sure an add-on isn't associated with a cancelled base entitlement)
+                               BlockingStateType.SUBSCRIPTION.equals(input.getType()) && input.getBlockedId().equals(getBaseEntitlementId()) ||
+                               // ... for that bundle (to make sure the subscription isn't associated with a cancelled bundle - not yet implemented)
+                               BlockingStateType.SUBSCRIPTION_BUNDLE.equals(input.getType()) && input.getBlockedId().equals(getBundleId()) ||
+                               // ... for that bundle (to make sure the subscription isn't associated with a cancelled account - not yet implemented)
+                               BlockingStateType.ACCOUNT.equals(input.getType()) && input.getBlockedId().equals(getAccountId())
+                       );
             }
         });