killbill-memoizeit

invoice: first pass at using recordIds in dao Switch all getInvoicesByAccount*

9/23/2013 9:02:59 AM

Changes

invoice/pom.xml 5(+5 -0)

Details

invoice/pom.xml 5(+5 -0)

diff --git a/invoice/pom.xml b/invoice/pom.xml
index 8246d03..c49ff6d 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -57,6 +57,11 @@
         </dependency>
         <dependency>
             <groupId>com.ning.billing</groupId>
+            <artifactId>killbill-account</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.ning.billing</groupId>
             <artifactId>killbill-api</artifactId>
         </dependency>
         <dependency>
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
index 38cd7a7..f42a45f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
@@ -20,6 +20,7 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 
+import com.ning.billing.ObjectType;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoicePayment;
@@ -53,7 +54,7 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     @Override
     public List<Invoice> getAllInvoicesByAccount(final UUID accountId, final TenantContext context) {
-        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getAllInvoicesByAccount(accountId, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getAllInvoicesByAccount(internalCallContextFactory.createInternalTenantContext(accountId, context)),
                                                                     new Function<InvoiceModelDao, Invoice>() {
                                                                         @Override
                                                                         public Invoice apply(final InvoiceModelDao input) {
@@ -64,12 +65,12 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     @Override
     public Invoice getInvoice(final UUID invoiceId, final TenantContext context) throws InvoiceApiException {
-        return new DefaultInvoice(dao.getById(invoiceId, internalCallContextFactory.createInternalTenantContext(context)));
+        return new DefaultInvoice(dao.getById(invoiceId, internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context)));
     }
 
     @Override
     public List<InvoicePayment> getInvoicePayments(final UUID paymentId, final TenantContext context) {
-        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getInvoicePayments(paymentId, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getInvoicePayments(paymentId, internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, context)),
                                                                            new Function<InvoicePaymentModelDao, InvoicePayment>() {
                                                                                @Override
                                                                                public InvoicePayment apply(final InvoicePaymentModelDao input) {
@@ -94,12 +95,12 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     @Override
     public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId, final TenantContext context) {
-        return dao.getRemainingAmountPaid(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(context));
+        return dao.getRemainingAmountPaid(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(invoicePaymentId, ObjectType.INVOICE_PAYMENT, context));
     }
 
     @Override
     public List<InvoicePayment> getChargebacksByAccountId(final UUID accountId, final TenantContext context) {
-        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getChargebacksByAccountId(accountId, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getChargebacksByAccountId(accountId, internalCallContextFactory.createInternalTenantContext(accountId, context)),
                                                                            new Function<InvoicePaymentModelDao, InvoicePayment>() {
                                                                                @Override
                                                                                public InvoicePayment apply(final InvoicePaymentModelDao input) {
@@ -110,7 +111,7 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     @Override
     public List<InvoicePayment> getChargebacksByPaymentId(final UUID paymentId, final TenantContext context) {
-        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getChargebacksByPaymentId(paymentId, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getChargebacksByPaymentId(paymentId, internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, context)),
                                                                            new Function<InvoicePaymentModelDao, InvoicePayment>() {
                                                                                @Override
                                                                                public InvoicePayment apply(final InvoicePaymentModelDao input) {
@@ -121,12 +122,12 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     @Override
     public InvoicePayment getChargebackById(final UUID chargebackId, final TenantContext context) throws InvoiceApiException {
-        return new DefaultInvoicePayment(dao.getChargebackById(chargebackId, internalCallContextFactory.createInternalTenantContext(context)));
+        return new DefaultInvoicePayment(dao.getChargebackById(chargebackId, internalCallContextFactory.createInternalTenantContext(chargebackId, ObjectType.INVOICE_PAYMENT, context)));
     }
 
     @Override
     public UUID getAccountIdFromInvoicePaymentId(final UUID invoicePaymentId, final TenantContext context) throws InvoiceApiException {
-        return dao.getAccountIdFromInvoicePaymentId(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(context));
+        return dao.getAccountIdFromInvoicePaymentId(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(invoicePaymentId, ObjectType.INVOICE_PAYMENT, context));
     }
 
     @Override
@@ -136,8 +137,6 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     @Override
     public InvoicePayment createChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
-        // Retrieve the account id for the internal call context
-        final UUID accountId = dao.getAccountIdFromInvoicePaymentId(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(context));
-        return new DefaultInvoicePayment(dao.postChargeback(invoicePaymentId, amount, internalCallContextFactory.createInternalCallContext(accountId, context)));
+        return new DefaultInvoicePayment(dao.postChargeback(invoicePaymentId, amount, internalCallContextFactory.createInternalCallContext(invoicePaymentId, ObjectType.INVOICE_PAYMENT, context)));
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
index fdaf7dd..26fd408 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.MigrationPlan;
+import com.ning.billing.clock.Clock;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
 import com.ning.billing.invoice.dao.DefaultInvoiceDao;
@@ -35,7 +36,6 @@ import com.ning.billing.invoice.dao.InvoiceModelDao;
 import com.ning.billing.invoice.dao.InvoicePaymentModelDao;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.clock.Clock;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 
 import com.google.common.collect.ImmutableList;
@@ -65,7 +65,7 @@ public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
     @Override
     public UUID createMigrationInvoice(final UUID accountId, final LocalDate targetDate, final BigDecimal balance, final Currency currency, final CallContext context) {
         try {
-            accountUserApi.getAccountById(accountId, internalCallContextFactory.createInternalTenantContext(context));
+            accountUserApi.getAccountById(accountId, internalCallContextFactory.createInternalTenantContext(accountId, context));
         } catch (AccountApiException e) {
             log.warn("Unable to find account for id {}", accountId);
             return null;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
index 100e57d..2b62f58 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
@@ -70,16 +70,6 @@ public class DefaultInvoiceInternalApi implements InvoiceInternalApi {
     }
 
     @Override
-    public Collection<Invoice> getInvoicesByAccountId(final UUID accountId, final InternalTenantContext context) {
-        return Collections2.transform(dao.getInvoicesByAccount(accountId, context), new Function<InvoiceModelDao, Invoice>() {
-            @Override
-            public Invoice apply(final InvoiceModelDao input) {
-                return new DefaultInvoice(input);
-            }
-        });
-    }
-
-    @Override
     public BigDecimal getAccountBalance(final UUID accountId, final InternalTenantContext context) {
         return dao.getAccountBalance(accountId, context);
     }
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 20fcb6c..6841fd5 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
@@ -90,7 +90,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     @Override
     public List<Invoice> getInvoicesByAccount(final UUID accountId, final TenantContext context) {
-        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getInvoicesByAccount(accountId, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getInvoicesByAccount(internalCallContextFactory.createInternalTenantContext(accountId, context)),
                                                                     new Function<InvoiceModelDao, Invoice>() {
                                                                         @Override
                                                                         public Invoice apply(final InvoiceModelDao input) {
@@ -101,7 +101,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     @Override
     public List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate, final TenantContext context) {
-        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getInvoicesByAccount(accountId, fromDate, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getInvoicesByAccount(fromDate, internalCallContextFactory.createInternalTenantContext(accountId, context)),
                                                                     new Function<InvoiceModelDao, Invoice>() {
                                                                         @Override
                                                                         public Invoice apply(final InvoiceModelDao input) {
@@ -112,29 +112,30 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     @Override
     public BigDecimal getAccountBalance(final UUID accountId, final TenantContext context) {
-        final BigDecimal result = dao.getAccountBalance(accountId, internalCallContextFactory.createInternalTenantContext(context));
+        final BigDecimal result = dao.getAccountBalance(accountId, internalCallContextFactory.createInternalTenantContext(accountId, context));
         return result == null ? BigDecimal.ZERO : result;
     }
 
     @Override
     public BigDecimal getAccountCBA(final UUID accountId, final TenantContext context) {
-        final BigDecimal result = dao.getAccountCBA(accountId, internalCallContextFactory.createInternalTenantContext(context));
+        final BigDecimal result = dao.getAccountCBA(accountId, internalCallContextFactory.createInternalTenantContext(accountId, context));
         return result == null ? BigDecimal.ZERO : result;
     }
 
     @Override
     public Invoice getInvoice(final UUID invoiceId, final TenantContext context) throws InvoiceApiException {
-        return new DefaultInvoice(dao.getById(invoiceId, internalCallContextFactory.createInternalTenantContext(context)));
+        return new DefaultInvoice(dao.getById(invoiceId, internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context)));
     }
 
     @Override
     public Invoice getInvoiceByNumber(final Integer number, final TenantContext context) throws InvoiceApiException {
+        // TODO (PIERRE) Populate accountRecordId in context
         return new DefaultInvoice(dao.getByNumber(number, internalCallContextFactory.createInternalTenantContext(context)));
     }
 
     @Override
     public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate, final TenantContext context) {
-        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContextFactory.createInternalTenantContext(context)),
+        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContextFactory.createInternalTenantContext(accountId, context)),
                                                                     new Function<InvoiceModelDao, Invoice>() {
                                                                         @Override
                                                                         public Invoice apply(final InvoiceModelDao input) {
@@ -146,16 +147,15 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     @Override
     public Invoice triggerInvoiceGeneration(final UUID accountId, final LocalDate targetDate, final boolean dryRun,
                                             final CallContext context) throws InvoiceApiException {
+        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(accountId, context);
 
         final Account account;
         try {
-            account = accountUserApi.getAccountById(accountId, internalCallContextFactory.createInternalTenantContext(context));
+            account = accountUserApi.getAccountById(accountId, internalContext);
         } catch (AccountApiException e) {
             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, internalContext);
         if (result == null) {
@@ -168,30 +168,30 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     @Override
     public void tagInvoiceAsWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException, InvoiceApiException {
         // Note: the tagApi is audited
-        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(context);
+        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(invoiceId, ObjectType.INVOICE, context);
         tagApi.addTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), internalContext);
 
         // Retrieve the invoice for the account id
         final Invoice invoice = new DefaultInvoice(dao.getById(invoiceId, internalContext));
         // This is for overdue
-        notifyBusOfInvoiceAdjustment(invoiceId, invoice.getAccountId(), internalCallContextFactory.createInternalCallContext(invoice.getAccountId(), context));
+        notifyBusOfInvoiceAdjustment(invoiceId, invoice.getAccountId(), internalContext);
     }
 
     @Override
     public void tagInvoiceAsNotWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException, InvoiceApiException {
         // Note: the tagApi is audited
-        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(context);
+        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(invoiceId, ObjectType.INVOICE, context);
         tagApi.removeTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), internalContext);
 
         // Retrieve the invoice for the account id
         final Invoice invoice = new DefaultInvoice(dao.getById(invoiceId, internalContext));
         // This is for overdue
-        notifyBusOfInvoiceAdjustment(invoiceId, invoice.getAccountId(), internalCallContextFactory.createInternalCallContext(invoice.getAccountId(), context));
+        notifyBusOfInvoiceAdjustment(invoiceId, invoice.getAccountId(), internalContext);
     }
 
     @Override
     public InvoiceItem getExternalChargeById(final UUID externalChargeId, final TenantContext context) throws InvoiceApiException {
-        final InvoiceItem externalChargeItem = InvoiceItemFactory.fromModelDao(dao.getExternalChargeById(externalChargeId, internalCallContextFactory.createInternalTenantContext(context)));
+        final InvoiceItem externalChargeItem = InvoiceItemFactory.fromModelDao(dao.getExternalChargeById(externalChargeId, internalCallContextFactory.createInternalTenantContext(externalChargeId, ObjectType.INVOICE_ITEM, context)));
         if (externalChargeItem == null) {
             throw new InvoiceApiException(ErrorCode.INVOICE_NO_SUCH_EXTERNAL_CHARGE, externalChargeId);
         }
@@ -233,7 +233,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     @Override
     public InvoiceItem getCreditById(final UUID creditId, final TenantContext context) throws InvoiceApiException {
-        final InvoiceItem creditItem = InvoiceItemFactory.fromModelDao(dao.getCreditById(creditId, internalCallContextFactory.createInternalTenantContext(context)));
+        final InvoiceItem creditItem = InvoiceItemFactory.fromModelDao(dao.getCreditById(creditId, internalCallContextFactory.createInternalTenantContext(creditId, ObjectType.INVOICE_ITEM, context)));
         if (creditItem == null) {
             throw new InvoiceApiException(ErrorCode.INVOICE_NO_SUCH_CREDIT, creditId);
         }
@@ -289,7 +289,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
             throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId);
         }
 
-        final InternalTenantContext internalContext = internalCallContextFactory.createInternalTenantContext(context);
+        final InternalTenantContext internalContext = internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context);
         final Account account = accountUserApi.getAccountById(invoice.getAccountId(), internalContext);
 
         // Check if this account has the MANUAL_PAY system tag
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java
index 2d25c6e..3b2c0db 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/CBADao.java
@@ -43,7 +43,7 @@ public class CBADao {
     public BigDecimal getAccountCBAFromTransaction(final UUID accountId,
                                                     final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory,
                                                     final InternalTenantContext context) {
-        final List<InvoiceModelDao> invoices = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(accountId, entitySqlDaoWrapperFactory, context);
+        final List<InvoiceModelDao> invoices = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(entitySqlDaoWrapperFactory, context);
         return getAccountCBAFromTransaction(invoices);
     }
 
@@ -57,11 +57,11 @@ public class CBADao {
 
     public void doCBAComplexity(final UUID accountId, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context) throws EntityPersistenceException, InvoiceApiException {
 
-        List<InvoiceModelDao> invoiceItemModelDaos = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(accountId, entitySqlDaoWrapperFactory, context);
+        List<InvoiceModelDao> invoiceItemModelDaos = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(entitySqlDaoWrapperFactory, context);
         for (InvoiceModelDao cur : invoiceItemModelDaos) {
             addCBAIfNeeded(entitySqlDaoWrapperFactory, cur, context);
         }
-        invoiceItemModelDaos = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(accountId, entitySqlDaoWrapperFactory, context);
+        invoiceItemModelDaos = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(entitySqlDaoWrapperFactory, context);
         useExistingCBAFromTransaction(invoiceItemModelDaos, entitySqlDaoWrapperFactory, context);
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 41d5ff1..ef40a12 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -33,6 +33,7 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.clock.Clock;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItemType;
@@ -42,7 +43,6 @@ import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.clock.Clock;
 import com.ning.billing.util.dao.NonEntityDao;
 import com.ning.billing.util.entity.dao.EntityDaoBase;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
@@ -50,12 +50,25 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
 import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
 import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
 
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Ordering;
 import com.google.inject.Inject;
 
 public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, InvoiceApiException> implements InvoiceDao {
 
     private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceDao.class);
 
+    private static final Ordering<InvoiceModelDao> INVOICE_MODEL_DAO_ORDERING = Ordering.natural()
+                                                                                        .onResultOf(new Function<InvoiceModelDao, Comparable>() {
+                                                                                            @Override
+                                                                                            public Comparable apply(final InvoiceModelDao invoice) {
+                                                                                                return invoice.getTargetDate();
+                                                                                            }
+                                                                                        });
+
     private final NextBillingDatePoster nextBillingDatePoster;
     private final PersistentBus eventBus;
     private final InvoiceDaoHelper invoiceDaoHelper;
@@ -81,13 +94,19 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     }
 
     @Override
-    public List<InvoiceModelDao> getInvoicesByAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<InvoiceModelDao> getInvoicesByAccount(final InternalTenantContext context) {
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<InvoiceModelDao>>() {
             @Override
             public List<InvoiceModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final InvoiceSqlDao invoiceDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
 
-                final List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(accountId.toString(), context);
+                final List<InvoiceModelDao> invoices = ImmutableList.<InvoiceModelDao>copyOf(INVOICE_MODEL_DAO_ORDERING.sortedCopy(Iterables.<InvoiceModelDao>filter(invoiceDao.getByAccountRecordId(context),
+                                                                                                                                                                     new Predicate<InvoiceModelDao>() {
+                                                                                                                                                                         @Override
+                                                                                                                                                                         public boolean apply(final InvoiceModelDao invoice) {
+                                                                                                                                                                             return !invoice.isMigrated();
+                                                                                                                                                                         }
+                                                                                                                                                                     })));
                 invoiceDaoHelper.populateChildren(invoices, entitySqlDaoWrapperFactory, context);
 
                 return invoices;
@@ -96,25 +115,22 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     }
 
     @Override
-    public List<InvoiceModelDao> getAllInvoicesByAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<InvoiceModelDao> getAllInvoicesByAccount(final InternalTenantContext context) {
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<InvoiceModelDao>>() {
             @Override
             public List<InvoiceModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(accountId, entitySqlDaoWrapperFactory, context);
+                return invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(entitySqlDaoWrapperFactory, context);
             }
         });
     }
 
     @Override
-    public List<InvoiceModelDao> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate, final InternalTenantContext context) {
+    public List<InvoiceModelDao> getInvoicesByAccount(final LocalDate fromDate, final InternalTenantContext context) {
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<InvoiceModelDao>>() {
             @Override
             public List<InvoiceModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final InvoiceSqlDao invoiceDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
-
-                final List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccountAfterDate(accountId.toString(),
-                                                                                                fromDate.toDateTimeAtStartOfDay().toDate(),
-                                                                                                context);
+                final List<InvoiceModelDao> invoices = getAllNonMigratedInvoicesByAccountAfterDate(invoiceDao, fromDate, context);
                 invoiceDaoHelper.populateChildren(invoices, entitySqlDaoWrapperFactory, context);
 
                 return invoices;
@@ -122,6 +138,16 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
         });
     }
 
+    private List<InvoiceModelDao> getAllNonMigratedInvoicesByAccountAfterDate(final InvoiceSqlDao invoiceSqlDao, final LocalDate fromDate, final InternalTenantContext context) {
+        return ImmutableList.<InvoiceModelDao>copyOf(INVOICE_MODEL_DAO_ORDERING.sortedCopy(Iterables.<InvoiceModelDao>filter(invoiceSqlDao.getByAccountRecordId(context),
+                                                                                                                             new Predicate<InvoiceModelDao>() {
+                                                                                                                                 @Override
+                                                                                                                                 public boolean apply(final InvoiceModelDao invoice) {
+                                                                                                                                     return !invoice.isMigrated() && invoice.getTargetDate().compareTo(fromDate) >= 0;
+                                                                                                                                 }
+                                                                                                                             })));
+    }
+
     @Override
     public List<InvoiceModelDao> get(final InternalTenantContext context) {
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<InvoiceModelDao>>() {
@@ -235,7 +261,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                 BigDecimal cba = BigDecimal.ZERO;
 
                 BigDecimal accountBalance = BigDecimal.ZERO;
-                final List<InvoiceModelDao> invoices = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(accountId, entitySqlDaoWrapperFactory, context);
+                final List<InvoiceModelDao> invoices = invoiceDaoHelper.getAllInvoicesByAccountFromTransaction(entitySqlDaoWrapperFactory, context);
                 for (final InvoiceModelDao cur : invoices) {
                     accountBalance = accountBalance.add(InvoiceModelDaoHelper.getBalance(cur));
                     cba = cba.add(InvoiceModelDaoHelper.getCBAAmount(cur));
@@ -370,6 +396,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
             }
         });
     }
+
     @Override
     public InvoicePaymentModelDao postChargeback(final UUID invoicePaymentId, final BigDecimal amount, final InternalCallContext context) throws InvoiceApiException {
         return transactionalSqlDao.execute(InvoiceApiException.class, new EntitySqlDaoTransactionWrapper<InvoicePaymentModelDao>() {
@@ -637,9 +664,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                     if (accountCBA.compareTo(cbaItem.getAmount().negate()) < 0) {
                         throw new IllegalStateException("The account balance can't be lower than the amount adjusted");
                     }
-                    final List<InvoiceModelDao> invoicesFollowing = transactional.getInvoicesByAccountAfterDate(accountId.toString(),
-                                                                                                                invoice.getInvoiceDate().toDateTimeAtStartOfDay().toDate(),
-                                                                                                                context);
+                    final List<InvoiceModelDao> invoicesFollowing = getAllNonMigratedInvoicesByAccountAfterDate(transactional, invoice.getInvoiceDate(), context);
                     invoiceDaoHelper.populateChildren(invoicesFollowing, entitySqlDaoWrapperFactory, context);
 
                     // The remaining amount to adjust (i.e. the amount of credits used on following invoices)
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index 6a9a21e..8ac96a5 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -42,9 +42,9 @@ public interface InvoiceDao {
 
     List<InvoiceModelDao> get(InternalTenantContext context);
 
-    List<InvoiceModelDao> getInvoicesByAccount(UUID accountId, InternalTenantContext context);
+    List<InvoiceModelDao> getInvoicesByAccount(InternalTenantContext context);
 
-    List<InvoiceModelDao> getInvoicesByAccount(UUID accountId, LocalDate fromDate, InternalTenantContext context);
+    List<InvoiceModelDao> getInvoicesByAccount(LocalDate fromDate, InternalTenantContext context);
 
     List<InvoiceModelDao> getInvoicesBySubscription(UUID subscriptionId, InternalTenantContext context);
 
@@ -61,7 +61,7 @@ public interface InvoiceDao {
     void test(InternalTenantContext context);
 
     // Include migrated invoices
-    List<InvoiceModelDao> getAllInvoicesByAccount(UUID accountId, InternalTenantContext context);
+    List<InvoiceModelDao> getAllInvoicesByAccount(InternalTenantContext context);
 
     InvoicePaymentModelDao postChargeback(UUID invoicePaymentId, BigDecimal amount, InternalCallContext context) throws InvoiceApiException;
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java
index 61797f6..8c5cecb 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java
@@ -37,7 +37,6 @@ import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
@@ -158,7 +157,7 @@ public class InvoiceDaoHelper {
 
 
     public List<InvoiceModelDao> getUnpaidInvoicesByAccountFromTransaction(final UUID accountId, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final LocalDate upToDate, final InternalTenantContext context) {
-        final List<InvoiceModelDao> invoices = getAllInvoicesByAccountFromTransaction(accountId, entitySqlDaoWrapperFactory, context);
+        final List<InvoiceModelDao> invoices = getAllInvoicesByAccountFromTransaction(entitySqlDaoWrapperFactory, context);
         return getUnpaidInvoicesByAccountFromTransaction(invoices, upToDate);
     }
 
@@ -235,8 +234,8 @@ public class InvoiceDaoHelper {
         getInvoicePaymentsWithinTransaction(invoices, entitySqlDaoWrapperFactory, context);
     }
 
-    public List<InvoiceModelDao> getAllInvoicesByAccountFromTransaction(final UUID accountId, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalTenantContext context) {
-        final List<InvoiceModelDao> invoices = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class).getAllInvoicesByAccount(accountId.toString(), context);
+    public List<InvoiceModelDao> getAllInvoicesByAccountFromTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalTenantContext context) {
+        final List<InvoiceModelDao> invoices = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class).getByAccountRecordId(context);
         populateChildren(invoices, entitySqlDaoWrapperFactory, context);
         return invoices;
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index 716c2b0..7bce03b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -16,7 +16,6 @@
 
 package com.ning.billing.invoice.dao;
 
-import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
@@ -33,19 +32,6 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 public interface InvoiceSqlDao extends EntitySqlDao<InvoiceModelDao, Invoice> {
 
     @SqlQuery
-    List<InvoiceModelDao> getInvoicesByAccount(@Bind("accountId") final String accountId,
-                                               @BindBean final InternalTenantContext context);
-
-    @SqlQuery
-    List<InvoiceModelDao> getAllInvoicesByAccount(@Bind("accountId") final String string,
-                                                  @BindBean final InternalTenantContext context);
-
-    @SqlQuery
-    List<InvoiceModelDao> getInvoicesByAccountAfterDate(@Bind("accountId") final String accountId,
-                                                        @Bind("fromDate") final Date fromDate,
-                                                        @BindBean final InternalTenantContext context);
-
-    @SqlQuery
     List<InvoiceModelDao> getInvoicesBySubscription(@Bind("subscriptionId") final String subscriptionId,
                                                     @BindBean final InternalTenantContext context);
 
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 ff16d36..778cc3d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -177,7 +177,7 @@ public class InvoiceDispatcher {
 
             List<Invoice> invoices = new ArrayList<Invoice>();
             if (!billingEvents.isAccountAutoInvoiceOff()) {
-                invoices = ImmutableList.<Invoice>copyOf(Collections2.transform(invoiceDao.getInvoicesByAccount(accountId, context),
+                invoices = ImmutableList.<Invoice>copyOf(Collections2.transform(invoiceDao.getInvoicesByAccount(context),
                                                                                 new Function<InvoiceModelDao, Invoice>() {
                                                                                     @Override
                                                                                     public Invoice apply(final InvoiceModelDao input) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
index 36145e4..3bd7a50 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
@@ -65,7 +65,7 @@ public class EmailInvoiceNotifier implements InvoiceNotifier {
 
     @Override
     public void notify(final Account account, final Invoice invoice, final TenantContext context) throws InvoiceApiException {
-        final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(context);
+        final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(account.getId(), context);
         final List<String> to = new ArrayList<String>();
         to.add(account.getEmail());
 
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
index cd845e7..5fd95ce 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -26,30 +26,6 @@ extraTableFieldsWithComma(prefix) ::= <<
 , <prefix>record_id as invoice_number
 >>
 
-getInvoicesByAccount() ::= <<
-  SELECT <allTableFields()>
-  FROM <tableName()>
-  WHERE account_id = :accountId AND migrated = '0'
-  <AND_CHECK_TENANT()>
-  ORDER BY target_date ASC;
->>
-
-getAllInvoicesByAccount() ::= <<
-  SELECT <allTableFields()>
-  FROM <tableName()>
-  WHERE account_id = :accountId
-  <AND_CHECK_TENANT()>
-  ORDER BY target_date ASC;
->>
-
-getInvoicesByAccountAfterDate() ::= <<
-  SELECT <allTableFields()>
-  FROM <tableName()>
-  WHERE account_id = :accountId AND target_date >= :fromDate AND migrated = '0'
-  <AND_CHECK_TENANT()>
-  ORDER BY target_date ASC;
->>
-
 getInvoicesBySubscription() ::= <<
   SELECT <allTableFields("i.")>
   FROM <tableName()> i
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 8e665f1..00d3c1e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -58,10 +58,10 @@ public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbedded
         date_migrated = clock.getUTCToday().minusYears(1);
         date_regular = clock.getUTCNow();
 
-        final Account account = invoiceUtil.createAccount();
+        final Account account = invoiceUtil.createAccount(callContext);
         accountId = account.getId();
         migrationInvoiceId = createAndCheckMigrationInvoice(accountId);
-        regularInvoiceId = invoiceUtil.generateRegularInvoice(account, date_regular);
+        regularInvoiceId = invoiceUtil.generateRegularInvoice(account, date_regular, callContext);
     }
 
     private UUID createAndCheckMigrationInvoice(final UUID accountId) throws InvoiceApiException {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
index 52f957e..17f7f6a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
@@ -53,9 +53,9 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
     @BeforeMethod(groups = "slow")
     public void beforeMethod() throws Exception {
         super.beforeMethod();
-        final Account account = invoiceUtil.createAccount();
+        final Account account = invoiceUtil.createAccount(callContext);
         accountId = account.getId();
-        invoiceId = invoiceUtil.generateRegularInvoice(account, clock.getUTCNow());
+        invoiceId = invoiceUtil.generateRegularInvoice(account, clock.getUTCNow(), callContext);
     }
 
     @Test(groups = "slow")
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index bf569cb..57f4a0e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -36,6 +36,8 @@ import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
 import com.google.inject.Inject;
 
 public class MockInvoiceDao implements InvoiceDao {
@@ -45,6 +47,7 @@ public class MockInvoiceDao implements InvoiceDao {
     private final Map<UUID, InvoiceModelDao> invoices = new LinkedHashMap<UUID, InvoiceModelDao>();
     private final Map<UUID, InvoiceItemModelDao> items = new LinkedHashMap<UUID, InvoiceItemModelDao>();
     private final Map<UUID, InvoicePaymentModelDao> payments = new LinkedHashMap<UUID, InvoicePaymentModelDao>();
+    private final BiMap<UUID, Long> accountRecordIds = HashBiMap.create();
 
     @Inject
     public MockInvoiceDao(final PersistentBus eventBus) {
@@ -62,6 +65,7 @@ public class MockInvoiceDao implements InvoiceDao {
             for (final InvoicePaymentModelDao paymentModelDao : invoicePayments) {
                 payments.put(paymentModelDao.getId(), paymentModelDao);
             }
+            accountRecordIds.put(invoice.getAccountId(), context.getAccountRecordId());
         }
         try {
             eventBus.post(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
@@ -100,10 +104,11 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<InvoiceModelDao> getInvoicesByAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<InvoiceModelDao> getInvoicesByAccount(final InternalTenantContext context) {
         final List<InvoiceModelDao> result = new ArrayList<InvoiceModelDao>();
 
         synchronized (monitor) {
+            final UUID accountId = accountRecordIds.inverse().get(context.getAccountRecordId());
             for (final InvoiceModelDao invoice : invoices.values()) {
                 if (accountId.equals(invoice.getAccountId()) && !invoice.isMigrated()) {
                     result.add(invoice);
@@ -114,10 +119,11 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<InvoiceModelDao> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate, final InternalTenantContext context) {
+    public List<InvoiceModelDao> getInvoicesByAccount(final LocalDate fromDate, final InternalTenantContext context) {
         final List<InvoiceModelDao> invoicesForAccount = new ArrayList<InvoiceModelDao>();
 
         synchronized (monitor) {
+            final UUID accountId = accountRecordIds.inverse().get(context.getAccountRecordId());
             for (final InvoiceModelDao invoice : get(context)) {
                 if (accountId.equals(invoice.getAccountId()) && !invoice.getTargetDate().isBefore(fromDate) && !invoice.isMigrated()) {
                     invoicesForAccount.add(invoice);
@@ -212,10 +218,11 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<InvoiceModelDao> getAllInvoicesByAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<InvoiceModelDao> getAllInvoicesByAccount(final InternalTenantContext context) {
         final List<InvoiceModelDao> result = new ArrayList<InvoiceModelDao>();
 
         synchronized (monitor) {
+            final UUID accountId = accountRecordIds.inverse().get(context.getAccountRecordId());
             for (final InvoiceModelDao invoice : invoices.values()) {
                 if (accountId.equals(invoice.getAccountId())) {
                     result.add(invoice);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index dc2ed45..4ce0994 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -25,13 +25,17 @@ import java.util.Map;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 import org.skife.jdbi.v2.exceptions.TransactionFailedException;
 import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.ErrorCode;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountData;
 import com.ning.billing.catalog.DefaultPrice;
 import com.ning.billing.catalog.MockInternationalPrice;
 import com.ning.billing.catalog.MockPlan;
@@ -42,8 +46,7 @@ import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
-import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
-import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.clock.ClockMock;
 import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.MockBillingEventSet;
 import com.ning.billing.invoice.api.Invoice;
@@ -59,7 +62,10 @@ import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
-import com.ning.billing.clock.ClockMock;
+import com.ning.billing.mock.MockAccountBuilder;
+import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
+import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
@@ -78,26 +84,35 @@ import static org.testng.Assert.assertTrue;
 
 public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
+    private Account account;
+    private InternalCallContext context;
+
+    @BeforeMethod(groups = "slow")
+    public void setUp() throws Exception {
+        account = invoiceUtil.createAccount(callContext);
+        context = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+    }
+
     @Test(groups = "slow")
     public void testSimple() throws Exception {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
-        invoiceUtil.createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, context);
 
-        final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
+        final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoice.getId(), context);
         invoiceUtil.checkInvoicesEqual(retrievedInvoice, invoice);
-        invoiceUtil.checkInvoicesEqual(invoiceDao.getByNumber(retrievedInvoice.getInvoiceNumber(), internalCallContext), invoice);
+        invoiceUtil.checkInvoicesEqual(invoiceDao.getByNumber(retrievedInvoice.getInvoiceNumber(), context), invoice);
     }
 
     @Test(groups = "slow")
     public void testCreationAndRetrievalByAccount() {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
         final LocalDate invoiceDate = invoice.getInvoiceDate();
 
-        invoiceUtil.createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, context);
 
-        final List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(accountId, internalCallContext);
+        final List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(context);
         assertNotNull(invoices);
         assertEquals(invoices.size(), 1);
         final InvoiceModelDao thisInvoice = invoices.get(0);
@@ -110,7 +125,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testInvoicePayment() throws InvoiceApiException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
         final UUID invoiceId = invoice.getId();
         final UUID subscriptionId = UUID.randomUUID();
@@ -121,9 +136,9 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
                                                                  new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
 
         invoice.addInvoiceItem(invoiceItem);
-        invoiceUtil.createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, context);
 
-        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoiceId, internalCallContext);
+        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoiceId, context);
         assertNotNull(savedInvoice);
         assertEquals(InvoiceModelDaoHelper.getBalance(savedInvoice).compareTo(new BigDecimal("21.00")), 0);
         assertEquals(savedInvoice.getInvoiceItems().size(), 1);
@@ -132,9 +147,9 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final UUID paymentId = UUID.randomUUID();
 
         final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, clock.getUTCNow().plusDays(12), paymentAmount, Currency.USD);
-        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), internalCallContext);
+        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
 
-        final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoiceId, internalCallContext);
+        final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoiceId, context);
         assertNotNull(retrievedInvoice);
         assertEquals(retrievedInvoice.getInvoiceItems().size(), 1);
         assertEquals(InvoiceModelDaoHelper.getBalance(retrievedInvoice).compareTo(new BigDecimal("10.00")), 0);
@@ -143,7 +158,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow")
     public void testRetrievalForNonExistentInvoiceOrInvoiceItem() throws InvoiceApiException {
         try {
-            invoiceDao.getById(UUID.randomUUID(), internalCallContext);
+            invoiceDao.getById(UUID.randomUUID(), context);
             Assert.fail();
         } catch (TransactionFailedException e) {
             // TODO FIXME getById defined in EntityDaoBase
@@ -152,35 +167,35 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         }
 
         try {
-            invoiceDao.getByNumber(null, internalCallContext);
+            invoiceDao.getByNumber(null, context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_INVALID_NUMBER.getCode());
         }
 
         try {
-            invoiceDao.getByNumber(Integer.MIN_VALUE, internalCallContext);
+            invoiceDao.getByNumber(Integer.MIN_VALUE, context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_NUMBER_NOT_FOUND.getCode());
         }
 
         try {
-            invoiceDao.getChargebackById(UUID.randomUUID(), internalCallContext);
+            invoiceDao.getChargebackById(UUID.randomUUID(), context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.CHARGE_BACK_DOES_NOT_EXIST.getCode());
         }
 
         try {
-            invoiceDao.getExternalChargeById(UUID.randomUUID(), internalCallContext);
+            invoiceDao.getExternalChargeById(UUID.randomUUID(), context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_ITEM_NOT_FOUND.getCode());
         }
 
         try {
-            invoiceDao.getCreditById(UUID.randomUUID(), internalCallContext);
+            invoiceDao.getCreditById(UUID.randomUUID(), context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_ITEM_NOT_FOUND.getCode());
@@ -190,7 +205,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow")
     public void testCreateRefundOnNonExistingPayment() throws Exception {
         try {
-            invoiceDao.createRefund(UUID.randomUUID(), BigDecimal.TEN, false, ImmutableMap.<UUID, BigDecimal>of(), null, internalCallContext);
+            invoiceDao.createRefund(UUID.randomUUID(), BigDecimal.TEN, false, ImmutableMap.<UUID, BigDecimal>of(), null, context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_PAYMENT_BY_ATTEMPT_NOT_FOUND.getCode());
@@ -199,7 +214,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetInvoicesBySubscriptionForRecurringItems() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
 
         final UUID subscriptionId1 = UUID.randomUUID();
@@ -215,7 +230,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -224,23 +239,23 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
 
         final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
                                                                     rate3, rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(item3, internalCallContext);
+        invoiceUtil.createInvoiceItem(item3, context);
 
         final RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
                                                                     rate4, rate4, Currency.USD);
-        invoiceUtil.createInvoiceItem(item4, internalCallContext);
+        invoiceUtil.createInvoiceItem(item4, context);
 
         // Create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -249,33 +264,33 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item5, internalCallContext);
+        invoiceUtil.createInvoiceItem(item5, context);
 
         final RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item6, internalCallContext);
+        invoiceUtil.createInvoiceItem(item6, context);
 
         final RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
                                                                     rate3, rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(item7, internalCallContext);
+        invoiceUtil.createInvoiceItem(item7, context);
 
         // Check that each subscription returns the correct number of invoices
-        final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, internalCallContext);
+        final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, context);
         assertEquals(items1.size(), 2);
 
-        final List<InvoiceModelDao> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2, internalCallContext);
+        final List<InvoiceModelDao> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2, context);
         assertEquals(items2.size(), 2);
 
-        final List<InvoiceModelDao> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3, internalCallContext);
+        final List<InvoiceModelDao> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3, context);
         assertEquals(items3.size(), 2);
 
-        final List<InvoiceModelDao> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4, internalCallContext);
+        final List<InvoiceModelDao> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4, context);
         assertEquals(items4.size(), 1);
     }
 
     @Test(groups = "slow")
     public void testGetInvoicesBySubscriptionForFixedItems() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
 
         final UUID subscriptionId1 = UUID.randomUUID();
@@ -291,7 +306,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -300,23 +315,23 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate,
                                                                       rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate,
                                                                       rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
 
         final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate,
                                                                       rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(item3, internalCallContext);
+        invoiceUtil.createInvoiceItem(item3, context);
 
         final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate,
                                                                       rate4, Currency.USD);
-        invoiceUtil.createInvoiceItem(item4, internalCallContext);
+        invoiceUtil.createInvoiceItem(item4, context);
 
         // create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -324,33 +339,33 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate,
                                                                       rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item5, internalCallContext);
+        invoiceUtil.createInvoiceItem(item5, context);
 
         final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate,
                                                                       rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item6, internalCallContext);
+        invoiceUtil.createInvoiceItem(item6, context);
 
         final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate,
                                                                       rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(item7, internalCallContext);
+        invoiceUtil.createInvoiceItem(item7, context);
 
         // check that each subscription returns the correct number of invoices
-        final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, internalCallContext);
+        final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, context);
         assertEquals(items1.size(), 2);
 
-        final List<InvoiceModelDao> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2, internalCallContext);
+        final List<InvoiceModelDao> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2, context);
         assertEquals(items2.size(), 2);
 
-        final List<InvoiceModelDao> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3, internalCallContext);
+        final List<InvoiceModelDao> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3, context);
         assertEquals(items3.size(), 2);
 
-        final List<InvoiceModelDao> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4, internalCallContext);
+        final List<InvoiceModelDao> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4, context);
         assertEquals(items4.size(), 1);
     }
 
     @Test(groups = "slow")
     public void testGetInvoicesBySubscriptionForRecurringAndFixedItems() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
 
         final UUID subscriptionId1 = UUID.randomUUID();
@@ -366,7 +381,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -375,39 +390,39 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem recurringItem1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
                                                                              rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem1, context);
 
         final RecurringInvoiceItem recurringItem2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
                                                                              rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem2, context);
 
         final RecurringInvoiceItem recurringItem3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
                                                                              rate3, rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem3, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem3, context);
 
         final RecurringInvoiceItem recurringItem4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
                                                                              rate4, rate4, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem4, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem4, context);
 
         final FixedPriceInvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate,
                                                                            rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem1, context);
 
         final FixedPriceInvoiceItem fixedItem2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate,
                                                                            rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem2, context);
 
         final FixedPriceInvoiceItem fixedItem3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate,
                                                                            rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem3, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem3, context);
 
         final FixedPriceInvoiceItem fixedItem4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate,
                                                                            rate4, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem4, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem4, context);
 
         // create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -416,76 +431,76 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem recurringItem5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
                                                                              rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem5, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem5, context);
 
         final RecurringInvoiceItem recurringItem6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
                                                                              rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem6, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem6, context);
 
         final RecurringInvoiceItem recurringItem7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
                                                                              rate3, rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(recurringItem7, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem7, context);
         final FixedPriceInvoiceItem fixedItem5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate,
                                                                            rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem5, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem5, context);
 
         final FixedPriceInvoiceItem fixedItem6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate,
                                                                            rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem6, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem6, context);
 
         final FixedPriceInvoiceItem fixedItem7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate,
                                                                            rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(fixedItem7, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem7, context);
 
         // check that each subscription returns the correct number of invoices
-        final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, internalCallContext);
+        final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, context);
         assertEquals(items1.size(), 4);
 
-        final List<InvoiceModelDao> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2, internalCallContext);
+        final List<InvoiceModelDao> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2, context);
         assertEquals(items2.size(), 4);
 
-        final List<InvoiceModelDao> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3, internalCallContext);
+        final List<InvoiceModelDao> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3, context);
         assertEquals(items3.size(), 4);
 
-        final List<InvoiceModelDao> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4, internalCallContext);
+        final List<InvoiceModelDao> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4, context);
         assertEquals(items4.size(), 2);
     }
 
     @Test(groups = "slow")
     public void testGetInvoicesForAccountAfterDate() {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate targetDate2 = new LocalDate(2011, 12, 6);
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate2, Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
         List<InvoiceModelDao> invoices;
-        invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 1, 1), internalCallContext);
+        invoices = invoiceDao.getInvoicesByAccount(new LocalDate(2011, 1, 1), context);
         assertEquals(invoices.size(), 2);
 
