killbill-aplcache

Details

diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index e20ffeb..c0539a9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -234,19 +234,12 @@ public class DefaultInvoiceDao implements InvoiceDao {
         return invoiceSqlDao.inTransaction(new Transaction<BigDecimal, InvoiceSqlDao>() {
             @Override
             public BigDecimal inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
-
-                BigDecimal cba = BigDecimal.ZERO;
-                List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, transactional);
-                for (Invoice cur : invoices) {
-                    cba = cba.add(cur.getCBAAmount());
-                }
-                return cba;
+                return getAccountCBAFromTransaction(accountId, transactional);
             }
         });
     }
 
 
-
     @Override
     public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
         invoicePaymentSqlDao.inTransaction(new Transaction<Void, InvoicePaymentSqlDao>() {
@@ -327,6 +320,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
                     throw new InvoiceApiException(ErrorCode.REFUND_AMOUNT_TOO_HIGH, requestedPositiveAmount, maxRefundAmount);
                 }
 
+
                 final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.REFUND, paymentAttemptId,
                         payment.getInvoiceId(), context.getCreatedDate(), requestedPositiveAmount.negate(), payment.getCurrency(), payment.getId());
                 transactional.create(refund, context);
@@ -342,10 +336,11 @@ public class DefaultInvoiceDao implements InvoiceDao {
                 InvoiceItemSqlDao transInvoiceItemDao = transInvoiceDao.become(InvoiceItemSqlDao.class);
 
                 // If we have an existing CBA > 0, we need to adjust it
-                final BigDecimal cbaAmountAfterRefund = invoice.getCBAAmount();
+                //final BigDecimal cbaAmountAfterRefund = invoice.getCBAAmount();
+                final BigDecimal accountCbaAvailable = getAccountCBAFromTransaction(invoice.getAccountId(), transInvoiceDao);
                 BigDecimal cbaAdjAmount = BigDecimal.ZERO;
-                if (cbaAmountAfterRefund.compareTo(BigDecimal.ZERO) > 0) {
-                    cbaAdjAmount = (requestedPositiveAmount.compareTo(cbaAmountAfterRefund) > 0) ?  cbaAmountAfterRefund.negate() : requestedPositiveAmount.negate();
+                if (accountCbaAvailable.compareTo(BigDecimal.ZERO) > 0) {
+                    cbaAdjAmount = (requestedPositiveAmount.compareTo(accountCbaAvailable) > 0) ?  accountCbaAvailable.negate() : requestedPositiveAmount.negate();
                     final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate(), cbaAdjAmount, invoice.getCurrency());
                     transInvoiceItemDao.create(cbaAdjItem, context);
                 }
@@ -462,6 +457,16 @@ public class DefaultInvoiceDao implements InvoiceDao {
         invoiceSqlDao.test();
     }
 
+    private BigDecimal getAccountCBAFromTransaction(final UUID accountId, final InvoiceSqlDao transactional) {
+        BigDecimal cba = BigDecimal.ZERO;
+        List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, transactional);
+        for (Invoice cur : invoices) {
+            cba = cba.add(cur.getCBAAmount());
+        }
+        return cba;
+    }
+
+
     private void populateChildren(final Invoice invoice, final InvoiceSqlDao invoiceSqlDao) {
         getInvoiceItemsWithinTransaction(invoice, invoiceSqlDao);
         getInvoicePaymentsWithinTransaction(invoice, invoiceSqlDao);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index df254de..3de924b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -114,23 +114,5 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
             return new DefaultInvoice(id, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
         }
     }
-
-    public static class BalanceMapper implements ResultSetMapper<BigDecimal> {
-        @Override
-        public BigDecimal map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
-            BigDecimal amountInvoiced = result.getBigDecimal("amount_invoiced");
-            BigDecimal amountPaid = result.getBigDecimal("amount_paid");
-
-            if (amountInvoiced == null) {
-                amountInvoiced = BigDecimal.ZERO;
-            }
-
-            if (amountPaid == null) {
-                amountPaid = BigDecimal.ZERO;
-            }
-
-            return amountInvoiced.subtract(amountPaid);
-        }
-    }
 }