From d99b2211fa4843cbd53fca3bd52facbd450b3859 Mon Sep 17 00:00:00 2001 From: Matias Aguero Date: Fri, 29 Jan 2016 15:10:13 -0300 Subject: [PATCH] #457 autoCommit, tests updated, payment actions and more PR suggestions. --- .../integration/TestIntegrationInvoice.java | 6 +- .../integration/TestInvoicePayment.java | 4 +- .../overdue/TestOverdueIntegration.java | 2 +- .../billing/invoice/InvoiceDispatcher.java | 6 +- .../api/user/DefaultInvoiceUserApi.java | 22 ++++--- .../invoice/dao/DefaultInvoiceDao.java | 28 +++++---- .../billing/invoice/dao/InvoiceDaoHelper.java | 3 +- .../api/user/TestDefaultInvoiceUserApi.java | 59 +++---------------- .../billing/invoice/dao/TestInvoiceDao.java | 52 +++++++++++++++- .../jaxrs/resources/AccountResource.java | 2 +- .../jaxrs/resources/CreditResource.java | 5 +- .../jaxrs/resources/InvoiceResource.java | 3 +- .../jaxrs/resources/JaxrsResource.java | 2 + .../payment/bus/PaymentBusEventHandler.java | 16 ----- .../InvoicePaymentControlPluginApi.java | 7 +++ .../billing/jaxrs/TestAccountTimeline.java | 13 ++-- .../killbill/billing/jaxrs/TestCredit.java | 30 ++++++++-- .../killbill/billing/jaxrs/TestInvoice.java | 16 ++--- 18 files changed, 153 insertions(+), 123 deletions(-) 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 9c9100aa16..6532ce0d0e 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 @@ -244,7 +244,9 @@ public void testApplyCreditOnExistingBalance() throws Exception { final BigDecimal accountBalance1 = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance1.compareTo(new BigDecimal("249.95")) == 0); - invoiceUserApi.insertCredit(account.getId(), new BigDecimal("300"), new LocalDate(clock.getUTCNow(), account.getTimeZone()), account.getCurrency(), callContext); + busHandler.pushExpectedEvents(NextEvent.INVOICE); + invoiceUserApi.insertCredit(account.getId(), new BigDecimal("300"), new LocalDate(clock.getUTCNow(), account.getTimeZone()), account.getCurrency(), true, callContext); + assertListenerStatus(); final BigDecimal accountBalance2 = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance2.compareTo(new BigDecimal("-50.05")) == 0); @@ -308,7 +310,7 @@ public void testDraftInvoice() throws Exception { final List invoiceItemList = new ArrayList(); ExternalChargeInvoiceItem item = new ExternalChargeInvoiceItem(null, account.getId(), subscription.getBundleId(), "", date, BigDecimal.TEN, account.getCurrency()); invoiceItemList.add(item); - final List draftInvoiceItems = invoiceUserApi.insertExternalCharges(account.getId(), date, invoiceItemList, callContext); + final List draftInvoiceItems = invoiceUserApi.insertExternalCharges(account.getId(), date, invoiceItemList, false, callContext); // add expected invoice final List expectedDraftInvoices = new ArrayList(); diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java index 52928da580..d9fc32b560 100644 --- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java +++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java @@ -56,8 +56,10 @@ public void testPartialPayments() throws Exception { clock.setDay(new LocalDate(2012, 4, 1)); + busHandler.pushExpectedEvents(NextEvent.INVOICE); final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(null, account.getId(), null, "Initial external charge", clock.getUTCToday(), BigDecimal.TEN, Currency.USD); - final InvoiceItem item1 = invoiceUserApi.insertExternalCharges(account.getId(), clock.getUTCToday(), ImmutableList.of(externalCharge), callContext).get(0); + final InvoiceItem item1 = invoiceUserApi.insertExternalCharges(account.getId(), clock.getUTCToday(), ImmutableList.of(externalCharge), true, callContext).get(0); + assertListenerStatus(); final Invoice invoice = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext); final Payment payment1 = createPaymentAndCheckForCompletion(account, invoice, new BigDecimal("4.00"), account.getCurrency(), NextEvent.PAYMENT); diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java index 0cbd559ab2..0c8d329274 100644 --- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java +++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java @@ -687,7 +687,7 @@ public void testShouldBeInOverdueAfterExternalCharge() throws Exception { addDaysAndCheckForCompletion(5); busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT); final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(null, account.getId(), bundle.getId(), "For overdue", new LocalDate(2012, 5, 6), BigDecimal.TEN, Currency.USD); - invoiceUserApi.insertExternalCharges(account.getId(), clock.getUTCToday(), ImmutableList.of(externalCharge), callContext).get(0); + invoiceUserApi.insertExternalCharges(account.getId(), clock.getUTCToday(), ImmutableList.of(externalCharge), true, callContext).get(0); assertListenerStatus(); invoiceChecker.checkInvoice(account.getId(), 2, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 6), null, InvoiceItemType.EXTERNAL_CHARGE, BigDecimal.TEN)); 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 cd00376cf1..4253d46498 100644 --- a/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java +++ b/invoice/src/main/java/org/killbill/billing/invoice/InvoiceDispatcher.java @@ -370,13 +370,11 @@ public Invoice apply(final InvoiceModelDao input) { setChargedThroughDates(billingEvents.getAccountDateAndTimeZoneContext(), invoice.getInvoiceItems(FixedPriceInvoiceItem.class), invoice.getInvoiceItems(RecurringInvoiceItem.class), context); if (InvoiceStatus.COMMITTED.equals(invoice.getStatus())) { - // TODO we should send bus events when we commit the ionvoice on disk in commitInvoice + // TODO we should send bus events when we commit the invoice on disk in commitInvoice postEvents(account, invoice, adjustedUniqueOtherInvoiceId, isRealInvoiceWithNonEmptyItems, context); - + notifyAccountIfEnabled(account, invoice, isRealInvoiceWithNonEmptyItems, context); } - // TODO should we include this notification inside of previous if clause? - notifyAccountIfEnabled(account, invoice, isRealInvoiceWithNonEmptyItems, context); } return invoice; } catch (final AccountApiException e) { diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java index ff525a02ba..1697e4ef5f 100644 --- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java +++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java @@ -262,7 +262,7 @@ public InvoiceItem getExternalChargeById(final UUID externalChargeId, final Tena } @Override - public List insertExternalCharges(final UUID accountId, final LocalDate effectiveDate, final Iterable charges, final CallContext context) throws InvoiceApiException { + public List insertExternalCharges(final UUID accountId, final LocalDate effectiveDate, final Iterable charges, final boolean autoCommit, final CallContext context) throws InvoiceApiException { for (final InvoiceItem charge : charges) { if (charge.getAmount() == null || charge.getAmount().compareTo(BigDecimal.ZERO) <= 0) { throw new InvoiceApiException(ErrorCode.EXTERNAL_CHARGE_AMOUNT_INVALID, charge.getAmount()); @@ -284,7 +284,8 @@ public Iterable prepareInvoices() throws InvoiceApiException { if (invoiceIdForExternalCharge == null) { final Currency currency = charge.getCurrency(); if (newInvoicesForExternalCharges.get(currency) == null) { - final Invoice newInvoiceForExternalCharge = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency, InvoiceStatus.DRAFT); + final InvoiceStatus status = autoCommit ? InvoiceStatus.COMMITTED : InvoiceStatus.DRAFT; + final Invoice newInvoiceForExternalCharge = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency, status); newInvoicesForExternalCharges.put(currency, newInvoiceForExternalCharge); } invoiceForExternalCharge = newInvoicesForExternalCharges.get(currency); @@ -328,13 +329,18 @@ public InvoiceItem getCreditById(final UUID creditId, final TenantContext contex @Override public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final LocalDate effectiveDate, - final Currency currency, final CallContext context) throws InvoiceApiException { - return insertCreditForInvoice(accountId, null, amount, effectiveDate, currency, context); + final Currency currency, final boolean autoCommit, final CallContext context) throws InvoiceApiException { + return insertCreditForInvoice(accountId, null, amount, effectiveDate, currency, autoCommit, context); } @Override public InvoiceItem insertCreditForInvoice(final UUID accountId, final UUID invoiceId, final BigDecimal amount, final LocalDate effectiveDate, final Currency currency, final CallContext context) throws InvoiceApiException { + return insertCreditForInvoice(accountId, invoiceId, amount, effectiveDate, currency, false, context); + } + + private InvoiceItem insertCreditForInvoice(final UUID accountId, final UUID invoiceId, final BigDecimal amount, final LocalDate effectiveDate, + final Currency currency, final boolean autoCommit, final CallContext context) throws InvoiceApiException { if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) { throw new InvoiceApiException(ErrorCode.CREDIT_AMOUNT_INVALID, amount); } @@ -348,15 +354,13 @@ public List prepareInvoices() throws InvoiceApiException { // Create an invoice for that credit if it doesn't exist final Invoice invoiceForCredit; if (invoiceId == null) { - invoiceForCredit = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency, InvoiceStatus.DRAFT); + final InvoiceStatus status = autoCommit ? InvoiceStatus.COMMITTED : InvoiceStatus.DRAFT; + invoiceForCredit = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency, status); } else { invoiceForCredit = getInvoiceAndCheckCurrency(invoiceId, currency, context); - // TODO check with @sbrossie if really want to add this validation - /* if (InvoiceStatus.COMMITTED.equals(invoiceForCredit.getStatus())) { - throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_STATUS_CREDIT, invoiceId); + throw new InvoiceApiException(ErrorCode.INVOICE_ALREADY_COMMITTED, invoiceId); } - */ } // Create the new credit 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 0e5bb1123e..7e0317856f 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 @@ -35,7 +35,6 @@ import org.killbill.billing.callcontext.InternalTenantContext; import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.entity.EntityPersistenceException; -import org.killbill.billing.events.BusInternalEvent; import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications; import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications.SubscriptionNotification; import org.killbill.billing.invoice.api.Invoice; @@ -278,11 +277,13 @@ public List inTransaction(final EntitySqlDaoWrapperFactory final List createdInvoiceItems = new LinkedList(); for (final InvoiceModelDao invoiceModelDao : invoices) { boolean madeChanges = false; + boolean newInvoice = false; // Create the invoice if needed if (invoiceSqlDao.getById(invoiceModelDao.getId().toString(), context) == null) { invoiceSqlDao.create(invoiceModelDao, context); madeChanges = true; + newInvoice = true; } // Create the invoice items if needed @@ -296,8 +297,12 @@ public List inTransaction(final EntitySqlDaoWrapperFactory if (madeChanges) { cbaDao.addCBAComplexityFromTransaction(invoiceModelDao.getId(), entitySqlDaoWrapperFactory, context); + } - if (InvoiceStatus.COMMITTED.equals(invoiceModelDao.getStatus())) { + if (InvoiceStatus.COMMITTED.equals(invoiceModelDao.getStatus())) { + if (newInvoice) { + notifyBusOfInvoiceCreation(entitySqlDaoWrapperFactory, invoiceModelDao, context); + } else if (madeChanges) { // Notify the bus since the balance of the invoice changed (only if the invoice is COMMITTED) // TODO should we post an InvoiceCreationInternalEvent event instead? Note! This will trigger a payment (see InvoiceHandler) notifyBusOfInvoiceAdjustment(entitySqlDaoWrapperFactory, invoiceModelDao.getId(), invoiceModelDao.getAccountId(), context.getUserToken(), context); @@ -881,24 +886,23 @@ public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFa transactional.updateStatus(invoiceId.toString(), newStatus.toString(), context); // notify invoice creation event - final BigDecimal balance = InvoiceModelDaoHelper.getBalance(invoice); - final DefaultInvoiceCreationEvent defaultInvoiceCreationEvent = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(), - balance, invoice.getCurrency(), - context.getAccountRecordId(), context.getTenantRecordId(), - context.getUserToken()); - postEvent(defaultInvoiceCreationEvent, invoice.getAccountId()); + notifyBusOfInvoiceCreation(entitySqlDaoWrapperFactory, invoice, context); return null; } }); } - /* Use this method to post any event that implements BusInternalEvent */ - private void postEvent(final BusInternalEvent event, final UUID accountId) { + private void notifyBusOfInvoiceCreation(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final InvoiceModelDao invoice, final InternalCallContext context) { try { - eventBus.post(event); + final BigDecimal balance = InvoiceModelDaoHelper.getBalance(invoice); + final DefaultInvoiceCreationEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(), + balance, invoice.getCurrency(), + context.getAccountRecordId(), context.getTenantRecordId(), + context.getUserToken()); + eventBus.postFromTransaction(event, entitySqlDaoWrapperFactory.getHandle().getConnection()); } catch (final EventBusException e) { - log.error(String.format("Failed to post event %s for account %s", event.getBusEventType(), accountId), e); + log.error(String.format("Failed to post invoice creation event %s for account %s", invoice.getAccountId()), e); } } diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java index f6b6619d59..64eef23cce 100644 --- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java +++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java @@ -38,6 +38,7 @@ import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.invoice.api.InvoiceApiException; import org.killbill.billing.invoice.api.InvoiceItemType; +import org.killbill.billing.invoice.api.InvoiceStatus; import org.killbill.billing.tag.TagInternalApi; import org.killbill.billing.util.entity.dao.EntitySqlDaoWrapperFactory; import org.killbill.billing.util.tag.ControlTagType; @@ -171,7 +172,7 @@ public List getUnpaidInvoicesByAccountFromTransaction(final Lis final Collection unpaidInvoices = Collections2.filter(invoices, new Predicate() { @Override public boolean apply(final InvoiceModelDao in) { - return (InvoiceModelDaoHelper.getBalance(in).compareTo(BigDecimal.ZERO) >= 1) && (upToDate == null || !in.getTargetDate().isAfter(upToDate)); + return (InvoiceStatus.COMMITTED.equals(in.getStatus())) && (InvoiceModelDaoHelper.getBalance(in).compareTo(BigDecimal.ZERO) >= 1) && (upToDate == null || !in.getTargetDate().isAfter(upToDate)); } }); return new ArrayList(unpaidInvoices); diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java index b011ee41f6..ebd73d3334 100644 --- a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java +++ b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java @@ -72,7 +72,7 @@ public void testPostExternalChargeOnNewInvoice() throws Exception { // Post an external charge final BigDecimal externalChargeAmount = BigDecimal.TEN; final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(null, accountId, null, UUID.randomUUID().toString(), clock.getUTCToday(), externalChargeAmount, accountCurrency); - final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), callContext).get(0); + final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), true, callContext).get(0); verifyExternalChargeOnNewInvoice(accountBalance, null, externalChargeAmount, externalChargeInvoiceItem); } @@ -85,7 +85,7 @@ public void testPostExternalChargeForBundleOnNewInvoice() throws Exception { final BigDecimal externalChargeAmount = BigDecimal.TEN; final UUID bundleId = UUID.randomUUID(); final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(null, accountId, bundleId, UUID.randomUUID().toString(), clock.getUTCToday(), externalChargeAmount, accountCurrency); - final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), callContext).get(0); + final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), true, callContext).get(0); verifyExternalChargeOnNewInvoice(accountBalance, bundleId, externalChargeAmount, externalChargeInvoiceItem); } @@ -121,7 +121,7 @@ public void testPostExternalChargeOnExistingInvoice() throws Exception { // Post an external charge final BigDecimal externalChargeAmount = BigDecimal.TEN; final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(invoiceId, accountId, null, UUID.randomUUID().toString(), clock.getUTCToday(), externalChargeAmount, accountCurrency); - final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), callContext).get(0); + final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), true, callContext).get(0); verifyExternalChargeOnExistingInvoice(invoiceBalance, null, externalChargeAmount, externalChargeInvoiceItem); } @@ -140,7 +140,7 @@ public void testOriginalAmountCharged() throws Exception { // Post an external charge final BigDecimal externalChargeAmount = BigDecimal.TEN; final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(invoiceId, accountId, null, UUID.randomUUID().toString(), clock.getUTCToday(), externalChargeAmount, accountCurrency); - final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), newCallContextLater).get(0); + final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), true, newCallContextLater).get(0); final Invoice newInvoice = invoiceUserApi.getInvoice(invoiceId, callContext); final BigDecimal newOriginalAmountCharged = newInvoice.getOriginalChargedAmount(); @@ -165,7 +165,7 @@ public void testPostExternalChargeForBundleOnExistingInvoice() throws Exception final BigDecimal externalChargeAmount = BigDecimal.TEN; final UUID bundleId = UUID.randomUUID(); final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(invoiceId, accountId, bundleId, UUID.randomUUID().toString(), clock.getUTCToday(), externalChargeAmount, accountCurrency); - final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), callContext).get(0); + final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), true, callContext).get(0); verifyExternalChargeOnExistingInvoice(invoiceBalance, bundleId, externalChargeAmount, externalChargeInvoiceItem); } @@ -188,8 +188,8 @@ private void verifyExternalChargeOnExistingInvoice(final BigDecimal initialInvoi Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance); } - @Test(groups = "slow") - public void testAdjustFullInvoice() throws Exception { + @Test(groups = "slow", expectedExceptions = InvoiceApiException.class, expectedExceptionsMessageRegExp = ".*it is already in COMMITTED status") + public void testAdjustCommittedInvoice() throws Exception { // Verify the initial invoice balance final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1); @@ -201,50 +201,7 @@ public void testAdjustFullInvoice() throws Exception { // Adjust the invoice for the full amount final InvoiceItem creditInvoiceItem = invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, invoiceBalance, clock.getUTCToday(), accountCurrency, callContext); - Assert.assertEquals(creditInvoiceItem.getInvoiceId(), invoiceId); - Assert.assertEquals(creditInvoiceItem.getInvoiceItemType(), InvoiceItemType.CREDIT_ADJ); - Assert.assertEquals(creditInvoiceItem.getAccountId(), accountId); - Assert.assertEquals(creditInvoiceItem.getAmount().compareTo(invoiceBalance.negate()), 0); - Assert.assertEquals(creditInvoiceItem.getCurrency(), accountCurrency); - Assert.assertNull(creditInvoiceItem.getLinkedItemId()); - - // Verify the adjusted invoice balance - final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); - Assert.assertEquals(adjustedInvoiceBalance.compareTo(BigDecimal.ZERO), 0); - - // Verify the adjusted account balance - final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); - Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance); - } - - @Test(groups = "slow") - public void testAdjustPartialInvoice() throws Exception { - // Verify the initial invoice balance - final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); - Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1); - // Verify the initial account balance - final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); - Assert.assertEquals(accountBalance, invoiceBalance); - - // Adjust the invoice for a fraction of the balance - final BigDecimal creditAmount = invoiceBalance.divide(BigDecimal.TEN); - final InvoiceItem creditInvoiceItem = invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, creditAmount, - clock.getUTCToday(), accountCurrency, callContext); - Assert.assertEquals(creditInvoiceItem.getInvoiceId(), invoiceId); - Assert.assertEquals(creditInvoiceItem.getInvoiceItemType(), InvoiceItemType.CREDIT_ADJ); - Assert.assertEquals(creditInvoiceItem.getAccountId(), accountId); - Assert.assertEquals(creditInvoiceItem.getAmount().compareTo(creditAmount.negate()), 0); - Assert.assertEquals(creditInvoiceItem.getCurrency(), accountCurrency); - Assert.assertNull(creditInvoiceItem.getLinkedItemId()); - - // Verify the adjusted invoice balance - final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); - verifyAdjustedInvoiceBalance(invoiceBalance, creditAmount, accountCurrency, adjustedInvoiceBalance); - - // Verify the adjusted account balance - final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); - Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance); } @Test(groups = "slow") @@ -368,7 +325,7 @@ public void testAddRemoveWrittenOffTag() throws InvoiceApiException, TagApiExcep } @Test(groups = "slow") - public void testInvoiceStatusTransition() throws Exception { + public void testCommitInvoice() throws Exception { // Verify the initial invoice balance final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1); 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 74d938e2b2..3e387b7893 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 @@ -32,7 +32,6 @@ import org.joda.time.LocalDate; import org.killbill.billing.ErrorCode; import org.killbill.billing.account.api.Account; -import org.killbill.billing.account.api.DefaultAccount; import org.killbill.billing.callcontext.InternalCallContext; import org.killbill.billing.catalog.DefaultPrice; import org.killbill.billing.catalog.MockInternationalPrice; @@ -54,6 +53,7 @@ import org.killbill.billing.invoice.api.InvoiceItemType; import org.killbill.billing.invoice.api.InvoicePayment; import org.killbill.billing.invoice.api.InvoicePaymentType; +import org.killbill.billing.invoice.api.InvoiceStatus; import org.killbill.billing.invoice.generator.InvoiceWithMetadata; import org.killbill.billing.invoice.model.CreditAdjInvoiceItem; import org.killbill.billing.invoice.model.CreditBalanceAdjInvoiceItem; @@ -1083,6 +1083,54 @@ public void testGetUnpaidInvoicesByAccountId() throws EntityPersistenceException assertEquals(invoices.size(), 2); } + @Test(groups = "slow") + public void testGetUnpaidInvoicesByAccountIdWithDraftInvoice() throws EntityPersistenceException { + 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, context); + + final LocalDate startDate = new LocalDate(2011, 3, 1); + final LocalDate endDate = startDate.plusMonths(1); + + final BigDecimal rate1 = new BigDecimal("17.0"); + final BigDecimal rate2 = new BigDecimal("42.0"); + + 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, 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, context); + + LocalDate upToDate; + Collection invoices; + + upToDate = new LocalDate(2011, 1, 1); + invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context); + assertEquals(invoices.size(), 0); + + upToDate = new LocalDate(2012, 1, 1); + invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context); + assertEquals(invoices.size(), 1); + + List allInvoicesByAccount = invoiceDao.getInvoicesByAccount(new LocalDate(2011, 1, 1), context); + assertEquals(allInvoicesByAccount.size(), 1); + + // insert DRAFT invoice + createCredit(accountId, new LocalDate(2011, 12, 31), BigDecimal.TEN); + + allInvoicesByAccount = invoiceDao.getInvoicesByAccount(new LocalDate(2011, 1, 1), context); + assertEquals(allInvoicesByAccount.size(), 2); + assertEquals(allInvoicesByAccount.get(0).getStatus(), InvoiceStatus.COMMITTED); + assertEquals(allInvoicesByAccount.get(1).getStatus(), InvoiceStatus.DRAFT); + + upToDate = new LocalDate(2012, 1, 1); + invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, context); + assertEquals(invoices.size(), 1); + } /* * @@ -1659,7 +1707,7 @@ private void createCredit(final UUID accountId, final LocalDate effectiveDate, f private void createCredit(final UUID accountId, @Nullable final UUID invoiceId, final LocalDate effectiveDate, final BigDecimal creditAmount) { final InvoiceModelDao invoiceModelDao; if (invoiceId == null) { - invoiceModelDao = new InvoiceModelDao(accountId, effectiveDate, effectiveDate, Currency.USD); + invoiceModelDao = new InvoiceModelDao(accountId, effectiveDate, effectiveDate, Currency.USD, false, InvoiceStatus.DRAFT); } else { invoiceModelDao = invoiceDao.getById(invoiceId, context); diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java index ef929a247a..ee73b60dca 100644 --- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java +++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java @@ -689,7 +689,7 @@ public Response payAllInvoices(@PathParam("accountId") final String accountId, // then we apply some credit on the account. // if (externalPayment && remainingRequestPayment.compareTo(BigDecimal.ZERO) > 0) { - invoiceApi.insertCredit(account.getId(), remainingRequestPayment, clock.getUTCToday(), account.getCurrency(), callContext); + invoiceApi.insertCredit(account.getId(), remainingRequestPayment, clock.getUTCToday(), account.getCurrency(), true, callContext); } return Response.status(Status.OK).build(); } diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java index bfad1b1b93..d9f2585efd 100644 --- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java +++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java @@ -20,12 +20,14 @@ import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; @@ -103,6 +105,7 @@ public Response getCredit(@PathParam("creditId") final String creditId, @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied"), @ApiResponse(code = 404, message = "Account not found")}) public Response createCredit(final CreditJson json, + @QueryParam(QUERY_AUTO_COMMIT) @DefaultValue("false") final Boolean autoCommit, @HeaderParam(HDR_CREATED_BY) final String createdBy, @HeaderParam(HDR_REASON) final String reason, @HeaderParam(HDR_COMMENT) final String comment, @@ -125,7 +128,7 @@ public Response createCredit(final CreditJson json, } else { // Apply a account level credit credit = invoiceUserApi.insertCredit(account.getId(), json.getCreditAmount(), effectiveDate, - account.getCurrency(), callContext); + account.getCurrency(), autoCommit, callContext); } return uriBuilder.buildResponse(uriInfo, CreditResource.class, "getCredit", credit.getId()); diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java index 9b4214e90c..2f94dd6f6f 100644 --- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java +++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java @@ -461,6 +461,7 @@ public Response createExternalCharges(final Iterable externalCh @QueryParam(QUERY_REQUESTED_DT) final String requestedDateTimeString, @QueryParam(QUERY_PAY_INVOICE) @DefaultValue("false") final Boolean payInvoice, @QueryParam(QUERY_PLUGIN_PROPERTY) final List pluginPropertiesString, + @QueryParam(QUERY_AUTO_COMMIT) @DefaultValue("false") final Boolean autoCommit, @HeaderParam(HDR_CREATED_BY) final String createdBy, @HeaderParam(HDR_REASON) final String reason, @HeaderParam(HDR_COMMENT) final String comment, @@ -483,7 +484,7 @@ public InvoiceItem apply(final InvoiceItemJson invoiceItemJson) { } } ); - final List createdExternalCharges = invoiceApi.insertExternalCharges(account.getId(), requestedDate, externalCharges, callContext); + final List createdExternalCharges = invoiceApi.insertExternalCharges(account.getId(), requestedDate, externalCharges, autoCommit, callContext); if (payInvoice) { final Collection paidInvoices = new HashSet(); diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java index 8a0dc17350..d9de6ef460 100644 --- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java +++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java @@ -121,6 +121,8 @@ public interface JaxrsResource { public static final String QUERY_PARALLEL = "parallel"; + public static final String QUERY_AUTO_COMMIT = "autoCommit"; + public static final String QUERY_NOTIFICATION_CALLBACK = "cb"; public static final String PAGINATION = "pagination"; diff --git a/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java b/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java index 492951fde9..c7705ec547 100644 --- a/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java +++ b/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java @@ -30,10 +30,6 @@ import org.killbill.billing.callcontext.InternalCallContext; import org.killbill.billing.events.InvoiceCreationInternalEvent; import org.killbill.billing.events.PaymentInternalEvent; -import org.killbill.billing.invoice.api.Invoice; -import org.killbill.billing.invoice.api.InvoiceApiException; -import org.killbill.billing.invoice.api.InvoiceInternalApi; -import org.killbill.billing.invoice.api.InvoiceStatus; import org.killbill.billing.payment.api.PaymentApiException; import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.payment.core.PluginControlPaymentProcessor; @@ -57,7 +53,6 @@ public class PaymentBusEventHandler { private static final Logger log = LoggerFactory.getLogger(PaymentBusEventHandler.class); private final AccountInternalApi accountApi; - private final InvoiceInternalApi invoiceApi; private final InternalCallContextFactory internalCallContextFactory; private final PluginControlPaymentProcessor pluginControlPaymentProcessor; private final PaymentConfig paymentConfig; @@ -66,13 +61,11 @@ public class PaymentBusEventHandler { @Inject public PaymentBusEventHandler(final PaymentConfig paymentConfig, final AccountInternalApi accountApi, - final InvoiceInternalApi invoiceApi, final PluginControlPaymentProcessor pluginControlPaymentProcessor, final Janitor janitor, final InternalCallContextFactory internalCallContextFactory) { this.paymentConfig = paymentConfig; this.accountApi = accountApi; - this.invoiceApi = invoiceApi; this.janitor = janitor; this.internalCallContextFactory = internalCallContextFactory; this.pluginControlPaymentProcessor = pluginControlPaymentProcessor; @@ -90,16 +83,9 @@ public void processInvoiceEvent(final InvoiceCreationInternalEvent event) { log.info("Received invoice creation notification for account {} and invoice {}", event.getAccountId(), event.getInvoiceId()); - final Account account; try { final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken()); - final Invoice invoice = invoiceApi.getInvoiceById(event.getInvoiceId(), internalContext); - if (!InvoiceStatus.COMMITTED.equals(invoice.getStatus())) { - log.info("Ignoring payment for non COMMITTED invoice " + event.getInvoiceId()); - return; - } - account = accountApi.getAccountById(event.getAccountId(), internalContext); final List properties = new ArrayList(); @@ -115,8 +101,6 @@ public void processInvoiceEvent(final InvoiceCreationInternalEvent event) { properties, paymentControlPluginNames, callContext, internalContext); } catch (final AccountApiException e) { log.error("Failed to process invoice payment", e); - } catch (final InvoiceApiException e) { - log.error("Failed to process invoice payment", e); } catch (final PaymentApiException e) { // Log as error unless: if (e.getCode() != ErrorCode.PAYMENT_NULL_INVOICE.getCode() /* Nothing left to be paid */ && diff --git a/payment/src/main/java/org/killbill/billing/payment/invoice/InvoicePaymentControlPluginApi.java b/payment/src/main/java/org/killbill/billing/payment/invoice/InvoicePaymentControlPluginApi.java index ce2913ea20..33d92334c2 100644 --- a/payment/src/main/java/org/killbill/billing/payment/invoice/InvoicePaymentControlPluginApi.java +++ b/payment/src/main/java/org/killbill/billing/payment/invoice/InvoicePaymentControlPluginApi.java @@ -45,6 +45,7 @@ import org.killbill.billing.invoice.api.InvoiceInternalApi; import org.killbill.billing.invoice.api.InvoiceItem; import org.killbill.billing.invoice.api.InvoicePayment; +import org.killbill.billing.invoice.api.InvoiceStatus; import org.killbill.billing.payment.api.PaymentApiException; import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.payment.api.TransactionStatus; @@ -250,6 +251,12 @@ private PriorPaymentControlResult getPluginPurchaseResult(final PaymentControlCo try { final UUID invoiceId = getInvoiceId(pluginProperties); final Invoice invoice = rebalanceAndGetInvoice(invoiceId, internalContext); + + if (!InvoiceStatus.COMMITTED.equals(invoice.getStatus())) { + // abort payment if the invoice status is not COMMITTED + return new DefaultPriorPaymentControlResult(true); + } + final BigDecimal requestedAmount = validateAndComputePaymentAmount(invoice, paymentControlPluginContext.getAmount(), paymentControlPluginContext.isApiPayment()); final boolean isAborted = requestedAmount.compareTo(BigDecimal.ZERO) == 0; diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java index 62dd8b977a..66eb99670d 100644 --- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java +++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java @@ -42,10 +42,6 @@ import org.testng.Assert; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableList; - -import static org.testng.Assert.assertEquals; - public class TestAccountTimeline extends TestJaxrsBase { private static final String PAYMENT_REQUEST_PROCESSOR = "PaymentRequestProcessor"; @@ -83,9 +79,8 @@ public void testAccountTimelineWithAudits() throws Exception { final BigDecimal creditAmount = BigDecimal.ONE; final Credit credit = new Credit(); credit.setAccountId(accountJson.getAccountId()); - credit.setInvoiceId(invoice.getInvoiceId()); credit.setCreditAmount(creditAmount); - killBillClient.createCredit(credit, createdBy, reason, comment); + killBillClient.createCredit(credit, true, createdBy, reason, comment); // Add refund final Payment postedPayment = killBillClient.getPaymentsForAccount(accountJson.getAccountId()).get(0); @@ -191,19 +186,23 @@ private void verifyInvoices(final UUID accountId, final DateTime startTime, fina final AccountTimeline timeline = killBillClient.getAccountTimeline(accountId, auditLevel); // Verify invoices - Assert.assertEquals(timeline.getInvoices().size(), 2); + Assert.assertEquals(timeline.getInvoices().size(), 3); // Verify audits final List firstInvoiceAuditLogs = timeline.getInvoices().get(0).getAuditLogs(); final List secondInvoiceAuditLogs = timeline.getInvoices().get(1).getAuditLogs(); + final List thirdInvoiceAuditLogs = timeline.getInvoices().get(2).getAuditLogs(); if (AuditLevel.NONE.equals(auditLevel)) { Assert.assertEquals(firstInvoiceAuditLogs.size(), 0); Assert.assertEquals(secondInvoiceAuditLogs.size(), 0); + Assert.assertEquals(thirdInvoiceAuditLogs.size(), 0); } else { Assert.assertEquals(firstInvoiceAuditLogs.size(), 1); verifyAuditLog(firstInvoiceAuditLogs.get(0), ChangeType.INSERT, null, null, TRANSITION, startTime, endTime); Assert.assertEquals(secondInvoiceAuditLogs.size(), 1); verifyAuditLog(secondInvoiceAuditLogs.get(0), ChangeType.INSERT, null, null, TRANSITION, startTime, endTime); + Assert.assertEquals(thirdInvoiceAuditLogs.size(), 1); + verifyAuditLog(thirdInvoiceAuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime); } } } diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java index 5bc85f043c..4ccc863f29 100644 --- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java +++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCredit.java @@ -26,6 +26,7 @@ import org.killbill.billing.client.model.Account; import org.killbill.billing.client.model.Credit; import org.killbill.billing.client.model.Invoice; +import org.killbill.billing.invoice.api.InvoiceApiException; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -45,23 +46,40 @@ public void setUp() throws Exception { @Test(groups = "slow", description = "Can add a credit to an existing invoice") public void testAddCreditToInvoice() throws Exception { - final Invoice invoice = killBillClient.getInvoicesForAccount(accountJson.getAccountId()).get(1); + //final Invoice invoice = killBillClient.getInvoicesForAccount(accountJson.getAccountId()).get(1); final DateTime effectiveDate = clock.getUTCNow(); final BigDecimal creditAmount = BigDecimal.ONE; final Credit credit = new Credit(); credit.setAccountId(accountJson.getAccountId()); - credit.setInvoiceId(invoice.getInvoiceId()); credit.setCreditAmount(creditAmount); - final Credit objFromJson = killBillClient.createCredit(credit, createdBy, reason, comment); + Credit objFromJson = killBillClient.createCredit(credit, false, createdBy, reason, comment); + + final UUID invoiceId = objFromJson.getInvoiceId(); + credit.setInvoiceId(invoiceId); + objFromJson = killBillClient.createCredit(credit, false, createdBy, reason, comment); // We can't just compare the object via .equals() due e.g. to the invoice id assertEquals(objFromJson.getAccountId(), accountJson.getAccountId()); - assertEquals(objFromJson.getInvoiceId(), invoice.getInvoiceId()); + assertEquals(objFromJson.getInvoiceId(), invoiceId); assertEquals(objFromJson.getCreditAmount().compareTo(creditAmount), 0); assertEquals(objFromJson.getEffectiveDate().compareTo(effectiveDate.toLocalDate()), 0); } + @Test(groups = "slow", description = "Can add a credit to an existing account", + expectedExceptions = KillBillClientException.class, expectedExceptionsMessageRegExp = ".*it is already in COMMITTED status") + public void testAddCreditToCommittedInvoice() throws Exception { + final Invoice invoice = killBillClient.getInvoicesForAccount(accountJson.getAccountId()).get(1); + + final DateTime effectiveDate = clock.getUTCNow(); + final BigDecimal creditAmount = BigDecimal.ONE; + final Credit credit = new Credit(); + credit.setAccountId(accountJson.getAccountId()); + credit.setInvoiceId(invoice.getInvoiceId()); + credit.setCreditAmount(creditAmount); + final Credit objFromJson = killBillClient.createCredit(credit, true, createdBy, reason, comment); + } + @Test(groups = "slow", description = "Cannot add a credit if the account doesn't exist") public void testAccountDoesNotExist() throws Exception { final Credit credit = new Credit(); @@ -69,7 +87,7 @@ public void testAccountDoesNotExist() throws Exception { credit.setCreditAmount(BigDecimal.TEN); // Try to create the credit - assertNull(killBillClient.createCredit(credit, createdBy, reason, comment)); + assertNull(killBillClient.createCredit(credit, true, createdBy, reason, comment)); } @Test(groups = "slow", description = "Cannot credit a badly formatted credit") @@ -80,7 +98,7 @@ public void testBadRequest() throws Exception { // Try to create the credit try { - killBillClient.createCredit(credit, createdBy, reason, comment); + killBillClient.createCredit(credit, true, createdBy, reason, comment); fail(); } catch (final KillBillClientException e) { } diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java index bcefd3f517..65806185e7 100644 --- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java +++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java @@ -342,7 +342,7 @@ public void testExternalChargeOnNewInvoice() throws Exception { externalCharge.setAmount(chargeAmount); externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency())); externalCharge.setDescription(UUID.randomUUID().toString()); - final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment); + final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, true, createdBy, reason, comment); final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true); assertEquals(invoiceWithItems.getBalance().compareTo(chargeAmount), 0); assertEquals(invoiceWithItems.getItems().size(), 1); @@ -379,7 +379,7 @@ public void testExternalCharges() throws Exception { externalCharge2.setDescription(UUID.randomUUID().toString()); externalCharges.add(externalCharge2); - final List createdExternalCharges = killBillClient.createExternalCharges(externalCharges, clock.getUTCNow(), false, createdBy, reason, comment); + final List createdExternalCharges = killBillClient.createExternalCharges(externalCharges, clock.getUTCNow(), false, true, createdBy, reason, comment); assertEquals(createdExternalCharges.size(), 2); assertEquals(createdExternalCharges.get(0).getCurrency().toString(), accountJson.getCurrency()); assertEquals(createdExternalCharges.get(1).getCurrency().toString(), accountJson.getCurrency()); @@ -401,7 +401,7 @@ public void testExternalChargeOnNewInvoiceWithAutomaticPayment() throws Exceptio externalCharge.setAccountId(accountJson.getAccountId()); externalCharge.setAmount(chargeAmount); externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency())); - final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), true, createdBy, reason, comment); + final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), true, true, createdBy, reason, comment); final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true); assertEquals(invoiceWithItems.getBalance().compareTo(BigDecimal.ZERO), 0); assertEquals(invoiceWithItems.getItems().size(), 1); @@ -426,7 +426,7 @@ public void testExternalChargeForBundleOnNewInvoice() throws Exception { externalCharge.setAmount(chargeAmount); externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency())); externalCharge.setBundleId(bundleId); - final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment); + final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, true, createdBy, reason, comment); final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true); assertEquals(invoiceWithItems.getBalance().compareTo(chargeAmount), 0); assertEquals(invoiceWithItems.getItems().size(), 1); @@ -455,7 +455,7 @@ public void testExternalChargeOnExistingInvoice() throws Exception { externalCharge.setAmount(chargeAmount); externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency())); externalCharge.setInvoiceId(invoiceId); - final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment); + final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, true, createdBy, reason, comment); final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true); assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1); assertNull(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId()); @@ -485,7 +485,7 @@ public void testExternalChargeOnExistingInvoiceWithAutomaticPayment() throws Exc externalCharge.setAmount(chargeAmount); externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency())); externalCharge.setInvoiceId(invoiceId); - final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), true, createdBy, reason, comment); + final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), true, true, createdBy, reason, comment); final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true); assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1); assertNull(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId()); @@ -516,7 +516,7 @@ public void testExternalChargeForBundleOnExistingInvoice() throws Exception { externalCharge.setCurrency(Currency.valueOf(accountJson.getCurrency())); externalCharge.setInvoiceId(invoiceId); externalCharge.setBundleId(bundleId); - final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, createdBy, reason, comment); + final InvoiceItem createdExternalCharge = killBillClient.createExternalCharge(externalCharge, clock.getUTCNow(), false, true, createdBy, reason, comment); final Invoice invoiceWithItems = killBillClient.getInvoice(createdExternalCharge.getInvoiceId(), true); assertEquals(invoiceWithItems.getItems().size(), originalNumberOfItemsForInvoice + 1); assertEquals(invoiceWithItems.getItems().get(originalNumberOfItemsForInvoice).getBundleId(), bundleId); @@ -567,7 +567,7 @@ public void testCreateCreditInvoiceAndMoveStatus() throws Exception { credit.setAccountId(account.getAccountId()); credit.setInvoiceId(null); credit.setCreditAmount(creditAmount); - final Credit creditJson = killBillClient.createCredit(credit, createdBy, reason, comment); + final Credit creditJson = killBillClient.createCredit(credit, false, createdBy, reason, comment); Invoice invoice = killBillClient.getInvoice(creditJson.getInvoiceId()); Assert.assertEquals(invoice.getStatus(), InvoiceStatus.DRAFT.toString());