-        invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 10, 6), internalCallContext);
+        invoices = invoiceDao.getInvoicesByAccount(new LocalDate(2011, 10, 6), context);
         assertEquals(invoices.size(), 2);
 
-        invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 10, 11), internalCallContext);
+        invoices = invoiceDao.getInvoicesByAccount(new LocalDate(2011, 10, 11), context);
         assertEquals(invoices.size(), 1);
 
-        invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 12, 6), internalCallContext);
+        invoices = invoiceDao.getInvoicesByAccount(new LocalDate(2011, 12, 6), context);
         assertEquals(invoices.size(), 1);
 
-        invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2012, 1, 1), internalCallContext);
+        invoices = invoiceDao.getInvoicesByAccount(new LocalDate(2012, 1, 1), context);
         assertEquals(invoices.size(), 0);
     }
 
     @Test(groups = "slow")
     public void testAccountBalance() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -495,27 +510,27 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
 
         final BigDecimal payment1 = new BigDecimal("48.0");
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        invoiceUtil.createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, context);
 
-        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(rate1.add(rate2).subtract(payment1)), 0);
     }
 
     @Test(groups = "slow")
     public void testAccountBalanceWithCredit() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -524,22 +539,22 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate1.negate(), Currency.USD);
-        invoiceUtil.createInvoiceItem(creditItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditItem, context);
 
