killbill-memoizeit

Details

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 f6c86e6..14e7ab0 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 class DefaultPayment extends EntityBase implements Payment {
 
     private static BigDecimal getAmountForType(final Iterable<PaymentTransaction> transactions, final TransactionType transactiontype) {
         BigDecimal result = BigDecimal.ZERO;
-        final Iterable<PaymentTransaction> filtered = Iterables.filter(transactions, new Predicate<PaymentTransaction>() {
-            @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