@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", 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); }
@Test(groups = "slow", expectedExceptions = InvoiceApiException.class, expectedExceptionsMessageRegExp = ".* does not have a Parent Account associated") public void testParentInvoiceTransferCreditAccountNoParent() throws Exception { final int billingDay = 14; final DateTime initialCreationDate = new DateTime(2014, 5, 15, 0, 0, 0, 0, testTimeZone); // set clock to the initial start date clock.setTime(initialCreationDate); final Account account = createAccountWithNonOsgiPaymentMethod(getChildAccountData(billingDay, null, true)); BigDecimal childAccountCBA = invoiceUserApi.getAccountCBA(account.getId(), callContext); assertEquals(childAccountCBA.compareTo(BigDecimal.ZERO), 0); invoiceUserApi.transferChildCreditToParent(account.getId(), callContext); }
@Test(groups = "slow", expectedExceptions = InvoiceApiException.class, expectedExceptionsMessageRegExp = ".* does not have credit") public void testParentInvoiceTransferCreditAccountWithoutCredit() throws Exception { final int billingDay = 14; final DateTime initialCreationDate = new DateTime(2014, 5, 15, 0, 0, 0, 0, testTimeZone); // set clock to the initial start date clock.setTime(initialCreationDate); final Account parentAccount = createAccountWithNonOsgiPaymentMethod(getAccountData(billingDay)); final Account childAccount = createAccountWithNonOsgiPaymentMethod(getChildAccountData(billingDay, parentAccount.getId(), true)); BigDecimal childAccountCBA = invoiceUserApi.getAccountCBA(childAccount.getId(), callContext); assertEquals(childAccountCBA.compareTo(BigDecimal.ZERO), 0); BigDecimal parentAccountCBA = invoiceUserApi.getAccountCBA(parentAccount.getId(), callContext); assertEquals(parentAccountCBA.compareTo(BigDecimal.ZERO), 0); invoiceUserApi.transferChildCreditToParent(childAccount.getId(), callContext); }
@Test(groups = "slow", description = "Verify invoice/account balance with DRAFT invoice. Verify that invoice/account balance are ZERO in DRAFT mode but becomes visible after it hasa been COMMITTED." ) public void testDraftInvoiceWithAccountCredit() throws Exception { // Add credit on the account invoiceUserApi.insertCredit(accountId, BigDecimal.TEN, null, accountCurrency, true, null, null, null, callContext); // 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("4.0"), accountCurrency, null)), false, null, callContext); assertEquals(items.size(), 1); final UUID invoiceId = items.get(0).getInvoiceId(); final Invoice invoice1 = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(invoice1.getStatus(), InvoiceStatus.DRAFT); // Verify CBA was *NOT* applied against DRAFT invoice assertEquals(invoice1.getInvoiceItems().size(), 1); // And balance is ZERO because DRAFT mode 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); invoiceUserApi.commitInvoice(invoiceId, callContext); final Invoice invoice2 = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(invoice2.getStatus(), InvoiceStatus.COMMITTED); // Verify this time credit was applied against COMMITTED invoice assertEquals(invoice2.getBalance().compareTo(BigDecimal.ZERO), 0); final BigDecimal accountBalance1 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance1.compareTo(new BigDecimal("-6.0")), 0); final BigDecimal accountCBA1 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA1.compareTo(new BigDecimal("6.0")), 0); }
assertEquals(accountBalance0.compareTo(BigDecimal.TEN), 0); final BigDecimal accountCBA0 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA0.compareTo(BigDecimal.ZERO), 0); assertEquals(accountBalance1.compareTo(BigDecimal.ZERO), 0); final BigDecimal accountCBA1 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA1.compareTo(BigDecimal.ZERO), 0); assertEquals(accountBalance2.compareTo(new BigDecimal("-10.00")), 0); final BigDecimal accountCBA2 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA2.compareTo(BigDecimal.TEN), 0);
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); } }
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); 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);