-        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(BigDecimal.ZERO), 0);
     }
 
     @Test(groups = "slow")
     public void testAccountBalanceWithNoPayments() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -549,28 +564,28 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
 
-        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(rate1.add(rate2)), 0);
     }
 
     @Test(groups = "slow")
     public void testAccountBalanceWithNoInvoiceItems() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final BigDecimal payment1 = new BigDecimal("48.0");
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        invoiceUtil.createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, context);
 
-        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(BigDecimal.ZERO.subtract(payment1)), 0);
     }
 
@@ -586,11 +601,11 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     private void testAccountBalanceWithRefundInternal(final boolean withAdjustment) throws InvoiceApiException, EntityPersistenceException {
 
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -601,20 +616,20 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
-        BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
+        BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("20.00")), 0);
 
         // Pay the whole thing
         final UUID paymentId = UUID.randomUUID();
         final BigDecimal payment1 = rate1;
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        invoiceUtil.createPayment(payment, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createPayment(payment, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
-        invoiceDao.createRefund(paymentId, refund1, withAdjustment, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceDao.createRefund(paymentId, refund1, withAdjustment, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         if (withAdjustment) {
             assertEquals(balance.compareTo(BigDecimal.ZERO), 0);
         } else {
@@ -635,12 +650,12 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
     }
 
     private void testRefundWithRepairAndInvoiceItemAdjustmentInternal(final BigDecimal refundAmount) throws InvoiceApiException, EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
 
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -650,42 +665,42 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, amount, amount, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
-        BigDecimal balancePriorRefund = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
+        BigDecimal balancePriorRefund = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balancePriorRefund.compareTo(new BigDecimal("20.00")), 0);
 
         // Pay the whole thing
         final UUID paymentId = UUID.randomUUID();
         final BigDecimal payment1 = amount;
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice.getId(), new DateTime(), payment1, Currency.USD);
-        invoiceUtil.createPayment(payment, internalCallContext);
-        balancePriorRefund = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createPayment(payment, context);
+        balancePriorRefund = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balancePriorRefund.compareTo(new BigDecimal("0.00")), 0);
 
         // Repair the item (And add CBA item that should be generated)
         final InvoiceItem repairItem = new RepairAdjInvoiceItem(invoice.getId(), accountId, startDate, endDate, amount.negate(), Currency.USD, item2.getId());
-        invoiceUtil.createInvoiceItem(repairItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(repairItem, context);
 
         final InvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), accountId, startDate, amount, Currency.USD);
