killbill-memoizeit
Changes
entitlement/src/main/java/org/killbill/billing/entitlement/api/EntitlementDateHelper.java 19(+14 -5)
invoice/src/main/java/org/killbill/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java 30(+16 -14)
invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java 46(+23 -23)
invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java 10(+5 -5)
invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java 2(+1 -1)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEventSet.java 22(+9 -13)
junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultInternalBillingApi.java 11(+5 -6)
Details
diff --git a/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java b/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
index bb68757..812511f 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
@@ -22,7 +22,9 @@ import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
+import org.joda.time.LocalTime;
+// TODO Cache the accountTimeZone, reference time and clock in the context
public class TimeAwareContext {
// From JDK to Joda (see http://www.joda.org/joda-time/userguide.html#JDK_Interoperability)
@@ -35,14 +37,30 @@ public class TimeAwareContext {
return toDateTime(dateTime, DateTimeZone.UTC);
}
+ // Create a DateTime object using the specified reference time and timezone (usually, the one on the account)
+ public DateTime toUTCDateTime(final LocalDate localDate, final DateTime referenceDateTime, final DateTimeZone accountTimeZone) {
+ return toUTCDateTime(toDateTime(localDate, referenceDateTime, accountTimeZone));
+ }
+
+ // Create a DateTime object using the specified reference time and timezone (usually, the one on the account)
+ public DateTime toDateTime(final LocalDate localDate, final DateTime referenceDateTime, final DateTimeZone accountTimeZone) {
+ final LocalTime referenceLocalTime = toDateTime(referenceDateTime, accountTimeZone).toLocalTime();
+
+ return new DateTime(localDate.getYear(),
+ localDate.getMonthOfYear(),
+ localDate.getDayOfMonth(),
+ referenceLocalTime.getHourOfDay(),
+ referenceLocalTime.getMinuteOfHour(),
+ referenceLocalTime.getSecondOfMinute(),
+ accountTimeZone);
+ }
+
// Create a DateTime object using the specified timezone (usually, the one on the account)
- // TODO Should we cache the accountTimeZone in the context?
public DateTime toDateTime(final DateTime dateTime, final DateTimeZone accountTimeZone) {
return dateTime.toDateTime(accountTimeZone);
}
// Create a LocalDate object using the specified timezone (usually, the one on the account)
- // TODO Should we cache the accountTimeZone in the context?
public LocalDate toLocalDate(final DateTime dateTime, final DateTimeZone accountTimeZone) {
return new LocalDate(dateTime, accountTimeZone);
}
diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/EntitlementDateHelper.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/EntitlementDateHelper.java
index 1378573..1136f11 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/EntitlementDateHelper.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/EntitlementDateHelper.java
@@ -20,13 +20,13 @@ package org.killbill.billing.entitlement.api;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
+import org.joda.time.Interval;
import org.joda.time.LocalDate;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.ImmutableAccountData;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.clock.Clock;
-import org.killbill.clock.ClockUtil;
public class EntitlementDateHelper {
@@ -39,19 +39,28 @@ public class EntitlementDateHelper {
}
public DateTime fromLocalDateAndReferenceTime(final LocalDate requestedDate, final DateTime referenceDateTime, final InternalTenantContext callContext) throws EntitlementApiException {
+ final ImmutableAccountData account;
+
try {
- final ImmutableAccountData account = accountApi.getImmutableAccountDataByRecordId(callContext.getAccountRecordId(), callContext);
- return ClockUtil.computeDateTimeWithUTCReferenceTime(requestedDate, callContext.toUTCDateTime(referenceDateTime).toLocalTime(), account.getTimeZone(), clock);
+ account = accountApi.getImmutableAccountDataByRecordId(callContext.getAccountRecordId(), callContext);
} catch (final AccountApiException e) {
throw new EntitlementApiException(e);
}
+
+ // If the input date overlaps with the present, we return NOW.
+ final Interval interval = requestedDate.toInterval(account.getTimeZone());
+ if (interval.contains(clock.getUTCNow())) {
+ return clock.getUTCNow();
+ }
+
+ return callContext.toUTCDateTime(requestedDate, referenceDateTime, account.getTimeZone());
}
/**
* Check if the date portion of a date/time is before or equals at now (as returned by the clock).
*
- * @param inputDate the fully qualified DateTime
- * @param accountTimeZone the account timezone
+ * @param inputDate the fully qualified DateTime
+ * @param accountTimeZone the account timezone
* @param internalTenantContext the context
* @return true if the inputDate, once converted into a LocalDate using account timezone is less or equals than today
*/
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
index b537bff..1eea7fe 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -22,17 +22,14 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
-import org.killbill.billing.account.api.ImmutableAccountData;
-import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications;
-import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications.SubscriptionNotification;
-import org.killbill.billing.util.timezone.DefaultAccountDateAndTimeZoneContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.killbill.billing.account.api.AccountApiException;
+import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.MigrationPlan;
-import org.killbill.clock.Clock;
+import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications;
+import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications.SubscriptionNotification;
import org.killbill.billing.invoice.api.InvoiceItemType;
import org.killbill.billing.invoice.api.InvoiceMigrationApi;
import org.killbill.billing.invoice.dao.DefaultInvoiceDao;
@@ -40,7 +37,10 @@ import org.killbill.billing.invoice.dao.InvoiceItemModelDao;
import org.killbill.billing.invoice.dao.InvoiceModelDao;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
-import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.util.timezone.DefaultAccountDateAndTimeZoneContext;
+import org.killbill.clock.Clock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -68,10 +68,12 @@ public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
@Override
public UUID createMigrationInvoice(final UUID accountId, final LocalDate targetDate, final BigDecimal balance, final Currency currency, final CallContext context) {
- ImmutableAccountData account;
+ final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(accountId, context);
+
+ final ImmutableAccountData account;
try {
- account = accountUserApi.getImmutableAccountDataById(accountId, internalCallContextFactory.createInternalTenantContext(accountId, context));
- } catch (AccountApiException e) {
+ account = accountUserApi.getImmutableAccountDataById(accountId, internalCallContext);
+ } catch (final AccountApiException e) {
log.warn("Unable to find account for id {}", accountId);
return null;
}
@@ -82,9 +84,9 @@ public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
targetDate, null, balance, null, currency, null);
final DateTime wrongEffectiveDateButDoesNotMatter = null;
- final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(wrongEffectiveDateButDoesNotMatter, account.getTimeZone());
+ final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(wrongEffectiveDateButDoesNotMatter, account.getTimeZone(), internalCallContext);
dao.createInvoice(migrationInvoice, ImmutableList.<InvoiceItemModelDao>of(migrationInvoiceItem),
- true, new FutureAccountNotifications(dateAndTimeZoneContext, ImmutableMap.<UUID, List<SubscriptionNotification>>of()), internalCallContextFactory.createInternalCallContext(accountId, context));
+ true, new FutureAccountNotifications(dateAndTimeZoneContext, ImmutableMap.<UUID, List<SubscriptionNotification>>of()), internalCallContext);
return migrationInvoice.getId();
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
index 6a16b88..dc87e42 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
@@ -1109,7 +1109,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingMode.IN_ADVANCE,
"testEvent1", 1L, SubscriptionBaseTransitionType.CREATE);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(event1);
final InvoiceWithMetadata invoiceWithMetadata1 = generator.generateInvoice(account, events, invoiceList, targetDate, Currency.USD, context);
@@ -1161,7 +1161,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
final BillingEvent event = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate, plan, phase,
fixedPrice.getPrice(currency), null, currency, BillingPeriod.MONTHLY, 15, BillingMode.IN_ADVANCE,
"testEvent", 1L, SubscriptionBaseTransitionType.CREATE);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(event);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
@@ -1203,7 +1203,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1, fixedPrice.getPrice(currency),
null, currency, BillingPeriod.MONTHLY, 1, BillingMode.IN_ADVANCE,
"testEvent1", 1L, SubscriptionBaseTransitionType.CREATE);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(event1);
final UUID accountId = account.getId();
@@ -1246,7 +1246,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
@Test(groups = "slow")
public void testInvoiceForEmptyEventSet() throws InvoiceApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final InvoiceWithMetadata invoiceWithMetadata = generator.generateInvoice(account, events, null, new LocalDate(), Currency.USD, context);
final Invoice invoice = invoiceWithMetadata.getInvoice();
assertNull(invoice);
@@ -1273,7 +1273,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
fixedPrice.getPrice(currency), null, currency,
BillingPeriod.MONTHLY, 1, BillingMode.IN_ADVANCE,
"testEvent1", 1L, SubscriptionBaseTransitionType.CREATE);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(event1);
final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
@@ -1340,7 +1340,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
invoices.add(new DefaultInvoice(savedInvoice));
// NOW COMPUTE A DIFFERENT ITEM TO TRIGGER REPAIR
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final SubscriptionBase subscription = getZombieSubscription(subscriptionId);
final Plan plan = Mockito.mock(Plan.class);
@@ -1381,7 +1381,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
final PlanPhase phase2 = Mockito.mock(PlanPhase.class);
Mockito.when(phase2.getName()).thenReturn("plan-phase2");
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final List<Invoice> invoices = new ArrayList<Invoice>();
final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index 4b8be24..3d20246 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -157,14 +157,14 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testWithEmptyEventSet() throws InvoiceApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final InvoiceWithMetadata invoiceWithMetadata = generator.generateInvoice(account, events, null, clock.getUTCToday(), Currency.USD, internalCallContext);
assertNull(invoiceWithMetadata.getInvoice());
}
@Test(groups = "fast")
public void testWithSingleMonthlyEvent() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final SubscriptionBase sub = createSubscription();
final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
@@ -208,7 +208,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final int bcdLocal = 16;
final LocalDate startDate = invoiceUtil.buildDate(2012, 7, bcdLocal);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final BillingEvent event = createBillingEvent(sub.getId(), sub.getBundleId(), startDate, plan, phase, bcdLocal);
events.add(event);
@@ -233,7 +233,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final int bcdLocal = 16;
final LocalDate startDate = invoiceUtil.buildDate(2012, 7, 16);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(createBillingEvent(sub.getId(), sub.getBundleId(), startDate, plan, phaseEvergreen, bcdLocal));
// Set a target date of today (start date)
@@ -248,7 +248,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testWithSingleMonthlyEventWithLeadingProRation() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final SubscriptionBase sub = createSubscription();
final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
@@ -273,7 +273,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testTwoMonthlySubscriptionsWithAlignedBillingDates() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final Plan plan1 = new MockPlan();
final BigDecimal rate1 = FIVE;
@@ -301,7 +301,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testOnePlan_TwoMonthlyPhases_ChangeImmediate() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final Plan plan1 = new MockPlan();
final BigDecimal rate1 = FIVE;
@@ -338,7 +338,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testOnePlan_ThreeMonthlyPhases_ChangeEOT() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final Plan plan1 = new MockPlan();
final BigDecimal rate1 = FIVE;
@@ -368,7 +368,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testSingleEventWithExistingInvoice() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final SubscriptionBase sub = createSubscription();
final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
@@ -446,7 +446,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
BigDecimal expectedAmount;
final List<Invoice> invoices = new ArrayList<Invoice>();
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
// on 1/5/2011, create SubscriptionBase 1 (trial)
events.add(createBillingEvent(subscriptionId1, bundleId, plan1StartDate, plan1, plan1Phase1, 5));
@@ -556,7 +556,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
public void testZeroDollarEvents() throws InvoiceApiException, CatalogApiException {
final Plan plan = new MockPlan();
final PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
events.add(createBillingEvent(UUID.randomUUID(), UUID.randomUUID(), targetDate, plan, planPhase, 1));
@@ -569,7 +569,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
public void testEndDateIsCorrect() throws InvoiceApiException, CatalogApiException {
final Plan plan = new MockPlan();
final PlanPhase planPhase = createMockMonthlyPlanPhase(ONE);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final LocalDate startDate = clock.getUTCToday().minusDays(1);
final LocalDate targetDate = startDate.plusDays(1);
@@ -597,7 +597,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final DateTime changeDate = new DateTime("2012-04-1");
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, new DateTime("2012-01-1"),
plan, phase1,
@@ -636,7 +636,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final BigDecimal fixedCost = TEN;
final PlanPhase phase1 = createMockMonthlyPlanPhase(monthlyRate, fixedCost, PhaseType.TRIAL);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final UUID subscriptionId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
@@ -674,7 +674,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final PlanPhase phase1 = createMockMonthlyPlanPhase(null, fixedCost1, PhaseType.TRIAL);
final PlanPhase phase2 = createMockMonthlyPlanPhase(null, fixedCost2, PhaseType.EVERGREEN);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final UUID subscriptionId = UUID.randomUUID();
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
@@ -706,7 +706,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testInvoiceGenerationFailureScenario() throws InvoiceApiException, CatalogApiException {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final UUID subscriptionId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
final int BILL_CYCLE_DAY = 15;
@@ -766,7 +766,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast", expectedExceptions = {InvoiceApiException.class})
public void testTargetDateRestrictionFailure() throws InvoiceApiException, CatalogApiException {
final LocalDate targetDate = clock.getUTCToday().plusMonths(60);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final Plan plan1 = new MockPlan();
final PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
events.add(createBillingEvent(UUID.randomUUID(), UUID.randomUUID(), clock.getUTCToday(), plan1, phase1, 1));
@@ -840,7 +840,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final MockInternationalPrice price20 = new MockInternationalPrice(new DefaultPrice(TWENTY, Currency.USD));
final PlanPhase basePlanEvergreen = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(createBillingEvent(baseSubscription.getId(), baseSubscription.getBundleId(), april25, basePlan, basePlanEvergreen, 25));
// generate invoice
@@ -876,7 +876,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
// perform a repair (change base plan; remove one add-on)
// event stream should include just two plans
- final MockBillingEventSet newEvents = new MockBillingEventSet();
+ final MockBillingEventSet newEvents = new MockBillingEventSet(internalCallContext);
final Plan basePlan2 = new MockPlan("base plan 2");
final MockInternationalPrice price13 = new MockInternationalPrice(new DefaultPrice(THIRTEEN, Currency.USD));
final PlanPhase basePlan2Phase = new MockPlanPhase(price13, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
@@ -905,7 +905,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
final MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
final PlanPhase originalPlanEvergreen = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
events.add(createBillingEvent(originalSubscription.getId(), originalSubscription.getBundleId(), april25, originalPlan, originalPlanEvergreen, 25));
final InvoiceWithMetadata invoiceWithMetadata1 = generator.generateInvoice(account, events, null, april25, Currency.USD, internalCallContext);
@@ -983,7 +983,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
//
// Note : this is the interesting part of the test; it does not provide the blocking billing events, which force invoice
// to un repair what was previously repaired.
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final BillingEvent event = invoiceUtil.createMockBillingEvent(null, subscription, new DateTime("2013-06-15", DateTimeZone.UTC),
plan, phase,
null, recurringPrice.getPrice(currency), currency,
@@ -1064,7 +1064,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
@Test(groups = "fast")
public void testAutoInvoiceOffAccount() throws Exception {
- final MockBillingEventSet events = new MockBillingEventSet();
+ final MockBillingEventSet events = new MockBillingEventSet(internalCallContext);
events.setAccountInvoiceOff(true);
final SubscriptionBase sub = createSubscription();
@@ -1087,7 +1087,7 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
public void testAutoInvoiceOffWithCredits() throws CatalogApiException, InvoiceApiException {
final Currency currency = Currency.USD;
final List<Invoice> invoices = new ArrayList<Invoice>();
- final MockBillingEventSet eventSet = new MockBillingEventSet();
+ final MockBillingEventSet eventSet = new MockBillingEventSet(internalCallContext);
final UUID accountId = UUID.randomUUID();
final UUID bundleId = UUID.randomUUID();
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 fc2d83a..ed2cc17 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
@@ -69,7 +69,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
try {
account = invoiceUtil.createAccount(callContext);
subscription = invoiceUtil.createSubscription();
- dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(new DateTime("2016-01-08T03:01:01.000Z"), DateTimeZone.UTC);
+ dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(new DateTime("2016-01-08T03:01:01.000Z"), DateTimeZone.UTC, internalCallContext);
} catch (final Exception e) {
Assert.fail(e.getMessage());
}
@@ -170,7 +170,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
final LocalDate targetDate = new LocalDate("2016-01-08");
final UUID invoiceId = UUID.randomUUID();
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final BigDecimal fixedPriceAmount = BigDecimal.TEN;
final MockInternationalPrice fixedPrice = new MockInternationalPrice(new DefaultPrice(fixedPriceAmount, Currency.USD));
@@ -203,7 +203,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
final LocalDate targetDate = new LocalDate("2016-01-08");
final UUID invoiceId = UUID.randomUUID();
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final BigDecimal fixedPriceAmount = BigDecimal.TEN;
final MockInternationalPrice fixedPrice = new MockInternationalPrice(new DefaultPrice(fixedPriceAmount, Currency.USD));
@@ -239,7 +239,7 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
final LocalDate targetDate = new LocalDate("2016-01-08");
final UUID invoiceId = UUID.randomUUID();
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final BigDecimal fixedPriceAmount1 = BigDecimal.TEN;
final MockInternationalPrice fixedPrice1 = new MockInternationalPrice(new DefaultPrice(fixedPriceAmount1, Currency.USD));
@@ -287,4 +287,4 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
assertEquals(proposedItems.get(0).getAmount(), fixedPriceAmount3);
}
-}
\ No newline at end of file
+}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/MockBillingEventSet.java b/invoice/src/test/java/org/killbill/billing/invoice/MockBillingEventSet.java
index 356cb3d..ded4436 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/MockBillingEventSet.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/MockBillingEventSet.java
@@ -27,6 +27,7 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
+import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.BillingMode;
import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.junction.BillingEvent;
@@ -38,12 +39,15 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
private static final long serialVersionUID = 1L;
+ private final InternalTenantContext internalTenantContext;
+
private boolean isAccountInvoiceOff;
private List<UUID> subscriptionIdsWithAutoInvoiceOff;
private AccountDateAndTimeZoneContext accountDateAndTimeZoneContext;
- public MockBillingEventSet() {
+ public MockBillingEventSet(final InternalTenantContext internalTenantContext) {
super();
+ this.internalTenantContext = internalTenantContext;
this.isAccountInvoiceOff = false;
this.subscriptionIdsWithAutoInvoiceOff = new ArrayList<UUID>();
}
@@ -51,7 +55,7 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
@Override
public boolean add(final BillingEvent e) {
if (accountDateAndTimeZoneContext == null) {
- this.accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(e.getEffectiveDate(), DateTimeZone.UTC);
+ this.accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(e.getEffectiveDate(), DateTimeZone.UTC, internalTenantContext);
}
return super.add(e);
}
@@ -59,7 +63,7 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
@Override
public boolean addAll(final Collection<? extends BillingEvent> all) {
if (accountDateAndTimeZoneContext == null) {
- this.accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(all.iterator().next().getEffectiveDate(), DateTimeZone.UTC);
+ this.accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(all.iterator().next().getEffectiveDate(), DateTimeZone.UTC, internalTenantContext);
}
return super.addAll(all);
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/proRations/InvoiceTestUtils.java b/invoice/src/test/java/org/killbill/billing/invoice/proRations/InvoiceTestUtils.java
index 0f90be1..879f538 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/proRations/InvoiceTestUtils.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/proRations/InvoiceTestUtils.java
@@ -106,7 +106,7 @@ public class InvoiceTestUtils {
}
Mockito.when(invoice.getInvoiceItems()).thenReturn(invoiceItems);
- final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC);
+ final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC, internalCallContext);
invoiceDao.createInvoice(new InvoiceModelDao(invoice), invoiceModelItems, true, new FutureAccountNotifications(dateAndTimeZoneContext, ImmutableMap.<UUID, List<SubscriptionNotification>>of()), internalCallContext);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java
index 2bdde60..0695857 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceDispatcher.java
@@ -72,7 +72,7 @@ public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
public void testDryRunInvoice() throws InvoiceApiException, AccountApiException, CatalogApiException {
final UUID accountId = account.getId();
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final Plan plan = MockPlan.createBicycleNoTrialEvergreen1USD();
final PlanPhase planPhase = MockPlanPhase.create1USDMonthlyEvergreen();
final DateTime effectiveDate = clock.getUTCNow().minusDays(1);
@@ -114,7 +114,7 @@ public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
@Test(groups = "slow")
public void testWithOverdueEvents() throws Exception {
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
// Initial trial
final MockPlan bicycleTrialEvergreen1USD = MockPlan.createBicycleTrialEvergreen1USD();
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 3cc1c21..8b8946b 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
@@ -189,7 +189,7 @@ public class TestInvoiceHelper {
final SubscriptionBase subscription = Mockito.mock(SubscriptionBase.class);
Mockito.when(subscription.getId()).thenReturn(UUID.randomUUID());
Mockito.when(subscription.getBundleId()).thenReturn(new UUID(0L, 0L));
- final BillingEventSet events = new MockBillingEventSet();
+ final BillingEventSet events = new MockBillingEventSet(internalCallContext);
final Plan plan = MockPlan.createBicycleNoTrialEvergreen1USD();
final PlanPhase planPhase = MockPlanPhase.create1USDMonthlyEvergreen();
final DateTime effectiveDate = new DateTime().minusDays(1);
@@ -288,7 +288,7 @@ public class TestInvoiceHelper {
}));
// The test does not use the invoice callback notifier hence the empty map
- final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC);
+ final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC, internalCallContext);
invoiceDao.createInvoice(invoiceModelDao, invoiceItemModelDaos, isRealInvoiceWithItems, new FutureAccountNotifications(dateAndTimeZoneContext, ImmutableMap.<UUID, List<SubscriptionNotification>>of()), internalCallContext);
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java
index ce4dcb6..823cd41 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestSubscriptionConsumableInArrear.java
@@ -75,7 +75,7 @@ public class TestSubscriptionConsumableInArrear extends TestUsageInArrearBase {
LocalDate targetDate = new LocalDate(2013, 6, 23);
- final AccountDateAndTimeZoneContext accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC);
+ final AccountDateAndTimeZoneContext accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC, internalCallContext);
final SubscriptionConsumableInArrear foo = new SubscriptionConsumableInArrear(accountId, invoiceId, billingEvents, ImmutableList.<RawUsage>of(), targetDate, new LocalDate(dt1, DateTimeZone.UTC), accountDateAndTimeZoneContext);
final List<ContiguousIntervalConsumableInArrear> result = foo.computeInArrearUsageInterval();
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 8f4d001..c968760 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
@@ -73,7 +73,7 @@ public abstract class TestUsageInArrearBase extends InvoiceTestSuiteNoDB {
}
protected ContiguousIntervalConsumableInArrear createContiguousIntervalConsumableInArrear(final DefaultUsage usage, List<RawUsage> rawUsages, final LocalDate targetDate, final boolean closedInterval, final BillingEvent... events) {
- final AccountDateAndTimeZoneContext accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC);
+ final AccountDateAndTimeZoneContext accountDateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.UTC, internalCallContext);
final ContiguousIntervalConsumableInArrear intervalConsumableInArrear = new ContiguousIntervalConsumableInArrear(usage, accountId, invoiceId, rawUsages, targetDate, new LocalDate(events[0].getEffectiveDate()), accountDateAndTimeZoneContext);
for (BillingEvent event : events) {
intervalConsumableInArrear.addBillingEvent(event);
diff --git a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEventSet.java b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEventSet.java
index 3e7cd5b..b819311 100644
--- a/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEventSet.java
+++ b/junction/src/main/java/org/killbill/billing/junction/plumbing/billing/DefaultBillingEventSet.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * 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:
*
@@ -26,9 +28,8 @@ import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
-import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
-import org.joda.time.LocalDate;
+import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.BillingMode;
import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.junction.BillingEvent;
@@ -48,20 +49,22 @@ public class DefaultBillingEventSet extends TreeSet<BillingEvent> implements Sor
private final List<UUID> subscriptionIdsWithAutoInvoiceOff;
private final BillingMode recurringBillingMode;
private final DateTimeZone accountTimeZone;
+ private final InternalTenantContext internalTenantContext;
private DefaultAccountDateAndTimeZoneContext dateTimeZoneContext;
- public DefaultBillingEventSet(final boolean accountAutoInvoiceOff, final BillingMode recurringBillingMode, final DateTimeZone timeZone) {
+ public DefaultBillingEventSet(final boolean accountAutoInvoiceOff, final BillingMode recurringBillingMode, final DateTimeZone timeZone, final InternalTenantContext internalTenantContext) {
this.accountAutoInvoiceOff = accountAutoInvoiceOff;
this.recurringBillingMode = recurringBillingMode;
this.accountTimeZone = timeZone;
+ this.internalTenantContext = internalTenantContext;
this.subscriptionIdsWithAutoInvoiceOff = new ArrayList<UUID>();
}
@Override
public boolean add(final BillingEvent e) {
if (dateTimeZoneContext == null) {
- this.dateTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(e.getEffectiveDate(), accountTimeZone);
+ this.dateTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(e.getEffectiveDate(), accountTimeZone, internalTenantContext);
}
return super.add(e);
}
@@ -69,14 +72,11 @@ public class DefaultBillingEventSet extends TreeSet<BillingEvent> implements Sor
@Override
public boolean addAll(final Collection<? extends BillingEvent> all) {
if (dateTimeZoneContext == null) {
- this.dateTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(all.iterator().next().getEffectiveDate(), accountTimeZone);
+ this.dateTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(all.iterator().next().getEffectiveDate(), accountTimeZone, internalTenantContext);
}
return super.addAll(all);
}
- /* (non-Javadoc)
- * @see org.killbill.billing.junction.plumbing.billing.BillingEventSet#isAccountAutoInvoiceOff()
- */
@Override
public boolean isAccountAutoInvoiceOff() {
return accountAutoInvoiceOff;
@@ -87,9 +87,6 @@ public class DefaultBillingEventSet extends TreeSet<BillingEvent> implements Sor
return recurringBillingMode;
}
- /* (non-Javadoc)
- * @see org.killbill.billing.junction.plumbing.billing.BillingEventSet#getSubscriptionIdsWithAutoInvoiceOff()
- */
@Override
public List<UUID> getSubscriptionIdsWithAutoInvoiceOff() {
return subscriptionIdsWithAutoInvoiceOff;
@@ -121,7 +118,6 @@ public class DefaultBillingEventSet extends TreeSet<BillingEvent> implements Sor
return result;
}
-
@Override
public String toString() {
return "DefaultBillingEventSet [accountAutoInvoiceOff=" + accountAutoInvoiceOff
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 71bf65d..fde849c 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
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * 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:
*
@@ -17,7 +19,6 @@
package org.killbill.billing.junction.plumbing.billing;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
@@ -25,8 +26,6 @@ import java.util.UUID;
import javax.annotation.Nullable;
-import org.joda.time.DateTimeZone;
-import org.joda.time.LocalDate;
import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountInternalApi;
@@ -92,7 +91,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
final StaticCatalog currentCatalog = catalogService.getCurrentCatalog(context);
final ImmutableAccountData account = accountApi.getImmutableAccountDataById(accountId, context);
- final DefaultBillingEventSet result = new DefaultBillingEventSet(false, currentCatalog.getRecurringBillingMode(), account.getTimeZone());
+ final DefaultBillingEventSet result = new DefaultBillingEventSet(false, currentCatalog.getRecurringBillingMode(), account.getTimeZone(), context);
@@ -102,7 +101,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
final List<Tag> accountTags = tagApi.getTags(accountId, ObjectType.ACCOUNT, context);
final boolean found_AUTO_INVOICING_OFF = is_AUTO_INVOICING_OFF(accountTags);
if (found_AUTO_INVOICING_OFF) {
- return new DefaultBillingEventSet(true, currentCatalog.getRecurringBillingMode(), account.getTimeZone()); // billing is off, we are done
+ return new DefaultBillingEventSet(true, currentCatalog.getRecurringBillingMode(), account.getTimeZone(), context); // billing is off, we are done
}
addBillingEventsForBundles(bundles, account, dryRunArguments, context, result, skippedSubscriptions);
diff --git a/util/src/main/java/org/killbill/billing/util/timezone/DefaultAccountDateAndTimeZoneContext.java b/util/src/main/java/org/killbill/billing/util/timezone/DefaultAccountDateAndTimeZoneContext.java
index 2562fc2..cee1333 100644
--- a/util/src/main/java/org/killbill/billing/util/timezone/DefaultAccountDateAndTimeZoneContext.java
+++ b/util/src/main/java/org/killbill/billing/util/timezone/DefaultAccountDateAndTimeZoneContext.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * 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:
*
@@ -21,28 +23,33 @@ import org.joda.time.DateTimeZone;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
+import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.util.AccountDateAndTimeZoneContext;
/**
- * Used by entitlement and invoice to calculate:
+ * Used by junction and invoice to calculate:
* - a LocalDate from DateTime and the timeZone set on the account
* - A DateTime from a LocalDate and the referenceTime attached to the account.
*/
public final class DefaultAccountDateAndTimeZoneContext implements AccountDateAndTimeZoneContext {
private final LocalTime referenceTime;
- private final int offsetFromUtc;
private final DateTimeZone accountTimeZone;
+ private final InternalTenantContext internalTenantContext;
+
+ private final int offsetFromUtc;
- /// effectiveDateTime is compute from first billing event and so offsetFromUtc will remain constant with regard to daylight saving time
- public DefaultAccountDateAndTimeZoneContext(final DateTime effectiveDateTime, final DateTimeZone accountTimeZone) {
+ /// referenceTime is compute from first billing event and so offsetFromUtc will remain constant with regard to daylight saving time
+ public DefaultAccountDateAndTimeZoneContext(final DateTime effectiveDateTime, final DateTimeZone accountTimeZone, final InternalTenantContext internalTenantContext) {
this.referenceTime = effectiveDateTime != null ? effectiveDateTime.toLocalTime() : null;
this.accountTimeZone = accountTimeZone;
- this.offsetFromUtc = computeOffsetFromUtc(effectiveDateTime, accountTimeZone);
+ this.internalTenantContext = internalTenantContext;
+
+ this.offsetFromUtc = computeOffsetFromUtc(effectiveDateTime, accountTimeZone, internalTenantContext);
}
- static int computeOffsetFromUtc(final DateTime effectiveDateTime, final DateTimeZone accountTimeZone) {
- final LocalDate localDateInAccountTimeZone = new LocalDate(effectiveDateTime, accountTimeZone);
+ static int computeOffsetFromUtc(final DateTime effectiveDateTime, final DateTimeZone accountTimeZone, final InternalTenantContext internalTenantContext) {
+ final LocalDate localDateInAccountTimeZone = internalTenantContext.toLocalDate(effectiveDateTime, accountTimeZone);
final LocalDate localDateInUTC = new LocalDate(effectiveDateTime, DateTimeZone.UTC);
return Days.daysBetween(localDateInUTC, localDateInAccountTimeZone).getDays();
}
@@ -50,7 +57,7 @@ public final class DefaultAccountDateAndTimeZoneContext implements AccountDateAn
@Override
public LocalDate computeLocalDateFromFixedAccountOffset(final DateTime targetDateTime) {
final DateTime dateWithOriginalAccountTimeZoneOffset = targetDateTime.plusDays(offsetFromUtc);
- return dateWithOriginalAccountTimeZoneOffset.toLocalDate();
+ return dateWithOriginalAccountTimeZoneOffset.toLocalDate();
}
@Override
diff --git a/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java b/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java
index ba6b67f..905b9db 100644
--- a/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java
+++ b/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java
@@ -21,6 +21,7 @@ import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
+import org.killbill.billing.util.AccountDateAndTimeZoneContext;
import org.testng.annotations.Test;
import org.killbill.billing.util.UtilTestSuiteNoDB;
@@ -57,7 +58,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime1);
- int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone);
+ int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone, internalCallContext);
assertEquals(offset, -1);
}
@@ -71,7 +72,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime2);
- int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone);
+ int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone, internalCallContext);
assertEquals(offset, 0);
}
@@ -85,7 +86,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime3);
- int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone);
+ int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone, internalCallContext);
assertEquals(offset, 0);
}
@@ -99,7 +100,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeA);
- int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone);
+ int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone, internalCallContext);
assertEquals(offset, 1);
}
@@ -113,7 +114,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeB);
- int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone);
+ int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone, internalCallContext);
assertEquals(offset, 1);
}
@@ -127,7 +128,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeC);
- int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone);
+ int offset = DefaultAccountDateAndTimeZoneContext.computeOffsetFromUtc(effectiveDateTime, timeZone, internalCallContext);
assertEquals(offset, 0);
}
@@ -137,7 +138,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime1);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
- final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone);
+ final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 19);
final DateTime endDateTimeInUTC = dateContext.computeUTCDateTimeFromLocalDate(endDate);
@@ -151,7 +152,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime2);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
- final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone);
+ final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 20);
final DateTime endDateTimeInUTC = dateContext.computeUTCDateTimeFromLocalDate(endDate);
@@ -165,7 +166,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime3);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
- final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone);
+ final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 20);
final DateTime endDateTimeInUTC = dateContext.computeUTCDateTimeFromLocalDate(endDate);
@@ -178,7 +179,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeA);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
- final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone);
+ final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 21);
final DateTime endDateTimeInUTC = dateContext.computeUTCDateTimeFromLocalDate(endDate);
@@ -191,7 +192,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeB);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
- final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone);
+ final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 21);
final DateTime endDateTimeInUTC = dateContext.computeUTCDateTimeFromLocalDate(endDate);
@@ -204,7 +205,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeC);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
- final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone);
+ final DefaultAccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 20);
final DateTime endDateTimeInUTC = dateContext.computeUTCDateTimeFromLocalDate(endDate);
@@ -218,7 +219,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
final DateTimeZone tz = DateTimeZone.forID("America/Juneau");
final DateTime originalDateTime = new DateTime("2015-09-01T08:01:01.000Z");
- final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(originalDateTime, tz);
+ final DefaultAccountDateAndTimeZoneContext dateAndTimeZoneContext = new DefaultAccountDateAndTimeZoneContext(originalDateTime, tz, internalCallContext);
final LocalDate l1 = dateAndTimeZoneContext.computeLocalDateFromFixedAccountOffset(originalDateTime);