@Override public boolean apply(@Nullable final InvoiceItemModelDao input) { return input.getType().equals(InvoiceItemType.ITEM_ADJ); } });
@Override public int hashCode() { int result = super.hashCode(); result = 31 * result + (type != null ? type.hashCode() : 0); result = 31 * result + (invoiceId != null ? invoiceId.hashCode() : 0); result = 31 * result + (accountId != null ? accountId.hashCode() : 0); result = 31 * result + (childAccountId != null ? childAccountId.hashCode() : 0); result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0); result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0); result = 31 * result + (description != null ? description.hashCode() : 0); result = 31 * result + (productName != null ? productName.hashCode() : 0); result = 31 * result + (planName != null ? planName.hashCode() : 0); result = 31 * result + (phaseName != null ? phaseName.hashCode() : 0); result = 31 * result + (usageName != null ? usageName.hashCode() : 0); result = 31 * result + (startDate != null ? startDate.hashCode() : 0); result = 31 * result + (endDate != null ? endDate.hashCode() : 0); result = 31 * result + (amount != null ? amount.hashCode() : 0); result = 31 * result + (rate != null ? rate.hashCode() : 0); result = 31 * result + (currency != null ? currency.hashCode() : 0); result = 31 * result + (linkedItemId != null ? linkedItemId.hashCode() : 0); result = 31 * result + (quantity != null ? quantity.hashCode() : 0); result = 31 * result + (itemDetails != null ? itemDetails.hashCode() : 0); return result; }
@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; } };
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 int hashCode() { int result = id != null ? id.hashCode() : 0; result = 31 * result + (invoiceItemType != null ? invoiceItemType.hashCode() : 0); result = 31 * result + (invoiceId != null ? invoiceId.hashCode() : 0); result = 31 * result + (accountId != null ? accountId.hashCode() : 0); result = 31 * result + (childAccountId != null ? childAccountId.hashCode() : 0); result = 31 * result + (startDate != null ? startDate.hashCode() : 0); result = 31 * result + (endDate != null ? endDate.hashCode() : 0); result = 31 * result + (amount != null ? amount.hashCode() : 0); result = 31 * result + (currency != null ? currency.hashCode() : 0); result = 31 * result + (description != null ? description.hashCode() : 0); result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0); result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0); result = 31 * result + (planName != null ? planName.hashCode() : 0); result = 31 * result + (prettyPlanName != null ? prettyPlanName.hashCode() : 0); result = 31 * result + (phaseName != null ? phaseName.hashCode() : 0); result = 31 * result + (prettyPhaseName != null ? prettyPhaseName.hashCode() : 0); result = 31 * result + (rate != null ? rate.hashCode() : 0); result = 31 * result + (linkedItemId != null ? linkedItemId.hashCode() : 0); result = 31 * result + (usageName != null ? usageName.hashCode() : 0); result = 31 * result + (prettyUsageName != null ? prettyUsageName.hashCode() : 0); result = 31 * result + (quantity != null ? quantity.hashCode() : 0); result = 31 * result + (itemDetails != null ? itemDetails.hashCode() : 0); result = 31 * result + (createdDate != null ? createdDate.hashCode() : 0); result = 31 * result + (updatedDate != null ? updatedDate.hashCode() : 0); return result; } }
@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); }
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 boolean apply(final InvoiceItem input) { return InvoiceItemType.RECURRING.equals(input.getInvoiceItemType()); } });
@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;