-        invoiceUtil.createInvoiceItem(cbaItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem, context);
 
         final Map<UUID, BigDecimal> itemAdjustment = new HashMap<UUID, BigDecimal>();
         // PAss a null value to let invoice calculate the amount to adjust
         itemAdjustment.put(item2.getId(), null);
 
-        invoiceDao.createRefund(paymentId, refundAmount, true, itemAdjustment, UUID.randomUUID(), internalCallContext);
-        balancePriorRefund = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceDao.createRefund(paymentId, refundAmount, true, itemAdjustment, UUID.randomUUID(), context);
+        balancePriorRefund = invoiceDao.getAccountBalance(accountId, context);
 
         final boolean partialRefund = refundAmount.compareTo(amount) < 0;
-        final BigDecimal cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
-        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
+        final BigDecimal cba = invoiceDao.getAccountCBA(accountId, context);
+        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoice.getId(), context);
 
         final BigDecimal expectedCba = balancePriorRefund.compareTo(BigDecimal.ZERO) < 0 ? balancePriorRefund.negate() : BigDecimal.ZERO;
         assertEquals(cba.compareTo(expectedCba), 0);
 
         // Let's re-calculate them from invoice
-        final BigDecimal balanceAfterRefund = invoiceDao.getAccountBalance(accountId, internalCallContext);
-        final BigDecimal cbaAfterRefund = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        final BigDecimal balanceAfterRefund = invoiceDao.getAccountBalance(accountId, context);
+        final BigDecimal cbaAfterRefund = invoiceDao.getAccountCBA(accountId, context);
 
         if (partialRefund) {
             // IB = 20 (rec) - 20 (repair) + 20 (cba) - (20 -7) = 7;  AB = IB - CBA = 7 - 20 = -13
@@ -732,11 +747,11 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
     }
 
     private void testAccountBalanceWithRefundAndCBAInternal(final boolean withAdjustment, final BigDecimal refundAmount, final BigDecimal expectedFinalBalance) throws InvoiceApiException, EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -748,49 +763,49 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         // Fixed Item
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                       amount1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
-        BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("5.00")), 0);
 
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("25.00")), 0);
 
         // Pay the whole thing
         final UUID paymentId = UUID.randomUUID();
         final BigDecimal payment1 = amount1.add(rate1);
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        invoiceUtil.createPayment(payment, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createPayment(payment, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
         // Repair previous item with rate 2
         final RepairAdjInvoiceItem item2Repair = new RepairAdjInvoiceItem(invoice1.getId(), accountId, startDate, endDate, rate1.negate(), Currency.USD, item2.getId());
         final RecurringInvoiceItem item2Replace = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                            endDate, rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2Repair, internalCallContext);
-        invoiceUtil.createInvoiceItem(item2Replace, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2Repair, context);
+        invoiceUtil.createInvoiceItem(item2Replace, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
 
         // CBA
         final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), balance.negate(), Currency.USD);
