protected SortedSet<BillingEvent> createNewEvents(final List<DisabledDuration> disabledDuration, final SortedSet<BillingEvent> billingEvents, final Account account, final SubscriptionBase subscription) { final SortedSet<BillingEvent> result = new TreeSet<BillingEvent>(); for (final DisabledDuration duration : disabledDuration) { // The first one before the blocked duration final BillingEvent precedingInitialEvent = precedingBillingEventForSubscription(duration.getStart(), billingEvents, subscription); // The last one during of before the duration final BillingEvent precedingFinalEvent = precedingBillingEventForSubscription(duration.getEnd(), billingEvents, subscription); if (precedingInitialEvent != null) { // there is a preceding billing event result.add(createNewDisableEvent(duration.getStart(), precedingInitialEvent)); if (duration.getEnd() != null) { // no second event in the pair means they are still disabled (no re-enable) result.add(createNewReenableEvent(duration.getEnd(), precedingFinalEvent)); } } else if (precedingFinalEvent != null) { // can happen - e.g. phase event result.add(createNewReenableEvent(duration.getEnd(), precedingFinalEvent)); } // N.B. if there's no precedingInitial and no precedingFinal then there's nothing to do } return result; }
@Test(groups = "fast") public void testPrecedingBillingEventForSubscription() { final DateTime now = new DateTime(); final SortedSet<BillingEvent> events = new TreeSet<BillingEvent>(); events.add(createRealEvent(now.minusDays(10), subscription1)); events.add(createRealEvent(now.minusDays(6), subscription1)); events.add(createRealEvent(now.minusDays(5), subscription1)); events.add(createRealEvent(now.minusDays(1), subscription1)); final BillingEvent minus11 = blockingCalculator.precedingBillingEventForSubscription(now.minusDays(11), events, subscription1); assertNull(minus11); final BillingEvent minus5andAHalf = blockingCalculator.precedingBillingEventForSubscription(now.minusDays(5).minusHours(12), events, subscription1); assertNotNull(minus5andAHalf); assertEquals(minus5andAHalf.getEffectiveDate(), now.minusDays(6)); }