killbill-memoizeit

Fix broken bus handler so they use event accountRecordId, tenantRecordId

10/24/2012 9:39:30 PM

Changes

Details

diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
index 4945661..bd5458d 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
@@ -96,4 +96,8 @@ public interface Subscription extends Entity, Blockable {
     public DateTime getPaidThroughDate();
 
     public ProductCategory getCategory();
+
+    public SubscriptionTransition getPendingTransition();
+
+    public SubscriptionTransition getPreviousTransition();
 }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
new file mode 100644
index 0000000..b53d1ae
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.entitlement.api.user;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Plan;
+import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.entitlement.api.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
+
+public interface SubscriptionTransition {
+
+    public UUID getSubscriptionId();
+
+    public UUID getBundleId();
+
+    public SubscriptionState getPreviousState();
+
+    public SubscriptionState getNextState();
+
+    public Plan getPreviousPlan();
+
+    public Plan getNextPlan();
+
+    public PlanPhase getPreviousPhase();
+
+    public PlanPhase getNextPhase();
+
+    public PriceList getPreviousPriceList();
+
+    public PriceList getNextPriceList();
+
+    public DateTime getRequestedTransitionTime();
+
+    public DateTime getEffectiveTransitionTime();
+
+    public SubscriptionTransitionType getTransitionType();
+}
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/BeatrixService.java b/beatrix/src/main/java/com/ning/billing/beatrix/BeatrixService.java
new file mode 100644
index 0000000..72f5664
--- /dev/null
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/BeatrixService.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.beatrix;
+
+import com.ning.billing.lifecycle.KillbillService;
+
+public class BeatrixService implements KillbillService {
+
+    public static final String BEATRIX_SERVICE_NAME = "beatrix-service";
+
+    @Override
+    public String getName() {
+        return BEATRIX_SERVICE_NAME;
+    }
+
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionDataRepair.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionDataRepair.java
index 12b692a..555b227 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionDataRepair.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionDataRepair.java
@@ -35,7 +35,7 @@ import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory.SubscriptionBuilder;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
-import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.entitlement.engine.addon.AddonUtils;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.events.EntitlementEvent;
@@ -126,7 +126,7 @@ public class SubscriptionDataRepair extends SubscriptionData {
             return;
         }
 
-        final SubscriptionTransitionData pendingTransition = getPendingTransitionData();
+        final SubscriptionTransition pendingTransition = getPendingTransition();
         if (pendingTransition == null) {
             return;
         }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
index 1daf3d4..6c85794 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
@@ -364,7 +364,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
         }
 
-        final SubscriptionTransitionData  previousTransition = subscription.getPreviousTransitionData();
+        final SubscriptionTransition  previousTransition = subscription.getPreviousTransition();
         if (previousTransition != null && previousTransition.getEffectiveTransitionTime().isAfter(requestedDate)) {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_DATE,
                                                   requestedDate.toString(), previousTransition.getEffectiveTransitionTime());
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
index 0119af3..85bf0fc 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
@@ -114,8 +114,8 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
     @Override
     public SubscriptionState getState() {
-        return (getPreviousTransitionData()  == null) ? null
-                : getPreviousTransitionData().getNextState();
+        return (getPreviousTransition()  == null) ? null
+                : getPreviousTransition().getNextState();
     }
 
     @Override