-        invoiceUtil.createInvoiceItem(cbaItem, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
-        BigDecimal cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        BigDecimal cba = invoiceDao.getAccountCBA(accountId, context);
         assertEquals(cba.compareTo(new BigDecimal("10.00")), 0);
 
         // PARTIAL REFUND on the payment
-        invoiceDao.createRefund(paymentId, refundAmount, withAdjustment, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), internalCallContext);
+        invoiceDao.createRefund(paymentId, refundAmount, withAdjustment, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), context);
 
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(expectedFinalBalance), 0);
-        cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        cba = invoiceDao.getAccountCBA(accountId, context);
         final BigDecimal expectedCba = balance.compareTo(BigDecimal.ZERO) < 0 ? balance.negate() : BigDecimal.ZERO;
         assertEquals(cba.compareTo(expectedCba), 0);
     }
@@ -798,14 +813,14 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow")
     public void testExternalChargeWithCBA() throws InvoiceApiException, EntityPersistenceException {
 
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
 
-        invoiceDao.insertCredit(accountId, null, new BigDecimal("20.0"), new LocalDate(), Currency.USD, internalCallContext);
+        invoiceDao.insertCredit(accountId, null, new BigDecimal("20.0"), new LocalDate(), Currency.USD, context);
 
-        final InvoiceItemModelDao charge = invoiceDao.insertExternalCharge(accountId, null, bundleId, "bla", new BigDecimal("15.0"), clock.getUTCNow().toLocalDate(), Currency.USD, internalCallContext);
+        final InvoiceItemModelDao charge = invoiceDao.insertExternalCharge(accountId, null, bundleId, "bla", new BigDecimal("15.0"), clock.getUTCNow().toLocalDate(), Currency.USD, context);
 
-        final InvoiceModelDao newInvoice = invoiceDao.getById(charge.getInvoiceId(), internalCallContext);
+        final InvoiceModelDao newInvoice = invoiceDao.getById(charge.getInvoiceId(), context);
         final List<InvoiceItemModelDao> items = newInvoice.getInvoiceItems();
         assertEquals(items.size(), 2);
         for (final InvoiceItemModelDao cur : items) {
@@ -819,11 +834,11 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testAccountBalanceWithAllSortsOfThings() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -835,88 +850,85 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         // Fixed Item
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                       amount1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
-        BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("5.00")), 0);
 
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("25.00")), 0);
 
         // Pay the whole thing
         final BigDecimal payment1 = amount1.add(rate1);
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        invoiceUtil.createPayment(payment, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createPayment(payment, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
         // Repair previous item with rate 2
         final RepairAdjInvoiceItem item2Repair = new RepairAdjInvoiceItem(invoice1.getId(), accountId, startDate, endDate, rate1.negate(), Currency.USD, item2.getId());
         final RecurringInvoiceItem item2Replace = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                            endDate, rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2Repair, internalCallContext);
-        invoiceUtil.createInvoiceItem(item2Replace, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2Repair, context);
+        invoiceUtil.createInvoiceItem(item2Replace, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
 
         // CBA
         final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), balance.negate(), Currency.USD);
-        invoiceUtil.createInvoiceItem(cbaItem, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
-        BigDecimal cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        BigDecimal cba = invoiceDao.getAccountCBA(accountId, context);
         assertEquals(cba.compareTo(new BigDecimal("10.00")), 0);
 
         // partial REFUND on the payment (along with CBA generated by the system)
         final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), rate2.negate(), Currency.USD, null, payment.getId());
-        invoiceUtil.createPayment(refund, internalCallContext);
+        invoiceUtil.createPayment(refund, context);
         final CreditBalanceAdjInvoiceItem cbaItem2 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
-        invoiceUtil.createInvoiceItem(cbaItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem2, context);
 
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(BigDecimal.ZERO), 0);
-        cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        cba = invoiceDao.getAccountCBA(accountId, context);
         assertEquals(cba.compareTo(BigDecimal.ZERO), 0);
 
         // NEXT RECURRING on invoice 2
 
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1.plusMonths(1), Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
         final RecurringInvoiceItem nextItem = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test bla", startDate.plusMonths(1),
                                                                        endDate.plusMonths(1), rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(nextItem, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(nextItem, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("10.00")), 0);
-        cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        cba = invoiceDao.getAccountCBA(accountId, context);
         assertEquals(cba.compareTo(new BigDecimal("0.00")), 0);
 
         // FINALLY ISSUE A CREDIT ADJ
         final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice2.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
-        invoiceUtil.createInvoiceItem(creditItem, internalCallContext);
-        balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditItem, context);
+        balance = invoiceDao.getAccountBalance(accountId, context);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
-        cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
+        cba = invoiceDao.getAccountCBA(accountId, context);
         assertEquals(cba.compareTo(new BigDecimal("0.00")), 0);
-
     }
 
     @Test(groups = "slow")
     public void testAccountCredit() {
-
-        final UUID accountId = UUID.randomUUID();
-
+        final UUID accountId = account.getId();
         final LocalDate effectiveDate = new LocalDate(2011, 3, 1);
 
         final BigDecimal creditAmount = new BigDecimal("5.0");
 
-        invoiceDao.insertCredit(accountId, null, creditAmount, effectiveDate, Currency.USD, internalCallContext);
+        invoiceDao.insertCredit(accountId, null, creditAmount, effectiveDate, Currency.USD, context);
 
-        final List<InvoiceModelDao> invoices = invoiceDao.getAllInvoicesByAccount(accountId, internalCallContext);
+        final List<InvoiceModelDao> invoices = invoiceDao.getAllInvoicesByAccount(context);
         assertEquals(invoices.size(), 1);
 
         final InvoiceModelDao invoice = invoices.get(0);
@@ -963,14 +975,13 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
     }
 
     private void testInvoiceCreditInternal(final BigDecimal creditAmount, final BigDecimal expectedBalance, final boolean expectCBA) throws EntityPersistenceException {
-
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
 
         // Create one invoice with a fixed invoice item
         final LocalDate targetDate = new LocalDate(2011, 2, 15);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
 
@@ -979,14 +990,14 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         // Fixed Item
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                       amount1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         // Create the credit item
         final LocalDate effectiveDate = new LocalDate(2011, 3, 1);
 
-        invoiceDao.insertCredit(accountId, invoice1.getId(), creditAmount, effectiveDate, Currency.USD, internalCallContext);
+        invoiceDao.insertCredit(accountId, invoice1.getId(), creditAmount, effectiveDate, Currency.USD, context);
 
-        final List<InvoiceModelDao> invoices = invoiceDao.getAllInvoicesByAccount(accountId, internalCallContext);
+        final List<InvoiceModelDao> invoices = invoiceDao.getAllInvoicesByAccount(context);
         assertEquals(invoices.size(), 1);
 
         final InvoiceModelDao invoice = invoices.get(0);
@@ -1009,11 +1020,11 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetUnpaidInvoicesByAccountId() throws EntityPersistenceException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -1023,26 +1034,26 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        invoiceUtil.createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, context);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        invoiceUtil.createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, context);
 
         LocalDate upToDate;
         Collection<InvoiceModelDao> invoices;
 
         upToDate = new LocalDate(2011, 1, 1);
-        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContext);
+        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context);
         assertEquals(invoices.size(), 0);
 
         upToDate = new LocalDate(2012, 1, 1);
-        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContext);
+        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context);
         assertEquals(invoices.size(), 1);
 
         final LocalDate targetDate2 = new LocalDate(2011, 7, 1);
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate2, Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
         final LocalDate startDate2 = new LocalDate(2011, 6, 1);
         final LocalDate endDate2 = startDate2.plusMonths(3);
@@ -1051,14 +1062,14 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2,
                                                                     rate3, rate3, Currency.USD);
-        invoiceUtil.createInvoiceItem(item3, internalCallContext);
+        invoiceUtil.createInvoiceItem(item3, context);
 
         upToDate = new LocalDate(2011, 1, 1);
