killbill-aplcache

Details

diff --git a/api/src/main/java/com/ning/billing/payment/api/Payment.java b/api/src/main/java/com/ning/billing/payment/api/Payment.java
index 9171213..e64d92e 100644
--- a/api/src/main/java/com/ning/billing/payment/api/Payment.java
+++ b/api/src/main/java/com/ning/billing/payment/api/Payment.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -37,6 +37,8 @@ public interface Payment {
 
     public BigDecimal getAmount();
 
+    public BigDecimal getPaidAmount();
+
     public DateTime getEffectiveDate();
 
     public Currency getCurrency();
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
index 789ccc3..866f64d 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
@@ -109,8 +109,7 @@ public class AccountTimelineJson {
         for (final Payment cur : payments) {
 
             final String status = cur.getPaymentStatus().toString();
-            final BigDecimal paidAmount = cur.getPaymentStatus() == PaymentStatus.SUCCESS ? cur.getAmount() : BigDecimal.ZERO;
-            this.payments.add(new PaymentJsonWithBundleKeys(cur.getAmount(), paidAmount, account.getId().toString(),
+            this.payments.add(new PaymentJsonWithBundleKeys(cur.getAmount(), cur.getPaidAmount(), account.getId().toString(),
                                                             cur.getInvoiceId().toString(), cur.getId().toString(),
                                                             cur.getEffectiveDate(), cur.getEffectiveDate(),
                                                             cur.getAttempts().size(), cur.getCurrency().toString(), status,
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
index a74e005..a075425 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
@@ -86,7 +86,7 @@ public class PaymentJsonSimple {
 
     public PaymentJsonSimple(final Payment src) {
         this.amount = src.getAmount();
-        this.paidAmount =  src.getPaymentStatus() == PaymentStatus.SUCCESS ?  src.getAmount() : BigDecimal.ZERO;
+        this.paidAmount =  src.getPaidAmount();
         this.invoiceId = src.getInvoiceId().toString();
         this.accountId = src.getAccountId().toString();
         this.paymentId = src.getId().toString();
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
index c206d8e..8bb07fd 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -28,6 +28,8 @@ import com.google.common.collect.Collections2;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.payment.dao.PaymentAttemptModelDao;
 import com.ning.billing.payment.dao.PaymentModelDao;
+import com.ning.billing.payment.dao.RefundModelDao;
+import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
 import com.ning.billing.util.entity.EntityBase;
 
 public class DefaultPayment extends EntityBase implements Payment {
@@ -37,6 +39,7 @@ public class DefaultPayment extends EntityBase implements Payment {
     private final UUID invoiceId;
     private final UUID paymentMethodId;
     private final BigDecimal amount;
+    private final BigDecimal paidAmount;
     private final Currency currency;
     private final DateTime effectiveDate;
     private final Integer paymentNumber;
@@ -45,7 +48,7 @@ public class DefaultPayment extends EntityBase implements Payment {
 
 
     private DefaultPayment(final UUID id, final UUID accountId, final UUID invoiceId,
-                           final UUID paymentMethodId, final BigDecimal amount, final Currency currency,
+                           final UUID paymentMethodId, final BigDecimal amount, BigDecimal paidAmount, final Currency currency,
                            final DateTime effectiveDate, final Integer paymentNumber,
                            final PaymentStatus paymentStatus, final String paymentError, final List<PaymentAttempt> attempts) {
         super(id);
@@ -53,6 +56,7 @@ public class DefaultPayment extends EntityBase implements Payment {
         this.invoiceId = invoiceId;
         this.paymentMethodId = paymentMethodId;
         this.amount = amount;
+        this.paidAmount = paidAmount;
         this.currency = currency;
         this.effectiveDate = effectiveDate;
         this.paymentNumber = paymentNumber;
@@ -60,12 +64,13 @@ public class DefaultPayment extends EntityBase implements Payment {
         this.attempts = attempts;
     }
 
-    public DefaultPayment(final PaymentModelDao src, final List<PaymentAttemptModelDao> attempts) {
+    public DefaultPayment(final PaymentModelDao src, final List<PaymentAttemptModelDao> attempts, final List<RefundModelDao> refunds) {
         this(src.getId(),
              src.getAccountId(),
              src.getInvoiceId(),
              src.getPaymentMethodId(),
              src.getAmount(),
+             toPaidAmount(src.getPaymentStatus(), src.getAmount(), refunds),
              src.getCurrency(),
              src.getEffectiveDate(),
              src.getPaymentNumber(),
@@ -101,6 +106,11 @@ public class DefaultPayment extends EntityBase implements Payment {
     }
 
     @Override
+    public BigDecimal getPaidAmount() {
+        return paidAmount;
+    }
+
+    @Override
     public DateTime getEffectiveDate() {
         return effectiveDate;
     }
@@ -121,6 +131,21 @@ public class DefaultPayment extends EntityBase implements Payment {
         return attempts;
     }
 
+    private final static BigDecimal toPaidAmount(final PaymentStatus paymentStatus, final BigDecimal amount, final List<RefundModelDao> refunds) {
+
+        if (paymentStatus != PaymentStatus.SUCCESS) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal result = amount;
+        for (RefundModelDao cur : refunds) {
+            if (cur.getRefundStatus() != RefundStatus.CREATED) {
+                result = result.subtract(cur.getAmount());
+            }
+        }
+        return result;
+    }
+
     private static List<PaymentAttempt> toPaymentAttempts(final List<PaymentAttemptModelDao> attempts) {
         if (attempts == null || attempts.size() == 0) {
             return Collections.emptyList();
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index ae6e45e..b964bfd 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -51,6 +51,7 @@ import com.ning.billing.payment.dao.PaymentAttemptModelDao;
 import com.ning.billing.payment.dao.PaymentDao;
 import com.ning.billing.payment.dao.PaymentModelDao;
 import com.ning.billing.payment.dao.PaymentSqlDao;
+import com.ning.billing.payment.dao.RefundModelDao;
 import com.ning.billing.payment.dispatcher.PluginDispatcher;
 import com.ning.billing.payment.plugin.api.PaymentInfoPlugin;
 import com.ning.billing.payment.plugin.api.PaymentPluginApi;
@@ -143,7 +144,8 @@ public class PaymentProcessor extends ProcessorBase {
         final List<Payment> result = new LinkedList<Payment>();
         for (final PaymentModelDao cur : payments) {
             final List<PaymentAttemptModelDao> attempts = paymentDao.getAttemptsForPayment(cur.getId());
-            final Payment entry = new DefaultPayment(cur, attempts);
+            final List<RefundModelDao> refunds = paymentDao.getRefundsForPayment(cur.getId());
+            final Payment entry = new DefaultPayment(cur, attempts, refunds);
             result.add(entry);
         }
         return result;
@@ -408,7 +410,7 @@ public class PaymentProcessor extends ProcessorBase {
         final PaymentAttemptModelDao attempt = new PaymentAttemptModelDao(account.getId(), invoice.getId(), paymentInfo.getId(), paymentStatus, clock.getUTCNow(), requestedAmount);
 
         paymentDao.insertPaymentWithAttempt(paymentInfo, attempt, context);
-        return new DefaultPayment(paymentInfo, Collections.singletonList(attempt));
+        return new DefaultPayment(paymentInfo, Collections.singletonList(attempt), Collections.<RefundModelDao>emptyList());
     }
 
 
@@ -503,7 +505,7 @@ public class PaymentProcessor extends ProcessorBase {
                 postPaymentEvent(event, account.getId());
             }
         }
-        return new DefaultPayment(payment, allAttempts);
+        return new DefaultPayment(payment, allAttempts, Collections.<RefundModelDao>emptyList());
     }
 
     private PaymentStatus scheduleRetryOnPluginFailure(final UUID paymentId) {