killbill-uncached

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 573b215..99c2204 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
@@ -18,6 +18,8 @@ package com.ning.billing.invoice.dao;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
 
@@ -26,6 +28,9 @@ import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.Transaction;
 import org.skife.jdbi.v2.TransactionStatus;
 
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.Currency;
@@ -72,9 +77,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
             @Override
             public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
                 final List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId.toString());
-
                 populateChildren(invoices, invoiceDao);
-
                 return invoices;
             }
         });
@@ -85,11 +88,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
         return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
             @Override
             public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
-                final List<Invoice> invoices = invoiceDao.getAllInvoicesByAccount(accountId.toString());
-
-                populateChildren(invoices, invoiceDao);
-
-                return invoices;
+                return getAllInvoicesByAccountFromTransaction(accountId, invoiceDao);
             }
         });
     }
@@ -205,9 +204,28 @@ public class DefaultInvoiceDao implements InvoiceDao {
 
     @Override
     public BigDecimal getAccountBalance(final UUID accountId) {
-        return invoiceSqlDao.getAccountBalance(accountId.toString());
+
+        return invoiceSqlDao.inTransaction(new Transaction<BigDecimal, InvoiceSqlDao>() {
+            @Override
+            public BigDecimal inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+
+                BigDecimal accountBalance = BigDecimal.ZERO;
+                List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, transactional);
+                List<InvoiceItem> creditBalanceItems = new LinkedList<InvoiceItem>();
+                for (Invoice cur : invoices) {
+                    accountBalance = accountBalance.add(cur.getBalance());
+                    creditBalanceItems.addAll(cur.getInvoiceItems(CreditBalanceAdjInvoiceItem.class));
+                }
+                BigDecimal cbaTotal = BigDecimal.ZERO;
+                for (InvoiceItem cur : creditBalanceItems) {
+                    cbaTotal = cbaTotal.add(cur.getAmount());
+                }
+                return accountBalance.add(cbaTotal.negate());
+            }
+        });
     }
 
+
     @Override
     public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
         invoicePaymentSqlDao.inTransaction(new Transaction<Void, InvoicePaymentSqlDao>() {
@@ -230,11 +248,16 @@ public class DefaultInvoiceDao implements InvoiceDao {
         return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
             @Override
             public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
-                final List<Invoice> invoices = invoiceSqlDao.getUnpaidInvoicesByAccountId(accountId.toString(), upToDate.toDate());
-
-                populateChildren(invoices, invoiceDao);
 
-                return invoices;
+                List<Invoice> invoices = getAllInvoicesByAccountFromTransaction(accountId, invoiceDao);
+                Collection<Invoice> unpaidInvoices = Collections2.filter(invoices, new Predicate<Invoice>() {
+                    @Override
+                    public boolean apply(Invoice in) {
+                        // STEPH do we really want to exclude migration invoice
+                        return (!in.isMigrationInvoice() && in.getBalance().compareTo(BigDecimal.ZERO) >= 1);
+                    }
+                });
+                return new ArrayList<Invoice>(unpaidInvoices);
             }
         });
     }
@@ -351,6 +374,13 @@ public class DefaultInvoiceDao implements InvoiceDao {
         getInvoicePaymentsWithinTransaction(invoices, invoiceSqlDao);
     }
 
