@Override public LocalDate getStartDate() { return item.getStartDate(); }
@Override public String getFormattedStartDate() { return item.getStartDate().toString(dateFormatter); }
public Item(final InvoiceItem item, final UUID targetInvoiceId, final ItemAction action) { this(item, item.getStartDate(), item.getEndDate(), targetInvoiceId, action); }
private void addInvoiceItemsToChargeThroughDates(final Map<UUID, DateTime> chargeThroughDates, final Collection<InvoiceItem> items, final InternalTenantContext internalTenantContext) { for (final InvoiceItem item : items) { final UUID subscriptionId = item.getSubscriptionId(); final LocalDate endDate = (item.getEndDate() != null) ? item.getEndDate() : item.getStartDate(); final DateTime proposedChargedThroughDate = internalTenantContext.toUTCDateTime(endDate); if (chargeThroughDates.containsKey(subscriptionId)) { if (chargeThroughDates.get(subscriptionId).isBefore(proposedChargedThroughDate)) { chargeThroughDates.put(subscriptionId, proposedChargedThroughDate); } } else { chargeThroughDates.put(subscriptionId, proposedChargedThroughDate); } } }
@Override public int compare(final InvoiceItem o1, final InvoiceItem o2) { int startDateComp = o1.getStartDate().compareTo(o2.getStartDate()); if (startDateComp != 0) { return startDateComp; } int itemTypeComp = (o1.getInvoiceItemType().ordinal()<o2.getInvoiceItemType().ordinal() ? -1 : (o1.getInvoiceItemType().ordinal()==o2.getInvoiceItemType().ordinal() ? 0 : 1)); if (itemTypeComp != 0) { return itemTypeComp; } Preconditions.checkState(false, "Unexpected list of items for subscription " + o1.getSubscriptionId() + ", type(item1) = " + o1.getInvoiceItemType() + ", start(item1) = " + o1.getStartDate() + ", type(item12) = " + o2.getInvoiceItemType() + ", start(item2) = " + o2.getStartDate()); // Never reached... return 0; } };
private InvoiceItem createInvoiceItem(final BigDecimal amount, final String networkName, final LocalDate startDate, final LocalDate endDate, final String planName) { final InvoiceItem item = Mockito.mock(InvoiceItem.class); Mockito.when(item.getAmount()).thenReturn(amount); Mockito.when(item.getStartDate()).thenReturn(startDate); Mockito.when(item.getEndDate()).thenReturn(endDate); Mockito.when(item.getPlanName()).thenReturn(planName); Mockito.when(item.getDescription()).thenReturn(networkName); return item; } }
@VisibleForTesting boolean isSameDayAndSameSubscription(final InvoiceItem prevComputedFixedItem, final BillingEvent currentBillingEvent, final InternalCallContext internalCallContext) { final LocalDate curLocalEffectiveDate = internalCallContext.toLocalDate(currentBillingEvent.getEffectiveDate()); if (prevComputedFixedItem != null && /* If we have computed a previous item */ prevComputedFixedItem.getStartDate().compareTo(curLocalEffectiveDate) == 0 && /* The current billing event happens at the same date */ prevComputedFixedItem.getSubscriptionId().compareTo(currentBillingEvent.getSubscription().getId()) == 0 /* The current billing event happens for the same subscription */) { return true; } else { return false; } }
public CreditJson(final Invoice invoice, final InvoiceItem credit, final List<AuditLog> auditLogs) { super(toAuditLogJson(auditLogs)); this.creditId = credit.getId(); this.accountId = credit.getAccountId(); this.creditAmount = credit.getAmount(); this.currency = credit.getCurrency(); this.invoiceId = credit.getInvoiceId(); this.invoiceNumber = invoice.getInvoiceNumber().toString(); this.effectiveDate = credit.getStartDate(); this.description = credit.getDescription(); this.itemDetails = credit.getItemDetails(); }
protected Plan getPlanFromInvoiceItem(final InvoiceItem invoiceItem, final TenantContext context) throws OSGIServiceNotAvailable { try { final Catalog catalog = getCatalog(context); return catalog.findPlan(invoiceItem.getPlanName(), invoiceItem.getStartDate().toDateTimeAtStartOfDay()); } catch (final CatalogApiException e) { logService.log(LogService.LOG_INFO, "Unable to retrieve plan for invoice item " + invoiceItem.getId(), e); return null; } }
protected PlanPhase getPlanPhaseFromInvoiceItem(final InvoiceItem invoiceItem, final LocalDate subscriptionStartDate, final TenantContext context) throws OSGIServiceNotAvailable { try { final Catalog catalog = getCatalog(context); // TODO - Inaccurate timing return catalog.findPhase(invoiceItem.getPhaseName(), invoiceItem.getStartDate().toDateTimeAtStartOfDay(), subscriptionStartDate.toDateTimeAtStartOfDay()); } catch (final CatalogApiException e) { logService.log(LogService.LOG_INFO, "Unable to retrieve phase for invoice item " + invoiceItem.getId(), e); return null; } }
@BeforeMethod(groups = "fast") public void setUp() throws Exception { pluginTaxCalculatorTest = new PluginTaxCalculatorTest(); final Account account = TestUtils.buildAccount(Currency.BTC, "US"); final Invoice invoice1 = TestUtils.buildInvoice(account); invoice1TaxableItem = TestUtils.buildInvoiceItem(invoice1, InvoiceItemType.EXTERNAL_CHARGE, BigDecimal.TEN, null); invoice1TaxItem = PluginInvoiceItem.createTaxItem(invoice1TaxableItem, invoice1.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE, "TestNG tax"); invoice1AdjustmentItemForInvoice1TaxableItem = PluginInvoiceItem.createAdjustmentItem(invoice1TaxableItem, invoice1.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE.negate(), "Mis-billing 1"); invoice1.getInvoiceItems().add(invoice1TaxableItem); invoice1.getInvoiceItems().add(invoice1TaxItem); invoice1.getInvoiceItems().add(invoice1AdjustmentItemForInvoice1TaxableItem); final Invoice invoice2 = TestUtils.buildInvoice(account); invoice2AdjustmentItemForInvoice1TaxableItem = PluginInvoiceItem.createAdjustmentItem(invoice1TaxableItem, invoice2.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE.negate(), "Mis-billing 2"); invoice2.getInvoiceItems().add(invoice2AdjustmentItemForInvoice1TaxableItem); }
@BeforeMethod(groups = "fast") public void setUp() throws Exception { account = TestUtils.buildAccount(Currency.BTC, "US"); invoice1 = TestUtils.buildInvoice(account); invoice1TaxableItem = TestUtils.buildInvoiceItem(invoice1, InvoiceItemType.EXTERNAL_CHARGE, BigDecimal.TEN, null); invoice1TaxItem = PluginInvoiceItem.createTaxItem(invoice1TaxableItem, invoice1.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE, "TestNG tax"); invoice1.getInvoiceItems().add(invoice1TaxableItem); invoice1.getInvoiceItems().add(invoice1TaxItem); }
@BeforeMethod(groups = "fast") public void setUp() throws Exception { account = TestUtils.buildAccount(Currency.BTC, "US"); final OSGIKillbillAPI killbillAPI = TestUtils.buildOSGIKillbillAPI(account); final OSGIConfigPropertiesService configPropertiesService = Mockito.mock(OSGIConfigPropertiesService.class); final OSGIKillbillLogService logService = TestUtils.buildLogService(); pluginInvoicePluginApi = new PluginInvoicePluginApiTest(killbillAPI, configPropertiesService, logService, clock); invoice1 = TestUtils.buildInvoice(account); invoice1TaxableItem = TestUtils.buildInvoiceItem(invoice1, InvoiceItemType.EXTERNAL_CHARGE, BigDecimal.TEN, null); invoice1TaxItem = PluginInvoiceItem.createTaxItem(invoice1TaxableItem, invoice1.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE, "TestNG tax"); invoice1AdjustmentItemForInvoice1TaxableItem = PluginInvoiceItem.createAdjustmentItem(invoice1TaxableItem, invoice1.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE.negate(), "Mis-billing 1"); invoice1.getInvoiceItems().add(invoice1TaxableItem); invoice1.getInvoiceItems().add(invoice1TaxItem); invoice1.getInvoiceItems().add(invoice1AdjustmentItemForInvoice1TaxableItem); invoice2 = TestUtils.buildInvoice(account); invoice2TaxableItem = TestUtils.buildInvoiceItem(invoice2, InvoiceItemType.RECURRING, BigDecimal.TEN, null); invoice2AdjustmentItemForInvoice1TaxableItem = PluginInvoiceItem.createAdjustmentItem(invoice1TaxableItem, invoice2.getId(), invoice1TaxableItem.getStartDate(), null, BigDecimal.ONE.negate(), "Mis-billing 2"); invoice2.getInvoiceItems().add(invoice2TaxableItem); invoice2.getInvoiceItems().add(invoice2AdjustmentItemForInvoice1TaxableItem); }
@Override public InvoiceItem getCreditById(final UUID creditId, final TenantContext context) throws InvoiceApiException { final InvoiceItem creditItem = InvoiceItemFactory.fromModelDao(dao.getCreditById(creditId, internalCallContextFactory.createInternalTenantContext(creditId, ObjectType.INVOICE_ITEM, context))); if (creditItem == null) { throw new InvoiceApiException(ErrorCode.INVOICE_NO_SUCH_CREDIT, creditId); } return new CreditAdjInvoiceItem(creditItem.getId(), creditItem.getCreatedDate(), creditItem.getInvoiceId(), creditItem.getAccountId(), creditItem.getStartDate(), creditItem.getDescription(), creditItem.getAmount().negate(), creditItem.getCurrency(), creditItem.getItemDetails()); }
@Test(groups = "fast") public void testWithSingleMonthlyEvent() throws InvoiceApiException, CatalogApiException { final BillingEventSet events = new MockBillingEventSet(); final SubscriptionBase sub = createSubscription(); final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1); final Plan plan = new MockPlan(); final BigDecimal rate1 = TEN; final PlanPhase phase = createMockMonthlyPlanPhase(rate1); final BillingEvent event = createBillingEvent(sub.getId(), sub.getBundleId(), startDate, plan, phase, 1); events.add(event); final LocalDate targetDate = invoiceUtil.buildDate(2011, 10, 3); final InvoiceWithMetadata invoiceWithMetadata = generator.generateInvoice(account, events, null, null, targetDate, Currency.USD, internalCallContext); final Invoice invoice = invoiceWithMetadata.getInvoice(); assertNotNull(invoice); assertEquals(invoice.getNumberOfItems(), 2); assertEquals(invoice.getBalance(), KillBillMoney.of(TWENTY, invoice.getCurrency())); assertEquals(invoice.getInvoiceItems().get(0).getSubscriptionId(), sub.getId()); assertEquals(invoice.getInvoiceItems().get(0).getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), new LocalDate(2011, 9, 1)); assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), new LocalDate(2011, 10, 1)); assertEquals(invoice.getInvoiceItems().get(1).getInvoiceItemType(), InvoiceItemType.RECURRING); assertEquals(invoice.getInvoiceItems().get(1).getStartDate(), new LocalDate(2011, 10, 1)); assertEquals(invoice.getInvoiceItems().get(1).getEndDate(), new LocalDate(2011, 11, 1)); }
@Test(groups = "fast") public void testSimpleWithSingleDiscountEvent() throws Exception { final UUID accountId = UUID.randomUUID(); final SubscriptionBase sub = createSubscription(); final Plan plan = new MockPlan("Plan with a single discount phase"); final PlanPhase phaseEvergreen = createMockMonthlyPlanPhase(EIGHT, PhaseType.DISCOUNT); final int bcdLocal = 16; final LocalDate startDate = invoiceUtil.buildDate(2012, 7, 16); final BillingEventSet events = new MockBillingEventSet(); events.add(createBillingEvent(sub.getId(), sub.getBundleId(), startDate, plan, phaseEvergreen, bcdLocal)); // Set a target date of today (start date) final LocalDate targetDate = startDate; final InvoiceWithMetadata invoiceWithMetadata = generator.generateInvoice(account, events, null, null, targetDate, Currency.USD, internalCallContext); final Invoice invoice = invoiceWithMetadata.getInvoice(); assertNotNull(invoice); assertEquals(invoice.getNumberOfItems(), 1); assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), invoiceUtil.buildDate(2012, 7, 16)); assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), invoiceUtil.buildDate(2012, 8, 16)); }
@Override public InvoiceItem getExternalChargeById(final UUID externalChargeId, final TenantContext context) throws InvoiceApiException { final InvoiceItem externalChargeItem = InvoiceItemFactory.fromModelDao(dao.getExternalChargeById(externalChargeId, internalCallContextFactory.createInternalTenantContext(externalChargeId, ObjectType.INVOICE_ITEM, context))); if (externalChargeItem == null) { throw new InvoiceApiException(ErrorCode.INVOICE_NO_SUCH_EXTERNAL_CHARGE, externalChargeId); } return new ExternalChargeInvoiceItem(externalChargeItem.getId(), externalChargeItem.getInvoiceId(), externalChargeItem.getAccountId(), externalChargeItem.getDescription(), externalChargeItem.getStartDate(), externalChargeItem.getEndDate(), externalChargeItem.getAmount(), externalChargeItem.getCurrency(), externalChargeItem.getItemDetails()); }
public InvoiceItemJson(final InvoiceItem item, final List<InvoiceItem> childItems, @Nullable final List<AuditLog> auditLogs) { this(item.getId(), item.getInvoiceId(), item.getLinkedItemId(), item.getAccountId(), item.getChildAccountId(), item.getBundleId(), item.getSubscriptionId(), item.getProductName(), item.getPlanName(), item.getPhaseName(), item.getUsageName(), item.getPrettyProductName(), item.getPrettyPlanName(), item.getPrettyPhaseName(), item.getPrettyUsageName(), item.getInvoiceItemType(), item.getDescription(), item.getStartDate(), item.getEndDate(), item.getAmount(), item.getRate(), item.getCurrency(), item.getQuantity(), item.getItemDetails(), toInvoiceItemJson(childItems), toAuditLogJson(auditLogs)); }
public InvoiceItemModelDao(final InvoiceItem invoiceItem) { this(invoiceItem.getId(), invoiceItem.getCreatedDate(), invoiceItem.getInvoiceItemType(), invoiceItem.getInvoiceId(), invoiceItem.getAccountId(), invoiceItem.getChildAccountId(), invoiceItem.getBundleId(), invoiceItem.getSubscriptionId(), invoiceItem.getDescription(), invoiceItem.getProductName(), invoiceItem.getPlanName(), invoiceItem.getPhaseName(), invoiceItem.getUsageName(), invoiceItem.getStartDate(), invoiceItem.getEndDate(), invoiceItem.getAmount(), invoiceItem.getRate(), invoiceItem.getCurrency(), invoiceItem.getLinkedItemId(), invoiceItem.getQuantity(), invoiceItem.getItemDetails()); }
@Override public boolean apply(final InvoiceItem input) { if (input.getInvoiceItemType() != cur.getType() || (cur.shouldCheckDates() && input.getStartDate().compareTo(cur.getStartDate()) != 0)) { return false; } if (input.getAmount().compareTo(cur.getAmount()) != 0) { return false; } if (!cur.shouldCheckDates() || (cur.getEndDate() == null && input.getEndDate() == null) || (cur.getEndDate() != null && input.getEndDate() != null && cur.getEndDate().compareTo(input.getEndDate()) == 0)) { return true; } return false; } }).orNull();