killbill-memoizeit
Changes
api/src/main/java/org/killbill/billing/subscription/api/user/SubscriptionBillingEvent.java 39(+39 -0)
invoice/src/main/java/org/killbill/billing/invoice/generator/FixedAndRecurringInvoiceItemGenerator.java 18(+9 -9)
invoice/src/main/java/org/killbill/billing/invoice/generator/UsageInvoiceItemGenerator.java 2(+1 -1)
invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java 4(+2 -2)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/BlockingCalculator.java 21(+11 -10)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEvent.java 146(+86 -60)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java 32(+12 -20)
junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java 15(+11 -4)
junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBlockingCalculator.java 158(+85 -73)
junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultBillingEvent.java 6(+2 -4)
subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java 6(+3 -3)
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 9588349..02e0bb6 100644
--- a/api/src/main/java/org/killbill/billing/junction/BillingEvent.java
+++ b/api/src/main/java/org/killbill/billing/junction/BillingEvent.java
@@ -20,6 +20,7 @@ package org.killbill.billing.junction;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import org.joda.time.DateTime;
import org.killbill.billing.catalog.api.BillingAlignment;
@@ -34,6 +35,11 @@ import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
public interface BillingEvent extends Comparable<BillingEvent> {
+ UUID getSubscriptionId();
+
+
+ UUID getBundleId();
+
/**
* @return the billCycleDay in the account timezone as seen for that subscription at that time
* <p/>
@@ -46,10 +52,6 @@ public interface BillingEvent extends Comparable<BillingEvent> {
*/
BillingAlignment getBillingAlignment();
- /**
- * @return the subscription
- */
- SubscriptionBase getSubscription();
/**
* @return the date for when that event became effective
@@ -84,7 +86,7 @@ public interface BillingEvent extends Comparable<BillingEvent> {
/**
* @return the recurring price for the phase
*/
- BigDecimal getRecurringPrice(DateTime effectiveDate) throws CatalogApiException;
+ BigDecimal getRecurringPrice();
/**
* @return the currency for the account being invoiced
diff --git a/api/src/main/java/org/killbill/billing/subscription/api/SubscriptionBaseInternalApi.java b/api/src/main/java/org/killbill/billing/subscription/api/SubscriptionBaseInternalApi.java
index 562aa85..4da292a 100644
--- a/api/src/main/java/org/killbill/billing/subscription/api/SubscriptionBaseInternalApi.java
+++ b/api/src/main/java/org/killbill/billing/subscription/api/SubscriptionBaseInternalApi.java
@@ -31,12 +31,11 @@ import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.BillingActionPolicy;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
-import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
-import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.entitlement.api.EntitlementAOStatusDryRun;
import org.killbill.billing.entitlement.api.EntitlementSpecifier;
import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
import org.killbill.billing.invoice.api.DryRunArguments;
+import org.killbill.billing.subscription.api.user.SubscriptionBillingEvent;
import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.util.entity.Pagination;
@@ -83,7 +82,7 @@ public interface SubscriptionBaseInternalApi {
public List<EffectiveSubscriptionInternalEvent> getAllTransitions(SubscriptionBase subscription, InternalTenantContext context);
- public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(SubscriptionBase subscription, InternalTenantContext context);
+ public List<SubscriptionBillingEvent> getSubscriptionBillingEvents(SubscriptionBase subscription, InternalTenantContext context);
public DateTime getDryRunChangePlanEffectiveDate(SubscriptionBase subscription, EntitlementSpecifier spec, DateTime requestedDate, BillingActionPolicy policy, InternalCallContext context) throws SubscriptionBaseApiException, CatalogApiException;
diff --git a/api/src/main/java/org/killbill/billing/subscription/api/user/SubscriptionBillingEvent.java b/api/src/main/java/org/killbill/billing/subscription/api/user/SubscriptionBillingEvent.java
new file mode 100644
index 0000000..91be9fb
--- /dev/null
+++ b/api/src/main/java/org/killbill/billing/subscription/api/user/SubscriptionBillingEvent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2014-2019 Groupon, Inc
+ * Copyright 2014-2019 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.subscription.api.user;
+
+import org.joda.time.DateTime;
+import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+
+public interface SubscriptionBillingEvent {
+
+ String getPlanName();
+
+ String getPlanPhaseName();
+
+ DateTime getEffectiveDate();
+
+ Long getTotalOrdering();
+
+ SubscriptionBaseTransitionType getType();
+
+ DateTime getLastChangePlanDate();
+
+ public Integer getBcdLocal();
+
+}
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 9756bff..24ad2ee 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
@@ -139,8 +139,8 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
final BillingEvent thisEvent = nextEvent;
nextEvent = eventIt.next();
if (!events.getSubscriptionIdsWithAutoInvoiceOff().
- contains(thisEvent.getSubscription().getId())) { // don't consider events for subscriptions that have auto_invoice_off
- final BillingEvent adjustedNextEvent = (thisEvent.getSubscription().getId() == nextEvent.getSubscription().getId()) ? nextEvent : null;
+ contains(thisEvent.getSubscriptionId())) { // don't consider events for subscriptions that have auto_invoice_off
+ final BillingEvent adjustedNextEvent = (thisEvent.getSubscriptionId() == nextEvent.getSubscriptionId()) ? nextEvent : null;
final List<InvoiceItem> newProposedItems = processRecurringEvent(invoiceId, accountId, thisEvent, adjustedNextEvent, targetDate, currency, invoiceItemGeneratorLogger, thisEvent.getPlan().getRecurringBillingMode(), perSubscriptionFutureNotificationDate, internalCallContext);
proposedItems.addAll(newProposedItems);
}
@@ -187,7 +187,7 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
final LocalDate curLocalEffectiveDate = internalCallContext.toLocalDate(currentBillingEvent.getEffectiveDate());
if (prevComputedFixedItem != null && /* If we have computed a previous item */
prevComputedFixedItem.getStartDate().compareTo(curLocalEffectiveDate) == 0 && /* The current billing event happens at the same date */
- prevComputedFixedItem.getSubscriptionId().compareTo(currentBillingEvent.getSubscription().getId()) == 0 /* The current billing event happens for the same subscription */) {
+ prevComputedFixedItem.getSubscriptionId().compareTo(currentBillingEvent.getSubscriptionId()) == 0 /* The current billing event happens for the same subscription */) {
return true;
} else {
return false;
@@ -231,13 +231,13 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
if (maxEndDate != null && maxEndDate.compareTo(itemDatum.getEndDate()) < 0) {
break;
}
- final BigDecimal rate = thisEvent.getRecurringPrice(internalCallContext.toUTCDateTime(itemDatum.getStartDate()));
+ 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.getBundleId(),
+ thisEvent.getSubscriptionId(),
thisEvent.getPlan().getProduct().getName(),
thisEvent.getPlan().getName(),
thisEvent.getPlanPhase().getName(),
@@ -247,7 +247,7 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
items.add(recurringItem);
}
}
- updatePerSubscriptionNextNotificationDate(thisEvent.getSubscription().getId(), itemDataWithNextBillingCycleDate.getNextBillingCycleDate(), items, billingMode,
+ updatePerSubscriptionNextNotificationDate(thisEvent.getSubscriptionId(), itemDataWithNextBillingCycleDate.getNextBillingCycleDate(), items, billingMode,
perSubscriptionFutureNotificationDate);
}
}
@@ -398,8 +398,8 @@ public class FixedAndRecurringInvoiceItemGenerator extends InvoiceItemGenerator
final BigDecimal fixedPrice = thisEvent.getFixedPrice();
if (fixedPrice != null) {
- final FixedPriceInvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, thisEvent.getSubscription().getBundleId(),
- thisEvent.getSubscription().getId(),
+ final FixedPriceInvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, thisEvent.getBundleId(),
+ thisEvent.getSubscriptionId(),
thisEvent.getPlan().getProduct().getName(), thisEvent.getPlan().getName(), thisEvent.getPlanPhase().getName(),
roundedStartDate, fixedPrice, currency);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/generator/UsageInvoiceItemGenerator.java b/invoice/src/main/java/org/killbill/billing/invoice/generator/UsageInvoiceItemGenerator.java
index a99dc62..3ce549c 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/generator/UsageInvoiceItemGenerator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/generator/UsageInvoiceItemGenerator.java
@@ -122,7 +122,7 @@ public class UsageInvoiceItemGenerator extends InvoiceItemGenerator {
continue;
}
- final UUID subscriptionId = event.getSubscription().getId();
+ final UUID subscriptionId = event.getSubscriptionId();
if (curSubscriptionId != null && !curSubscriptionId.equals(subscriptionId)) {
final SubscriptionUsageInArrear subscriptionUsageInArrear = new SubscriptionUsageInArrear(account.getId(), invoiceId, curEvents, rawUsgRes.getRawUsage(), rawUsgRes.getExistingTrackingIds(), targetDate, rawUsgRes.getRawUsageStartDate(), usageDetailMode, internalCallContext);
final List<InvoiceItem> usageInArrearItems = perSubscriptionInArrearUsageItems.get(curSubscriptionId);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
index 2bc350b..8f516ec 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
@@ -426,7 +426,7 @@ public class InvoiceDispatcher {
final DateTime now = clock.getUTCNow();
final Map<UUID, DateTime> result = new HashMap<UUID, DateTime>();
for (final BillingEvent evt : billingEvents) {
- final UUID subscriptionId = evt.getSubscription().getId();
+ final UUID subscriptionId = evt.getSubscriptionId();
final DateTime evtEffectiveDate = evt.getEffectiveDate();
if (evtEffectiveDate.compareTo(now) <= 0) {
continue;
@@ -514,12 +514,12 @@ public class InvoiceDispatcher {
return Iterables.transform(Iterables.filter(billingEvents, new Predicate<BillingEvent>() {
@Override
public boolean apply(final BillingEvent input) {
- return input.getSubscription().getBundleId().equals(dryRunArguments.getBundleId());
+ return input.getBundleId().equals(dryRunArguments.getBundleId());
}
}), new Function<BillingEvent, UUID>() {
@Override
public UUID apply(final BillingEvent input) {
- return input.getSubscription().getId();
+ return input.getSubscriptionId();
}
});
}
@@ -675,7 +675,7 @@ public class InvoiceDispatcher {
new Function<BillingEvent, UUID>() {
@Override
public UUID apply(final BillingEvent billingEvent) {
- return billingEvent.getSubscription().getId();
+ return billingEvent.getSubscriptionId();
}
}));
populateNextFutureNotificationDate(rescheduleDate, subscriptionIds, notificationsBuilder, context);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
index 8bf1ca5..0c39ef4 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
@@ -471,11 +471,11 @@ public abstract class ContiguousIntervalUsageInArrear {
}
public UUID getBundleId() {
- return billingEvents.get(0).getSubscription().getBundleId();
+ return billingEvents.get(0).getBundleId();
}
public UUID getSubscriptionId() {
- return billingEvents.get(0).getSubscription().getId();
+ return billingEvents.get(0).getSubscriptionId();
}
// STEPH_USAGE planName/phaseName,BCD,... might not be correct if we changed plan but Usage section was exactly similar
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java
index a9b11f3..9e537bb 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java
@@ -103,7 +103,7 @@ public class SubscriptionUsageInArrear {
this.rawSubscriptionUsage = Ordering.<RawUsage>from(RAW_USAGE_DATE_COMPARATOR).sortedCopy(Iterables.filter(rawUsage, new Predicate<RawUsage>() {
@Override
public boolean apply(final RawUsage input) {
- return input.getSubscriptionId().equals(subscriptionBillingEvents.get(0).getSubscription().getId());
+ return input.getSubscriptionId().equals(subscriptionBillingEvents.get(0).getSubscriptionId());
}
}));
this.existingTrackingIds = existingTrackingIds;
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 e61343d..d8ad91e 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
@@ -358,6 +358,16 @@ public class TestInvoiceHelper {
Mockito.when(mockAccount.getTimeZone()).thenReturn(DateTimeZone.UTC);
return new BillingEvent() {
@Override
+ public UUID getSubscriptionId() {
+ return subscription.getId();
+ }
+
+ @Override
+ public UUID getBundleId() {
+ return subscription.getBundleId();
+ }
+
+ @Override
public int getBillCycleDayLocal() {
return billCycleDayLocal;
}
@@ -367,10 +377,6 @@ public class TestInvoiceHelper {
return null;
}
- @Override
- public SubscriptionBase getSubscription() {
- return subscription;
- }
@Override
public DateTime getEffectiveDate() {
@@ -403,7 +409,7 @@ public class TestInvoiceHelper {
}
@Override
- public BigDecimal getRecurringPrice(DateTime effectiveDate) {
+ public BigDecimal getRecurringPrice() {
return recurringPrice;
}
@@ -434,8 +440,8 @@ public class TestInvoiceHelper {
@Override
public int compareTo(final BillingEvent e1) {
- if (!getSubscription().getId().equals(e1.getSubscription().getId())) { // First order by subscription
- return getSubscription().getId().compareTo(e1.getSubscription().getId());
+ if (!getSubscriptionId().equals(e1.getSubscriptionId())) { // First order by subscription
+ return getSubscriptionId().compareTo(e1.getSubscriptionId());
} else { // subscriptions are the same
if (!getEffectiveDate().equals(e1.getEffectiveDate())) { // Secondly order by date
return getEffectiveDate().compareTo(e1.getEffectiveDate());
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
index 5daaec1..109b44a 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
@@ -187,6 +187,8 @@ public abstract class TestUsageInArrearBase extends InvoiceTestSuiteNoDB {
Mockito.when(result.getBillCycleDayLocal()).thenReturn(bcd);
Mockito.when(result.getEffectiveDate()).thenReturn(effectiveDate);
Mockito.when(result.getBillingPeriod()).thenReturn(billingPeriod);
+ Mockito.when(result.getSubscriptionId()).thenReturn(subscriptionId);
+ Mockito.when(result.getBundleId()).thenReturn(bundleId);
final Account account = Mockito.mock(Account.class);
Mockito.when(account.getId()).thenReturn(accountId);
@@ -194,7 +196,6 @@ public abstract class TestUsageInArrearBase extends InvoiceTestSuiteNoDB {
final SubscriptionBase subscription = Mockito.mock(SubscriptionBase.class);
Mockito.when(subscription.getId()).thenReturn(subscriptionId);
Mockito.when(subscription.getBundleId()).thenReturn(bundleId);
- Mockito.when(result.getSubscription()).thenReturn(subscription);
final Product product = Mockito.mock(Product.class);
Mockito.when(product.getName()).thenReturn(productName);
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 0da70fa..8452ca2 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
@@ -79,6 +79,7 @@ public class BlockingCalculator {
return false;
}
+
final Hashtable<UUID, List<SubscriptionBase>> bundleMap = createBundleSubscriptionMap(billingEvents);
final SortedSet<BillingEvent> billingEventsToAdd = new TreeSet<BillingEvent>();
@@ -228,7 +229,7 @@ public class BlockingCalculator {
protected SortedSet<BillingEvent> filter(final SortedSet<BillingEvent> billingEvents, final SubscriptionBase subscription) {
final SortedSet<BillingEvent> result = new TreeSet<BillingEvent>();
for (final BillingEvent event : billingEvents) {
- if (event.getSubscription().getId().equals(subscription.getId())) {
+ if (event.getSubscriptionId().equals(subscription.getId())) {
result.add(event);
}
}
@@ -238,7 +239,6 @@ public class BlockingCalculator {
protected BillingEvent createNewDisableEvent(final DateTime disabledDurationStart, final BillingEvent previousEvent, final Catalog catalog) throws CatalogApiException {
final int billCycleDay = previousEvent.getBillCycleDayLocal();
- final SubscriptionBase subscription = previousEvent.getSubscription();
final DateTime effectiveDate = disabledDurationStart;
final PlanPhase planPhase = previousEvent.getPlanPhase();
final Plan plan = previousEvent.getPlan();
@@ -246,6 +246,7 @@ 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();
@@ -253,19 +254,19 @@ public class BlockingCalculator {
final SubscriptionBaseTransitionType type = SubscriptionBaseTransitionType.START_BILLING_DISABLED;
final Long totalOrdering = globaltotalOrder.getAndIncrement();
- return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase, fixedPrice,
+ return new DefaultBillingEvent(((DefaultBillingEvent) previousEvent).getSubscription(), effectiveDate, true, plan, planPhase, fixedPrice, recurringPrice,
currency,
billingPeriod, billCycleDay,
- description, totalOrdering, type, catalog, true);
+ description, totalOrdering, type, true);
}
protected BillingEvent createNewReenableEvent(final DateTime odEventTime, final BillingEvent previousEvent, final Catalog catalog, 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 BigDecimal fixedPrice = previousEvent.getFixedPrice();
+ final BigDecimal recurringPrice = previousEvent.getRecurringPrice();
final Plan plan = previousEvent.getPlan();
final Currency currency = previousEvent.getCurrency();
final String description = "";
@@ -273,23 +274,23 @@ public class BlockingCalculator {
final SubscriptionBaseTransitionType type = SubscriptionBaseTransitionType.END_BILLING_DISABLED;
final Long totalOrdering = globaltotalOrder.getAndIncrement();
- return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase, fixedPrice,
+ return new DefaultBillingEvent(((DefaultBillingEvent) previousEvent).getSubscription(), effectiveDate, true, plan, planPhase, fixedPrice, recurringPrice,
currency,
billingPeriod, billCycleDay,
- description, totalOrdering, type, catalog, false);
+ description, totalOrdering, type, false);
}
protected Hashtable<UUID, List<SubscriptionBase>> createBundleSubscriptionMap(final SortedSet<BillingEvent> billingEvents) {
final Hashtable<UUID, List<SubscriptionBase>> result = new Hashtable<UUID, List<SubscriptionBase>>();
for (final BillingEvent event : billingEvents) {
- final UUID bundleId = event.getSubscription().getBundleId();
+ final UUID bundleId = event.getBundleId();
List<SubscriptionBase> subs = result.get(bundleId);
if (subs == null) {
subs = new ArrayList<SubscriptionBase>();
result.put(bundleId, subs);
}
- if (!result.get(bundleId).contains(event.getSubscription())) {
- subs.add(event.getSubscription());
+ if (!result.get(bundleId).contains(((DefaultBillingEvent)event).getSubscription())) {
+ subs.add(((DefaultBillingEvent)event).getSubscription());
}
}
return result;
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 43da1ab..628ad61 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
@@ -20,6 +20,7 @@ package org.killbill.billing.junction.plumbing.billing;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import javax.annotation.Nullable;
@@ -32,96 +33,104 @@ import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.Usage;
-import org.killbill.billing.events.SubscriptionInternalEvent;
import org.killbill.billing.junction.BillingEvent;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+import org.killbill.billing.subscription.api.user.SubscriptionBillingEvent;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class DefaultBillingEvent implements BillingEvent {
+ private final UUID subscriptionId;
+ private final UUID bundleId;
+
private final int billCycleDayLocal;
private final BillingAlignment billingAlignment;
- private final SubscriptionBase subscription;
+
private final DateTime effectiveDate;
+
private final PlanPhase planPhase;
private final Plan plan;
+ private final BillingPeriod billingPeriod;
+
private final BigDecimal fixedPrice;
+ private final BigDecimal recurringPrice;
private final Currency currency;
private final String description;
- private final BillingPeriod billingPeriod;
private final SubscriptionBaseTransitionType type;
private final Long totalOrdering;
private final List<Usage> usages;
- private final Catalog catalog;
private final boolean isDisableEvent;
- private final PlanPhase nextPlanPhase;
private final DateTime catalogEffectiveDate;
- public DefaultBillingEvent(final SubscriptionInternalEvent transition,
+
+ // TODO Ugly, can that go completely ?
+ private final SubscriptionBase subscription;
+
+ public DefaultBillingEvent(final SubscriptionBillingEvent transition,
final SubscriptionBase subscription,
final int billCycleDayLocal,
final BillingAlignment billingAlignment,
final Currency currency,
final Catalog catalog) throws CatalogApiException {
- final boolean isActive = transition.getTransitionType() != SubscriptionBaseTransitionType.CANCEL;
-
- if (isActive) {
- final String planName = transition.getNextPlan();
- this.plan = (planName != null) ? catalog.findPlan(planName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
+ final boolean isActive = transition.getType() != SubscriptionBaseTransitionType.CANCEL;
- final String planPhaseName = transition.getNextPhase();
- this.planPhase = (planPhaseName != null && this.plan != null) ? this.plan.findPhase(planPhaseName) : null;
- this.nextPlanPhase = this.planPhase;
+ this.subscription = subscription;
- this.billingPeriod = getRecurringBillingPeriod(nextPlanPhase);
- } else {
- final String planName = transition.getPreviousPlan();
- this.plan = (planName != null) ? catalog.findPlan(planName, transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
- final Plan prevPlan = this.plan;
+ this.subscriptionId = subscription.getId();
+ this.bundleId = subscription.getBundleId();
- final String planPhaseName = transition.getPreviousPhase();
- this.planPhase = (planPhaseName != null && this.plan != null) ? this.plan.findPhase(planPhaseName) : null;
- this.nextPlanPhase = null;
+ this.type = transition.getType();
+ this.plan = transition.getPlanName() != null ? catalog.findPlan(transition.getPlanName(), transition.getEffectiveDate(), subscription.getStartDate()) : null;
+ this.planPhase = transition.getPlanPhaseName() != null && this.plan != null ? this.plan.findPhase(transition.getPlanPhaseName()) : null;
+ this.billingPeriod = getRecurringBillingPeriod(planPhase);
- final String prevPhaseName = transition.getPreviousPhase();
- final PlanPhase prevPlanPhase = (prevPhaseName != null && prevPlan != null) ? prevPlan.findPhase(prevPhaseName) : null;
- this.billingPeriod = getRecurringBillingPeriod(prevPlanPhase);
- }
this.catalogEffectiveDate = plan == null ? null : new DateTime(plan.getCatalog().getEffectiveDate());
this.billCycleDayLocal = billCycleDayLocal;
this.billingAlignment = billingAlignment;
- this.catalog = catalog;
this.currency = currency;
- this.description = transition.getTransitionType().toString();
- this.effectiveDate = transition.getEffectiveTransitionTime();
- this.fixedPrice = transition.getTransitionType() != SubscriptionBaseTransitionType.BCD_CHANGE ? getFixedPrice(nextPlanPhase, currency) : null;
+ this.description = transition.getType().toString();
+ this.effectiveDate = transition.getEffectiveDate();
this.isDisableEvent = false;
- this.subscription = subscription;
this.totalOrdering = transition.getTotalOrdering();
- this.type = transition.getTransitionType();
this.usages = initializeUsage(isActive);
+
+ this.fixedPrice = computeFixedPrice();
+ this.recurringPrice = computeRecurringPrice();
+
+
}
- public DefaultBillingEvent(final SubscriptionBase subscription, final DateTime effectiveDate, final boolean isActive,
- final Plan plan, final PlanPhase planPhase, final BigDecimal fixedPrice,
+ 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 BillingPeriod billingPeriod, final int billCycleDayLocal,
- final String description, final long totalOrdering, final SubscriptionBaseTransitionType type,
- final Catalog catalog,
+ final BillingPeriod billingPeriod,
+ final int billCycleDayLocal,
+ final String description,
+ final long totalOrdering,
+ final SubscriptionBaseTransitionType type,
final boolean isDisableEvent) throws CatalogApiException {
- this.catalog = catalog;
+
this.subscription = subscription;
+
+ this.subscriptionId = subscription.getId();
+ this.bundleId = subscription.getBundleId();
this.effectiveDate = effectiveDate;
this.plan = plan;
this.planPhase = planPhase;
this.fixedPrice = fixedPrice;
+ this.recurringPrice = recurringPrice;
this.currency = currency;
this.billingPeriod = billingPeriod;
this.billCycleDayLocal = billCycleDayLocal;
@@ -130,15 +139,18 @@ public class DefaultBillingEvent implements BillingEvent {
this.totalOrdering = totalOrdering;
this.usages = initializeUsage(isActive);
this.isDisableEvent = isDisableEvent;
- this.nextPlanPhase = isDisableEvent ? null : planPhase;
this.catalogEffectiveDate = plan != null ? new DateTime(plan.getCatalog().getEffectiveDate()) : null;
this.billingAlignment = null;
}
+ SubscriptionBase getSubscription() {
+ return subscription;
+ }
+
@Override
public int compareTo(final BillingEvent e1) {
- if (!getSubscription().getId().equals(e1.getSubscription().getId())) { // First order by subscription
- return getSubscription().getId().compareTo(e1.getSubscription().getId());
+ if (!subscriptionId.equals(e1.getSubscriptionId())) { // First order by subscription
+ return subscriptionId.compareTo(e1.getSubscriptionId());
} else { // subscriptions are the same
if (!getEffectiveDate().equals(e1.getEffectiveDate())) { // Secondly order by date
return getEffectiveDate().compareTo(e1.getEffectiveDate());
@@ -182,6 +194,16 @@ public class DefaultBillingEvent implements BillingEvent {
}
@Override
+ public UUID getSubscriptionId() {
+ return subscriptionId;
+ }
+
+ @Override
+ public UUID getBundleId() {
+ return bundleId;
+ }
+
+ @Override
public int getBillCycleDayLocal() {
return billCycleDayLocal;
}
@@ -191,10 +213,6 @@ public class DefaultBillingEvent implements BillingEvent {
return billingAlignment;
}
- @Override
- public SubscriptionBase getSubscription() {
- return subscription;
- }
@Override
public DateTime getEffectiveDate() {
@@ -227,12 +245,8 @@ public class DefaultBillingEvent implements BillingEvent {
}
@Override
- 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);
+ public BigDecimal getRecurringPrice() {
+ return recurringPrice;
}
@Override
@@ -264,7 +278,7 @@ public class DefaultBillingEvent implements BillingEvent {
sb.append("{type=").append(type);
sb.append(", effectiveDate=").append(effectiveDate);
sb.append(", planPhaseName=").append(planPhase.getName());
- sb.append(", subscriptionId=").append(subscription.getId());
+ sb.append(", subscriptionId=").append(subscriptionId);
sb.append(", totalOrdering=").append(totalOrdering);
sb.append('}');
return sb.toString();
@@ -281,6 +295,12 @@ public class DefaultBillingEvent implements BillingEvent {
final DefaultBillingEvent that = (DefaultBillingEvent) o;
+ if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
+ return false;
+ }
+ if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+ return false;
+ }
if (billCycleDayLocal != that.billCycleDayLocal) {
return false;
}
@@ -305,9 +325,6 @@ public class DefaultBillingEvent implements BillingEvent {
if (planPhase != null ? !planPhase.equals(that.planPhase) : that.planPhase != null) {
return false;
}
- if (subscription != null ? !subscription.equals(that.subscription) : that.subscription != null) {
- return false;
- }
if (totalOrdering != null ? !totalOrdering.equals(that.totalOrdering) : that.totalOrdering != null) {
return false;
}
@@ -321,7 +338,8 @@ public class DefaultBillingEvent implements BillingEvent {
@Override
public int hashCode() {
int result = 31 * billCycleDayLocal;
- result = 31 * result + (subscription != null ? subscription.hashCode() : 0);
+ result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0);
+ result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
result = 31 * result + (fixedPrice != null ? fixedPrice.hashCode() : 0);
result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
result = 31 * result + (planPhase != null ? planPhase.hashCode() : 0);
@@ -334,12 +352,19 @@ public class DefaultBillingEvent implements BillingEvent {
return result;
}
- private BigDecimal getFixedPrice(@Nullable final PlanPhase nextPhase, final Currency currency) throws CatalogApiException {
- return (nextPhase != null && nextPhase.getFixed() != null && nextPhase.getFixed().getPrice() != null) ? nextPhase.getFixed().getPrice().getPrice(currency) : null;
+ private BigDecimal computeFixedPrice() throws CatalogApiException {
+ if (type == SubscriptionBaseTransitionType.BCD_CHANGE || type == SubscriptionBaseTransitionType.CANCEL) {
+ return null;
+ }
+ return (planPhase != null && planPhase.getFixed() != null && planPhase.getFixed().getPrice() != null) ? planPhase.getFixed().getPrice().getPrice(currency) : null;
}
- private BigDecimal getRecurringPrice(@Nullable final PlanPhase nextPhase, final Currency currency) throws CatalogApiException {
- return (nextPhase != null && nextPhase.getRecurring() != null && nextPhase.getRecurring().getRecurringPrice() != null) ? nextPhase.getRecurring().getRecurringPrice().getPrice(currency) : null;
+ private BigDecimal computeRecurringPrice() throws CatalogApiException {
+ // TODO why is logic different than fixedPrice ?
+ if (isDisableEvent || type == SubscriptionBaseTransitionType.CANCEL) {
+ return null;
+ }
+ return (planPhase != null && planPhase.getRecurring() != null && planPhase.getRecurring().getRecurringPrice() != null) ? planPhase.getRecurring().getRecurringPrice().getPrice(currency) : null;
}
private BillingPeriod getRecurringBillingPeriod(@Nullable final PlanPhase nextPhase) {
@@ -365,6 +390,7 @@ public class DefaultBillingEvent implements BillingEvent {
@Override
public DateTime getCatalogEffectiveDate() {
+ // TODO Can that go ?
return catalogEffectiveDate;
}
}
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
index a096e5e..641173d 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
@@ -43,8 +43,6 @@ import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.entitlement.api.SubscriptionEventType;
-import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
-import org.killbill.billing.events.SubscriptionInternalEvent;
import org.killbill.billing.invoice.api.DryRunArguments;
import org.killbill.billing.junction.BillingEvent;
import org.killbill.billing.junction.BillingEventSet;
@@ -52,6 +50,7 @@ import org.killbill.billing.junction.BillingInternalApi;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+import org.killbill.billing.subscription.api.user.SubscriptionBillingEvent;
import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.tag.TagInternalApi;
@@ -121,6 +120,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
return result;
}
+
// Pretty-print the events, before and after the blocking calculator does its magic
final StringBuilder logStringBuilder = new StringBuilder("Computed billing events for accountId='").append(accountId).append("'");
eventsToString(logStringBuilder, result);
@@ -235,7 +235,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
continue;
}
- final BigDecimal recurringPrice = event.getRecurringPrice(event.getEffectiveDate());
+ final BigDecimal recurringPrice = event.getRecurringPrice();
final boolean hasRecurringPrice = recurringPrice != null; // Note: could be zero (BCD would still be set, by convention)
final boolean hasUsage = event.getUsages() != null && !event.getUsages().isEmpty();
if (!hasRecurringPrice &&
@@ -274,25 +274,25 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
for (final SubscriptionBase subscription : subscriptions) {
- final List<EffectiveSubscriptionInternalEvent> billingTransitions = subscriptionApi.getBillingTransitions(subscription, context);
+ final List<SubscriptionBillingEvent> billingTransitions = subscriptionApi.getSubscriptionBillingEvents(subscription, context);
if (billingTransitions.isEmpty() ||
- (billingTransitions.get(0).getTransitionType() != SubscriptionBaseTransitionType.CREATE &&
- billingTransitions.get(0).getTransitionType() != SubscriptionBaseTransitionType.TRANSFER)) {
+ (billingTransitions.get(0).getType() != SubscriptionBaseTransitionType.CREATE &&
+ billingTransitions.get(0).getType() != SubscriptionBaseTransitionType.TRANSFER)) {
log.warn("Skipping billing events for subscription " + subscription.getId() + ": Does not start with a valid CREATE transition");
skipSubscriptionsSet.add(subscription.getId());
return;
}
Integer overridenBCD = null;
- for (final EffectiveSubscriptionInternalEvent transition : billingTransitions) {
- final BillingAlignment alignment = catalog.billingAlignment(getPlanPhaseSpecifierFromTransition(catalog, transition), transition.getEffectiveTransitionTime(), subscription.getStartDate());
+ for (final SubscriptionBillingEvent transition : billingTransitions) {
+ final BillingAlignment alignment = catalog.billingAlignment(getPlanPhaseSpecifierFromTransition(catalog, transition), transition.getEffectiveDate(), subscription.getStartDate());
//
// A BCD_CHANGE transition defines a new billCycleDayLocal for the subscription and this overrides whatever computation
// occurs below (which is based on billing alignment policy). Also multiple of those BCD_CHANGE transitions could occur,
// to define different intervals with different billing cycle days.
//
- overridenBCD = transition.getNextBillCycleDayLocal() != null ? transition.getNextBillCycleDayLocal() : overridenBCD;
+ overridenBCD = transition.getBcdLocal() != null ? transition.getBcdLocal() : overridenBCD;
final int bcdLocal = overridenBCD != null ?
overridenBCD :
calculateBcdForTransition(alignment, bcdCache, baseSubscription, subscription, currentAccountBCD, context);
@@ -311,17 +311,9 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
return BillCycleDayCalculator.calculateBcdForAlignment(bcdCache, subscription, baseSubscription, alignment, internalTenantContext, accountBillCycleDayLocal);
}
- private PlanPhaseSpecifier getPlanPhaseSpecifierFromTransition(final Catalog catalog, final SubscriptionInternalEvent transition) throws CatalogApiException {
- final Plan prevPlan = (transition.getPreviousPlan() != null) ? catalog.findPlan(transition.getPreviousPlan(), transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
- final Plan nextPlan = (transition.getNextPlan() != null) ? catalog.findPlan(transition.getNextPlan(), transition.getEffectiveTransitionTime(), transition.getSubscriptionStartDate()) : null;
-
- final Plan plan = (transition.getTransitionType() != SubscriptionBaseTransitionType.CANCEL) ? nextPlan : prevPlan;
-
- final PlanPhase prevPhase = prevPlan != null && transition.getPreviousPhase() != null ? prevPlan.findPhase(transition.getPreviousPhase()) : null;
- final PlanPhase nextPhase = nextPlan != null && transition.getNextPhase() != null ? nextPlan.findPhase(transition.getNextPhase()) : null;
-
- final PlanPhase phase = (transition.getTransitionType() != SubscriptionBaseTransitionType.CANCEL) ? nextPhase : prevPhase;
-
+ private PlanPhaseSpecifier getPlanPhaseSpecifierFromTransition(final Catalog catalog, final SubscriptionBillingEvent transition) throws CatalogApiException {
+ final Plan plan = catalog.findPlan(transition.getPlanName(), transition.getEffectiveDate(), transition.getLastChangePlanDate());
+ final PlanPhase phase = plan.findPhase(transition.getPlanPhaseName());
return new PlanPhaseSpecifier(plan.getName(), phase.getPhaseType());
}
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 e6e6daf..fcdecdf 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
@@ -54,6 +54,8 @@ import org.killbill.billing.mock.MockEffectiveSubscriptionEvent;
import org.killbill.billing.mock.MockSubscription;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+import org.killbill.billing.subscription.api.user.SubscriptionBillingEvent;
+import org.killbill.billing.subscription.api.user.DefaultSubscriptionBillingEvent;
import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.util.api.TagApiException;
@@ -82,6 +84,7 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
private static final UUID bunId = new UUID(2L, 0L);
private static final String bunKey = bunId.toString();
+ private List<SubscriptionBillingEvent> billingTransitions;
private List<EffectiveSubscriptionInternalEvent> effectiveSubscriptionTransitions;
private SubscriptionBase subscription;
private MockCatalog catalog;
@@ -97,6 +100,8 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
Mockito.when(bundle.getId()).thenReturn(bunId);
final List<SubscriptionBaseBundle> bundles = ImmutableList.<SubscriptionBaseBundle>of(bundle);
+
+ billingTransitions = new LinkedList<SubscriptionBillingEvent>();
effectiveSubscriptionTransitions = new LinkedList<EffectiveSubscriptionInternalEvent>();
final DateTime subscriptionStartDate = clock.getUTCNow().minusDays(3);
@@ -111,7 +116,7 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
Mockito.when(subscriptionInternalApi.getSubscriptionFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
Mockito.when(subscriptionInternalApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
Mockito.when(subscriptionInternalApi.getBaseSubscription(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
- Mockito.when(subscriptionInternalApi.getBillingTransitions(Mockito.<SubscriptionBase>any(), Mockito.<InternalTenantContext>any())).thenReturn(effectiveSubscriptionTransitions);
+ Mockito.when(subscriptionInternalApi.getSubscriptionBillingEvents(Mockito.<SubscriptionBase>any(), Mockito.<InternalTenantContext>any())).thenReturn(billingTransitions);
Mockito.when(subscriptionInternalApi.getAllTransitions(Mockito.<SubscriptionBase>any(), Mockito.<InternalTenantContext>any())).thenReturn(effectiveSubscriptionTransitions);
final DefaultVersionedCatalog versionedCatalog = catalogService.getFullCatalog(true, true, internalCallContext);
@@ -260,13 +265,13 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
}
if (recurringPrice != null) {
- Assert.assertEquals(recurringPrice.getPrice(Currency.USD), event.getRecurringPrice(null));
+ Assert.assertEquals(recurringPrice.getPrice(Currency.USD), event.getRecurringPrice());
} else {
- assertNull(event.getRecurringPrice(null));
+ assertNull(event.getRecurringPrice());
}
Assert.assertEquals(BCD, event.getBillCycleDayLocal());
- Assert.assertEquals(id, event.getSubscription().getId());
+ Assert.assertEquals(id, event.getSubscriptionId());
Assert.assertEquals(time.getDayOfMonth(), event.getEffectiveDate().getDayOfMonth());
Assert.assertEquals(nextPhase, event.getPlanPhase());
Assert.assertEquals(nextPlan, event.getPlan());
@@ -300,6 +305,8 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
SubscriptionBaseTransitionType.CREATE, 1, null, 1L, 2L, null);
effectiveSubscriptionTransitions.add(t);
+ billingTransitions.add(new DefaultSubscriptionBillingEvent(SubscriptionBaseTransitionType.CREATE, nextPlan.getName(), nextPhase.getName(), now, 1L, now, null));
+
return now;
}
}
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 58d299b..cbdd84f 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
@@ -357,7 +357,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 1);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice(null));
+ assertNull(results.first().getRecurringPrice());
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
}
@@ -379,7 +379,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 1);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice(null));
+ assertNull(results.first().getRecurringPrice());
assertEquals(results.first().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
assertEquals(results.first().getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
}
@@ -433,11 +433,11 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 2);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice(null));
+ assertNull(results.first().getRecurringPrice());
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(null), billingEvents.first().getRecurringPrice(null));
+ assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
@@ -458,11 +458,11 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 2);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice(null));
+ assertNull(results.first().getRecurringPrice());
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(null), billingEvents.first().getRecurringPrice(null));
+ assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
@@ -484,11 +484,11 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 2);
assertEquals(results.first().getEffectiveDate(), now);
assertNull(results.first().getFixedPrice());
- assertNull(results.first().getRecurringPrice(null));
+ assertNull(results.first().getRecurringPrice());
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(null), billingEvents.first().getRecurringPrice(null));
+ assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
@@ -507,7 +507,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 1);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
+ assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
@@ -526,7 +526,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(results.size(), 1);
assertEquals(results.last().getEffectiveDate(), now.plusDays(2));
- assertEquals(results.last().getRecurringPrice(null), billingEvents.first().getRecurringPrice(null));
+ assertEquals(results.last().getRecurringPrice(), billingEvents.first().getRecurringPrice());
assertEquals(results.last().getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
}
@@ -566,63 +566,24 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
}
- protected BillingEvent createRealEvent(final DateTime effectiveDate, final SubscriptionBase subscription) {
- return createRealEvent(effectiveDate, subscription, SubscriptionBaseTransitionType.CHANGE);
- }
-
- 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);
- Mockito.when(planPhase.getUsages()).thenReturn(new DefaultUsage[0]);
-
- final BigDecimal fixedPrice = BigDecimal.TEN;
-
- return new DefaultBillingEvent(subscription, effectiveDate, true, plan, planPhase, fixedPrice,
- currency,
- billingPeriod, billCycleDay,
- description, totalOrdering, type, null, false);
-
- } catch (final CatalogApiException e) {
- Assert.fail("", e);
- }
- throw new IllegalStateException();
- }
-
@Test(groups = "fast")
public void testFilter() {
final SortedSet<BillingEvent> events = new TreeSet<BillingEvent>();
- events.add(createBillingEvent(subscription1));
- events.add(createBillingEvent(subscription1));
- events.add(createBillingEvent(subscription1));
- events.add(createBillingEvent(subscription2));
+ events.add(createBillingEvent(subscription1, 1L));
+ events.add(createBillingEvent(subscription1, 2L));
+ events.add(createBillingEvent(subscription1, 3L));
+ events.add(createBillingEvent(subscription2, 4L));
final SortedSet<BillingEvent> result1 = blockingCalculator.filter(events, subscription1);
final SortedSet<BillingEvent> result2 = blockingCalculator.filter(events, subscription2);
final SortedSet<BillingEvent> result3 = blockingCalculator.filter(events, subscription3);
assertEquals(result1.size(), 3);
- assertEquals(result1.first().getSubscription(), subscription1);
- assertEquals(result1.last().getSubscription(), subscription1);
+ assertEquals(((DefaultBillingEvent)(result1.first())).getSubscription(), subscription1);
+ assertEquals(((DefaultBillingEvent)(result1.last())).getSubscription(), subscription1);
assertEquals(result2.size(), 1);
- assertEquals(result2.first().getSubscription(), subscription2);
+ assertEquals(((DefaultBillingEvent)(result2.first())).getSubscription(), subscription2);
assertEquals(result3.size(), 0);
}
@@ -637,7 +598,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(result.getPlanPhase(), event.getPlanPhase());
assertEquals(result.getPlan(), event.getPlan());
assertNull(result.getFixedPrice());
- assertNull(result.getRecurringPrice(null));
+ assertNull(result.getRecurringPrice());
assertEquals(result.getCurrency(), event.getCurrency());
assertEquals(result.getDescription(), "");
assertEquals(result.getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD);
@@ -657,7 +618,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(result.getPlanPhase(), event.getPlanPhase());
assertEquals(result.getPlan(), event.getPlan());
assertEquals(result.getFixedPrice(), event.getFixedPrice());
- assertEquals(result.getRecurringPrice(null), event.getRecurringPrice(null));
+ assertEquals(result.getRecurringPrice(), event.getRecurringPrice());
assertEquals(result.getCurrency(), event.getCurrency());
assertEquals(result.getDescription(), "");
assertEquals(result.getBillingPeriod(), event.getBillingPeriod());
@@ -669,18 +630,18 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
private class MockBillingEvent extends DefaultBillingEvent {
public MockBillingEvent() throws CatalogApiException {
- super(subscription1, clock.getUTCNow(), true, null, null, BigDecimal.ZERO, Currency.USD, BillingPeriod.ANNUAL,
- 4, "", 3L, SubscriptionBaseTransitionType.CREATE, null, false);
+ super(subscription1, clock.getUTCNow(), true, null, null, BigDecimal.ZERO, BigDecimal.ZERO, Currency.USD, BillingPeriod.ANNUAL,
+ 4, "", 3L, SubscriptionBaseTransitionType.CREATE, false);
}
}
@Test(groups = "fast")
public void testCreateBundleSubscriptionMap() {
final SortedSet<BillingEvent> events = new TreeSet<BillingEvent>();
- events.add(createBillingEvent(subscription1));
- events.add(createBillingEvent(subscription2));
- events.add(createBillingEvent(subscription3));
- events.add(createBillingEvent(subscription4));
+ events.add(createBillingEvent(subscription1, 1L));
+ events.add(createBillingEvent(subscription2, 2L));
+ events.add(createBillingEvent(subscription3, 3L));
+ events.add(createBillingEvent(subscription4, 4L));
final Hashtable<UUID, List<SubscriptionBase>> map = blockingCalculator.createBundleSubscriptionMap(events);
@@ -691,12 +652,7 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
}
- private BillingEvent createBillingEvent(final SubscriptionBase subscription) {
- final BillingEvent result = Mockito.mock(BillingEvent.class);
- Mockito.when(result.getSubscription()).thenReturn(subscription);
- Mockito.when(result.compareTo(Mockito.<BillingEvent>any())).thenReturn(1);
- return result;
- }
+
@Test(groups = "fast")
public void testCreateDisablePairs() {
@@ -833,9 +789,9 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
@Test(groups = "fast")
public void testSimpleWithClearBlockingDuration() throws Exception {
- final BillingEvent trial = createRealEvent(new LocalDate(2012, 5, 1).toDateTimeAtStartOfDay(DateTimeZone.UTC), subscription1, SubscriptionBaseTransitionType.CREATE);
- final BillingEvent phase = createRealEvent(new LocalDate(2012, 5, 31).toDateTimeAtStartOfDay(DateTimeZone.UTC), subscription1, SubscriptionBaseTransitionType.PHASE);
- final BillingEvent upgrade = createRealEvent(new LocalDate(2012, 7, 25).toDateTimeAtStartOfDay(DateTimeZone.UTC), subscription1, SubscriptionBaseTransitionType.CHANGE);
+ final BillingEvent trial = createRealEvent(subscription1, new LocalDate(2012, 5, 1).toDateTimeAtStartOfDay(DateTimeZone.UTC), SubscriptionBaseTransitionType.CREATE);
+ final BillingEvent phase = createRealEvent(subscription1, new LocalDate(2012, 5, 31).toDateTimeAtStartOfDay(DateTimeZone.UTC), SubscriptionBaseTransitionType.PHASE);
+ final BillingEvent upgrade = createRealEvent(subscription1, new LocalDate(2012, 7, 25).toDateTimeAtStartOfDay(DateTimeZone.UTC), SubscriptionBaseTransitionType.CHANGE);
final SortedSet<BillingEvent> billingEvents = new TreeSet<BillingEvent>();
billingEvents.add(trial);
billingEvents.add(phase);
@@ -866,4 +822,60 @@ public class TestBlockingCalculator extends JunctionTestSuiteNoDB {
assertEquals(events.get(3).getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
assertEquals(events.get(4).getEffectiveDate(), new LocalDate(2012, 7, 25).toDateTimeAtStartOfDay(DateTimeZone.UTC));
assertEquals(events.get(4).getTransitionType(), SubscriptionBaseTransitionType.CHANGE); }
+
+
+ private BillingEvent createBillingEvent(final SubscriptionBase subscription, final Long totalOrdering) {
+ return createRealEvent( subscription, new DateTime(), SubscriptionBaseTransitionType.CREATE, totalOrdering);
+ }
+
+ protected BillingEvent createRealEvent(final DateTime effectiveDate, final SubscriptionBase subscription) {
+ return createRealEvent(subscription, effectiveDate, SubscriptionBaseTransitionType.CHANGE);
+ }
+
+ protected BillingEvent createRealEvent(final SubscriptionBase subscription, final DateTime effectiveDate, final SubscriptionBaseTransitionType type) {
+ return createRealEvent(subscription, effectiveDate, type, 0L);
+ }
+
+ private BillingEvent createRealEvent(final SubscriptionBase subscription, final DateTime effectiveDate, final SubscriptionBaseTransitionType type, final Long totalOrdering) {
+ try {
+
+ final Integer billCycleDay = 1;
+ final Plan plan = new MockPlan();
+ final Currency currency = Currency.USD;
+ final String description = "";
+ final BillingPeriod billingPeriod = BillingPeriod.MONTHLY;
+
+ 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);
+ Mockito.when(planPhase.getUsages()).thenReturn(new DefaultUsage[0]);
+
+ final BigDecimal fixedPrice = BigDecimal.TEN;
+
+ return new DefaultBillingEvent(subscription,
+ effectiveDate,
+ true,
+ plan,
+ planPhase,
+ fixedPrice,
+ BigDecimal.TEN,
+ currency,
+ billingPeriod,
+ billCycleDay,
+ description,
+ totalOrdering,
+ type,
+ false);
+
+ } catch (final CatalogApiException e) {
+ Assert.fail("", e);
+ }
+ throw new IllegalStateException();
+ }
+
}
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 05ff9dd..8aeab7e 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
@@ -31,7 +31,6 @@ import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
-import org.killbill.billing.account.api.Account;
import org.killbill.billing.catalog.DefaultPrice;
import org.killbill.billing.catalog.MockInternationalPrice;
import org.killbill.billing.catalog.MockPlan;
@@ -44,7 +43,6 @@ import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.junction.JunctionTestSuiteNoDB;
-import org.killbill.billing.mock.MockAccountBuilder;
import org.killbill.billing.junction.BillingEvent;
public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
@@ -187,9 +185,9 @@ public class TestDefaultBillingEvent extends JunctionTestSuiteNoDB {
final PlanPhase shotgunMonthly = createMockMonthlyPlanPhase(null, BigDecimal.ZERO, PhaseType.TRIAL);
return new DefaultBillingEvent(sub, effectiveDate, true,
- shotgun, shotgunMonthly, BigDecimal.ZERO,
+ shotgun, shotgunMonthly, BigDecimal.ZERO, BigDecimal.ZERO,
Currency.USD, BillingPeriod.NO_BILLING_PERIOD, billCycleDay,
- "Test Event 1", totalOrdering, type, null, false);
+ "Test Event 1", totalOrdering, type, false);
}
private MockPlanPhase createMockMonthlyPlanPhase(@Nullable final BigDecimal recurringRate,
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
index 0e830df..1fddc01 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
@@ -53,6 +53,7 @@ import org.killbill.billing.subscription.api.SubscriptionBaseApiService;
import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
import org.killbill.billing.subscription.api.SubscriptionBaseWithAddOns;
import org.killbill.billing.subscription.api.SubscriptionBaseWithAddOnsSpecifier;
+import org.killbill.billing.subscription.api.user.SubscriptionBillingEvent;
import org.killbill.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
import org.killbill.billing.subscription.api.user.DefaultSubscriptionBase;
import org.killbill.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
@@ -349,9 +350,8 @@ public class DefaultSubscriptionInternalApi extends DefaultSubscriptionBaseCreat
}
@Override
- public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(final SubscriptionBase subscription, final InternalTenantContext context) {
- final List<SubscriptionBaseTransition> transitions = ((DefaultSubscriptionBase) subscription).getBillingTransitions();
- return convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(subscription, context, transitions);
+ public List<SubscriptionBillingEvent> getSubscriptionBillingEvents(final SubscriptionBase subscription, final InternalTenantContext context) {
+ return((DefaultSubscriptionBase) subscription).getBillingTransitions();
}
@Override
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
index fc09a99..4aaf947 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
@@ -524,26 +524,40 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
return it.hasNext() ? ((SubscriptionBaseTransitionData) it.next()).getTotalOrdering() : -1L;
}
- public List<SubscriptionBaseTransition> getBillingTransitions() {
+ public List<SubscriptionBillingEvent> getBillingTransitions() {
if (transitions == null) {
return Collections.emptyList();
}
- final List<SubscriptionBaseTransition> result = new ArrayList<SubscriptionBaseTransition>();
+ final List<SubscriptionBillingEvent> result = new ArrayList<SubscriptionBillingEvent>();
final SubscriptionBaseTransitionDataIterator it = new SubscriptionBaseTransitionDataIterator(
clock, transitions, Order.ASC_FROM_PAST,
Visibility.ALL, TimeLimit.ALL);
// Remove anything prior to first CREATE
boolean foundInitialEvent = false;
+
+ DateTime lastPlanChangeTime = null;
while (it.hasNext()) {
- final SubscriptionBaseTransitionData curTransition = (SubscriptionBaseTransitionData) it.next();
+ final SubscriptionBaseTransitionData cur = (SubscriptionBaseTransitionData) it.next();
if (!foundInitialEvent) {
- foundInitialEvent = curTransition.getEventType() == EventType.API_USER &&
- (curTransition.getApiEventType() == ApiEventType.CREATE ||
- curTransition.getApiEventType() == ApiEventType.TRANSFER);
+ foundInitialEvent = cur.getEventType() == EventType.API_USER &&
+ (cur.getApiEventType() == ApiEventType.CREATE ||
+ cur.getApiEventType() == ApiEventType.TRANSFER);
+ lastPlanChangeTime = cur.getEffectiveTransitionTime();
}
+
if (foundInitialEvent) {
- result.add(curTransition);
+
+ if (cur.getEventType() == EventType.API_USER &&
+ cur.getApiEventType() == ApiEventType.CHANGE) {
+ lastPlanChangeTime = cur.getEffectiveTransitionTime();
+ }
+
+ final boolean isActive = cur.getTransitionType() != SubscriptionBaseTransitionType.CANCEL;
+ final String planName = isActive ? cur.getNextPlan().getName() : cur.getPreviousPlan().getName();
+ final String planPhaseName = isActive ? cur.getNextPhase().getName() : cur.getPreviousPhase().getName();
+ final SubscriptionBillingEvent billingTransition = new DefaultSubscriptionBillingEvent(cur.getTransitionType(), planName, planPhaseName, cur.getEffectiveTransitionTime(), cur.getTotalOrdering(), lastPlanChangeTime, cur.getNextBillingCycleDayLocal());
+ result.add(billingTransition);
}
}
return result;
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java
new file mode 100644
index 0000000..6ae9725
--- /dev/null
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBillingEvent.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2014-2019 Groupon, Inc
+ * Copyright 2014-2019 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.subscription.api.user;
+
+import org.joda.time.DateTime;
+import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+
+public class DefaultSubscriptionBillingEvent implements SubscriptionBillingEvent {
+
+ private final SubscriptionBaseTransitionType type;
+ private final String planName;
+ private final String planPhaseName;
+ private final DateTime effectiveDate;
+ private final Long totalOrdering;
+ private final DateTime lastChangePlanDate;
+ private final Integer bcdLocal;
+
+ public DefaultSubscriptionBillingEvent(final SubscriptionBaseTransitionType type, final String planName, final String planPhaseName, final DateTime effectiveDate, final Long totalOrdering, final DateTime lastChangePlanDate, final Integer bcdLocal) {
+ this.type = type;
+ this.planName = planName;
+ this.planPhaseName = planPhaseName;
+ this.effectiveDate = effectiveDate;
+ this.totalOrdering = totalOrdering;
+ this.lastChangePlanDate = lastChangePlanDate;
+ this.bcdLocal = bcdLocal;
+ }
+
+ @Override
+ public SubscriptionBaseTransitionType getType() {
+ return type;
+ }
+
+ @Override
+ public String getPlanName() {
+ return planName;
+ }
+
+ @Override
+ public String getPlanPhaseName() {
+ return planPhaseName;
+ }
+
+ @Override
+ public DateTime getEffectiveDate() {
+ return effectiveDate;
+ }
+
+ @Override
+ public Long getTotalOrdering() {
+ return totalOrdering;
+ }
+
+ @Override
+ public DateTime getLastChangePlanDate() {
+ return lastChangePlanDate;
+ }
+
+ @Override
+ public Integer getBcdLocal() {
+ return bcdLocal;
+ }
+}