@Override public boolean apply(@Nullable final InvoiceItemModelDao input) { return input.getType().equals(InvoiceItemType.ITEM_ADJ); } });
public static boolean isCharge(final InvoiceItem invoiceItem) { return InvoiceItemType.TAX.equals(invoiceItem.getInvoiceItemType()) || InvoiceItemType.EXTERNAL_CHARGE.equals(invoiceItem.getInvoiceItemType()) || InvoiceItemType.FIXED.equals(invoiceItem.getInvoiceItemType()) || InvoiceItemType.USAGE.equals(invoiceItem.getInvoiceItemType()) || InvoiceItemType.RECURRING.equals(invoiceItem.getInvoiceItemType()); }
@Override public boolean apply(final InvoiceItem invoiceItem) { return InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType()); } });
public static boolean isAccountCreditItem(final InvoiceItem invoiceItem) { return InvoiceItemType.CBA_ADJ.equals(invoiceItem.getInvoiceItemType()); }
protected boolean isTaxItem(final InvoiceItem invoiceItem) { return InvoiceItemType.TAX.equals(invoiceItem.getInvoiceItemType()); }
public static boolean isParentSummaryItem(final InvoiceItem invoiceItem) { return InvoiceItemType.PARENT_SUMMARY.equals(invoiceItem.getInvoiceItemType()); }
public static boolean isInvoiceAdjustmentItem(final InvoiceItem invoiceItem, final Iterable<InvoiceItem> otherInvoiceItems) { // Invoice level credit, i.e. credit adj, but NOT on its on own invoice return (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType()) && !(Iterables.size(otherInvoiceItems) == 1 && InvoiceItemType.CBA_ADJ.equals(otherInvoiceItems.iterator().next().getInvoiceItemType()) && otherInvoiceItems.iterator().next().getInvoiceId().equals(invoiceItem.getInvoiceId()) && otherInvoiceItems.iterator().next().getAmount().compareTo(invoiceItem.getAmount().negate()) == 0)); }
private boolean shouldIgnoreChildInvoice(final Invoice childInvoice, final BigDecimal childInvoiceAmount) { switch (childInvoiceAmount.compareTo(BigDecimal.ZERO)) { case -1: // do nothing if child invoice has negative amount because it's a credit and it will be use in next invoice return true; case 1: return false; case 0: // only ignore if amount == 0 and any item is not FIXED or RECURRING for (InvoiceItem item : childInvoice.getInvoiceItems()) { if (item.getInvoiceItemType().equals(InvoiceItemType.FIXED) || item.getInvoiceItemType().equals(InvoiceItemType.RECURRING)) { return false; } } } return true; }
@Override public boolean apply(@Nullable final InvoiceItemModelDao input) { return input.getType().equals(InvoiceItemType.PARENT_SUMMARY) && input.getChildAccountId().equals(childInvoiceModelDao.getAccountId()); } });
private static BigDecimal computeInvoiceAmountAdjustedForAccountCredit(final Currency currency, final Iterable<InvoiceItem> invoiceItems) { BigDecimal amountAdjusted = BigDecimal.ZERO; if (invoiceItems == null || !invoiceItems.iterator().hasNext()) { return KillBillMoney.of(amountAdjusted, currency); } for (final InvoiceItem invoiceItem : invoiceItems) { final Iterable<InvoiceItem> otherInvoiceItems = Iterables.filter(invoiceItems, new Predicate<InvoiceItem>() { @Override public boolean apply(final InvoiceItem input) { return !input.getId().equals(invoiceItem.getId()); } }); if (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType()) && (Iterables.size(otherInvoiceItems) == 1 && InvoiceItemType.CBA_ADJ.equals(otherInvoiceItems.iterator().next().getInvoiceItemType()) && otherInvoiceItems.iterator().next().getInvoiceId().equals(invoiceItem.getInvoiceId()) && otherInvoiceItems.iterator().next().getAmount().compareTo(invoiceItem.getAmount().negate()) == 0)) { amountAdjusted = amountAdjusted.add(invoiceItem.getAmount()); } } return KillBillMoney.of(amountAdjusted, currency); }
@Override public boolean apply(final InvoiceItem input) { return InvoiceItemType.RECURRING.equals(input.getInvoiceItemType()); } });
private InvoiceItemModelDao createInvoiceItemFromTransaction(final InvoiceItemSqlDao invoiceItemSqlDao, final InvoiceItemModelDao invoiceItemModelDao, final InternalCallContext context) throws EntityPersistenceException, InvoiceApiException { // There is no efficient way to retrieve an invoice item given an ID today (and invoice plugins can put item adjustments // on a different invoice than the original item), so it's easier to do the check in the DAO rather than in the API layer // See also https://github.com/killbill/killbill/issues/7 if (InvoiceItemType.ITEM_ADJ.equals(invoiceItemModelDao.getType())) { validateInvoiceItemToBeAdjusted(invoiceItemSqlDao, invoiceItemModelDao, context); } return createAndRefresh(invoiceItemSqlDao, invoiceItemModelDao, context); }
@Override public List<InvoiceItem> getInvoiceItems() { final List<InvoiceItem> invoiceItems = new ArrayList<InvoiceItem>(); InvoiceItem mergedCBAItem = null; InvoiceItem mergedInvoiceAdjustment = null; for (final InvoiceItem item : invoice.getInvoiceItems()) { if (InvoiceItemType.CBA_ADJ.equals(item.getInvoiceItemType())) { // Merge CBA items to avoid confusing the customer, since these are internal // adjustments (auto generated) mergedCBAItem = mergeCBAItem(invoiceItems, mergedCBAItem, item); } else if (InvoiceItemType.CREDIT_ADJ.equals(item.getInvoiceItemType())) { // Merge credit adjustments, as these are both the same for the customer (invoice adjustment) mergedInvoiceAdjustment = mergeInvoiceAdjustmentItem(invoiceItems, mergedInvoiceAdjustment, item); } else { invoiceItems.add(item); } } // Don't display adjustments of zero if (mergedCBAItem != null && mergedCBAItem.getAmount().compareTo(BigDecimal.ZERO) != 0) { invoiceItems.add(mergedCBAItem); } if (mergedInvoiceAdjustment != null && mergedInvoiceAdjustment.getAmount().compareTo(BigDecimal.ZERO) != 0) { invoiceItems.add(mergedInvoiceAdjustment); } final List<InvoiceItem> formatters = new ArrayList<InvoiceItem>(); for (final InvoiceItem item : invoiceItems) { formatters.add(new DefaultInvoiceItemFormatter(config, item, dateFormatter, locale, context, bundleFactory)); } return formatters; }
@Override public BigDecimal getCreditedAmount() { BigDecimal result = BigDecimal.ZERO; for (final InvoiceItem i : invoiceItems) { if (i.getInvoiceItemType().equals(InvoiceItemType.CBA_ADJ)) { result = result.add(i.getAmount()); } } return result; }
@Override public BigDecimal getChargedAmount() { BigDecimal result = BigDecimal.ZERO; for (final InvoiceItem i : invoiceItems) { if (!i.getInvoiceItemType().equals(InvoiceItemType.CBA_ADJ)) { result = result.add(i.getAmount()); } } return result; }
if (getInvoiceItemType() != null ? !getInvoiceItemType().equals(that.getInvoiceItemType()) : that.getInvoiceItemType() != null) { return false;
for (final Invoice invoice : invoices) { for (final InvoiceItem invoiceItem : invoice.getInvoiceItems()) { if (InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType())) { final List<AuditLog> auditLogs = accountAuditLogs.getAuditLogsForInvoiceItem(invoiceItem.getId()); credits.add(new CreditJson(invoice, invoiceItem, auditLogs));
if (!InvoiceItemType.CBA_ADJ.equals(cbaUsed.getType()) || cbaUsed.getAmount().compareTo(BigDecimal.ZERO) >= 0) { continue;
for (final InvoiceItem item : input.getInvoiceItems()) { ImmutableList<InvoiceItem> childItemsFiltered = null; if (item.getInvoiceItemType().equals(InvoiceItemType.PARENT_SUMMARY) && !CollectionUtils.isEmpty(childItems)) { childItemsFiltered = ImmutableList.copyOf(Iterables.filter(childItems, new Predicate<InvoiceItem>() { @Override