From d491768b5e11a82f97eeb6dfb993261a23b8c550 Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Meyer Date: Thu, 4 Feb 2016 06:51:40 -0800 Subject: [PATCH] payment: make amounts use processed values This fixes https://github.com/killbill/killbill/issues/482. Signed-off-by: Pierre-Alexandre Meyer --- .../billing/payment/api/DefaultPayment.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPayment.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPayment.java index f6c86e6d6b..14e7ab0149 100644 --- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPayment.java +++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPayment.java @@ -72,21 +72,26 @@ public boolean apply(final PaymentTransaction input) { private static BigDecimal getAmountForType(final Iterable transactions, final TransactionType transactiontype) { BigDecimal result = BigDecimal.ZERO; - final Iterable filtered = Iterables.filter(transactions, new Predicate() { - @Override - public boolean apply(final PaymentTransaction input) { - return input.getTransactionType() == transactiontype && TransactionStatus.SUCCESS.equals(input.getTransactionStatus()); + BigDecimal processedResult = BigDecimal.ZERO; + boolean shouldUseProcessedAmount = true; + + for (final PaymentTransaction transaction : transactions) { + if (transaction.getTransactionType() != transactiontype || !TransactionStatus.SUCCESS.equals(transaction.getTransactionStatus())) { + continue; } - }); - if (TransactionType.AUTHORIZE.equals(transactiontype) && filtered.iterator().hasNext()) { - // HACK - For multi-step AUTH, don't sum the individual transactions - result = filtered.iterator().next().getAmount(); - } else { - for (final PaymentTransaction dpt : filtered) { - result = result.add(dpt.getAmount()); + + result = result.add(transaction.getAmount()); + + shouldUseProcessedAmount = shouldUseProcessedAmount && transaction.getCurrency().equals(transaction.getProcessedCurrency()) && transaction.getProcessedAmount() != null; + processedResult = shouldUseProcessedAmount ? processedResult.add(transaction.getProcessedAmount()) : BigDecimal.ZERO; + + // For multi-step AUTH, don't sum the individual transactions + if (TransactionType.AUTHORIZE.equals(transactiontype)) { + break; } } - return result; + + return shouldUseProcessedAmount ? processedResult : result; } @Override