killbill-aplcache
Changes
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationInvoice.java 68(+66 -2)
Details
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationInvoice.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationInvoice.java
index 678f286..426a7d4 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationInvoice.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationInvoice.java
@@ -27,12 +27,13 @@ import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
-import org.killbill.billing.account.api.AccountData;
import org.killbill.billing.api.TestApiListener.NextEvent;
import org.killbill.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
+import org.killbill.billing.catalog.api.BillingActionPolicy;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.api.DefaultEntitlement;
+import org.killbill.billing.entitlement.api.Entitlement;
import org.killbill.billing.invoice.api.DryRunArguments;
import org.killbill.billing.invoice.api.DryRunType;
import org.killbill.billing.invoice.api.Invoice;
@@ -379,7 +380,7 @@ public class TestIntegrationInvoice extends TestIntegrationBase {
// Move through time and verify new parent Invoice. No payments are expected.
busHandler.pushExpectedEvents(NextEvent.PHASE, NextEvent.PHASE,
NextEvent.INVOICE, NextEvent.INVOICE);
- clock.addDays(31);
+ clock.addMonths(1);
assertListenerStatus();
// Second Parent invoice over Recurring period
@@ -402,4 +403,67 @@ public class TestIntegrationInvoice extends TestIntegrationBase {
}
+ @Test(groups = "slow")
+ public void testParentInvoiceGenerationMultipleActionsSameDay() throws Exception {
+
+ final int billingDay = 14;
+ final DateTime initialCreationDate = new DateTime(2015, 5, 15, 0, 0, 0, 0, testTimeZone);
+
+ log.info("Beginning test with BCD of " + billingDay);
+ final Account parentAccount = createAccountWithNonOsgiPaymentMethod(getAccountData(billingDay));
+ final Account childAccount = createAccountWithNonOsgiPaymentMethod(getChildAccountData(billingDay, parentAccount.getId(), true));
+
+ // set clock to the initial start date
+ clock.setTime(initialCreationDate);
+
+ //
+ // CREATE SUBSCRIPTION AND EXPECT BOTH EVENTS: NextEvent.CREATE NextEvent.INVOICE
+ //
+ DefaultEntitlement baseEntitlementChild = createBaseEntitlementAndCheckForCompletion(childAccount.getId(), "bundleKey1", "Pistol", ProductCategory.BASE, BillingPeriod.MONTHLY, NextEvent.CREATE, NextEvent.INVOICE);
+
+ // Moving a day the NotificationQ calls the commitInvoice. No payment is expected because balance is 0
+ busHandler.pushExpectedEvents(NextEvent.INVOICE);
+ clock.addDays(1);
+ assertListenerStatus();
+
+ // Move through time and verify new parent Invoice. No payments are expected.
+ busHandler.pushExpectedEvents(NextEvent.PHASE, NextEvent.INVOICE);
+ clock.addMonths(1);
+ assertListenerStatus();
+
+ // check parent Invoice with child plan amount
+ List<Invoice> parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), callContext);
+ assertEquals(parentInvoices.size(), 2);
+
+ Invoice parentInvoice = parentInvoices.get(1);
+ assertEquals(parentInvoice.getNumberOfItems(), 1);
+ assertEquals(parentInvoice.getStatus(), InvoiceStatus.DRAFT);
+ assertTrue(parentInvoice.isParentInvoice());
+ assertEquals(parentInvoice.getBalance().toString(), "29.95");
+
+ // change plan
+ busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE);
+ final Entitlement newChildEntitlement = baseEntitlementChild.changePlanOverrideBillingPolicy("Shotgun", BillingPeriod.MONTHLY, baseEntitlementChild.getLastActivePriceList().getName(), null, clock.getToday(childAccount.getTimeZone()), BillingActionPolicy.IMMEDIATE, null, callContext);
+ assertListenerStatus();
+
+ // check parent invoice. Expected to have the same invoice item but the amount updated
+ parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), callContext);
+ assertEquals(parentInvoices.size(), 2);
+
+ parentInvoice = parentInvoices.get(1);
+ assertEquals(parentInvoice.getNumberOfItems(), 1);
+ assertEquals(parentInvoice.getStatus(), InvoiceStatus.DRAFT);
+ assertTrue(parentInvoice.isParentInvoice());
+ assertEquals(parentInvoice.getBalance().toString(), "235.29");
+
+ // Moving a day the NotificationQ calls the commitInvoice. Now payment is expected
+ busHandler.pushExpectedEvents(NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+ clock.addDays(1);
+ assertListenerStatus();
+
+ parentInvoice = invoiceUserApi.getInvoice(parentInvoice.getId(), callContext);
+ assertEquals(parentInvoice.getStatus(), InvoiceStatus.COMMITTED);
+
+ }
+
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index d8c655c..39a7120 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -1019,7 +1019,31 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
@Override
public InvoiceModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final InvoiceSqlDao invoiceSqlDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
- return invoiceSqlDao.getParentDraftInvoice(parentAccountId.toString(), context);
+ InvoiceModelDao invoice = invoiceSqlDao.getParentDraftInvoice(parentAccountId.toString(), context);
+ if (invoice != null) {
+ invoiceDaoHelper.populateChildren(invoice, entitySqlDaoWrapperFactory, context);
+ }
+ return invoice;
+ }
+ });
+ }
+
+ @Override
+ public void updateInvoiceItemAmount(final UUID invoiceItemId, final BigDecimal amount, final InternalCallContext context) throws InvoiceApiException {
+ transactionalSqlDao.execute(InvoiceApiException.class, new EntitySqlDaoTransactionWrapper<Void>() {
+ @Override
+ public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+ final InvoiceItemSqlDao transactional = entitySqlDaoWrapperFactory.become(InvoiceItemSqlDao.class);
+
+ // Retrieve the invoice and make sure it belongs to the right account
+ final InvoiceItemModelDao invoiceItem = transactional.getById(invoiceItemId.toString(), context);
+
+ if (invoiceItem == null ) {
+ throw new InvoiceApiException(ErrorCode.INVOICE_ITEM_NOT_FOUND, invoiceItemId);
+ }
+
+ transactional.updateAmount(invoiceItemId.toString(), amount, context);
+ return null;
}
});
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
index ab6ee1a..a8562f8 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
@@ -146,7 +146,7 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
* @param invoiceId the invoice id
* @param newState the new invoice state
* @param context the tenant context
- * @throws InvoiceApiException
+ * @throws InvoiceApiException if any unexpected error occurs
*/
void changeInvoiceStatus(UUID invoiceId, InvoiceStatus newState, InternalCallContext context) throws InvoiceApiException;
@@ -155,7 +155,7 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
*
* @param invoiceRelation the invoice relation object
* @param context the tenant context
- * @throws InvoiceApiException
+ * @throws InvoiceApiException if any unexpected error occurs
*/
void createParentChildInvoiceRelation(final InvoiceParentChildModelDao invoiceRelation, final InternalCallContext context) throws InvoiceApiException;
@@ -164,7 +164,8 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
*
* @param parentInvoiceId the parent invoice id
* @param context the tenant context
- * @throws InvoiceApiException
+ * @return a list of parent-children relation
+ * @throws InvoiceApiException if any unexpected error occurs
*/
List<InvoiceParentChildModelDao> getChildInvoicesByParentInvoiceId(UUID parentInvoiceId, final InternalCallContext context) throws InvoiceApiException;
@@ -174,7 +175,18 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
*
* @param parentAccountId the parent account id
* @param context the tenant context
- * @return
+ * @return a parent invoice in DRAFT status
+ * @throws InvoiceApiException if any unexpected error occurs
*/
InvoiceModelDao getParentDraftInvoice(UUID parentAccountId, InternalCallContext context) throws InvoiceApiException;
+
+ /**
+ * Update invoice item amount
+ *
+ * @param invoiceItemId the invoice item id
+ * @param amount the new amount value
+ * @param context the tenant context
+ * @throws InvoiceApiException if any unexpected error occurs
+ */
+ void updateInvoiceItemAmount(UUID invoiceItemId, BigDecimal amount, InternalCallContext context) throws InvoiceApiException;
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.java
index 4ec1a9f..8278a98 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.java
@@ -16,8 +16,12 @@
package org.killbill.billing.invoice.dao;
+import java.math.BigDecimal;
import java.util.List;
+import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.util.audit.ChangeType;
+import org.killbill.billing.util.entity.dao.Audited;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.BindBean;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
@@ -26,6 +30,7 @@ import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.util.entity.dao.EntitySqlDao;
import org.killbill.billing.util.entity.dao.EntitySqlDaoStringTemplate;
+import org.skife.jdbi.v2.sqlobject.SqlUpdate;
@EntitySqlDaoStringTemplate
public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItemModelDao, InvoiceItem> {
@@ -42,4 +47,10 @@ public interface InvoiceItemSqlDao extends EntitySqlDao<InvoiceItemModelDao, Inv
@SqlQuery
List<InvoiceItemModelDao> getAdjustedOrRepairedInvoiceItemsByLinkedId(@Bind("linkedItemId") final String linkedItemId,
@BindBean final InternalTenantContext context);
+
+ @SqlUpdate
+ @Audited(ChangeType.UPDATE)
+ void updateAmount(@Bind("id") String invoiceItemId,
+ @Bind("amount")BigDecimal amount,
+ @BindBean final InternalCallContext context);
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
index 45b41ab..36f4226 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java
@@ -66,7 +66,6 @@ import org.killbill.billing.invoice.api.user.DefaultInvoiceAdjustmentEvent;
import org.killbill.billing.invoice.api.user.DefaultInvoiceCreationEvent;
import org.killbill.billing.invoice.api.user.DefaultInvoiceNotificationInternalEvent;
import org.killbill.billing.invoice.api.user.DefaultNullInvoiceEvent;
-import org.killbill.billing.invoice.calculator.InvoiceCalculatorUtils;
import org.killbill.billing.invoice.dao.InvoiceDao;
import org.killbill.billing.invoice.dao.InvoiceItemModelDao;
import org.killbill.billing.invoice.dao.InvoiceModelDao;
@@ -706,30 +705,41 @@ public class InvoiceDispatcher {
}
}
- public void processParentInvoiceForInvoiceGeneration(final ImmutableAccountData account, final UUID invoiceId, final InternalCallContext context) throws InvoiceApiException {
+ public void processParentInvoiceForInvoiceGeneration(final ImmutableAccountData account, final UUID childInvoiceId, final InternalCallContext context) throws InvoiceApiException {
- final InvoiceModelDao invoiceModelDao = invoiceDao.getById(invoiceId, context);
- final Invoice invoice = new DefaultInvoice(invoiceModelDao);
-
- // BigDecimal invoiceAmount = InvoiceCalculatorUtils.computeInvoiceBalance(invoice.getCurrency(), invoice.getInvoiceItems(), invoice.getPayments());
- BigDecimal invoiceAmount = invoice.getChargedAmount();
- InvoiceModelDao parentInvoice = invoiceDao.getParentDraftInvoice(account.getParentAccountId(), context);
+ final InvoiceModelDao childInvoiceModelDao = invoiceDao.getById(childInvoiceId, context);
+ final Invoice childInvoice = new DefaultInvoice(childInvoiceModelDao);
final Long parentAccountRecordId = internalCallContextFactory.getRecordIdFromObject(account.getParentAccountId(), ObjectType.ACCOUNT, buildTenantContext(context));
- final InternalCallContext parentContext = new InternalCallContext(context, parentAccountRecordId);
+ final InternalCallContext parentContext = internalCallContextFactory.createInternalCallContext(parentAccountRecordId, context);
+
+ BigDecimal childInvoiceAmount = childInvoice.getChargedAmount();
+ InvoiceModelDao parentInvoice = invoiceDao.getParentDraftInvoice(account.getParentAccountId(), parentContext);
final DateTime today = clock.getNow(account.getTimeZone());
final String description = account.getExternalKey().concat(" summary");
if (parentInvoice != null) {
- InvoiceItem invoiceItem = new ParentInvoiceItem(UUID.randomUUID(), today, parentInvoice.getId(), account.getParentAccountId(), account.getId(), invoiceAmount, account.getCurrency(), description);
- parentInvoice.addInvoiceItem(new InvoiceItemModelDao(invoiceItem));
+
+ for (InvoiceItemModelDao item : parentInvoice.getInvoiceItems()) {
+ if ((item.getChildAccountId() != null) && item.getChildAccountId().equals(childInvoice.getAccountId())) {
+ // update child item amount for existing parent invoice item
+ BigDecimal newChildInvoiceAmount = childInvoiceAmount.add(item.getAmount());
+ invoiceDao.updateInvoiceItemAmount(item.getId(), newChildInvoiceAmount, parentContext);
+ return;
+ }
+ }
+
+ // new item when the parent invoices does not have this child item yet
+ final ParentInvoiceItem newParentInvoiceItem = new ParentInvoiceItem(UUID.randomUUID(), today, parentInvoice.getId(), account.getParentAccountId(), account.getId(), childInvoiceAmount, account.getCurrency(), description);
+ parentInvoice.addInvoiceItem(new InvoiceItemModelDao(newParentInvoiceItem));
+
List<InvoiceModelDao> invoices = new ArrayList<InvoiceModelDao>();
invoices.add(parentInvoice);
invoiceDao.createInvoices(invoices, parentContext);
} else {
parentInvoice = new InvoiceModelDao(account.getParentAccountId(), today.toLocalDate(), account.getCurrency(), InvoiceStatus.DRAFT, true);
- InvoiceItem invoiceItem = new ParentInvoiceItem(UUID.randomUUID(), today, parentInvoice.getId(), account.getParentAccountId(), account.getId(), invoiceAmount, account.getCurrency(), description);
- parentInvoice.addInvoiceItem(new InvoiceItemModelDao(invoiceItem));
+ InvoiceItem parentInvoiceItem = new ParentInvoiceItem(UUID.randomUUID(), today, parentInvoice.getId(), account.getParentAccountId(), account.getId(), childInvoiceAmount, account.getCurrency(), description);
+ parentInvoice.addInvoiceItem(new InvoiceItemModelDao(parentInvoiceItem));
// build account date time zone
final AccountDateAndTimeZoneContext accountDateTimeZone = new DefaultAccountDateAndTimeZoneContext(today, account.getTimeZone());
@@ -739,7 +749,7 @@ public class InvoiceDispatcher {
}
// save parent child invoice relation
- final InvoiceParentChildModelDao invoiceRelation = new InvoiceParentChildModelDao(parentInvoice.getId(), invoiceId, account.getId());
+ final InvoiceParentChildModelDao invoiceRelation = new InvoiceParentChildModelDao(parentInvoice.getId(), childInvoiceId, account.getId());
invoiceDao.createParentChildInvoiceRelation(invoiceRelation, parentContext);
}
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
index 48d9cf8..0542071 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
@@ -68,4 +68,11 @@ getAdjustedOrRepairedInvoiceItemsByLinkedId() ::= <<
AND type IN ('ITEM_ADJ', 'REPAIR_ADJ')
<AND_CHECK_TENANT()>
;
+>>
+
+updateAmount() ::= <<
+ UPDATE <tableName()>
+ SET amount = :amount
+ WHERE id = :id
+ <AND_CHECK_TENANT()>;
>>
\ No newline at end of file
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceParentChildrenSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceParentChildrenSqlDao.sql.stg
index 4c780d9..e4f9726 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceParentChildrenSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceParentChildrenSqlDao.sql.stg
@@ -33,4 +33,5 @@ getChildInvoicesByParentInvoiceId() ::= <<
FROM <tableName()>
WHERE parent_invoice_id = :parentInvoiceId
<AND_CHECK_TENANT()>
+ <defaultOrderBy()>
>>
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
index 1e3008d..dc26465 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -68,4 +68,5 @@ getParentDraftInvoice() ::= <<
WHERE account_id = :accountId
AND status = 'DRAFT'
<AND_CHECK_TENANT()>
+ <defaultOrderBy()>
>>
\ No newline at end of file
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
index 23650a6..12010f6 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
@@ -382,4 +382,9 @@ public class MockInvoiceDao extends MockEntityDaoBase<InvoiceModelDao, Invoice,
public List<InvoiceParentChildModelDao> getChildInvoicesByParentInvoiceId(final UUID parentInvoiceId, final InternalCallContext context) throws InvoiceApiException {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public void updateInvoiceItemAmount(final UUID invoiceItemId, final BigDecimal amount, final InternalCallContext context) throws InvoiceApiException {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
index af3e3a2..8a9659a 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
@@ -45,6 +45,7 @@ import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.entity.EntityPersistenceException;
+import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications;
import org.killbill.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
import org.killbill.billing.invoice.MockBillingEventSet;
import org.killbill.billing.invoice.api.Invoice;
@@ -61,13 +62,16 @@ import org.killbill.billing.invoice.model.DefaultInvoice;
import org.killbill.billing.invoice.model.DefaultInvoicePayment;
import org.killbill.billing.invoice.model.ExternalChargeInvoiceItem;
import org.killbill.billing.invoice.model.FixedPriceInvoiceItem;
+import org.killbill.billing.invoice.model.ParentInvoiceItem;
import org.killbill.billing.invoice.model.RecurringInvoiceItem;
import org.killbill.billing.invoice.model.RepairAdjInvoiceItem;
import org.killbill.billing.junction.BillingEvent;
import org.killbill.billing.junction.BillingEventSet;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
+import org.killbill.billing.util.AccountDateAndTimeZoneContext;
import org.killbill.billing.util.currency.KillBillMoney;
+import org.killbill.billing.util.timezone.DefaultAccountDateAndTimeZoneContext;
import org.killbill.clock.ClockMock;
import org.mockito.Mockito;
import org.skife.jdbi.v2.exceptions.TransactionFailedException;
@@ -1742,4 +1746,28 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
}
+ @Test(groups = "slow")
+ public void testCreateParentInvoice() throws InvoiceApiException {
+
+ final UUID parentAccountId = UUID.randomUUID();
+ final UUID childAccountId = UUID.randomUUID();
+ final DateTime today = clock.getNow(account.getTimeZone());
+
+ InvoiceModelDao parentInvoice = new InvoiceModelDao(parentAccountId, today.toLocalDate(), account.getCurrency(), InvoiceStatus.DRAFT, true);
+ InvoiceItem parentInvoiceItem = new ParentInvoiceItem(UUID.randomUUID(), today, parentInvoice.getId(), parentAccountId, childAccountId, BigDecimal.TEN, account.getCurrency(), "");
+ parentInvoice.addInvoiceItem(new InvoiceItemModelDao(parentInvoiceItem));
+
+ // build account date time zone
+ final AccountDateAndTimeZoneContext accountDateTimeZone = new DefaultAccountDateAndTimeZoneContext(today, account.getTimeZone());
+ final FutureAccountNotifications futureAccountNotifications = new FutureAccountNotifications(accountDateTimeZone, null);
+ invoiceDao.createInvoice(parentInvoice, parentInvoice.getInvoiceItems(), true, futureAccountNotifications, context);
+
+ final InvoiceModelDao parentDraftInvoice = invoiceDao.getParentDraftInvoice(parentAccountId, context);
+
+ assertNotNull(parentDraftInvoice);
+ assertEquals(parentDraftInvoice.getStatus(), InvoiceStatus.DRAFT);
+ assertEquals(parentDraftInvoice.getInvoiceItems().size(), 1);
+
+ }
+
}
diff --git a/util/src/main/java/org/killbill/billing/util/dao/TableName.java b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
index 9cd5cb6..041a38a 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/TableName.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
@@ -35,7 +35,7 @@ public enum TableName {
INVOICE_ITEMS("invoice_items", ObjectType.INVOICE_ITEM),
INVOICE_PAYMENTS("invoice_payments", ObjectType.INVOICE_PAYMENT),
INVOICES("invoices", ObjectType.INVOICE),
- INVOICE_PARENT_CHILDREN("invoice_parent_children", ObjectType.INVOICE_PARENT_CHILD),
+ INVOICE_PARENT_CHILDREN("invoice_parent_children"),
NODE_INFOS("node_infos"),
PAYMENT_ATTEMPT_HISTORY("payment_attempt_history"),
PAYMENT_ATTEMPTS("payment_attempts", ObjectType.PAYMENT_ATTEMPT, PAYMENT_ATTEMPT_HISTORY),