killbill-aplcache
Changes
entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionEvent.java 1(+1 -0)
invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java 111(+63 -48)
invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java 7(+4 -3)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java 38(+20 -18)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java 47(+25 -22)
Details
diff --git a/api/src/main/java/org/killbill/billing/junction/BillingEvent.java b/api/src/main/java/org/killbill/billing/junction/BillingEvent.java
index a08e8c3..4e32345 100644
--- a/api/src/main/java/org/killbill/billing/junction/BillingEvent.java
+++ b/api/src/main/java/org/killbill/billing/junction/BillingEvent.java
@@ -18,13 +18,16 @@ package org.killbill.billing.junction;
import java.math.BigDecimal;
import java.util.List;
+import java.util.Set;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.catalog.api.BillingMode;
import org.killbill.billing.catalog.api.BillingPeriod;
+import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
@@ -80,7 +83,7 @@ public interface BillingEvent extends Comparable<BillingEvent> {
/**
* @return the recurring price for the phase
*/
- BigDecimal getRecurringPrice();
+ BigDecimal getRecurringPrice(DateTime effectiveDate) throws CatalogApiException;
/**
* @return the currency for the account being invoiced
@@ -107,4 +110,5 @@ public interface BillingEvent extends Comparable<BillingEvent> {
* @return the list of {@code Usage} section
*/
List<Usage> getUsages();
+
}
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionEvent.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionEvent.java
index ea983ad..8e6b127 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionEvent.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultSubscriptionEvent.java
@@ -29,6 +29,7 @@ import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PriceList;
import org.killbill.billing.catalog.api.Product;
+
public class DefaultSubscriptionEvent implements SubscriptionEvent {
private final UUID id;
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java b/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java
index e77696e..80c6acd 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java
@@ -32,6 +32,7 @@ import org.killbill.billing.account.api.ImmutableAccountData;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.BillingMode;
import org.killbill.billing.catalog.api.BillingPeriod;
+import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.invoice.api.Invoice;
@@ -47,6 +48,7 @@ import org.killbill.billing.invoice.tree.AccountItemTree;
import org.killbill.billing.junction.BillingEvent;
import org.killbill.billing.junction.BillingEventSet;
import org.killbill.billing.util.currency.KillBillMoney;
+import org.killbill.clock.Clock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,8 +63,11 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
private static final Logger log = LoggerFactory.getLogger(FixedAndRecurringInvoiceItemGenerator.class);
+ private final Clock clock;
+
@Inject
- public FixedAndRecurringInvoiceItemGenerator() {
+ public FixedAndRecurringInvoiceItemGenerator(final Clock clock) {
+ this.clock = clock;
}
public List<InvoiceItem> generateItems(final ImmutableAccountData account, final UUID invoiceId, final BillingEventSet eventSet,
@@ -128,7 +133,7 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
@VisibleForTesting
void processFixedBillingEvents(final UUID invoiceId, final UUID accountId, final BillingEventSet events, final LocalDate targetDate,
- final Currency currency, final List<InvoiceItem> proposedItems, final InternalCallContext internalCallContext) {
+ final Currency currency, final List<InvoiceItem> proposedItems, final InternalCallContext internalCallContext) throws InvoiceApiException {
InvoiceItem prevItem = null;
final Iterator<BillingEvent> eventIt = events.iterator();
@@ -165,66 +170,75 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
final StringBuilder logStringBuilder, final BillingMode billingMode,
final Map<UUID, SubscriptionFutureNotificationDates> perSubscriptionFutureNotificationDate,
final InternalCallContext internalCallContext) throws InvoiceApiException {
- final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
- // For FIXEDTERM phases we need to stop when the specified duration has been reached
- final LocalDate maxEndDate = thisEvent.getPlanPhase().getPhaseType() == PhaseType.FIXEDTERM ?
- thisEvent.getPlanPhase().getDuration().addToLocalDate(internalCallContext.toLocalDate(thisEvent.getEffectiveDate())) :
- null;
+ try {
- // Handle recurring items
- final BillingPeriod billingPeriod = thisEvent.getBillingPeriod();
- if (billingPeriod != BillingPeriod.NO_BILLING_PERIOD) {
- final LocalDate startDate = internalCallContext.toLocalDate(thisEvent.getEffectiveDate());
+ final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
- if (!startDate.isAfter(targetDate)) {
- final LocalDate endDate = (nextEvent == null) ? null : internalCallContext.toLocalDate(nextEvent.getEffectiveDate());
+ // For FIXEDTERM phases we need to stop when the specified duration has been reached
+ final LocalDate maxEndDate = thisEvent.getPlanPhase().getPhaseType() == PhaseType.FIXEDTERM ?
+ thisEvent.getPlanPhase().getDuration().addToLocalDate(internalCallContext.toLocalDate(thisEvent.getEffectiveDate())) :
+ null;
- final int billCycleDayLocal = thisEvent.getBillCycleDayLocal();
+ // Handle recurring items
+ final BillingPeriod billingPeriod = thisEvent.getBillingPeriod();
+ if (billingPeriod != BillingPeriod.NO_BILLING_PERIOD) {
+ final LocalDate startDate = internalCallContext.toLocalDate(thisEvent.getEffectiveDate());
- final RecurringInvoiceItemDataWithNextBillingCycleDate itemDataWithNextBillingCycleDate;
- try {
- itemDataWithNextBillingCycleDate = generateInvoiceItemData(startDate, endDate, targetDate, billCycleDayLocal, billingPeriod, billingMode);
- } catch (InvalidDateSequenceException e) {
- throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_DATE_SEQUENCE, startDate, endDate, targetDate);
- }
+ if (!startDate.isAfter(targetDate)) {
+ final LocalDate endDate = (nextEvent == null) ? null : internalCallContext.toLocalDate(nextEvent.getEffectiveDate());
- for (final RecurringInvoiceItemData itemDatum : itemDataWithNextBillingCycleDate.getItemData()) {
+ final int billCycleDayLocal = thisEvent.getBillCycleDayLocal();
- // Stop if there a maxEndDate and we have reached it
- if (maxEndDate != null && maxEndDate.compareTo(itemDatum.getEndDate()) < 0) {
- break;
+ final RecurringInvoiceItemDataWithNextBillingCycleDate itemDataWithNextBillingCycleDate;
+ try {
+ itemDataWithNextBillingCycleDate = generateInvoiceItemData(startDate, endDate, targetDate, billCycleDayLocal, billingPeriod, billingMode);
+ } catch (InvalidDateSequenceException e) {
+ throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_DATE_SEQUENCE, startDate, endDate, targetDate);
}
- final BigDecimal rate = thisEvent.getRecurringPrice();
- if (rate != null) {
- final BigDecimal amount = KillBillMoney.of(itemDatum.getNumberOfCycles().multiply(rate), currency);
- final RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId,
- accountId,
- thisEvent.getSubscription().getBundleId(),
- thisEvent.getSubscription().getId(),
- thisEvent.getPlan().getName(),
- thisEvent.getPlanPhase().getName(),
- itemDatum.getStartDate(),
- itemDatum.getEndDate(),
- amount, rate, currency);
- items.add(recurringItem);
+
+ for (final RecurringInvoiceItemData itemDatum : itemDataWithNextBillingCycleDate.getItemData()) {
+
+ // Stop if there a maxEndDate and we have reached it
+ if (maxEndDate != null && maxEndDate.compareTo(itemDatum.getEndDate()) < 0) {
+ break;
+ }
+ final BigDecimal rate = thisEvent.getRecurringPrice(internalCallContext.toUTCDateTime(itemDatum.getStartDate()));
+ if (rate != null) {
+ final BigDecimal amount = KillBillMoney.of(itemDatum.getNumberOfCycles().multiply(rate), currency);
+ final RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId,
+ accountId,
+ thisEvent.getSubscription().getBundleId(),
+ thisEvent.getSubscription().getId(),
+ thisEvent.getPlan().getName(),
+ thisEvent.getPlanPhase().getName(),
+ itemDatum.getStartDate(),
+ itemDatum.getEndDate(),
+ amount, rate, currency);
+ items.add(recurringItem);
+ }
}
+ updatePerSubscriptionNextNotificationDate(thisEvent.getSubscription().getId(), itemDataWithNextBillingCycleDate.getNextBillingCycleDate(), items, billingMode,
+ perSubscriptionFutureNotificationDate);
}
- updatePerSubscriptionNextNotificationDate(thisEvent.getSubscription().getId(), itemDataWithNextBillingCycleDate.getNextBillingCycleDate(), items, billingMode, perSubscriptionFutureNotificationDate);
}
- }
- // For debugging purposes
- logStringBuilder.append("\n")
- .append(thisEvent);
- for (final InvoiceItem item : items) {
- logStringBuilder.append("\n\t")
- .append(item);
+ // For debugging purposes
+ logStringBuilder.append("\n")
+ .append(thisEvent);
+ for (final InvoiceItem item : items) {
+ logStringBuilder.append("\n\t")
+ .append(item);
+ }
+ return items;
+
+ } catch (final CatalogApiException e) {
+ throw new InvoiceApiException(e);
}
- return items;
}
- private void updatePerSubscriptionNextNotificationDate(final UUID subscriptionId, final LocalDate nextBillingCycleDate, final List<InvoiceItem> newProposedItems, final BillingMode billingMode, final Map<UUID, SubscriptionFutureNotificationDates> perSubscriptionFutureNotificationDates) {
+ private void updatePerSubscriptionNextNotificationDate(final UUID subscriptionId, final LocalDate nextBillingCycleDate, final List<InvoiceItem> newProposedItems, final BillingMode billingMode,
+ final Map<UUID, SubscriptionFutureNotificationDates> perSubscriptionFutureNotificationDates) {
LocalDate nextNotificationDate = null;
switch (billingMode) {
@@ -247,6 +261,7 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
default:
throw new IllegalStateException("Unrecognized billing mode " + billingMode);
}
+
if (nextNotificationDate != null) {
SubscriptionFutureNotificationDates subscriptionFutureNotificationDates = perSubscriptionFutureNotificationDates.get(subscriptionId);
if (subscriptionFutureNotificationDates == null) {
@@ -350,7 +365,7 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
}
private InvoiceItem generateFixedPriceItem(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent,
- final LocalDate targetDate, final Currency currency, final InternalCallContext internalCallContext) {
+ final LocalDate targetDate, final Currency currency, final InternalCallContext internalCallContext) throws InvoiceApiException {
final LocalDate roundedStartDate = internalCallContext.toLocalDate(thisEvent.getEffectiveDate());
if (roundedStartDate.isAfter(targetDate)) {
return null;
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java
index dfa95a0..4ae0578 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java
@@ -37,6 +37,7 @@ import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.invoice.InvoiceTestSuiteNoDB;
import org.killbill.billing.invoice.MockBillingEventSet;
+import org.killbill.billing.invoice.api.InvoiceApiException;
import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.invoice.api.InvoiceItemType;
import org.killbill.billing.invoice.model.FixedPriceInvoiceItem;
@@ -160,7 +161,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
}
@Test(groups = "fast")
- public void testProcessFixedBillingEventsWithCancellationOnSameDay() {
+ public void testProcessFixedBillingEventsWithCancellationOnSameDay() throws InvoiceApiException {
final LocalDate targetDate = new LocalDate("2016-01-08");
@@ -193,7 +194,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
}
@Test(groups = "fast")
- public void testProcessFixedBillingEventsWithCancellationOnNextDay() {
+ public void testProcessFixedBillingEventsWithCancellationOnNextDay() throws InvoiceApiException {
final LocalDate targetDate = new LocalDate("2016-01-08");
@@ -229,7 +230,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
@Test(groups = "fast")
- public void testProcessFixedBillingEventsWithMultipleChangeOnSameDay() {
+ public void testProcessFixedBillingEventsWithMultipleChangeOnSameDay() throws InvoiceApiException {
final LocalDate targetDate = new LocalDate("2016-01-08");
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
index 6b4020f..7cfc780 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
@@ -21,6 +21,7 @@ package org.killbill.billing.invoice;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.UUID;
import javax.annotation.Nullable;
@@ -95,6 +96,7 @@ import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
public class TestInvoiceHelper {
@@ -392,7 +394,7 @@ public class TestInvoiceHelper {
}
@Override
- public BigDecimal getRecurringPrice() {
+ public BigDecimal getRecurringPrice(DateTime effectiveDate) {
return recurringPrice;
}
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
index b43bd54..360afd4 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java
@@ -37,6 +37,8 @@ import org.joda.time.DateTimeZone;
import org.joda.time.Days;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.BillingPeriod;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.CatalogService;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
@@ -59,6 +61,7 @@ public class BlockingCalculator {
private static final AtomicLong globaltotalOrder = new AtomicLong();
private final BlockingInternalApi blockingApi;
+ private final CatalogService catalogService;
protected static class DisabledDuration {
@@ -84,8 +87,9 @@ public class BlockingCalculator {
}
@Inject
- public BlockingCalculator(final BlockingInternalApi blockingApi) {
+ public BlockingCalculator(final BlockingInternalApi blockingApi, final CatalogService catalogService) {
this.blockingApi = blockingApi;
+ this.catalogService = catalogService;
}
/**
@@ -93,7 +97,7 @@ public class BlockingCalculator {
*
* @param billingEvents the original list of billing events to update (without overdue events)
*/
- public void insertBlockingEvents(final SortedSet<BillingEvent> billingEvents, final Set<UUID> skippedSubscriptions, final InternalTenantContext context) {
+ public void insertBlockingEvents(final SortedSet<BillingEvent> billingEvents, final Set<UUID> skippedSubscriptions, final InternalTenantContext context) throws CatalogApiException {
if (billingEvents.size() <= 0) {
return;
}
@@ -129,7 +133,7 @@ public class BlockingCalculator {
final List<BlockingState> aggregateSubscriptionBlockingEvents = getAggregateBlockingEventsPerSubscription(subscriptionBlockingEvents, bundleBlockingEvents, accountBlockingEvents);
final List<DisabledDuration> accountBlockingDurations = createBlockingDurations(aggregateSubscriptionBlockingEvents);
- billingEventsToAdd.addAll(createNewEvents(accountBlockingDurations, billingEvents, subscription));
+ billingEventsToAdd.addAll(createNewEvents(accountBlockingDurations, billingEvents, subscription, context));
billingEventsToRemove.addAll(eventsToRemove(accountBlockingDurations, billingEvents, subscription));
}
}
@@ -187,7 +191,7 @@ public class BlockingCalculator {
return result;
}
- protected SortedSet<BillingEvent> createNewEvents(final List<DisabledDuration> disabledDuration, final SortedSet<BillingEvent> billingEvents, final SubscriptionBase subscription) {
+ protected SortedSet<BillingEvent> createNewEvents(final List<DisabledDuration> disabledDuration, final SortedSet<BillingEvent> billingEvents, final SubscriptionBase subscription, final InternalTenantContext context) throws CatalogApiException {
final SortedSet<BillingEvent> result = new TreeSet<BillingEvent>();
for (final DisabledDuration duration : disabledDuration) {
// The first one before the blocked duration
@@ -196,12 +200,12 @@ public class BlockingCalculator {
final BillingEvent precedingFinalEvent = precedingBillingEventForSubscription(duration.getEnd(), billingEvents, subscription);
if (precedingInitialEvent != null) { // there is a preceding billing event
- result.add(createNewDisableEvent(duration.getStart(), precedingInitialEvent));
+ result.add(createNewDisableEvent(duration.getStart(), precedingInitialEvent, context));
if (duration.getEnd() != null) { // no second event in the pair means they are still disabled (no re-enable)
- result.add(createNewReenableEvent(duration.getEnd(), precedingFinalEvent));
+ result.add(createNewReenableEvent(duration.getEnd(), precedingFinalEvent, context));
}
} else if (precedingFinalEvent != null) { // can happen - e.g. phase event
- result.add(createNewReenableEvent(duration.getEnd(), precedingFinalEvent));
+ result.add(createNewReenableEvent(duration.getEnd(), precedingFinalEvent, context));
}
// N.B. if there's no precedingInitial and no precedingFinal then there's nothing to do
}
@@ -241,7 +245,7 @@ public class BlockingCalculator {
return result;
}
- protected BillingEvent createNewDisableEvent(final DateTime odEventTime, final BillingEvent previousEvent) {
+ protected BillingEvent createNewDisableEvent(final DateTime odEventTime, final BillingEvent previousEvent, final InternalTenantContext context) throws CatalogApiException {
final int billCycleDay = previousEvent.getBillCycleDayLocal();
final SubscriptionBase subscription = previousEvent.getSubscription();
final DateTime effectiveDate = odEventTime;
@@ -251,7 +255,6 @@ public class BlockingCalculator {
// Make sure to set the fixed price to null and the billing period to NO_BILLING_PERIOD,
// which makes invoice disregard this event
final BigDecimal fixedPrice = null;
- final BigDecimal recurringPrice = null;
final BillingPeriod billingPeriod = BillingPeriod.NO_BILLING_PERIOD;
final Currency currency = previousEvent.getCurrency();
@@ -260,21 +263,20 @@ public class BlockingCalculator {
final Long totalOrdering = globaltotalOrder.getAndIncrement();
final DateTimeZone tz = previousEvent.getTimeZone();
- return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase,
- fixedPrice, recurringPrice, currency,
+ return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase, fixedPrice,
+ currency,
billingPeriod, billCycleDay,
- description, totalOrdering, type, tz);
+ description, totalOrdering, type, tz, catalogService.getFullCatalog(context), true);
}
- protected BillingEvent createNewReenableEvent(final DateTime odEventTime, final BillingEvent previousEvent) {
+ protected BillingEvent createNewReenableEvent(final DateTime odEventTime, final BillingEvent previousEvent, final InternalTenantContext context) throws CatalogApiException {
// All fields are populated with the event state from before the blocking period, for invoice to resume invoicing
final int billCycleDay = previousEvent.getBillCycleDayLocal();
final SubscriptionBase subscription = previousEvent.getSubscription();
final DateTime effectiveDate = odEventTime;
final PlanPhase planPhase = previousEvent.getPlanPhase();
- final Plan plan = previousEvent.getPlan();
final BigDecimal fixedPrice = previousEvent.getFixedPrice();
- final BigDecimal recurringPrice = previousEvent.getRecurringPrice();
+ final Plan plan = previousEvent.getPlan();
final Currency currency = previousEvent.getCurrency();
final String description = "";
final BillingPeriod billingPeriod = previousEvent.getBillingPeriod();
@@ -282,10 +284,10 @@ public class BlockingCalculator {
final Long totalOrdering = globaltotalOrder.getAndIncrement();
final DateTimeZone tz = previousEvent.getTimeZone();
- return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase,
- fixedPrice, recurringPrice, currency,
+ return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase, fixedPrice,
+ currency,
billingPeriod, billCycleDay,
- description, totalOrdering, type, tz);
+ description, totalOrdering, type, tz, catalogService.getFullCatalog(context), false);
}
protected Hashtable<UUID, List<SubscriptionBase>> createBundleSubscriptionMap(final SortedSet<BillingEvent> billingEvents) {
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
index cbf1076..5280f62 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java
@@ -47,7 +47,6 @@ public class DefaultBillingEvent implements BillingEvent {
private final PlanPhase planPhase;
private final Plan plan;
private final BigDecimal fixedPrice;
- private final BigDecimal recurringPrice;
private final Currency currency;
private final String description;
private final BillingPeriod billingPeriod;
@@ -57,8 +56,14 @@ public class DefaultBillingEvent implements BillingEvent {
private final List<Usage> usages;
+ private final Catalog catalog;
+ private final boolean isDisableEvent;
+ private final PlanPhase nextPlanPhase;
+
public DefaultBillingEvent(final ImmutableAccountData account, final EffectiveSubscriptionInternalEvent transition, final SubscriptionBase subscription, final int billCycleDayLocal, final Currency currency, final Catalog catalog) throws CatalogApiException {
+ this.catalog = catalog;
+
final boolean isActive = transition.getTransitionType() != SubscriptionBaseTransitionType.CANCEL;
this.billCycleDayLocal = billCycleDayLocal;
@@ -71,34 +76,35 @@ public class DefaultBillingEvent implements BillingEvent {
this.plan = (planName != null) ? catalog.findPlan(planName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
final String nextPhaseName = transition.getNextPhase();
- final PlanPhase nextPhase = (nextPhaseName != null) ? catalog.findPhase(nextPhaseName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
+ this.nextPlanPhase = (nextPhaseName != null) ? catalog.findPhase(nextPhaseName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
final String prevPhaseName = transition.getPreviousPhase();
- final PlanPhase prevPhase = (prevPhaseName != null) ? catalog.findPhase(prevPhaseName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
-
- this.fixedPrice = getFixedPrice(nextPhase, currency);
- this.recurringPrice = getRecurringPrice(nextPhase, currency);
+ final PlanPhase prevPlanPhase = (prevPhaseName != null) ? catalog.findPhase(prevPhaseName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
+ this.fixedPrice = getFixedPrice(nextPlanPhase, currency);
this.currency = currency;
this.description = transition.getTransitionType().toString();
- this.billingPeriod = getRecurringBillingPeriod(isActive ? nextPhase : prevPhase);
+ this.billingPeriod = getRecurringBillingPeriod(isActive ? nextPlanPhase : prevPlanPhase);
this.type = transition.getTransitionType();
this.totalOrdering = transition.getTotalOrdering();
this.timeZone = account.getTimeZone();
this.usages = initializeUsage(isActive);
+ this.isDisableEvent = false;
}
public DefaultBillingEvent(final SubscriptionBase subscription, final DateTime effectiveDate, final boolean isActive,
- final Plan plan, final PlanPhase planPhase,
- final BigDecimal fixedPrice, final BigDecimal recurringPrice, final Currency currency,
+ final Plan plan, final PlanPhase planPhase, final BigDecimal fixedPrice,
+ final Currency currency,
final BillingPeriod billingPeriod, final int billCycleDayLocal,
- final String description, final long totalOrdering, final SubscriptionBaseTransitionType type, final DateTimeZone timeZone) {
+ final String description, final long totalOrdering, final SubscriptionBaseTransitionType type, final DateTimeZone timeZone,
+ final Catalog catalog,
+ final boolean isDisableEvent) {
+ this.catalog = catalog;
this.subscription = subscription;
this.effectiveDate = effectiveDate;
this.plan = plan;
this.planPhase = planPhase;
this.fixedPrice = fixedPrice;
- this.recurringPrice = recurringPrice;
this.currency = currency;
this.billingPeriod = billingPeriod;
this.billCycleDayLocal = billCycleDayLocal;
@@ -107,7 +113,8 @@ public class DefaultBillingEvent implements BillingEvent {
this.totalOrdering = totalOrdering;
this.timeZone = timeZone;
this.usages = initializeUsage(isActive);
-
+ this.isDisableEvent = isDisableEvent;
+ this.nextPlanPhase = isDisableEvent ? null : planPhase;
}
@Override
@@ -197,8 +204,12 @@ public class DefaultBillingEvent implements BillingEvent {
}
@Override
- public BigDecimal getRecurringPrice() {
- return recurringPrice;
+ public BigDecimal getRecurringPrice(final DateTime effectiveDate) throws CatalogApiException {
+ if (isDisableEvent || nextPlanPhase == null) {
+ return null;
+ }
+ final PlanPhase effectivePlanPhase = effectiveDate != null ? catalog.findPhase(nextPlanPhase.getName(), effectiveDate, subscription.getStartDate()) : nextPlanPhase;
+ return getRecurringPrice(effectivePlanPhase, currency);
}
@Override
@@ -267,18 +278,12 @@ public class DefaultBillingEvent implements BillingEvent {
if (effectiveDate != null ? !effectiveDate.equals(that.effectiveDate) : that.effectiveDate != null) {
return false;
}
- if (fixedPrice != null ? !fixedPrice.equals(that.fixedPrice) : that.fixedPrice != null) {
- return false;
- }
if (plan != null ? !plan.equals(that.plan) : that.plan != null) {
return false;
}
if (planPhase != null ? !planPhase.equals(that.planPhase) : that.planPhase != null) {
return false;
}
- if (recurringPrice != null ? !recurringPrice.equals(that.recurringPrice) : that.recurringPrice != null) {
- return false;
- }
if (subscription != null ? !subscription.equals(that.subscription) : that.subscription != null) {
return false;
}
@@ -302,8 +307,6 @@ public class DefaultBillingEvent implements BillingEvent {
result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
result = 31 * result + (planPhase != null ? planPhase.hashCode() : 0);
result = 31 * result + (plan != null ? plan.hashCode() : 0);
- result = 31 * result + (fixedPrice != null ? fixedPrice.hashCode() : 0);
- result = 31 * result + (recurringPrice != null ? recurringPrice.hashCode() : 0);
result = 31 * result + (currency != null ? currency.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (billingPeriod != null ? billingPeriod.hashCode() : 0);
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
index 5b4748b..df07cbc 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
@@ -247,9 +247,9 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
}
if (recurringPrice != null) {
- Assert.assertEquals(recurringPrice.getPrice(Currency.USD), event.getRecurringPrice());
+ Assert.assertEquals(recurringPrice.getPrice(Currency.USD), event.getRecurringPrice(null));
} else {
- assertNull(event.getRecurringPrice());
+ assertNull(event.getRecurringPrice(null));
}
Assert.assertEquals(BCD, event.getBillCycleDayLocal());
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
index 8c26b09..3dfdc3e 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java
@@ -35,9 +35,13 @@ import org.killbill.billing.account.api.Account;
import org.killbill.billing.catalog.MockPlan;
import org.killbill.billing.catalog.MockPlanPhase;
import org.killbill.billing.catalog.api.BillingPeriod;
+import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.Fixed;
+import org.killbill.billing.catalog.api.InternationalPrice;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.Recurring;
import org.killbill.billing.entitlement.api.BlockingState;
import org.killbill.billing.entitlement.api.BlockingStateType;
import org.killbill.billing.entitlement.dao.MockBlockingStateDao;
@@ -48,6 +52,7 @@ import org.killbill.billing.junction.plumbing.billing.BlockingCalculator.Disable
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
import org.mockito.Mockito;
+import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -104,7 +109,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
// S2 --B--[-------]--------------------------
// S3 ------------------D---------------------
@Test(groups = "fast")
- public void testInsertBlockingEventsForBundle() {
+ public void testInsertBlockingEventsForBundle() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final BillingEvent A = createRealEvent(now.minusDays(1).minusHours(1), subscription1);
@@ -319,7 +324,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
// Open ended duration with a previous event
// --X--[----------------------------------
@Test(groups = "fast")
- public void testCreateNewEventsOpenPrev() {
+ public void testCreateNewEventsOpenPrev() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -327,12 +332,12 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
disabledDuration.add(new DisabledDuration(now, null));
billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 1);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice());
+ assertNull(results.first().getRecurringPrice(null));
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
}
@@ -340,7 +345,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
// Open with previous and following events
// --X--[----Y-----------------------------
@Test(groups = "fast")
- public void testCreateNewEventsOpenPrevFollow() {
+ public void testCreateNewEventsOpenPrevFollow() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -349,12 +354,12 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 1);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice());
+ assertNull(results.first().getRecurringPrice(null));
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
}
@@ -362,7 +367,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
// Open with no previous event (only following)
// -----[----X-----------------------------
@Test(groups = "fast")
- public void testCreateNewEventsOpenFollow() {
+ public void testCreateNewEventsOpenFollow() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -370,7 +375,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
disabledDuration.add(new DisabledDuration(now, null));
billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 0);
}
@@ -378,7 +383,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
// Closed duration with a single previous event
// --X--[------------]---------------------
@Test(groups = "fast")
- public void testCreateNewEventsClosedPrev() {
+ public void testCreateNewEventsClosedPrev() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -386,23 +391,24 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
+
assertEquals(results.size(), 2);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice());
+ assertNull(results.first().getRecurringPrice(null));
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
+ assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
// Closed duration with a previous event and in-between event
// --X--[------Y-----]---------------------
@Test(groups = "fast")
- public void testCreateNewEventsClosedPrevBetw() {
+ public void testCreateNewEventsClosedPrevBetw() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -411,23 +417,23 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
billingEvents.add(createRealEvent(now.minusDays(1), subscription1));
billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 2);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice());
+ assertNull(results.first().getRecurringPrice(null));
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
+ assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
// Closed duration with a previous event and in-between event and following
// --X--[------Y-----]-------Z-------------
@Test(groups = "fast")
- public void testCreateNewEventsClosedPrevBetwNext() {
+ public void testCreateNewEventsClosedPrevBetwNext() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -437,23 +443,23 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
billingEvents.add(createRealEvent(now.plusDays(3), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 2);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice());
+ assertNull(results.first().getRecurringPrice(null));
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
+ assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
// Closed with no previous event but in-between events
// -----[------Y-----]---------------------
@Test(groups = "fast")
- public void testCreateNewEventsClosedBetwn() {
+ public void testCreateNewEventsClosedBetwn() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -461,18 +467,18 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 1);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
+ assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
// Closed with no previous event but in-between events and following
// -----[------Y-----]-------Z-------------
@Test(groups = "fast")
- public void testCreateNewEventsClosedBetweenFollow() {
+ public void testCreateNewEventsClosedBetweenFollow() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -480,18 +486,18 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
billingEvents.add(createRealEvent(now.plusDays(1), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 1);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
+ assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
// Closed duration with only following
// -----[------------]-------Z-------------
@Test(groups = "fast")
- public void testCreateNewEventsClosedFollow() {
+ public void testCreateNewEventsClosedFollow() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final List<DisabledDuration> disabledDuration = new ArrayList<BlockingCalculator.DisabledDuration>();
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
@@ -499,7 +505,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
disabledDuration.add(new DisabledDuration(now, now.plusDays(2)));
billingEvents.add(createRealEvent(now.plusDays(3), subscription1));
- final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1);
+ final SortedSet<BillingEvent> results = blockingCalculator.createNewEvents(disabledDuration, billingEvents, subscription1, internalCallContext);
assertEquals(results.size(), 0);
}
@@ -528,23 +534,38 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
return createRealEvent(effectiveDate, subscription, SubscriptionBaseTransitionType.CHANGE);
}
- protected BillingEvent createRealEvent(final DateTime effectiveDate, final SubscriptionBase subscription, final SubscriptionBaseTransitionType type) {
- final Account account = this.account;
- final Integer billCycleDay = 1;
- final PlanPhase planPhase = new MockPlanPhase();
- final Plan plan = new MockPlan();
- final BigDecimal fixedPrice = BigDecimal.TEN;
- final BigDecimal recurringPrice = BigDecimal.TEN;
- final Currency currency = Currency.USD;
- final String description = "";
- final BillingPeriod billingPeriod = BillingPeriod.MONTHLY;
- final Long totalOrdering = 0L;
- final DateTimeZone tz = DateTimeZone.UTC;
-
- return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase,
- fixedPrice, recurringPrice, currency,
- billingPeriod, billCycleDay,
- description, totalOrdering, type, tz);
+ protected BillingEvent createRealEvent(final DateTime effectiveDate, final SubscriptionBase subscription, final SubscriptionBaseTransitionType type) {
+ try {
+
+ final Integer billCycleDay = 1;
+ final Plan plan = new MockPlan();
+ final Currency currency = Currency.USD;
+ final String description = "";
+ final BillingPeriod billingPeriod = BillingPeriod.MONTHLY;
+ final Long totalOrdering = 0L;
+ final DateTimeZone tz = DateTimeZone.UTC;
+
+
+ final PlanPhase planPhase = Mockito.mock(PlanPhase.class);
+
+ final InternationalPrice recurringPrice = Mockito.mock(InternationalPrice.class);
+
+ Mockito.when(recurringPrice.getPrice(Mockito.<Currency>any())).thenReturn(BigDecimal.TEN);
+ final Recurring recurring = Mockito.mock(Recurring.class);
+ Mockito.when(recurring.getRecurringPrice()).thenReturn(recurringPrice);
+ Mockito.when(planPhase.getRecurring()).thenReturn(recurring);
+
+ final BigDecimal fixedPrice = BigDecimal.TEN;
+
+ return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase, fixedPrice,
+ currency,
+ billingPeriod, billCycleDay,
+ description, totalOrdering, type, tz, null, false);
+
+ } catch (final CatalogApiException e) {
+ Assert.fail("", e);
+ }
+ throw new IllegalStateException();
}
@Test(groups = "fast")
@@ -569,17 +590,17 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testCreateNewDisableEvent() {
+ public void testCreateNewDisableEvent() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final BillingEvent event = new MockBillingEvent();
- final BillingEvent result = blockingCalculator.createNewDisableEvent(now, event);
+ final BillingEvent result = blockingCalculator.createNewDisableEvent(now, event, internalCallContext);
assertEquals(result.getBillCycleDayLocal(), event.getBillCycleDayLocal());
assertEquals(result.getEffectiveDate(), now);
assertEquals(result.getPlanPhase(), event.getPlanPhase());
assertEquals(result.getPlan(), event.getPlan());
assertNull(result.getFixedPrice());
- assertNull(result.getRecurringPrice());
+ assertNull(result.getRecurringPrice(null));
assertEquals(result.getCurrency(), event.getCurrency());
assertEquals(result.getDescription(), "");
assertEquals(result.getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
@@ -589,17 +610,17 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
}
@Test(groups = "fast")
- public void testCreateNewReenableEvent() {
+ public void testCreateNewReenableEvent() throws CatalogApiException {
final DateTime now = clock.getUTCNow();
final BillingEvent event = new MockBillingEvent();
- final BillingEvent result = blockingCalculator.createNewReenableEvent(now, event);
+ final BillingEvent result = blockingCalculator.createNewReenableEvent(now, event, internalCallContext);
assertEquals(result.getBillCycleDayLocal(), event.getBillCycleDayLocal());
assertEquals(result.getEffectiveDate(), now);
assertEquals(result.getPlanPhase(), event.getPlanPhase());
assertEquals(result.getPlan(), event.getPlan());
assertEquals(result.getFixedPrice(), event.getFixedPrice());
- assertEquals(result.getRecurringPrice(), event.getRecurringPrice());
+ assertEquals(result.getRecurringPrice(null), event.getRecurringPrice(null));
assertEquals(result.getCurrency(), event.getCurrency());
assertEquals(result.getDescription(), "");
assertEquals(result.getBillingPeriod(), event.getBillingPeriod());
@@ -611,8 +632,8 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
private class MockBillingEvent extends DefaultBillingEvent {
public MockBillingEvent() {
- super(subscription1, clock.getUTCNow(), true, null, null, BigDecimal.ZERO, BigDecimal.TEN, Currency.USD, BillingPeriod.ANNUAL,
- 4, "", 3L, SubscriptionBaseTransitionType.CREATE, DateTimeZone.UTC);
+ super(subscription1, clock.getUTCNow(), true, null, null, BigDecimal.ZERO, Currency.USD, BillingPeriod.ANNUAL,
+ 4, "", 3L, SubscriptionBaseTransitionType.CREATE, DateTimeZone.UTC, null, false);
}
}
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
index fbd53bf..98252a9 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
@@ -187,9 +187,9 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
final Account account = new MockAccountBuilder().build();
return new DefaultBillingEvent(sub, effectiveDate, true,
- shotgun, shotgunMonthly,
- BigDecimal.ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, billCycleDay,
- "Test Event 1", totalOrdering, type, DateTimeZone.UTC);
+ shotgun, shotgunMonthly, BigDecimal.ZERO,
+ Currency.USD, BillingPeriod.NO_BILLING_PERIOD, billCycleDay,
+ "Test Event 1", totalOrdering, type, DateTimeZone.UTC, null, false);
}
private MockPlanPhase createMockMonthlyPlanPhase(@Nullable final BigDecimal recurringRate,