+    private List<Invoice> getAllInvoicesByAccountFromTransaction(final UUID accountId, final InvoiceSqlDao transactional) {
+        final List<Invoice> invoices = transactional.getAllInvoicesByAccount(accountId.toString());
+        populateChildren(invoices, transactional);
+        return invoices;
+    }
+
+
     private void getInvoiceItemsWithinTransaction(final List<Invoice> invoices, final InvoiceSqlDao invoiceDao) {
         for (final Invoice invoice : invoices) {
             getInvoiceItemsWithinTransaction(invoice, invoiceDao);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
index 8b12f8d..ab817b5 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -63,9 +63,11 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
     @SqlQuery
     public InvoicePayment getByPaymentAttemptId(@Bind("paymentAttempt") final String paymentAttemptId);
 
+    @Override
     @SqlQuery
     public List<InvoicePayment> get();
 
+    @Override
     @SqlUpdate
     public void create(@InvoicePaymentBinder final InvoicePayment invoicePayment,
                        @CallContextBinder final CallContext context);
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 21fe8d5..df254de 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
@@ -77,13 +77,6 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
     @RegisterMapper(UuidMapper.class)
     UUID getInvoiceIdByPaymentAttemptId(@Bind("paymentAttemptId") final String paymentAttemptId);
 
-    @SqlQuery
-    @RegisterMapper(BalanceMapper.class)
-    BigDecimal getAccountBalance(@Bind("accountId") final String accountId);
-
-    @SqlQuery
-    List<Invoice> getUnpaidInvoicesByAccountId(@Bind("accountId") final String accountId,
-                                               @Bind("upToDate") final Date upToDate);
 
     @BindingAnnotation(InvoiceBinder.InvoiceBinderFactory.class)
     @Retention(RetentionPolicy.RUNTIME)
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index c636ada..7c2bae1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -185,6 +185,7 @@ public class DefaultInvoice extends EntityBase implements Invoice {
     @Override
     public BigDecimal getBalance() {
         // credits offset payments
+        // STEPH fix that
         return getAmountCharged().subtract(getAmountPaid().subtract(getAmountCredited()));
     }
 
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
index 8c8a3a2..90e66bc 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -41,17 +41,9 @@ getInvoicesByAccountAfterDate() ::= <<
 getInvoicesBySubscription() ::= <<
   SELECT i.record_id as invoice_number, <invoiceFields("i.")>
   FROM invoices i
-  LEFT JOIN recurring_invoice_items rii ON i.id = rii.invoice_id
+  LEFT JOIN invoice_items rii ON i.id = rii.invoice_id
   WHERE rii.subscription_id = :subscriptionId AND migrated = 'FALSE'
   GROUP BY i.record_id, <invoiceFields("i.")>
-
-  UNION ALL
-
-  SELECT i.record_id as invoice_number, <invoiceFields("i.")>
-  FROM invoices i
-  LEFT JOIN fixed_invoice_items fii ON i.id = fii.invoice_id
-  WHERE fii.subscription_id = :subscriptionId AND migrated = 'FALSE'
-  GROUP BY i.record_id, <invoiceFields("i.")>;
 >>
 
 getById() ::= <<
@@ -60,16 +52,6 @@ getById() ::= <<
   WHERE id = :id;
 >>
 
-getAccountBalance() ::= <<
-  SELECT SUM(iis.amount_invoiced) AS amount_invoiced,
-         SUM(ips.total_paid) AS amount_paid
-  FROM invoices i
-  LEFT JOIN invoice_payment_summary ips ON i.id = ips.invoice_id
-  LEFT JOIN invoice_item_summary iis ON i.id = iis.invoice_id
-  WHERE i.account_id = :accountId
-  GROUP BY i.account_id;
->>
-
 create() ::= <<
   INSERT INTO invoices(<invoiceFields()>)
   VALUES (:id, :accountId, :invoiceDate, :targetDate, :currency, :migrated, :userName, :createdDate);
@@ -82,17 +64,6 @@ getInvoiceIdByPaymentAttemptId() ::= <<
      AND ip.payment_attempt_id = :paymentAttemptId
 >>
 
-getUnpaidInvoicesByAccountId() ::= <<
-  SELECT record_id as invoice_number, <invoiceFields("i.")>
-  FROM invoices i
-  LEFT JOIN invoice_payment_summary ips ON i.id = ips.invoice_id
-  LEFT JOIN invoice_item_summary iis ON i.id = iis.invoice_id
-  WHERE i.account_id = :accountId AND NOT (i.target_date > :upToDate) AND migrated = 'FALSE'
-  GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
-  HAVING (SUM(iis.amount_invoiced) > SUM(ips.total_paid)) OR (SUM(ips.total_paid) IS NULL)
-  AND SUM(iis.amount_invoiced) > 0
-  ORDER BY i.target_date ASC;
->>
 
 getRecordId() ::= <<
     SELECT record_id
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index c44a63a..e0d25dc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -16,21 +16,24 @@
 
 package com.ning.billing.invoice.api.migration;
 
-import static org.testng.Assert.assertNotNull;
-
-import java.io.IOException;
 import java.math.BigDecimal;
-import java.net.URL;
 import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.skife.jdbi.v2.Handle;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.TransactionCallback;
+import org.skife.jdbi.v2.TransactionStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterSuite;
 import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
@@ -111,14 +114,32 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
     private UUID migrationInvoiceId;
     private UUID regularInvoiceId;
 
+    private IDBI dbi;
+
+
     private static final BigDecimal MIGRATION_INVOICE_AMOUNT = new BigDecimal("100.00");
     private static final Currency MIGRATION_INVOICE_CURRENCY = Currency.USD;
 
     private final Clock clock = new ClockMock();
 
+    //@BeforeTest(groups = {"slow"})
+    public void cleanup() {
+        if (dbi !=  null) {
+            dbi.inTransaction(new TransactionCallback<Void>() {
+                @Override
+                public Void inTransaction(final Handle h, final TransactionStatus status)
+                throws Exception {
+                    h.execute("truncate table invoices");
+                    h.execute("truncate table invoice_items");
+                    h.execute("truncate table invoice_payments");
+                    return null;
+                }
+            });
+        }
+    }
 
 
-    @BeforeClass(groups = {"slow"})
+    @BeforeSuite(groups = {"slow"})
     public void setup() throws Exception {
         log.info("Starting set up");
         accountId = UUID.randomUUID();
@@ -133,7 +154,8 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
 
         helper.initDb(invoiceDdl);
         helper.initDb(utilDdl);
-
+        dbi = helper.getDBI();
+        cleanup();
         busService.getBus().start();
 
         ((ZombieControl) billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
@@ -142,7 +164,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
 
     }
 
-    @AfterClass(groups = {"slow"})
+    @AfterSuite(groups = {"slow"})
     public void tearDown() {
         try {
             ((DefaultBusService) busService).stopBus();