@Override public void updateChargedThroughDate(final DefaultSubscriptionBase subscription, final InternalCallContext context) { boolean found = false; final Iterator<SubscriptionBase> it = subscriptions.iterator(); while (it.hasNext()) { final SubscriptionBase cur = it.next(); if (cur.getId().equals(subscription.getId())) { found = true; it.remove(); break; } } if (found) { subscriptions.add(subscription); } }
@Override public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent cancelEvent, final InternalCallContext context, final int seqId) { synchronized (events) { cancelNextPhaseEvent(subscription.getId(), context); insertEvent(cancelEvent, context); } }
@Override public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent nextPhase, final InternalCallContext context) { cancelNextPhaseEvent(subscription.getId(), context); insertEvent(nextPhase, context); }
public void checkNextPhaseChange(final DefaultSubscriptionBase subscription, final int expPendingEvents, final DateTime expPhaseChange) { final List<SubscriptionBaseEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), callContext); assertNotNull(events); printEvents(events); assertEquals(events.size(), expPendingEvents); if (events.size() > 0 && expPhaseChange != null) { boolean foundPhase = false; boolean foundChange = false; for (final SubscriptionBaseEvent cur : events) { if (cur instanceof PhaseEvent) { assertEquals(foundPhase, false); foundPhase = true; assertEquals(cur.getEffectiveDate(), expPhaseChange); } else if (cur instanceof ApiEvent) { final ApiEvent uEvent = (ApiEvent) cur; assertEquals(ApiEventType.CHANGE, uEvent.getEventType()); assertEquals(foundChange, false); foundChange = true; } else { assertFalse(true); } } } }
@Override public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> changeEvents, final InternalCallContext context) { synchronized (events) { cancelNextChangeEvent(subscription.getId()); cancelNextPhaseEvent(subscription.getId(), context); events.addAll(changeEvents); for (final SubscriptionBaseEvent cur : changeEvents) { recordFutureNotificationFromTransaction(null, cur.getEffectiveDate(), new SubscriptionNotificationKey(cur.getId()), context); } } }
private SubscriptionBase buildSubscription(final DefaultSubscriptionBase in, final InternalTenantContext context) { final DefaultSubscriptionBase subscription = new DefaultSubscriptionBase(new SubscriptionBuilder(in), null, clock); if (events.size() > 0) { subscription.rebuildTransitions(getEventsForSubscription(in.getId(), context), catalogService.getFullCatalog()); } return subscription; }
@Override public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> uncancelEvents, final InternalCallContext context) { synchronized (events) { boolean foundCancel = false; final Iterator<SubscriptionBaseEvent> it = events.descendingIterator(); while (it.hasNext()) { final SubscriptionBaseEvent cur = it.next(); if (cur.getSubscriptionId() != subscription.getId()) { continue; } if (cur.getType() == EventType.API_USER && ((ApiEvent) cur).getEventType() == ApiEventType.CANCEL) { cur.deactivate(); foundCancel = true; break; } } if (foundCancel) { for (final SubscriptionBaseEvent cur : uncancelEvents) { insertEvent(cur, context); } } } }
assertEquals(events.get(1).getPlanPhaseSpecifier().getBillingPeriod(), baseTerm); } else { assertEquals(cur.getId(), aoSubscription.getId());
@Test(groups = "slow") public void testCreateCancelAddon() throws SubscriptionBaseApiException { final String baseProduct = "Shotgun"; final BillingPeriod baseTerm = BillingPeriod.ANNUAL; final String basePriceList = PriceListSet.DEFAULT_PRICELIST_NAME; DefaultSubscriptionBase baseSubscription = testUtil.createSubscription(bundle, baseProduct, baseTerm, basePriceList); final String aoProduct = "Telescopic-Scope"; final BillingPeriod aoTerm = BillingPeriod.MONTHLY; final String aoPriceList = PriceListSet.DEFAULT_PRICELIST_NAME; DefaultSubscriptionBase aoSubscription = testUtil.createSubscription(bundle, aoProduct, aoTerm, aoPriceList); assertEquals(aoSubscription.getState(), EntitlementState.ACTIVE); testListener.pushExpectedEvent(NextEvent.CANCEL); final DateTime now = clock.getUTCNow(); aoSubscription.cancel(callContext); assertListenerStatus(); aoSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext); assertEquals(aoSubscription.getState(), EntitlementState.CANCELLED); assertListenerStatus(); }
final Duration ctd = testUtil.getDurationMonth(1); final DateTime newChargedThroughDate = TestSubscriptionHelper.addDuration(now, ctd); subscriptionInternalApi.setChargedThroughDate(baseSubscription.getId(), newChargedThroughDate, internalCallContext); baseSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(baseSubscription.getId(), internalCallContext); final String newBasePriceList = PriceListSet.DEFAULT_PRICELIST_NAME; final List<EntitlementAOStatusDryRun> aoStatus = subscriptionInternalApi.getDryRunChangePlanStatus(baseSubscription.getId(), newBaseProduct, now, internalCallContext); assertEquals(aoStatus.size(), 1); assertEquals(aoStatus.get(0).getId(), aoSubscription.getId()); assertEquals(aoStatus.get(0).getProductName(), aoProduct); assertEquals(aoStatus.get(0).getBillingPeriod(), aoTerm); aoSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext); assertEquals(aoSubscription.getState(), EntitlementState.CANCELLED);
@Override public void doTest() throws SubscriptionBaseRepairException, SubscriptionBaseApiException { // MOVE CLOCK A LITTLE BIT-- STILL IN TRIAL Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(4)); clock.addDeltaFromReality(it.toDurationMillis()); final DefaultSubscriptionBase aoSubscription = testUtil.createSubscription(bundle, "Telescopic-Scope", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME); // MOVE CLOCK A LITTLE BIT MORE -- STILL IN TRIAL it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(4)); clock.addDeltaFromReality(it.toDurationMillis()); BundleBaseTimeline bundleRepair = repairApi.getBundleTimeline(bundle.getId(), callContext); testUtil.sortEventsOnBundle(bundleRepair); // Quick check final SubscriptionBaseTimeline bpRepair = testUtil.getSubscriptionRepair(baseSubscription.getId(), bundleRepair); assertEquals(bpRepair.getExistingEvents().size(), 2); final SubscriptionBaseTimeline aoRepair = testUtil.getSubscriptionRepair(aoSubscription.getId(), bundleRepair); assertEquals(aoRepair.getExistingEvents().size(), 2); final List<DeletedEvent> des = new LinkedList<SubscriptionBaseTimeline.DeletedEvent>(); //des.add(createDeletedEvent(aoRepair.getExistingEvents().get(1).getEventId())); final DateTime aoCancelDate = aoSubscription.getStartDate().plusDays(10); final NewEvent ne = testUtil.createNewEvent(SubscriptionBaseTransitionType.CANCEL, aoCancelDate, null); final SubscriptionBaseTimeline saoRepair = testUtil.createSubscriptionRepair(aoSubscription.getId(), des, Collections.singletonList(ne)); bundleRepair = testUtil.createBundleRepair(bundle.getId(), bundleRepair.getViewId(), Collections.singletonList(saoRepair)); final boolean dryRun = true; repairApi.repairBundle(bundleRepair, dryRun, callContext); } }, ErrorCode.SUB_REPAIR_NEW_EVENT_BEFORE_LAST_AO_REMAINING);
@Override public void doTest() throws SubscriptionBaseRepairException, SubscriptionBaseApiException { // MOVE CLOCK A LITTLE BIT-- STILL IN TRIAL Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(4)); clock.addDeltaFromReality(it.toDurationMillis()); final DefaultSubscriptionBase aoSubscription = testUtil.createSubscription(bundle, "Telescopic-Scope", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME); // MOVE CLOCK A LITTLE BIT MORE -- STILL IN TRIAL it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(4)); clock.addDeltaFromReality(it.toDurationMillis()); final BundleBaseTimeline bundleRepair = repairApi.getBundleTimeline(bundle.getId(), callContext); testUtil.sortEventsOnBundle(bundleRepair); // Quick check final SubscriptionBaseTimeline bpRepair = testUtil.getSubscriptionRepair(baseSubscription.getId(), bundleRepair); assertEquals(bpRepair.getExistingEvents().size(), 2); final SubscriptionBaseTimeline aoRepair = testUtil.getSubscriptionRepair(aoSubscription.getId(), bundleRepair); assertEquals(aoRepair.getExistingEvents().size(), 2); final List<DeletedEvent> des = new LinkedList<SubscriptionBaseTimeline.DeletedEvent>(); des.add(testUtil.createDeletedEvent(aoRepair.getExistingEvents().get(0).getEventId())); des.add(testUtil.createDeletedEvent(aoRepair.getExistingEvents().get(1).getEventId())); final DateTime aoRecreateDate = aoSubscription.getStartDate().minusDays(5); final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Telescopic-Scope", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.DISCOUNT); final NewEvent ne = testUtil.createNewEvent(SubscriptionBaseTransitionType.CREATE, aoRecreateDate, spec); final SubscriptionBaseTimeline saoRepair = testUtil.createSubscriptionRepair(aoSubscription.getId(), des, Collections.singletonList(ne)); final BundleBaseTimeline bRepair = testUtil.createBundleRepair(bundle.getId(), bundleRepair.getViewId(), Collections.singletonList(saoRepair)); final boolean dryRun = true; repairApi.repairBundle(bRepair, dryRun, callContext); } }, ErrorCode.SUB_REPAIR_AO_CREATE_BEFORE_BP_START);
assertListenerStatus(); final List<SubscriptionBaseEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), internalCallContext); assertNotNull(events); testUtil.printEvents(events);
final Duration ctd = testUtil.getDurationMonth(1); final DateTime newChargedThroughDate = TestSubscriptionHelper.addDuration(startDiscountPhase, ctd); subscriptionInternalApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate, internalCallContext); subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
assertListenerStatus(); subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext); currentPhase = subscription.getCurrentPhase(); assertNotNull(currentPhase);
subscriptionInternalApi.setChargedThroughDate(aoSubscription1.getId(), ctd, internalCallContext);
assertEquals(trialPhase.getPhaseType(), PhaseType.DISCOUNT); subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
subscriptionInternalApi.setChargedThroughDate(baseSubscription.getId(), newChargedThroughDate, internalCallContext); baseSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(baseSubscription.getId(), internalCallContext); aoSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext); assertEquals(aoSubscription.getState(), EntitlementState.ACTIVE); assertTrue(aoSubscription.isSubscriptionFutureCancelled()); aoSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext); assertEquals(aoSubscription.getState(), EntitlementState.CANCELLED);
subscriptionInternalApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate, internalCallContext); subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext); subscription.changePlan(toProd, toTerm, toPlanSet, callContext); assertFalse(testListener.isCompleted(3000)); final List<SubscriptionBaseEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), internalCallContext); assertTrue(events.get(0) instanceof ApiEvent); assertListenerStatus(); subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext); currentPhase = subscription.getCurrentPhase(); checkChangePlan(subscription, toProd, ProductCategory.BASE, toTerm, PhaseType.DISCOUNT);