@Test(groups = "fast") public void testBasicUSD() throws Exception { final FixedPriceInvoiceItem fixedItemUSD = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), new BigDecimal("-1114.751625346"), Currency.USD); checkOutput(fixedItemUSD, "{{#invoiceItem}}<td class=\"amount\">{{formattedAmount}}</td>{{/invoiceItem}}", "<td class=\"amount\">($1,114.75)</td>", LocaleUtils.toLocale("en_US")); }
@Test(groups = "fast") public void testIgnoreZeroAdjustments() throws Exception { // Scenario: single item with payment // * $10 item // * $-10 CBA // * $10 CBA final FixedPriceInvoiceItem fixedItem = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), BigDecimal.TEN, Currency.USD); final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem = new CreditBalanceAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), fixedItem.getAmount(), fixedItem.getCurrency()); final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem2 = new CreditBalanceAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), fixedItem.getAmount().negate(), fixedItem.getCurrency()); final Invoice invoice = new DefaultInvoice(fixedItem.getInvoiceId(), fixedItem.getAccountId(), null, new LocalDate(), new LocalDate(), Currency.USD, false); invoice.addInvoiceItem(fixedItem); invoice.addInvoiceItem(creditBalanceAdjInvoiceItem); invoice.addInvoiceItem(creditBalanceAdjInvoiceItem2); // Check the scenario Assert.assertEquals(invoice.getBalance().doubleValue(), 10.00); Assert.assertEquals(invoice.getCreditedAmount().doubleValue(), 0.00); // Verify the merge final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US, null); final List<InvoiceItem> invoiceItems = formatter.getInvoiceItems(); Assert.assertEquals(invoiceItems.size(), 1); Assert.assertEquals(invoiceItems.get(0).getInvoiceItemType(), InvoiceItemType.FIXED); Assert.assertEquals(invoiceItems.get(0).getAmount().doubleValue(), 10.00); }
@Override public String getDescription() { if (getPhaseName() == null) { return "Fixed price charge"; } else { if (getAmount().compareTo(BigDecimal.ZERO) == 0) { return getPhaseName(); } else { return String.format("%s (fixed price)", getPhaseName()); } } }
final FixedPriceInvoiceItem fixedItem = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), BigDecimal.TEN, Currency.USD); final RepairAdjInvoiceItem repairAdjInvoiceItem = new RepairAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), fixedItem.getEndDate(), fixedItem.getAmount().negate(), fixedItem.getCurrency(), fixedItem.getId()); final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem = new CreditBalanceAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), fixedItem.getAmount(), fixedItem.getCurrency()); final CreditAdjInvoiceItem creditAdjInvoiceItem = new CreditAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), BigDecimal.ONE.negate(), fixedItem.getCurrency()); final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem2 = new CreditBalanceAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), creditAdjInvoiceItem.getAmount().negate(), fixedItem.getCurrency()); final RefundAdjInvoiceItem refundAdjInvoiceItem = new RefundAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(), fixedItem.getStartDate(), BigDecimal.ONE.negate(), fixedItem.getCurrency()); final DefaultInvoice invoice = new DefaultInvoice(fixedItem.getInvoiceId(), fixedItem.getAccountId(), null, new LocalDate(), new LocalDate(), Currency.USD, false); invoice.addInvoiceItem(fixedItem);
assertEquals(invoice2.getNumberOfItems(), 1); final FixedPriceInvoiceItem item = (FixedPriceInvoiceItem) invoice2.getInvoiceItems().get(0); assertEquals(item.getStartDate(), changeDate.toLocalDate());
@Test(groups = "fast") public void testNullEndDate() throws Exception { final LocalDate startDate = new LocalDate(2012, 12, 1); final FixedPriceInvoiceItem fixedItem = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), startDate, BigDecimal.TEN, Currency.USD); checkOutput(fixedItem, "{{#invoiceItem}}<td>{{formattedStartDate}}{{#formattedEndDate}} - {{formattedEndDate}}{{/formattedEndDate}}</td>{{/invoiceItem}}", "<td>Dec 1, 2012</td>"); }
public static InvoiceItem createInvoiceItem(final Clock clock, final UUID invoiceId, final UUID accountId, final BigDecimal amount, final Currency currency) { return new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(), UUID.randomUUID(), "charge back test", "charge back phase", clock.getUTCToday(), amount, currency); }
@Test(groups = "fast") public void testFormattedAmount() throws Exception { final FixedPriceInvoiceItem fixedItemEUR = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), new BigDecimal("1499.95"), Currency.EUR); checkOutput(fixedItemEUR, "{{#invoiceItem}}<td class=\"amount\">{{formattedAmount}}</td>{{/invoiceItem}}", "<td class=\"amount\">1 499,95 €</td>", Locale.FRANCE); final FixedPriceInvoiceItem fixedItemUSD = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), new BigDecimal("-1114.751625346"), Currency.USD); checkOutput(fixedItemUSD, "{{#invoiceItem}}<td class=\"amount\">{{formattedAmount}}</td>{{/invoiceItem}}", "<td class=\"amount\">($1,114.75)</td>"); // Check locale/currency mismatch (locale is set at the account level) final FixedPriceInvoiceItem fixedItemGBP = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), new BigDecimal("8.07"), Currency.GBP); checkOutput(fixedItemGBP, "{{#invoiceItem}}<td class=\"amount\">{{formattedAmount}}</td>{{/invoiceItem}}", "<td class=\"amount\">8,07 GBP</td>", Locale.FRANCE); }
@Test(groups = "fast") public void testRemoveDuplicatedInvoiceItemsShouldNotThrowIllegalStateExceptionOne() { final LocalDate startDate = clock.getUTCToday(); final LocalDate endDate = startDate.plusMonths(1); final BigDecimal amount = new BigDecimal("12.00"); // More items in existing than proposed final List<InvoiceItem> existing = new LinkedList<InvoiceItem>(); final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); final InvoiceItem item2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, amount, currency); existing.add(item1); existing.add(item2); final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>(); final InvoiceItem other1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); proposed.add(other1); defaultInvoiceGenerator.removeMatchingInvoiceItems(proposed, existing); assertEquals(existing.size(), 1); assertEquals(proposed.size(), 0); }
@Test(groups = "fast") public void testRemoveDuplicatedInvoiceItemsShouldNotThrowIllegalStateExceptionTwo() { final LocalDate startDate = clock.getUTCToday(); final LocalDate endDate = startDate.plusMonths(1); final BigDecimal amount = new BigDecimal("12.00"); // More items in proposed than existing final List<InvoiceItem> existing = new LinkedList<InvoiceItem>(); final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); existing.add(item1); final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>(); final InvoiceItem other1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); final InvoiceItem other2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, amount, currency); proposed.add(other1); proposed.add(other2); defaultInvoiceGenerator.removeMatchingInvoiceItems(proposed, existing); assertEquals(existing.size(), 0); assertEquals(proposed.size(), 1); }
@Test(groups = "fast") public void testRemoveDuplicatedInvoiceItemsShouldNotThrowIllegalStateExceptionThree() { final LocalDate startDate = clock.getUTCToday(); final LocalDate endDate = startDate.plusMonths(1); final BigDecimal amount = new BigDecimal("12.00"); // Bunch of duplicated items final List<InvoiceItem> existing = new LinkedList<InvoiceItem>(); final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); final InvoiceItem item2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, amount, currency); existing.add(item1); existing.add(item2); existing.add(item1); final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>(); final InvoiceItem other1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); final InvoiceItem other2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, amount, currency); proposed.add(item1); proposed.add(other1); proposed.add(other1); proposed.add(other2); defaultInvoiceGenerator.removeMatchingInvoiceItems(proposed, existing); assertEquals(existing.size(), 0); assertEquals(proposed.size(), 1); }
@Test(groups = "fast") public void testFormattedAmount() throws Exception { final FixedPriceInvoiceItem fixedItemEUR = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), new BigDecimal("1499.95"), Currency.EUR); final Invoice invoiceEUR = new DefaultInvoice(UUID.randomUUID(), new LocalDate(), new LocalDate(), Currency.EUR); invoiceEUR.addInvoiceItem(fixedItemEUR); checkOutput(invoiceEUR, "<tr>\n" + " <td class=\"amount\"><strong>{{invoice.formattedChargedAmount}}</strong></td>\n" + "</tr>\n" + "<tr>\n" + " <td class=\"amount\"><strong>{{invoice.formattedPaidAmount}}</strong></td>\n" + "</tr>\n" + "<tr>\n" + " <td class=\"amount\"><strong>{{invoice.formattedBalance}}</strong></td>\n" + "</tr>", "<tr>\n" + " <td class=\"amount\"><strong>1 499,95 €</strong></td>\n" + "</tr>\n" + "<tr>\n" + " <td class=\"amount\"><strong>0,00 €</strong></td>\n" + "</tr>\n" + "<tr>\n" + " <td class=\"amount\"><strong>1 499,95 €</strong></td>\n" + "</tr>", Locale.FRANCE); }
@Test(groups = "slow") public void testFixedPriceInvoiceSqlDao() throws EntityPersistenceException { final UUID invoiceId = UUID.randomUUID(); final UUID accountId = account.getId(); final LocalDate startDate = new LocalDate(2012, 4, 1); final InvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(), UUID.randomUUID(), "test plan", "test phase", startDate, TEN, Currency.USD); invoiceUtil.createInvoiceItem(fixedPriceInvoiceItem, context); final InvoiceItemModelDao savedItem = invoiceUtil.getInvoiceItemById(fixedPriceInvoiceItem.getId(), context); assertSameInvoiceItem(fixedPriceInvoiceItem, savedItem); }
@Test(groups = "fast") public void testRemoveCancellingInvoiceItemsFixedPrice() { final LocalDate startDate = clock.getUTCToday(); final LocalDate endDate = startDate.plusDays(30); final LocalDate nextEndDate = startDate.plusMonths(1); final BigDecimal amount = new BigDecimal("12.00"); final BigDecimal rate2 = new BigDecimal("14.85"); final BigDecimal amount2 = rate2; final List<InvoiceItem> items = new LinkedList<InvoiceItem>(); final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency); items.add(item1); items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount.negate(), currency, item1.getId())); items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency)); defaultInvoiceGenerator.removeRepairedAndRepairInvoiceItems(items, new LinkedList<InvoiceItem>()); assertEquals(items.size(), 1); final InvoiceItem leftItem = items.get(0); assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(leftItem.getAmount(), amount2); }
@Test(groups = "fast") public void testRemoveDuplicatedInvoiceItemsFixedPrice() { final LocalDate startDate = clock.getUTCToday(); final LocalDate endDate = startDate.plusDays(30); final LocalDate nextEndDate = startDate.plusMonths(1); final BigDecimal amount1 = new BigDecimal("12.00"); final BigDecimal amount2 = new BigDecimal("14.85"); final BigDecimal rate3 = new BigDecimal("14.85"); final BigDecimal amount3 = rate3; final List<InvoiceItem> existing = new LinkedList<InvoiceItem>(); final InvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount1, currency); existing.add(item1); final List<InvoiceItem> proposed = new LinkedList<InvoiceItem>(); final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount3, rate3, currency); proposed.add(item1); proposed.add(other); defaultInvoiceGenerator.removeMatchingInvoiceItems(proposed, existing); assertEquals(existing.size(), 0); assertEquals(proposed.size(), 1); final InvoiceItem leftItem = proposed.get(0); assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(leftItem.getAmount(), amount2); }
final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, rate1, Currency.USD); invoiceUtil.createInvoiceItem(item1, context); final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, rate2, Currency.USD); invoiceUtil.createInvoiceItem(item2, context); final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, rate3, Currency.USD); invoiceUtil.createInvoiceItem(item3, context); final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, rate4, Currency.USD); invoiceUtil.createInvoiceItem(item4, context); final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, rate1, Currency.USD); invoiceUtil.createInvoiceItem(item5, context); final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, rate2, Currency.USD); invoiceUtil.createInvoiceItem(item6, context); final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, rate3, Currency.USD); invoiceUtil.createInvoiceItem(item7, context);
final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, amount1, Currency.USD); invoiceUtil.createInvoiceItem(item1, context);
@Test(groups = "fast") public void testForDisplay() throws Exception { final FixedPriceInvoiceItem fixedItemBRL = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), new LocalDate(), new BigDecimal("1499.95"), Currency.BRL);
InvoiceItem generateFixedPriceItem(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent, final LocalDate targetDate, final Currency currency) { final LocalDate roundedStartDate = new LocalDate(thisEvent.getEffectiveDate(), thisEvent.getTimeZone()); if (roundedStartDate.isAfter(targetDate)) { return null; } else { final BigDecimal fixedPrice = thisEvent.getFixedPrice(); if (fixedPrice != null) { return new FixedPriceInvoiceItem(invoiceId, accountId, thisEvent.getSubscription().getBundleId(), thisEvent.getSubscription().getId(), thisEvent.getPlan().getName(), thisEvent.getPlanPhase().getName(), roundedStartDate, fixedPrice, currency); } else { return null; } } } }
final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, amount1, Currency.USD); invoiceUtil.createInvoiceItem(item1, context);