-        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContext);
+        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context);
         assertEquals(invoices.size(), 0);
 
         upToDate = new LocalDate(2012, 1, 1);
-        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContext);
+        invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context);
         assertEquals(invoices.size(), 2);
     }
 
@@ -1069,7 +1080,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
      */
     @Test(groups = "slow")
     public void testInvoiceGenerationForImmediateChanges() throws InvoiceApiException, CatalogApiException {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final List<Invoice> invoiceList = new ArrayList<Invoice>();
         final LocalDate targetDate = new LocalDate(2011, 2, 16);
         final Currency currency = Currency.USD;
@@ -1112,13 +1123,13 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         assertEquals(invoice2.getBalance(), FIVE);
         invoiceList.add(invoice2);
 
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
+        invoiceUtil.createInvoice(invoice2, true, context);
 
-        final InvoiceModelDao savedInvoice1 = invoiceDao.getById(invoice1.getId(), internalCallContext);
+        final InvoiceModelDao savedInvoice1 = invoiceDao.getById(invoice1.getId(), context);
         assertEquals(InvoiceModelDaoHelper.getBalance(savedInvoice1), FIVE);
 
-        final InvoiceModelDao savedInvoice2 = invoiceDao.getById(invoice2.getId(), internalCallContext);
+        final InvoiceModelDao savedInvoice2 = invoiceDao.getById(invoice2.getId(), context);
         assertEquals(InvoiceModelDaoHelper.getBalance(savedInvoice2), TEN);
     }
 
@@ -1178,7 +1189,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final BillingEventSet events = new MockBillingEventSet();
         events.add(event1);
 
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final Invoice invoice1 = generator.generateInvoice(accountId, events, null, new LocalDate(effectiveDate1), Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 1);
@@ -1187,7 +1198,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
-        //invoiceUtil.createInvoice(invoice1, invoice1.getTargetDate().getDayOfMonth(), internalCallContext);
+        //invoiceUtil.createInvoice(invoice1, invoice1.getTargetDate().getDayOfMonth(), context);
 
         final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
         final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
@@ -1202,7 +1213,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         invoiceList.add(invoice2);
 
-        //invoiceUtil.createInvoice(invoice2, invoice2.getTargetDate().getDayOfMonth(), internalCallContext);
+        //invoiceUtil.createInvoice(invoice2, invoice2.getTargetDate().getDayOfMonth(), context);
 
         final DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
         final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, new LocalDate(effectiveDate3), Currency.USD);
@@ -1210,7 +1221,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         assertEquals(invoice3.getNumberOfItems(), 1);
         assertEquals(invoice3.getBalance().compareTo(cheapAmount), 0);
 
-        //invoiceUtil.createInvoice(invoice3, invoice3.getTargetDate().getDayOfMonth(), internalCallContext);
+        //invoiceUtil.createInvoice(invoice3, invoice3.getTargetDate().getDayOfMonth(), context);
     }
 
     @Test(groups = "slow")
@@ -1255,8 +1266,8 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         assertEquals(invoice.getNumberOfItems(), 2);
         assertEquals(invoice.getBalance().compareTo(cheapAmount), 0);
 
-        invoiceUtil.createInvoice(invoice, true, internalCallContext);
-        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, context);
+        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoice.getId(), context);
 
         assertNotNull(savedInvoice);
         assertEquals(savedInvoice.getInvoiceItems().size(), 2);
@@ -1265,8 +1276,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testRefundedInvoiceWithInvoiceItemAdjustmentWithRepair() throws InvoiceApiException {
-
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
         final UUID subscriptionId = UUID.randomUUID();
         final UUID bundleId = UUID.randomUUID();
         final LocalDate startDate = new LocalDate(2010, 1, 1);
@@ -1285,7 +1295,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
                                                                  recuringStartDate, recuringEndDate, new BigDecimal("239.00"), new BigDecimal("239.00"), Currency.USD);
 
         invoice.addInvoiceItem(invoiceItem);
-        invoiceUtil.createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, context);
 
         ((ClockMock) clock).addDays(1);
 
@@ -1293,14 +1303,14 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final BigDecimal paymentAmount = new BigDecimal("239.00");
         final UUID paymentId = UUID.randomUUID();
         final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, clock.getUTCNow(), paymentAmount, Currency.USD);
-        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), internalCallContext);
+        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
 
         // AND THEN THIRD THE REFUND
         final Map<UUID, BigDecimal> invoiceItemMap = new HashMap<UUID, BigDecimal>();
         invoiceItemMap.put(invoiceItem.getId(), new BigDecimal("239.00"));
-        invoiceDao.createRefund(paymentId, paymentAmount, true, invoiceItemMap, UUID.randomUUID(), internalCallContext);
+        invoiceDao.createRefund(paymentId, paymentAmount, true, invoiceItemMap, UUID.randomUUID(), context);
 
-        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoiceId, internalCallContext);
+        final InvoiceModelDao savedInvoice = invoiceDao.getById(invoiceId, context);
         assertNotNull(savedInvoice);
         assertEquals(savedInvoice.getInvoiceItems().size(), 2);
 
@@ -1326,10 +1336,10 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
                                                                        "new-event", 1L, SubscriptionBaseTransitionType.CREATE);
         events.add(event1);
         final Invoice newInvoice = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate, Currency.USD);
-        invoiceUtil.createInvoice(newInvoice, true, internalCallContext);
+        invoiceUtil.createInvoice(newInvoice, true, context);
 
         // VERIFY THAT WE STILL HAVE ONLY 2 ITEMS, MENAING THERE WERE NO REPAIR AND NO CBA GENERATED
-        final Invoice firstInvoice = new DefaultInvoice(invoiceDao.getById(invoiceId, internalCallContext));
+        final Invoice firstInvoice = new DefaultInvoice(invoiceDao.getById(invoiceId, context));
         assertNotNull(firstInvoice);
         assertEquals(firstInvoice.getInvoiceItems().size(), 2);
     }
@@ -1362,8 +1372,8 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
         Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, invoices, new LocalDate(targetDate1), Currency.USD);
         invoices.add(invoice1);
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
-        invoice1 = new DefaultInvoice(invoiceDao.getById(invoice1.getId(), internalCallContext));
+        invoiceUtil.createInvoice(invoice1, true, context);
+        invoice1 = new DefaultInvoice(invoiceDao.getById(invoice1.getId(), context));
         assertNotNull(invoice1.getInvoiceNumber());
 
         final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, targetDate1, plan, phase2, null,
@@ -1372,14 +1382,14 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
                                                                        "testEvent2", 2L, SubscriptionBaseTransitionType.CHANGE);
         events.add(event2);
         Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, invoices, new LocalDate(targetDate2), Currency.USD);
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
-        invoice2 = new DefaultInvoice(invoiceDao.getById(invoice2.getId(), internalCallContext));
+        invoiceUtil.createInvoice(invoice2, true, context);
+        invoice2 = new DefaultInvoice(invoiceDao.getById(invoice2.getId(), context));
         assertNotNull(invoice2.getInvoiceNumber());
     }
 
     @Test(groups = "slow")
     public void testDeleteCBANotConsumed() throws Exception {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
 
         // Create invoice 1
         // Scenario: single item with payment
@@ -1397,26 +1407,26 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(fixedItem1.getInvoiceId(), fixedItem1.getAccountId(),
                                                                                                          fixedItem1.getStartDate(), fixedItem1.getAmount(),
                                                                                                          fixedItem1.getCurrency());
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
-        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
+        invoiceUtil.createInvoiceItem(fixedItem1, context);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, context);
 
         // Verify scenario - no CBA should have been used
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 10.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 10.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 10.00, 10.00);
 
         // Delete the CBA on invoice 1
-        invoiceDao.deleteCBA(accountId, invoice1.getId(), creditBalanceAdjInvoiceItem1.getId(), internalCallContext);
+        invoiceDao.deleteCBA(accountId, invoice1.getId(), creditBalanceAdjInvoiceItem1.getId(), context);
 
         // Verify the result
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 0.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 0.00);
     }
 
     @Test(groups = "slow")
     public void testRefundWithCBAPartiallyConsumed() throws Exception {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
 
         // Create invoice 1
         // Scenario: single item with payment
@@ -1438,12 +1448,12 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final UUID paymentId = UUID.randomUUID();
         final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), clock.getUTCNow().plusDays(12), new BigDecimal("10.0"), Currency.USD);
 
-        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), internalCallContext);
+        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
 
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
-        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
+        invoiceUtil.createInvoiceItem(fixedItem1, context);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, context);
 
         // Create invoice 2
         // Scenario: single item
@@ -1455,27 +1465,27 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem2 = new CreditBalanceAdjInvoiceItem(fixedItem2.getInvoiceId(), fixedItem2.getAccountId(),
                                                                                                          fixedItem2.getStartDate(), fixedItem2.getAmount().negate(),
                                                                                                          fixedItem2.getCurrency());
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(fixedItem2, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem2, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
+        invoiceUtil.createInvoiceItem(fixedItem2, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem2, context);
 
         // Verify scenario - half of the CBA should have been used
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 5.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 5.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
         invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
 
         // Refund Payment before we can deleted CBA
-        invoiceDao.createRefund(paymentId, new BigDecimal("10.0"), false, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), internalCallContext);
+        invoiceDao.createRefund(paymentId, new BigDecimal("10.0"), false, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), context);
 
         // Verify all three invoices were affected
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 0.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 5.00, 5.00);
         invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
     }
 
     @Test(groups = "slow")
     public void testRefundCBAFullyConsumedTwice() throws Exception {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
 
         // Create invoice 1
         // Scenario: single item with payment
@@ -1493,17 +1503,17 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(fixedItem1.getInvoiceId(), fixedItem1.getAccountId(),
                                                                                                          fixedItem1.getStartDate(), fixedItem1.getAmount(),
                                                                                                          fixedItem1.getCurrency());
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
-        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
+        invoiceUtil.createInvoiceItem(fixedItem1, context);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, context);
 
 
         final BigDecimal paymentAmount = new BigDecimal("10.00");
         final UUID paymentId = UUID.randomUUID();
 
         final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), clock.getUTCNow().plusDays(12), paymentAmount, Currency.USD);
-        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), internalCallContext);
+        invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
 
         // Create invoice 2
         // Scenario: single item
@@ -1515,9 +1525,9 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem2 = new CreditBalanceAdjInvoiceItem(fixedItem2.getInvoiceId(), fixedItem2.getAccountId(),
                                                                                                          fixedItem2.getStartDate(), fixedItem2.getAmount().negate(),
                                                                                                          fixedItem2.getCurrency());
-        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(fixedItem2, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem2, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, context);
+        invoiceUtil.createInvoiceItem(fixedItem2, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem2, context);
 
         // Create invoice 3
         // Scenario: single item
@@ -1529,20 +1539,20 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem3 = new CreditBalanceAdjInvoiceItem(fixedItem3.getInvoiceId(), fixedItem3.getAccountId(),
                                                                                                          fixedItem3.getStartDate(), fixedItem3.getAmount().negate(),
                                                                                                          fixedItem3.getCurrency());