@@ -137,26 +137,26 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
     @Override
     public PlanPhase getCurrentPhase() {
-        return (getPreviousTransitionData() == null) ? null
-                : getPreviousTransitionData().getNextPhase();
+        return (getPreviousTransition() == null) ? null
+                : getPreviousTransition().getNextPhase();
     }
 
     @Override
     public Plan getCurrentPlan() {
-        return (getPreviousTransitionData() == null) ? null
-                : getPreviousTransitionData().getNextPlan();
+        return (getPreviousTransition() == null) ? null
+                : getPreviousTransition().getNextPlan();
     }
 
     @Override
     public PriceList getCurrentPriceList() {
-        return (getPreviousTransitionData() == null) ? null :
-            getPreviousTransitionData().getNextPriceList();
+        return (getPreviousTransition() == null) ? null :
+            getPreviousTransition().getNextPriceList();
 
     }
 
     @Override
     public DateTime getEndDate() {
-        final SubscriptionTransitionData latestTransition = getPreviousTransitionData();
+        final SubscriptionTransition latestTransition = getPreviousTransition();
         if (latestTransition.getNextState() == SubscriptionState.CANCELLED) {
             return latestTransition.getEffectiveTransitionTime();
         }
@@ -219,7 +219,8 @@ public class SubscriptionData extends EntityBase implements Subscription {
         throw new UnsupportedOperationException();
     }
 
-    public SubscriptionTransitionData getPendingTransitionData() {
+    @Override
+    public SubscriptionTransition getPendingTransition() {
         if (transitions == null) {
             return null;
         }
@@ -229,12 +230,10 @@ public class SubscriptionData extends EntityBase implements Subscription {
         return it.hasNext() ? it.next() : null;
     }
 
-
-
     @Override
     public String getLastActiveProductName() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransitionData data = getPreviousTransitionData();
+            final SubscriptionTransition data = getPreviousTransition();
             return data.getPreviousPlan().getProduct().getName();
         } else {
             return getCurrentPlan().getProduct().getName();
@@ -244,7 +243,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
     @Override
     public String getLastActivePriceListName() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransitionData data = getPreviousTransitionData();
+            final SubscriptionTransition data = getPreviousTransition();
             return data.getPreviousPriceList().getName();
         } else {
             return getCurrentPriceList().getName();
@@ -254,7 +253,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
     @Override
     public String getLastActiveCategoryName() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransitionData data = getPreviousTransitionData();
+            final SubscriptionTransition data = getPreviousTransition();
             return data.getPreviousPlan().getProduct().getCategory().name();
         } else {
             return getCurrentPlan().getProduct().getCategory().name();
@@ -264,7 +263,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
     @Override
     public Plan getLastActivePlan() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransitionData data = getPreviousTransitionData();
+            final SubscriptionTransition data = getPreviousTransition();
             return data.getPreviousPlan();
         } else {
             return getCurrentPlan();
@@ -274,14 +273,15 @@ public class SubscriptionData extends EntityBase implements Subscription {
     @Override
     public String getLastActiveBillingPeriod() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransitionData data = getPreviousTransitionData();
+            final SubscriptionTransition data = getPreviousTransition();
             return data.getPreviousPlan().getBillingPeriod().name();
         } else {
             return getCurrentPlan().getBillingPeriod().name();
         }
     }
 
-    protected SubscriptionTransitionData getPreviousTransitionData() {
+    @Override
+    public SubscriptionTransition getPreviousTransition() {
         if (transitions == null) {
             return null;
         }
@@ -581,4 +581,6 @@ public class SubscriptionData extends EntityBase implements Subscription {
             previousPriceList = nextPriceList;
         }
     }
+
+
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
index d3707fa..cf8752c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
@@ -29,7 +29,7 @@ import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 
-public class SubscriptionTransitionData /* implements SubscriptionEvent */ {
+public class SubscriptionTransitionData implements SubscriptionTransition {
     private final Long totalOrdering;
     private final UUID subscriptionId;
     private final UUID bundleId;
@@ -116,42 +116,52 @@ public class SubscriptionTransitionData /* implements SubscriptionEvent */ {
         return eventId;
     }
 
+    @Override
     public UUID getSubscriptionId() {
         return subscriptionId;
     }
 
+    @Override
     public UUID getBundleId() {
         return bundleId;
     }
 
+    @Override
     public SubscriptionState getPreviousState() {
         return previousState;
     }
 
+    @Override
     public Plan getPreviousPlan() {
         return previousPlan;
     }
 
+    @Override
     public PlanPhase getPreviousPhase() {
         return previousPhase;
     }
 
+    @Override
     public Plan getNextPlan() {
         return nextPlan;
     }
 
+    @Override
     public PlanPhase getNextPhase() {
         return nextPhase;
     }
 
+    @Override
     public SubscriptionState getNextState() {
         return nextState;
     }
 
+    @Override
     public PriceList getPreviousPriceList() {
         return previousPriceList;
     }
 
+    @Override
     public PriceList getNextPriceList() {
         return nextPriceList;
     }
@@ -164,6 +174,7 @@ public class SubscriptionTransitionData /* implements SubscriptionEvent */ {
         return remainingEventsForUserOperation;
     }
 
+    @Override
     public SubscriptionTransitionType getTransitionType() {
         return toSubscriptionTransitionType(eventType, apiEventType);
     }
@@ -179,10 +190,12 @@ public class SubscriptionTransitionData /* implements SubscriptionEvent */ {
         }
     }
 
+    @Override
     public DateTime getRequestedTransitionTime() {
         return requestedTransitionTime;
     }
 
+    @Override
     public DateTime getEffectiveTransitionTime() {
         return effectiveTransitionTime;
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
index 88a7895..f36d904 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
@@ -132,7 +132,7 @@ public class TestTransfer extends TestApiBase {
         // CREATE BP
         final Subscription baseSubscription = createSubscription(baseProduct, baseTerm, basePriceList);
 
-        final DateTime evergreenPhaseDate = ((SubscriptionData) baseSubscription).getPendingTransitionData().getEffectiveTransitionTime();
+        final DateTime evergreenPhaseDate = ((SubscriptionData) baseSubscription).getPendingTransition().getEffectiveTransitionTime();
 
         // MOVE A LITTLE, STILL IN TRIAL
         clock.addDays(20);
@@ -186,7 +186,7 @@ public class TestTransfer extends TestApiBase {
 
         entitlementInternalApi.setChargedThroughDate(baseSubscription.getId(), ctd.toLocalDate(), internalCallContext);
 
-        final DateTime evergreenPhaseDate = ((SubscriptionData) baseSubscription).getPendingTransitionData().getEffectiveTransitionTime();
+        final DateTime evergreenPhaseDate = ((SubscriptionData) baseSubscription).getPendingTransition().getEffectiveTransitionTime();
 
         // MOVE A LITTLE, STILL IN TRIAL
         clock.addDays(20);
@@ -344,8 +344,8 @@ public class TestTransfer extends TestApiBase {
         assertEquals(newPlan.getProduct().getName(), newBaseProduct1);
         assertEquals(newBaseSubscriptionWithCtd.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
 
-        assertNotNull(((SubscriptionData) newBaseSubscriptionWithCtd).getPendingTransitionData());
-        assertEquals(((SubscriptionData) newBaseSubscriptionWithCtd).getPendingTransitionData().getEffectiveTransitionTime(), newCtd);
+        assertNotNull(((SubscriptionData) newBaseSubscriptionWithCtd).getPendingTransition());
+        assertEquals(((SubscriptionData) newBaseSubscriptionWithCtd).getPendingTransition().getEffectiveTransitionTime(), newCtd);
     }
 
     @Test(groups = "slow")
@@ -403,15 +403,15 @@ public class TestTransfer extends TestApiBase {
             if (curProduct.getName().equals(baseProduct)) {
                 foundBP = true;
                 assertTrue(((SubscriptionData) cur).getAlignStartDate().compareTo(((SubscriptionData) baseSubscription).getAlignStartDate()) == 0);
-                assertNull(((SubscriptionData) cur).getPendingTransitionData());
+                assertNull(((SubscriptionData) cur).getPendingTransition());
             } else if (curProduct.getName().equals(aoProduct1)) {
                 foundAO1 = true;
                 assertTrue(((SubscriptionData) cur).getAlignStartDate().compareTo((aoSubscription1).getAlignStartDate()) == 0);
-                assertNull(((SubscriptionData) cur).getPendingTransitionData());
+                assertNull(((SubscriptionData) cur).getPendingTransition());
             } else if (curProduct.getName().equals(aoProduct2)) {
                 foundAO2 = true;
                 assertTrue(((SubscriptionData) cur).getAlignStartDate().compareTo((aoSubscription2).getAlignStartDate()) == 0);
-                assertNotNull(((SubscriptionData) cur).getPendingTransitionData());
+                assertNotNull(((SubscriptionData) cur).getPendingTransition());
             } else {
                 Assert.fail("Unexpected product " + curProduct.getName());
             }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
index ab69006..2421ad5 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
@@ -361,7 +361,7 @@ public class TestUserApiAddOn extends TestApiBase {
             assertEquals(aoSubscription.getBundleStartDate(), baseSubscription.getBundleStartDate());
 
             // CHECK next AO PHASE EVENT IS INDEED A MONTH AFTER BP STARTED => BUNDLE ALIGNMENT
-            SubscriptionTransitionData aoPendingTranstion = aoSubscription.getPendingTransitionData();
+            SubscriptionTransition aoPendingTranstion = aoSubscription.getPendingTransition();
             if (expAlignement == PlanAlignmentCreate.START_OF_BUNDLE) {
                 assertEquals(aoPendingTranstion.getEffectiveTransitionTime(), baseSubscription.getStartDate().plusMonths(1));
             } else {
@@ -392,7 +392,7 @@ public class TestUserApiAddOn extends TestApiBase {
             assertEquals(aoCurrentPhase.getPhaseType(), PhaseType.EVERGREEN);
 
             aoSubscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(aoSubscription.getId(), callContext);
-            aoPendingTranstion = aoSubscription.getPendingTransitionData();
+            aoPendingTranstion = aoSubscription.getPendingTransition();
             assertNull(aoPendingTranstion);
         } catch (EntitlementUserApiException e) {
             Assert.fail(e.getMessage());
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
index adff09c..349d57a 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
@@ -458,7 +458,7 @@ public abstract class TestUserApiChangePlan extends TestApiBase {
             subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId(), callContext);
 
             final DateTime expectedNextPhaseDate = subscription.getStartDate().plusDays(30).plusMonths(6);
-            final SubscriptionTransitionData nextPhase = subscription.getPendingTransitionData();
+            final SubscriptionTransition nextPhase = subscription.getPendingTransition();
             final DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
 
             assertEquals(nextPhaseEffectiveDate, expectedNextPhaseDate);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index b1fe43b..21f1545 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -130,6 +130,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     @Override
     public Invoice triggerInvoiceGeneration(final UUID accountId, final LocalDate targetDate, final boolean dryRun,
                                             final CallContext context) throws InvoiceApiException {
+
         final Account account;
         try {
             account = accountUserApi.getAccountById(accountId, internalCallContextFactory.createInternalTenantContext(context));
@@ -137,8 +138,10 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
             throw new InvoiceApiException(e, ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID, e.toString());
         }
 
+        // API_FIX Could we avoid the first call to createInternalTenantContext
+        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(accountId, context);
         final DateTime processingDateTime = targetDate.toDateTimeAtCurrentTime(account.getTimeZone());
-        final Invoice result = dispatcher.processAccount(accountId, processingDateTime, dryRun, context);
+        final Invoice result = dispatcher.processAccount(accountId, processingDateTime, dryRun, internalContext);
         if (result == null) {
             throw new InvoiceApiException(ErrorCode.INVOICE_NOTHING_TO_DO, accountId, targetDate);
         } else {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index 4c8ba26..fa8a35a 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -46,7 +46,6 @@ import com.ning.billing.invoice.generator.InvoiceDateUtils;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
-import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
@@ -107,20 +106,20 @@ public class InvoiceDispatcher {
     }
 
     public void processSubscription(final EffectiveSubscriptionInternalEvent transition,
-                                    final CallContext context) throws InvoiceApiException {
+                                    final InternalCallContext context) throws InvoiceApiException {
         final UUID subscriptionId = transition.getSubscriptionId();
         final DateTime targetDate = transition.getEffectiveTransitionTime();
         log.info("Got subscription transition: type: " + transition.getTransitionType().toString() + "; id: " + subscriptionId.toString() + "; targetDate: " + targetDate.toString());
         processSubscription(subscriptionId, targetDate, context);
     }
 
-    public void processSubscription(final UUID subscriptionId, final DateTime targetDate, final CallContext context) throws InvoiceApiException {
+    public void processSubscription(final UUID subscriptionId, final DateTime targetDate, final InternalCallContext context) throws InvoiceApiException {
         try {
             if (subscriptionId == null) {
                 log.error("Failed handling entitlement change.", new InvoiceApiException(ErrorCode.INVOICE_INVALID_TRANSITION));
                 return;
             }
-            final UUID accountId = entitlementApi.getAccountIdFromSubscriptionId(subscriptionId, internalCallContextFactory.createInternalTenantContext(context));
+            final UUID accountId = entitlementApi.getAccountIdFromSubscriptionId(subscriptionId, context);
             processAccount(accountId, targetDate, false, context);
         } catch (EntitlementUserApiException e) {
             log.error("Failed handling entitlement change.",
@@ -129,7 +128,7 @@ public class InvoiceDispatcher {
     }
 
     public Invoice processAccount(final UUID accountId, final DateTime targetDate,
-                                  final boolean dryRun, final CallContext context) throws InvoiceApiException {
+                                  final boolean dryRun, final InternalCallContext context) throws InvoiceApiException {
         GlobalLock lock = null;
         try {
             lock = locker.lockWithNumberOfTries(LockerType.ACCOUNT_FOR_INVOICE_PAYMENTS, accountId.toString(), NB_LOCK_TRY);
@@ -148,18 +147,16 @@ public class InvoiceDispatcher {
     }
 
     private Invoice processAccountWithLock(final UUID accountId, final DateTime targetDateTime,
-                                           final boolean dryRun, final CallContext context) throws InvoiceApiException {
+                                           final boolean dryRun, final InternalCallContext context) throws InvoiceApiException {
         try {
 
-            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(accountId, context);
-
             // Make sure to first set the BCD if needed then get the account object (to have the BCD set)
-            final BillingEventSet billingEvents = billingApi.getBillingEventsForAccountAndUpdateAccountBCD(accountId, internalCallContext);
+            final BillingEventSet billingEvents = billingApi.getBillingEventsForAccountAndUpdateAccountBCD(accountId, context);
 
-            final Account account = accountApi.getAccountById(accountId,  internalCallContext);
+            final Account account = accountApi.getAccountById(accountId,  context);
             List<Invoice> invoices = new ArrayList<Invoice>();
             if (!billingEvents.isAccountAutoInvoiceOff()) {
-                invoices = invoiceDao.getInvoicesByAccount(accountId, internalCallContextFactory.createInternalTenantContext(context)); //no need to fetch, invoicing is off on this account
+                invoices = invoiceDao.getInvoicesByAccount(accountId, context); //no need to fetch, invoicing is off on this account
             }
 
             final Currency targetCurrency = account.getCurrency();
@@ -172,8 +169,8 @@ public class InvoiceDispatcher {
                 log.info("Generated null invoice.");
                 if (!dryRun) {
                     final BusInternalEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday(), context.getUserToken(),
-                            internalCallContext.getAccountRecordId(), internalCallContext.getTenantRecordId());
-                    postEvent(event, accountId, internalCallContext);
+                            context.getAccountRecordId(), context.getTenantRecordId());
+                    postEvent(event, accountId, context);
                 }
             } else {
                 log.info("Generated invoice {} with {} items.", invoice.getId().toString(), invoice.getNumberOfItems());
@@ -186,7 +183,7 @@ public class InvoiceDispatcher {
                         }
                     }).size() > 0;
 
-                    invoiceDao.create(invoice, account.getBillCycleDay().getDayOfMonthUTC(), isRealInvoiceWithItems, internalCallContext);
+                    invoiceDao.create(invoice, account.getBillCycleDay().getDayOfMonthUTC(), isRealInvoiceWithItems, context);
 
                     final List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
                     final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
@@ -195,18 +192,19 @@ public class InvoiceDispatcher {
                     final InvoiceCreationInternalEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
                                                                                        invoice.getBalance(), invoice.getCurrency(),
                                                                                        context.getUserToken(),
-                                                                                       internalCallContext.getAccountRecordId(),
-                                                                                       internalCallContext.getTenantRecordId());
+                                                                                       context.getAccountRecordId(),
+                                                                                       context.getTenantRecordId());
 
                     if (isRealInvoiceWithItems) {
-                        postEvent(event, accountId, internalCallContext);
+                        postEvent(event, accountId, context);
                     }
                 }
             }
 
             if (account.isNotifiedForInvoices() && invoice != null && !dryRun) {
                 // Need to re-hydrate the invoice object to get the invoice number (record id)
-                invoiceNotifier.notify(account, invoiceDao.getById(invoice.getId(), internalCallContext), context);
+                // API_FIX InvoiceNotifier public API?
+                invoiceNotifier.notify(account, invoiceDao.getById(invoice.getId(), context), context.toTenantContext());
             }
 
             return invoice;
@@ -220,7 +218,7 @@ public class InvoiceDispatcher {
                                         final DateTimeZone accountTimeZone,
                                         final Collection<InvoiceItem> fixedPriceItems,
                                         final Collection<InvoiceItem> recurringItems,
-                                        final CallContext context) {
+                                        final InternalCallContext context) {
         final Map<UUID, LocalDate> chargeThroughDates = new HashMap<UUID, LocalDate>();
         addInvoiceItemsToChargeThroughDates(billCycleDay, accountTimeZone, chargeThroughDates, fixedPriceItems);
         addInvoiceItemsToChargeThroughDates(billCycleDay, accountTimeZone, chargeThroughDates, recurringItems);
@@ -229,7 +227,7 @@ public class InvoiceDispatcher {
             if (subscriptionId != null) {
                 final LocalDate chargeThroughDate = chargeThroughDates.get(subscriptionId);
                 log.info("Setting CTD for subscription {} to {}", subscriptionId.toString(), chargeThroughDate.toString());
-                entitlementApi.setChargedThroughDate(subscriptionId, chargeThroughDate, internalCallContextFactory.createInternalCallContext(context));
+                entitlementApi.setChargedThroughDate(subscriptionId, chargeThroughDate, context);
             }
         }
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index 9adeb07..e101e47 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -24,9 +24,9 @@ import org.slf4j.LoggerFactory;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallContextFactory;
 import com.ning.billing.util.callcontext.CallOrigin;
+import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.events.RepairEntitlementInternalEvent;
@@ -38,19 +38,18 @@ public class InvoiceListener {
 
     private static final Logger log = LoggerFactory.getLogger(InvoiceListener.class);
     private final InvoiceDispatcher dispatcher;
-    private final CallContextFactory factory;
+    private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
-    public InvoiceListener(final CallContextFactory factory, final InvoiceDispatcher dispatcher) {
+    public InvoiceListener(final InternalCallContextFactory internalCallContextFactory, final InvoiceDispatcher dispatcher) {
         this.dispatcher = dispatcher;
-        this.factory = factory;
+        this.internalCallContextFactory = internalCallContextFactory;
     }
 
     @Subscribe
     public void handleRepairEntitlementEvent(final RepairEntitlementInternalEvent repairEvent) {
         try {
-            // TODO retrieve tenantId?
-            final CallContext context = factory.createCallContext(null, "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, repairEvent.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(repairEvent.getTenantRecordId(), repairEvent.getAccountRecordId(), "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, repairEvent.getUserToken());
             dispatcher.processAccount(repairEvent.getAccountId(), repairEvent.getEffectiveDate(), false, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
@@ -67,19 +66,16 @@ public class InvoiceListener {
                 || transition.getRemainingEventsForUserOperation() > 0) {
                 return;
             }
-
-            // TODO retrieve tenantId?
-            final CallContext context = factory.createCallContext(null, "Transition", CallOrigin.INTERNAL, UserType.SYSTEM, transition.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(transition.getTenantRecordId(), transition.getAccountRecordId(), "Transition", CallOrigin.INTERNAL, UserType.SYSTEM, transition.getUserToken());
             dispatcher.processSubscription(transition, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
         }
     }
 
-    public void handleNextBillingDateEvent(final UUID subscriptionId, final DateTime eventDateTime) {
+    public void handleNextBillingDateEvent(final UUID subscriptionId, final DateTime eventDateTime, final Long accountRecordId, final Long tenantRecordId) {
         try {
-            // TODO retrieve tenantId?
-            final CallContext context = factory.createCallContext(null, "Next Billing Date", CallOrigin.INTERNAL, UserType.SYSTEM);
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(tenantRecordId, accountRecordId, "Next Billing Date", CallOrigin.INTERNAL, UserType.SYSTEM, null);
             dispatcher.processSubscription(subscriptionId, eventDateTime, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
index e4a72a6..7e1ae49 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
@@ -95,7 +95,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
                         if (subscription == null) {
                             log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")");
                         } else {
-                            processEvent(key.getUuidKey(), eventDate);
+                            processEvent(key.getUuidKey(), eventDate, accountRecordId, tenantRecordId);
                         }
                     } catch (EntitlementUserApiException e) {
                         log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")", e);
@@ -125,7 +125,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
         }
     }
 
-    private void processEvent(final UUID subscriptionId, final DateTime eventDateTime) {
-        listener.handleNextBillingDateEvent(subscriptionId, eventDateTime);
+    private void processEvent(final UUID subscriptionId, final DateTime eventDateTime, final Long accountRecordId, final Long tenantRecordId) {
+        listener.handleNextBillingDateEvent(subscriptionId, eventDateTime, accountRecordId, tenantRecordId);
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java b/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java
index ab645bd..714036b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java
@@ -21,9 +21,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallOrigin;
-import com.ning.billing.util.callcontext.DefaultCallContext;
+import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.ObjectType;
@@ -39,26 +39,28 @@ public class TagHandler {
 
     private final Clock clock;
     private final InvoiceDispatcher dispatcher;
+    private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
     public TagHandler(final Clock clock,
-            final InvoiceDispatcher dispatcher) {
+            final InvoiceDispatcher dispatcher,
+            final InternalCallContextFactory internalCallContextFactory) {
         this.clock = clock;
         this.dispatcher = dispatcher;
+        this.internalCallContextFactory = internalCallContextFactory;
     }
 
     @Subscribe
     public void process_AUTO_INVOICING_OFF_removal(final ControlTagDeletionInternalEvent event) {
         if (event.getTagDefinition().getName().equals(ControlTagType.AUTO_INVOICING_OFF.toString()) && event.getObjectType() ==  ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
-            processUnpaid_AUTO_INVOICING_OFF_invoices(accountId, event.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "InvoiceTagHandler", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+            processUnpaid_AUTO_INVOICING_OFF_invoices(accountId, context);
         }
     }
 
-    private void processUnpaid_AUTO_INVOICING_OFF_invoices(final UUID accountId, final UUID userToken) {
+    private void processUnpaid_AUTO_INVOICING_OFF_invoices(final UUID accountId, final InternalCallContext context) {
         try {
-            // TODO retrieve tenantId?
-            final CallContext context = new DefaultCallContext(null, "InvoiceTagHandler", CallOrigin.INTERNAL, UserType.SYSTEM, userToken, clock);
             dispatcher.processAccount(accountId, clock.getUTCNow(), false, context);
         } catch (InvoiceApiException e) {
             log.warn(String.format("Failed to process process removal AUTO_INVOICING_OFF for account %s", accountId), e);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java
index ec5c31d..6f6d465 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java
@@ -143,13 +143,13 @@ public abstract class InvoiceApiTestBase extends InvoicingTestBase {
                                                                    invoiceDao, invoiceNotifier, locker, busService.getBus(),
                                                                    clock, internalCallContextFactory);
 
-        Invoice invoice = dispatcher.processAccount(account.getId(), targetDate, true, callContext);
+        Invoice invoice = dispatcher.processAccount(account.getId(), targetDate, true, internalCallContext);
         Assert.assertNotNull(invoice);
 
         List<Invoice> invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
         Assert.assertEquals(invoices.size(), 0);
 
-        invoice = dispatcher.processAccount(account.getId(), targetDate, false, callContext);
+        invoice = dispatcher.processAccount(account.getId(), targetDate, false, internalCallContext);
         Assert.assertNotNull(invoice);
 
         invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
index 1dec97e..d151973 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
@@ -51,8 +51,6 @@ import com.ning.billing.invoice.glue.InvoiceModuleWithMocks;
 import com.ning.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory;
 import com.ning.billing.lifecycle.KillbillService;
 import com.ning.billing.mock.glue.MockJunctionModule;
-import com.ning.billing.util.callcontext.CallContextFactory;
-import com.ning.billing.util.callcontext.DefaultCallContextFactory;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
@@ -88,13 +86,13 @@ public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB 
         int eventCount = 0;
         UUID latestSubscriptionId = null;
 
-        public InvoiceListenerMock(final CallContextFactory factory, final InvoiceDispatcher dispatcher) {
-            super(factory, dispatcher);
+        public InvoiceListenerMock(final InternalCallContextFactory internalCallContextFactory, final InvoiceDispatcher dispatcher) {
+            super(internalCallContextFactory, dispatcher);
         }
 
         @Override
         public void handleNextBillingDateEvent(final UUID subscriptionId,
-                                               final DateTime eventDateTime) {
+                                               final DateTime eventDateTime, final Long accountRecordId, final Long tenantRecordId) {
             eventCount++;
             latestSubscriptionId = subscriptionId;
         }
@@ -160,9 +158,8 @@ public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB 
         final EntitlementInternalApi entitlementUserApi = Mockito.mock(EntitlementInternalApi.class);
         Mockito.when(entitlementUserApi.getSubscriptionFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
 
-        final CallContextFactory factory = new DefaultCallContextFactory(clock);
-        listener = new InvoiceListenerMock(factory, dispatcher);
         internalCallContextFactory = g.getInstance(InternalCallContextFactory.class);
+        listener = new InvoiceListenerMock(internalCallContextFactory, dispatcher);
         notifier = new DefaultNextBillingDateNotifier(notificationQueueService, g.getInstance(InvoiceConfig.class), entitlementUserApi,
                                                       listener, internalCallContextFactory);
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
index fd40668..87de546 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -170,7 +170,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock, new InternalCallContextFactory(getMysqlTestingHelper().getDBI(), clock));
 
-        Invoice invoice = dispatcher.processAccount(accountId, target, true, callContext);
+        Invoice invoice = dispatcher.processAccount(accountId, target, true, internalCallContext);
         Assert.assertNotNull(invoice);
 
         final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(callContext);
@@ -178,14 +178,14 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
         Assert.assertEquals(invoices.size(), 0);
 
         // Try it again to double check
-        invoice = dispatcher.processAccount(accountId, target, true, callContext);
+        invoice = dispatcher.processAccount(accountId, target, true, internalCallContext);
         Assert.assertNotNull(invoice);
 
         invoices = invoiceDao.getInvoicesByAccount(accountId, internalTenantContext);
         Assert.assertEquals(invoices.size(), 0);
 
         // This time no dry run
-        invoice = dispatcher.processAccount(accountId, target, false, callContext);
+        invoice = dispatcher.processAccount(accountId, target, false, internalCallContext);
         Assert.assertNotNull(invoice);
 
         invoices = invoiceDao.getInvoicesByAccount(accountId, internalTenantContext);
@@ -224,7 +224,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock, internalCallContextFactory);
 
-        final Invoice invoice = dispatcher.processAccount(account.getId(), new DateTime("2012-07-30T00:00:00.000Z"), false, callContext);
+        final Invoice invoice = dispatcher.processAccount(account.getId(), new DateTime("2012-07-30T00:00:00.000Z"), false, internalCallContext);
         Assert.assertNotNull(invoice);
 
         final List<InvoiceItem> invoiceItems = invoice.getInvoiceItems();
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
index 2344062..c69fe3e 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
@@ -29,6 +29,7 @@ import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.junction.api.BlockingApiException;
 import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.junction.block.BlockingChecker;
@@ -209,6 +210,16 @@ public class BlockingSubscription implements Subscription {
         return subscription.getLastActiveBillingPeriod();
     }
 
+    @Override
+    public SubscriptionTransition getPendingTransition() {
+        return subscription.getPendingTransition();
+    }
+
+    @Override
+    public SubscriptionTransition getPreviousTransition() {
+        return subscription.getPendingTransition();
+    }
+
     public Subscription getDelegateSubscription() {
         return subscription;
     }
diff --git a/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java b/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
index e2a67e2..af49464 100644
--- a/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
+++ b/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
@@ -24,11 +24,9 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.core.PaymentProcessor;
-import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallOrigin;
-import com.ning.billing.util.callcontext.DefaultCallContext;
+import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.events.InvoiceCreationInternalEvent;
@@ -65,11 +63,9 @@ public class InvoiceHandler {
 
         final Account account;
         try {
-            // API_FIX
-            final CallContext context = new DefaultCallContext(null, "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken(), clock);
-            final InternalTenantContext internalContext = internalCallContextFactory.createInternalCallContext(event.getAccountId(), context);
+            final InternalCallContext internalContext =  internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
             account = accountApi.getAccountById(event.getAccountId(), internalContext);
-            paymentProcessor.createPayment(account, event.getInvoiceId(), null, internalCallContextFactory.createInternalCallContext(event.getAccountId(), context), false, false);
+            paymentProcessor.createPayment(account, event.getInvoiceId(), null, internalContext, false, false);
         } catch (AccountApiException e) {
             log.error("Failed to process invoice payment", e);
         } catch (PaymentApiException e) {
diff --git a/util/src/test/java/com/ning/billing/mock/MockSubscription.java b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
index 6974621..c1127cd 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -32,6 +32,7 @@ import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
@@ -213,4 +214,16 @@ public class MockSubscription implements Subscription {
     public void setPlan(final Plan plan) {
         this.plan = plan;
     }
+
+    @Override
+    public SubscriptionTransition getPendingTransition() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public SubscriptionTransition getPreviousTransition() {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }