@Test(groups = "slow", description = "Verify invoice/account balance with a WRITTEN_OFF invoice. Verify behavior when WRITTEN_OFF tag is added after credit was added to invoice" ) public void testWrittenOffInvoiceWithAccountCredit() throws Exception { // Add credit on the account invoiceUserApi.insertCredit(accountId, BigDecimal.TEN, null, accountCurrency, true, null, null, null, callContext); final BigDecimal accountBalance0 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance0.compareTo(new BigDecimal("-10.0")), 0); final BigDecimal accountCBA0 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA0.compareTo(BigDecimal.TEN), 0); // Create new invoice with one charge and expect account credit to be used final List<InvoiceItem> items = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.<InvoiceItem>of(new ExternalChargeInvoiceItem(UUID.randomUUID(), clock.getUTCNow(), null, accountId, null, null, null, null, new BigDecimal("13.5"), accountCurrency, null)), true, null, callContext); assertEquals(items.size(), 1); final BigDecimal accountBalance1 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance1.compareTo(new BigDecimal("3.5")), 0); final BigDecimal accountCBA1 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA1.compareTo(BigDecimal.ZERO), 0); // Tag invoice with WRITTEN_OFF and expect balance to now show as Zero tagUserApi.addTag(items.get(0).getInvoiceId(), ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), callContext); final BigDecimal accountBalance2 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance2.compareTo(BigDecimal.ZERO), 0); final BigDecimal accountCBA2 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA2.compareTo(BigDecimal.ZERO), 0); }
@Override public List<Invoice> call() throws Exception { return invoiceApi.getInvoicesByAccount(accountId, false, false, tenantContext); } };
@TimedResource @PUT @Path("/{invoiceId:" + UUID_PATTERN + "}/" + COMMIT_INVOICE) @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) @ApiOperation(value = "Perform the invoice status transition from DRAFT to COMMITTED") @ApiResponses(value = {@ApiResponse(code = 204, message = "Successful operation"), @ApiResponse(code = 404, message = "Invoice not found")}) public Response commitInvoice(@PathParam("invoiceId") final UUID invoiceId, @HeaderParam(HDR_CREATED_BY) final String createdBy, @HeaderParam(HDR_REASON) final String reason, @HeaderParam(HDR_COMMENT) final String comment, @javax.ws.rs.core.Context final HttpServletRequest request, @javax.ws.rs.core.Context final UriInfo uriInfo) throws InvoiceApiException { final CallContext callContext = context.createCallContextNoAccountId(createdBy, reason, comment, request); invoiceApi.commitInvoice(invoiceId, callContext); return Response.status(Status.NO_CONTENT).build(); }
@GET @Path("/{creditId:" + UUID_PATTERN + "}") @Produces(APPLICATION_JSON) @ApiOperation(value = "Retrieve a credit by id", response = CreditJson.class) @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid credit id supplied"), @ApiResponse(code = 404, message = "Credit not found")}) public Response getCredit(@PathParam("creditId") final UUID creditId, @javax.ws.rs.core.Context final HttpServletRequest request) throws InvoiceApiException, AccountApiException { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final InvoiceItem credit = invoiceUserApi.getCreditById(creditId, tenantContext); final Invoice invoice = invoiceUserApi.getInvoice(credit.getInvoiceId(), tenantContext); final CreditJson creditJson = new CreditJson(invoice, credit); return Response.status(Response.Status.OK).entity(creditJson).build(); }
private AccountJson getAccount(final Account account, final Boolean accountWithBalance, final Boolean accountWithBalanceAndCBA, final AccountAuditLogs auditLogs, final TenantContext tenantContext) { if (accountWithBalanceAndCBA) { final BigDecimal accountBalance = invoiceApi.getAccountBalance(account.getId(), tenantContext); final BigDecimal accountCBA = invoiceApi.getAccountCBA(account.getId(), tenantContext); return new AccountJson(account, accountBalance, accountCBA, auditLogs); } else if (accountWithBalance) { final BigDecimal accountBalance = invoiceApi.getAccountBalance(account.getId(), tenantContext); return new AccountJson(account, accountBalance, null, auditLogs); } else { return new AccountJson(account, null, null, auditLogs); } }
@TimedResource @GET @Path("/{invoiceId:" + UUID_PATTERN + "}/") @Produces(APPLICATION_JSON) @ApiOperation(value = "Retrieve an invoice by id", response = InvoiceJson.class) @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid invoice id supplied"), @ApiResponse(code = 404, message = "Invoice not found")}) public Response getInvoice(@PathParam("invoiceId") final UUID invoiceId, @QueryParam(QUERY_INVOICE_WITH_ITEMS) @DefaultValue("false") final boolean withItems, @QueryParam(QUERY_INVOICE_WITH_CHILDREN_ITEMS) @DefaultValue("false") final boolean withChildrenItems, @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode, @javax.ws.rs.core.Context final HttpServletRequest request) throws InvoiceApiException { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final Invoice invoice = invoiceApi.getInvoice(invoiceId, tenantContext); if (invoice == null) { throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId); } final List<InvoiceItem> childInvoiceItems = withChildrenItems ? invoiceApi.getInvoiceItemsByParentInvoice(invoice.getId(), tenantContext) : null; final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(invoice.getAccountId(), auditMode.getLevel(), tenantContext); final InvoiceJson json = new InvoiceJson(invoice, withItems, childInvoiceItems, accountAuditLogs); return Response.status(Status.OK).entity(json).build(); }
@Test(groups = "slow", description = "Verify invoice/account balance with migrated invoice. Verify account credit is not consumed and that invoice/account balance does not take into account migrated invoice.") public void testMigratedInvoiceWithAccountCredit() throws Exception { // Add credit on the account invoiceUserApi.insertCredit(accountId, BigDecimal.TEN, null, accountCurrency, true, null, null, null, callContext); final UUID invoiceId = invoiceUserApi.createMigrationInvoice(accountId, null, ImmutableList.<InvoiceItem>of(new FixedPriceInvoiceItem(UUID.randomUUID(), clock.getUTCNow(), null, accountId, null, null, null, "foo", "bar", null, null, BigDecimal.ONE, accountCurrency)), callContext); final Invoice invoice1 = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(invoice1.getBalance().compareTo(BigDecimal.ZERO), 0); // Verify credit is **not applied** against migration invoice final BigDecimal accountBalance0 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance0.compareTo(new BigDecimal("-10.0")), 0); final BigDecimal accountCBA0 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA0.compareTo(BigDecimal.TEN), 0); }
@Test(groups = "slow") public void testRefundWithNoAdjustments() throws Exception { // Although we don't adjust the invoice, the invoicing system sends an event because invoice balance changes and overdue system-- in particular-- needs to know about it. refundPaymentAndCheckForCompletion(account, payment, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT); refundChecker.checkRefund(payment.getId(), callContext, new ExpectedRefundCheck(payment.getId(), false, new BigDecimal("233.82"), Currency.USD, initialCreationDate.toLocalDate())); final Invoice invoiceRefreshed = invoiceUserApi.getInvoice(invoice.getId(), callContext); assertTrue(invoiceRefreshed.getBalance().compareTo(new BigDecimal("233.82")) == 0); final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance.compareTo(new BigDecimal("233.82")) == 0); }
final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1); final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(accountBalance, invoiceBalance); final InvoiceItem creditInvoiceItem = invoiceUserApi.insertCreditForInvoice(accountId, null, creditAmount, clock.getUTCToday(), accountCurrency, null, null, null, callContext); Invoice creditInvoice = invoiceUserApi.getInvoice(invoiceId, callContext); Assert.assertEquals(creditInvoice.getStatus(), InvoiceStatus.DRAFT); Assert.assertEquals(creditInvoiceItem.getInvoiceId(), creditInvoice.getId()); final BigDecimal accountBalance2 = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(accountBalance2, accountBalance); invoiceUserApi.commitInvoice(creditInvoice.getId(), callContext); creditInvoice = invoiceUserApi.getInvoice(invoiceId, callContext); Assert.assertEquals(creditInvoice.getStatus(), InvoiceStatus.COMMITTED); invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.of(externalCharge), true, null, callContext); Assert.fail("Should fail to add external charge on already committed invoice"); } catch (final InvoiceApiException e) { invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, creditAmount, clock.getUTCToday(), accountCurrency, null, null, null, callContext); Assert.fail("Should fail to add credit on already committed invoice");
assertListenerStatus(); final Collection<Invoice> invoices = invoiceUserApi.getUnpaidInvoicesByAccountId(account.getId(), new LocalDate(clock.getUTCNow(), account.getTimeZone()), callContext); assertEquals(invoices.size(), 1); final Invoice unpaidInvoice = invoiceUserApi.getInvoice(unpaidInvoiceId, callContext); assertTrue(unpaidInvoice.getBalance().compareTo(new BigDecimal("249.95")) == 0); 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(), true, null, null, null, callContext); assertListenerStatus(); final BigDecimal accountBalance2 = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance2.compareTo(new BigDecimal("-50.05")) == 0); final Invoice unpaidInvoice2 = invoiceUserApi.getInvoice(unpaidInvoiceId, callContext); assertTrue(unpaidInvoice2.getBalance().compareTo(BigDecimal.ZERO) == 0); assertListenerStatus(); final BigDecimal accountBalance3 = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance3.compareTo(BigDecimal.ZERO) == 0);
@Test(groups = "slow") public void testAdjustFullInvoiceItem() throws Exception { final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, callContext).getInvoiceItems().get(0); // Verify we picked a non zero item Assert.assertEquals(invoiceItem.getAmount().compareTo(BigDecimal.ZERO), 1); // 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 the full amount final InvoiceItem adjInvoiceItem = invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(), clock.getUTCToday(), null, null, null, callContext); Assert.assertEquals(adjInvoiceItem.getInvoiceId(), invoiceId); Assert.assertEquals(adjInvoiceItem.getInvoiceItemType(), InvoiceItemType.ITEM_ADJ); Assert.assertEquals(adjInvoiceItem.getAccountId(), accountId); Assert.assertEquals(adjInvoiceItem.getAmount(), invoiceItem.getAmount().negate()); Assert.assertEquals(adjInvoiceItem.getCurrency(), accountCurrency); Assert.assertEquals(adjInvoiceItem.getLinkedItemId(), invoiceItem.getId()); // Verify the adjusted invoice balance final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance(); verifyAdjustedInvoiceBalance(invoiceBalance, invoiceItem.getAmount(), invoiceItem.getCurrency(), adjustedInvoiceBalance); // Verify the adjusted account balance final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext); Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance); // Verify idempotency Assert.assertNull(invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(), clock.getUTCToday(), null, null, null, callContext)); }
invoiceUserApi.insertExternalCharges(account.getId(), clock.getUTCNow().toLocalDate(), ImmutableList.<InvoiceItem>of(new ExternalChargeInvoiceItem(null, account.getId(), null, "foo", new LocalDate(2012, 4, 1), null, new BigDecimal("33.80"), account.getCurrency(), null)), false, null, callContext); assertListenerStatus(); final List<Invoice> accountInvoices = invoiceUserApi.getInvoicesByAccount(account.getId(), false, false, callContext); assertEquals(accountInvoices.size(), 2); invoiceUserApi.commitInvoice(accountInvoices.get(1).getId(), callContext); assertListenerStatus();
assertListenerStatus(); final List<Invoice> parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), false, false, callContext); final List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, false, callContext); invoiceUserApi.insertInvoiceItemAdjustment(childAccount.getId(), childInvoice.getId(), childInvoice.getInvoiceItems().get(0).getId(), childInvoice = invoiceUserApi.getInvoice(childInvoice.getId(), callContext); assertEquals(childInvoice.getNumberOfItems(), 3); assertEquals(childInvoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING); parentInvoice = invoiceUserApi.getInvoice(parentInvoice.getId(), callContext); assertEquals(parentInvoice.getNumberOfItems(), 1); assertEquals(parentInvoice.getPaidAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
invoiceUserApi.insertCredit(childAccount.getId(), new BigDecimal("250"), new LocalDate(clock.getUTCNow(), childAccount.getTimeZone()), childAccount.getCurrency(), true, null, null, null, callContext); assertListenerStatus(); BigDecimal childAccountCBA = invoiceUserApi.getAccountCBA(childAccount.getId(), callContext); assertEquals(childAccountCBA.compareTo(BigDecimal.valueOf(250)), 0); BigDecimal parentAccountCBA = invoiceUserApi.getAccountCBA(parentAccount.getId(), callContext); assertEquals(parentAccountCBA.compareTo(BigDecimal.ZERO), 0); invoiceUserApi.transferChildCreditToParent(childAccount.getId(), callContext); assertListenerStatus(); childAccountCBA = invoiceUserApi.getAccountCBA(childAccount.getId(), callContext); assertEquals(childAccountCBA.compareTo(BigDecimal.ZERO), 0); parentAccountCBA = invoiceUserApi.getAccountCBA(parentAccount.getId(), callContext); assertEquals(parentAccountCBA.compareTo(BigDecimal.valueOf(250)), 0); final List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, false, callContext); assertEquals(childInvoices.size(), 2); final List<Invoice> parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), false, false, callContext); assertEquals(parentInvoices.size(), 1);
List<Invoice> parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), false, false, callContext); assertEquals(parentInvoices.size(), 1); parentInvoice = invoiceUserApi.getInvoice(parentInvoice.getId(), callContext); assertEquals(parentInvoice.getStatus(), InvoiceStatus.COMMITTED); parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), false, false, callContext); assertEquals(parentInvoices.size(), 1); List<Invoice> childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, false, callContext); assertEquals(childInvoices.size(), 2); assertEquals(childInvoices.get(1).getStatus(), InvoiceStatus.DRAFT); invoiceUserApi.commitInvoice(childInvoices.get(1).getId(), callContext); assertListenerStatus(); parentInvoices = invoiceUserApi.getInvoicesByAccount(parentAccount.getId(), false, false, callContext); assertEquals(parentInvoices.size(), 2); parentInvoice = parentInvoices.get(1); childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, false, callContext); assertEquals(childInvoices.size(), 2); parentInvoice = invoiceUserApi.getInvoice(parentInvoice.getId(), callContext); assertEquals(parentInvoice.getStatus(), InvoiceStatus.COMMITTED); childInvoices = invoiceUserApi.getInvoicesByAccount(childAccount.getId(), false, false, callContext); assertEquals(childInvoices.size(), 2); assertTrue(parentInvoice.getBalance().compareTo(BigDecimal.ZERO) == 0);
assertNotNull(bpEntitlement); List<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId(), false, false, callContext); assertEquals(invoices.size(), 1); final Invoice trialInvoice = invoices.get(0); invoiceApi.commitInvoice(trialInvoice.getId(), callContext); assertListenerStatus(); assertListenerStatus(); invoices = invoiceApi.getInvoicesByAccount(account.getId(), false, false, callContext); assertEquals(invoices.size(), 2); final BigDecimal accountBalance = invoiceApi.getAccountBalance(account.getId(), callContext); assertEquals(accountBalance.compareTo(BigDecimal.ZERO), 0); assertListenerStatus(); invoices = invoiceApi.getInvoicesByAccount(account.getId(), false, false, callContext); assertEquals(invoices.size(), 3); invoiceApi.commitInvoice(firstNonTrialInvoice.getId(), callContext); assertListenerStatus(); final BigDecimal accountBalance2 = invoiceApi.getAccountBalance(account.getId(), callContext); assertEquals(accountBalance2.compareTo(BigDecimal.ZERO), 0);
assertListenerStatus(); final List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), false, false, callContext); assertEquals(invoices.size(), 2); assertNotNull(invoice1.getPayments().get(0).getPaymentId()); final BigDecimal accountBalance1 = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance1.compareTo(new BigDecimal("249.95")) == 0); assertListenerStatus(); final Invoice invoice2 = invoiceUserApi.getInvoice(invoice1.getId(), callContext); assertTrue(invoice2.getBalance().compareTo(BigDecimal.ZERO) == 0); assertTrue(invoice2.getPaidAmount().compareTo(new BigDecimal("249.95")) == 0); assertTrue(invoice2.getPayments().get(0).isSuccess()); final BigDecimal accountBalance2 = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance2.compareTo(BigDecimal.ZERO) == 0);
assertListenerStatus(); List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), false, false, callContext); invoiceChecker.checkInvoice(invoices.get(1).getId(), callContext, expectedInvoices); invoiceUserApi.voidInvoice(invoices.get(1).getId(), callContext); invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), false, true, callContext); assertEquals(invoices.size(), 3); final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance.compareTo(BigDecimal.ZERO) == 0); invoiceUserApi.voidInvoice(invoices.get(2).getId(), callContext); Assert.fail("Should fail to void invoice that is already paid"); } catch (final InvoiceApiException e) {
@Test(groups = "slow") public void testVoidInvoiceThatIsPaid() throws Exception { InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext); // 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); // create payment final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoiceId, new DateTime(), invoiceBalance, Currency.USD, Currency.USD, null, true); invoiceUtil.createPayment(payment, context); // try to void invoice, it should fail try { invoiceUserApi.voidInvoice(invoiceId, callContext); Assert.fail("Should fail to void invoice that is already paid"); } catch (final InvoiceApiException e) { Assert.assertEquals(e.getCode(), ErrorCode.CAN_NOT_VOID_INVOICE_THAT_IS_PAID.getCode()); } } }
final LocalDate endDate = startDate.plusDays(5); final InvoiceItem externalCharge = new ExternalChargeInvoiceItem(null, account.getId(), null, "Initial external charge", startDate, endDate, BigDecimal.TEN, Currency.USD, null); final InvoiceItem item1 = invoiceUserApi.insertExternalCharges(account.getId(), clock.getUTCToday(), ImmutableList.<InvoiceItem>of(externalCharge), true, null, callContext).get(0); assertListenerStatus(); final Invoice invoice = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext); Payment payment1 = createPaymentAndCheckForCompletion(account, invoice, new BigDecimal("4.00"), account.getCurrency(), NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT); Invoice invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext); assertTrue(invoice1.getBalance().compareTo(new BigDecimal("6.00")) == 0); assertTrue(invoice1.getPaidAmount().compareTo(new BigDecimal("4.00")) == 0); assertTrue(invoice1.getChargedAmount().compareTo(BigDecimal.TEN) == 0); BigDecimal accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance.compareTo(new BigDecimal("6.00")) == 0); invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext); assertTrue(invoice1.getBalance().compareTo(BigDecimal.ZERO) == 0); assertTrue(invoice1.getPaidAmount().compareTo(BigDecimal.TEN) == 0); assertTrue(invoice1.getChargedAmount().compareTo(BigDecimal.TEN) == 0); accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext); assertTrue(accountBalance.compareTo(BigDecimal.ZERO) == 0); iias.put(item1.getId(), new BigDecimal("4.00")); payment1 = refundPaymentWithInvoiceItemAdjAndCheckForCompletion(account, payment1, new BigDecimal("4.00"), Currency.USD, iias, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT, NextEvent.INVOICE_ADJUSTMENT); invoice1 = invoiceUserApi.getInvoice(item1.getInvoiceId(), callContext); assertTrue(invoice1.getBalance().compareTo(BigDecimal.ZERO) == 0); accountBalance = invoiceUserApi.getAccountBalance(account.getId(), callContext);