-        invoiceUtil.createInvoice(invoice3, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(fixedItem3, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem3, internalCallContext);
+        invoiceUtil.createInvoice(invoice3, true, context);
+        invoiceUtil.createInvoiceItem(fixedItem3, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem3, context);
 
         // Verify scenario - all CBA should have been used
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 0.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
         invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
         invoiceUtil.verifyInvoice(invoice3.getId(), 0.00, -5.00);
 
-        invoiceDao.createRefund(paymentId, paymentAmount, false, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), internalCallContext);
+        invoiceDao.createRefund(paymentId, paymentAmount, false, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), context);
 
         // Verify all three invoices were affected
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 0.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 10.00, 10.00);
         invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
         invoiceUtil.verifyInvoice(invoice3.getId(), 0.00, -5.00);
@@ -1550,7 +1560,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testCantDeleteCBAIfInvoiceBalanceBecomesNegative() throws Exception {
-        final UUID accountId = UUID.randomUUID();
+        final UUID accountId = account.getId();
 
         // Create invoice 1
         // Scenario:
@@ -1564,24 +1574,24 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), invoice1.getAccountId(),
                                                                                                          invoice1.getInvoiceDate(), repairAdjInvoiceItem.getAmount().negate(),
                                                                                                          invoice1.getCurrency());
-        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
-        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, context);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, context);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, context);
 
         // Verify scenario
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 10.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 10.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
 
         // Delete the CBA on invoice 1
         try {
-            invoiceDao.deleteCBA(accountId, invoice1.getId(), creditBalanceAdjInvoiceItem1.getId(), internalCallContext);
+            invoiceDao.deleteCBA(accountId, invoice1.getId(), creditBalanceAdjInvoiceItem1.getId(), context);
             Assert.fail();
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_WOULD_BE_NEGATIVE.getCode());
         }
 
         // Verify the result
-        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 10.00);
+        Assert.assertEquals(invoiceDao.getAccountCBA(accountId, context).doubleValue(), 10.00);
         invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
index d51aa36..1770ccc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
@@ -25,12 +25,12 @@ import com.ning.billing.mock.glue.MockGlobalLockerModule;
 import com.ning.billing.util.email.EmailModule;
 import com.ning.billing.util.email.templates.TemplateModule;
 import com.ning.billing.util.glue.CacheModule;
+import com.ning.billing.util.glue.CallContextModule;
 import com.ning.billing.util.glue.CustomFieldModule;
 import com.ning.billing.util.glue.NotificationQueueModule;
 import com.ning.billing.util.glue.TagStoreModule;
-import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 
 public class TestInvoiceModule extends DefaultInvoiceModule {
@@ -41,14 +41,13 @@ public class TestInvoiceModule extends DefaultInvoiceModule {
 
     private void installExternalApis() {
         bind(SubscriptionBaseInternalApi.class).toInstance(Mockito.mock(SubscriptionBaseInternalApi.class));
-        bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
         bind(BillingInternalApi.class).toInstance(Mockito.mock(BillingInternalApi.class));
     }
 
     @Override
     protected void configure() {
         super.configure();
-
+        install(new CallContextModule());
         install(new MockGlobalLockerModule());
 
         install(new CatalogModule(configSource));
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
index 58d4a49..172b6f3 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
@@ -16,13 +16,16 @@
 
 package com.ning.billing.invoice.glue;
 
+import org.mockito.Mockito;
 import org.skife.config.ConfigSource;
 
 import com.ning.billing.GuicyKillbillTestNoDBModule;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.dao.MockInvoiceDao;
 import com.ning.billing.mock.glue.MockNonEntityDaoModule;
 import com.ning.billing.util.bus.InMemoryBusModule;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
 
 public class TestInvoiceModuleNoDB extends TestInvoiceModule {
 
@@ -40,5 +43,8 @@ public class TestInvoiceModuleNoDB extends TestInvoiceModule {
         install(new GuicyKillbillTestNoDBModule());
         install(new MockNonEntityDaoModule());
         install(new InMemoryBusModule(configSource));
+
+        bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
+        bind(AccountUserApi.class).toInstance(Mockito.mock(AccountUserApi.class));
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
index a6cbc45..d491c30 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
@@ -19,6 +19,7 @@ package com.ning.billing.invoice.glue;
 import org.skife.config.ConfigSource;
 
 import com.ning.billing.GuicyKillbillTestWithEmbeddedDBModule;
+import com.ning.billing.account.glue.DefaultAccountModule;
 import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.TestInvoiceNotificationQListener;
 import com.ning.billing.util.glue.BusModule;
@@ -40,7 +41,7 @@ public class TestInvoiceModuleWithEmbeddedDb extends TestInvoiceModule {
     @Override
     public void configure() {
         super.configure();
-
+        install(new DefaultAccountModule(configSource));
         install(new GuicyKillbillTestWithEmbeddedDBModule());
         install(new NonEntityDaoModule());
         install(new MetricsModule());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
index aff1faf..e3e5c7c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -26,6 +26,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.commons.locker.GlobalLocker;
@@ -77,6 +78,8 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     @Inject
     protected BillingInternalApi billingApi;
     @Inject
+    protected AccountUserApi accountUserApi;
+    @Inject
     protected AccountInternalApi accountApi;
     @Inject
     protected SubscriptionBaseInternalApi subscriptionApi;
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 0342859..4651ad9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -39,9 +39,7 @@ import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
-import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
-import com.ning.billing.subscription.api.SubscriptionBase;
-import com.ning.billing.util.timezone.DateAndTimeZoneContext;
+import com.ning.billing.clock.ClockMock;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -50,23 +48,26 @@ import com.ning.billing.invoice.api.InvoiceNotifier;
 import com.ning.billing.invoice.dao.InvoiceItemModelDao;
 import com.ning.billing.invoice.dao.InvoiceModelDao;
 import com.ning.billing.invoice.notification.NullInvoiceNotifier;
+import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.clock.ClockMock;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
 import com.ning.billing.util.svcapi.junction.BillingModeType;
+import com.ning.billing.util.timezone.DateAndTimeZoneContext;
 
 public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
 
     private Account account;
     private SubscriptionBase subscription;
+    private InternalCallContext context;
 
     @Override
     @BeforeMethod(groups = "slow")
     public void beforeMethod() throws Exception {
         super.beforeMethod();
-        account = invoiceUtil.createAccount();
+        account = invoiceUtil.createAccount(callContext);
         subscription = invoiceUtil.createSubscription();
+        context = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
     }
 
     @Test(groups = "slow")
@@ -92,25 +93,24 @@ public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
                                                                    nonEntityDao, invoiceNotifier, locker, busService.getBus(),
                                                                    clock);
 
-        Invoice invoice = dispatcher.processAccount(accountId, target, true, internalCallContext);
+        Invoice invoice = dispatcher.processAccount(accountId, target, true, context);
         Assert.assertNotNull(invoice);
 
-        final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(callContext);
-        List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(accountId, internalTenantContext);
+        List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(context);
         Assert.assertEquals(invoices.size(), 0);
 
         // Try it again to double check
-        invoice = dispatcher.processAccount(accountId, target, true, internalCallContext);
+        invoice = dispatcher.processAccount(accountId, target, true, context);
         Assert.assertNotNull(invoice);
 
-        invoices = invoiceDao.getInvoicesByAccount(accountId, internalTenantContext);
+        invoices = invoiceDao.getInvoicesByAccount(context);
         Assert.assertEquals(invoices.size(), 0);
 
         // This time no dry run
-        invoice = dispatcher.processAccount(accountId, target, false, internalCallContext);
+        invoice = dispatcher.processAccount(accountId, target, false, context);
         Assert.assertNotNull(invoice);
 
-        invoices = invoiceDao.getInvoicesByAccount(accountId, internalTenantContext);
+        invoices = invoiceDao.getInvoicesByAccount(context);
         Assert.assertEquals(invoices.size(), 1);
     }
 
@@ -146,7 +146,7 @@ public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
                                                                    nonEntityDao, invoiceNotifier, locker, busService.getBus(),
                                                                    clock);
 
-        final Invoice invoice = dispatcher.processAccount(account.getId(), new DateTime("2012-07-30T00:00:00.000Z"), false, internalCallContext);
+        final Invoice invoice = dispatcher.processAccount(account.getId(), new DateTime("2012-07-30T00:00:00.000Z"), false, context);
         Assert.assertNotNull(invoice);
 
         final List<InvoiceItem> invoiceItems = invoice.getInvoiceItems();
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java
index 76242b6..4de64a3 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java
@@ -32,15 +32,16 @@ import org.testng.Assert;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.MockPlan;
 import com.ning.billing.catalog.MockPlanPhase;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.clock.Clock;
 import com.ning.billing.commons.locker.GlobalLocker;
-import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
-import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -56,18 +57,22 @@ import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
 import com.ning.billing.invoice.model.InvoicingConfiguration;
 import com.ning.billing.invoice.notification.NullInvoiceNotifier;
+import com.ning.billing.mock.MockAccountBuilder;
+import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+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.callcontext.InternalTenantContext;
-import com.ning.billing.clock.Clock;
 import com.ning.billing.util.dao.NonEntityDao;
 import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingModeType;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
 
 import com.google.common.base.Function;
@@ -130,27 +135,30 @@ public class TestInvoiceHelper {
     private final InvoiceGenerator generator;
     private final BillingInternalApi billingApi;
     private final AccountInternalApi accountApi;
+    private final AccountUserApi accountUserApi;
     private final SubscriptionBaseInternalApi subscriptionApi;
-    private final  BusService busService;
-    private final  InvoiceDao invoiceDao;
+    private final BusService busService;
+    private final InvoiceDao invoiceDao;
     private final GlobalLocker locker;
-    private final  Clock clock;
+    private final Clock clock;
     private final InternalCallContext internalCallContext;
     private final NonEntityDao nonEntityDao;
+    private final InternalCallContextFactory internalCallContextFactory;
 
     // Low level SqlDao used by the tests to directly insert rows
     private final InvoicePaymentSqlDao invoicePaymentSqlDao;
     private final InvoiceItemSqlDao invoiceItemSqlDao;
 
 
-
     @Inject
     public TestInvoiceHelper(final InvoiceGenerator generator, final IDBI dbi,
-                             final BillingInternalApi billingApi, final AccountInternalApi accountApi, final SubscriptionBaseInternalApi subscriptionApi, final BusService busService,
-                             final InvoiceDao invoiceDao, final GlobalLocker locker, final Clock clock, final NonEntityDao nonEntityDao, final InternalCallContext internalCallContext) {
+                             final BillingInternalApi billingApi, final AccountInternalApi accountApi, final AccountUserApi accountUserApi, final SubscriptionBaseInternalApi subscriptionApi, final BusService busService,
+                             final InvoiceDao invoiceDao, final GlobalLocker locker, final Clock clock, final NonEntityDao nonEntityDao, final InternalCallContext internalCallContext,
+                             final InternalCallContextFactory internalCallContextFactory) {
         this.generator = generator;
         this.billingApi = billingApi;
         this.accountApi = accountApi;
+        this.accountUserApi = accountUserApi;
         this.subscriptionApi = subscriptionApi;
         this.busService = busService;
         this.invoiceDao = invoiceDao;
@@ -158,11 +166,12 @@ public class TestInvoiceHelper {
         this.clock = clock;
         this.nonEntityDao = nonEntityDao;
         this.internalCallContext = internalCallContext;
+        this.internalCallContextFactory = internalCallContextFactory;
         this.invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
         this.invoicePaymentSqlDao = dbi.onDemand(InvoicePaymentSqlDao.class);
     }
 
-    public UUID generateRegularInvoice(final Account account, final DateTime targetDate) throws Exception {
+    public UUID generateRegularInvoice(final Account account, final DateTime targetDate, final CallContext callContext) throws Exception {
         final SubscriptionBase subscription = Mockito.mock(SubscriptionBase.class);
         Mockito.when(subscription.getId()).thenReturn(UUID.randomUUID());
         Mockito.when(subscription.getBundleId()).thenReturn(new UUID(0L, 0L));
@@ -186,13 +195,15 @@ public class TestInvoiceHelper {
         Invoice invoice = dispatcher.processAccount(account.getId(), targetDate, true, internalCallContext);
         Assert.assertNotNull(invoice);
 
-        List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
+        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+
+        List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(context);
         Assert.assertEquals(invoices.size(), 0);
 
-        invoice = dispatcher.processAccount(account.getId(), targetDate, false, internalCallContext);
+        invoice = dispatcher.processAccount(account.getId(), targetDate, false, context);
         Assert.assertNotNull(invoice);
 
-        invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
+        invoices = invoiceDao.getInvoicesByAccount(context);
         Assert.assertEquals(invoices.size(), 1);
 
         return invoice.getId();
@@ -206,18 +217,20 @@ public class TestInvoiceHelper {
         return subscription;
     }
 
-    public Account createAccount() throws AccountApiException {
-        final UUID accountId = UUID.randomUUID();
-        final Account account = Mockito.mock(Account.class);
-        Mockito.when(accountApi.getAccountById(Mockito.<UUID>any(), Mockito.<InternalCallContext>any())).thenReturn(account);
-        Mockito.when(account.getCurrency()).thenReturn(accountCurrency);
-        Mockito.when(account.getId()).thenReturn(accountId);
-        Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
-        Mockito.when(account.getBillCycleDayLocal()).thenReturn(31);
-        // The timezone is required to compute the date of the next invoice notification
-        Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
-
-        return account;
+    public Account createAccount(final CallContext callContext) throws AccountApiException {
+        final AccountData accountData = new MockAccountBuilder().name(UUID.randomUUID().toString().substring(1, 8))
+                                                                .firstNameLength(6)
+                                                                .email(UUID.randomUUID().toString().substring(1, 8))
+                                                                .phone(UUID.randomUUID().toString().substring(1, 8))
+                                                                .migrated(false)
+                                                                .isNotifiedForInvoices(true)
+                                                                .externalKey(UUID.randomUUID().toString().substring(1, 8))
+                                                                .billingCycleDayLocal(31)
+                                                                .currency(accountCurrency)
+                                                                .paymentMethodId(UUID.randomUUID())
+                                                                .timeZone(DateTimeZone.UTC)
+                                                                .build();
+        return accountUserApi.createAccount(accountData, callContext);
     }
 
     public void createInvoiceItem(final InvoiceItem invoiceItem, final InternalCallContext internalCallContext) throws EntityPersistenceException {
diff --git a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
index 4291aa4..34d99d8 100644
--- a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
+++ b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
@@ -24,13 +24,14 @@ import javax.inject.Inject;
 import org.joda.time.DateTime;
 
 import com.ning.billing.ObjectType;
+import com.ning.billing.clock.Clock;
 import com.ning.billing.util.cache.Cachable.CacheType;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
-import com.ning.billing.clock.Clock;
 import com.ning.billing.util.dao.NonEntityDao;
 
 import com.google.common.base.Objects;
 
+// Internal contexts almost always expect accountRecordId and tenantRecordId to be populated
 public class InternalCallContextFactory {
 
     public static final long INTERNAL_TENANT_RECORD_ID = 0L;
@@ -46,11 +47,11 @@ public class InternalCallContextFactory {
         this.cacheControllerDispatcher = cacheControllerDispatcher;
     }
 
-
     /**
      * Create an internal tenant context from a tenant context
      * <p/>
-     * This is used for r/o operations - we don't need the account id in that case
+     * This is used for r/o operations - we don't need the account id in that case.
+     * You should almost never use that one, you always want to populate the accountRecordId
      *
      * @param context tenant context (tenantId can be null only if multi-tenancy is disabled)
      * @return internal tenant context
@@ -75,20 +76,38 @@ public class InternalCallContextFactory {
 
     public InternalTenantContext createInternalTenantContext(final UUID accountId, final TenantContext context) {
         final Long tenantRecordId = getTenantRecordId(context);
-        final Long accountRecordId = nonEntityDao.retrieveAccountRecordIdFromObject(accountId, ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID));
+        final Long accountRecordId = getAccountRecordId(accountId, ObjectType.ACCOUNT);
         return new InternalTenantContext(tenantRecordId, accountRecordId);
     }
 
 
+    /**
+     * Crate an internal tenant context from a tenant context, and retrieving the account_record_id from another table
+     *
+     * @param objectId   the id of the row in the table pointed by object type where to look for account_record_id
+     * @param objectType the object type pointed by this objectId
+     * @param context    original tenant context
+     * @return internal tenant context from context, with a non null account_record_id (if found)
+     */
+    public InternalTenantContext createInternalTenantContext(final UUID objectId, final ObjectType objectType, final TenantContext context) {
+        // The context may come from a user API - for security, check we're not doing cross-tenants operations
+        //final Long tenantRecordIdFromObject = retrieveTenantRecordIdFromObject(objectId, objectType);
+        //final Long tenantRecordIdFromContext = getTenantRecordId(context);
+        //Preconditions.checkState(tenantRecordIdFromContext.equals(tenantRecordIdFromObject),
+        //                         "tenant of the pointed object (%s) and the context (%s) don't match!", tenantRecordIdFromObject, tenantRecordIdFromContext);
+        final Long tenantRecordId = getTenantRecordId(context);
+        final Long accountRecordId = getAccountRecordId(objectId, objectType);
+        return createInternalTenantContext(tenantRecordId, accountRecordId);
+    }
 
-        /**
-         * Crate an internal call context from a call context, and retrieving the account_record_id from another table
-         *
-         * @param objectId   the id of the row in the table pointed by object type where to look for account_record_id
-         * @param objectType the object type pointed by this objectId
-         * @param context    original call context
-         * @return internal call context from context, with a non null account_record_id (if found)
-         */
+    /**
+     * Create an internal call context from a call context, and retrieving the account_record_id from another table
+     *
+     * @param objectId   the id of the row in the table pointed by object type where to look for account_record_id
+     * @param objectType the object type pointed by this objectId
+     * @param context    original call context
+     * @return internal call context from context, with a non null account_record_id (if found)
+     */
     public InternalCallContext createInternalCallContext(final UUID objectId, final ObjectType objectType, final CallContext context) {
         // The context may come from a user API - for security, check we're not doing cross-tenants operations
         //final Long tenantRecordIdFromObject = retrieveTenantRecordIdFromObject(objectId, objectType);
@@ -152,7 +171,7 @@ public class InternalCallContextFactory {
                                                          @Nullable final String reasonCode, @Nullable final String comment, final DateTime createdDate,
                                                          final DateTime updatedDate) {
         final Long tenantRecordId = nonEntityDao.retrieveTenantRecordIdFromObject(objectId, objectType, cacheControllerDispatcher.getCacheController(CacheType.TENANT_RECORD_ID));
-        final Long accountRecordId = nonEntityDao.retrieveAccountRecordIdFromObject(objectId, objectType, cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID));
+        final Long accountRecordId = getAccountRecordId(objectId, objectType);
         return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken,
                                          reasonCode, comment, createdDate, updatedDate);
     }
@@ -202,8 +221,6 @@ public class InternalCallContextFactory {
         return new InternalCallContext(tenantRecordId, null, context);
     }
 
-
-
     // Used when we need to re-hydrate the context with the account_record_id (when creating the account)
     public InternalCallContext createInternalCallContext(final Long accountRecordId, final InternalCallContext context) {
         return new InternalCallContext(context.getTenantRecordId(), accountRecordId, context.getUserToken(), context.getCreatedBy(),
@@ -218,6 +235,14 @@ public class InternalCallContextFactory {
                                        context.getCreatedDate(), context.getUpdatedDate());
     }
 
+    private Long getAccountRecordId(final UUID accountId) {
+        return getAccountRecordId(accountId, ObjectType.ACCOUNT);
+    }
+
+    private Long getAccountRecordId(final UUID objectId, final ObjectType objectType) {
+        return nonEntityDao.retrieveAccountRecordIdFromObject(objectId, objectType, cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_RECORD_ID));
+    }
+
     private Long getTenantRecordId(final TenantContext context) {
         // Default to single default tenant (e.g. single tenant mode)
         // TODO Extract this convention (e.g. BusinessAnalyticsBase needs to know about it)
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java b/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java
index 2e6095d..d713448 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/invoice/InvoiceInternalApi.java
@@ -38,8 +38,6 @@ public interface InvoiceInternalApi {
 
     public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, LocalDate upToDate, InternalTenantContext context);
 
-    public Collection<Invoice> getInvoicesByAccountId(UUID accountId, InternalTenantContext context);
-
     public BigDecimal getAccountBalance(UUID accountId, InternalTenantContext context);
 
     public void notifyOfPayment(UUID invoiceId, BigDecimal amountOutstanding, Currency currency, UUID paymentId, DateTime paymentDate, InternalCallContext context) throws InvoiceApiException;
diff --git a/util/src/test/java/com/ning/billing/DBTestingHelper.java b/util/src/test/java/com/ning/billing/DBTestingHelper.java
index ac551bd..3da70b3 100644
--- a/util/src/test/java/com/ning/billing/DBTestingHelper.java
+++ b/util/src/test/java/com/ning/billing/DBTestingHelper.java
@@ -154,6 +154,27 @@ public class DBTestingHelper {
                                "    PRIMARY KEY(record_id)\n" +
                                ");");
 
+        // HACK (PIERRE): required by invoice tests which perform payments lookups to find the account record id for the internal context
+        instance.executeScript("DROP TABLE IF EXISTS payments;\n" +
+                               "CREATE TABLE payments (\n" +
+                               "    record_id int(11) unsigned NOT NULL AUTO_INCREMENT,\n" +
+                               "    id char(36) NOT NULL,\n" +
+                               "    account_id char(36) NOT NULL,\n" +
+                               "    invoice_id char(36) NOT NULL,\n" +
+                               "    payment_method_id char(36) NOT NULL,\n" +
+                               "    amount numeric(10,4),\n" +
+                               "    currency char(3),\n" +
+                               "    effective_date datetime,\n" +
+                               "    payment_status varchar(50),\n" +
+                               "    created_by varchar(50) NOT NULL,\n" +
+                               "    created_date datetime NOT NULL,\n" +
+                               "    updated_by varchar(50) NOT NULL,\n" +
+                               "    updated_date datetime NOT NULL,\n" +
+                               "    account_record_id int(11) unsigned default null,\n" +
+                               "    tenant_record_id int(11) unsigned default null,\n" +
+                               "    PRIMARY KEY (record_id)\n" +
+                               ");");
+
         for (final String pack : new String[]{"account", "analytics", "beatrix", "subscription", "util", "payment", "invoice", "entitlement", "usage", "meter", "tenant"}) {
             for (final String ddlFile : new String[]{"ddl.sql", "ddl_test.sql"}) {
                 final String ddl;