killbill-uncached

account balance phase 1

12/19/2011 7:44:06 PM

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
index b2ce15c..1c7a397 100644
--- a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.account.api;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 import org.joda.time.DateTime;
@@ -37,22 +38,24 @@ public class DefaultAccount extends CustomizableEntityBase implements Account {
     private final Currency currency;
     private final int billCycleDay;
     private final String paymentProviderName;
+    private final BigDecimal balance;
     private final DefaultTagStore tags;
 
     public DefaultAccount(AccountData data) {
         this(UUID.randomUUID(), data.getExternalKey(), data.getEmail(), data.getName(),
                 data.getFirstNameLength(), data.getPhone(), data.getCurrency(), data.getBillCycleDay(),
-                data.getPaymentProviderName());
+                data.getPaymentProviderName(), BigDecimal.ZERO);
     }
 
     public DefaultAccount(UUID id, AccountData data) {
         this(id, data.getExternalKey(), data.getEmail(), data.getName(),
                 data.getFirstNameLength(), data.getPhone(), data.getCurrency(), data.getBillCycleDay(),
-                data.getPaymentProviderName());
+                data.getPaymentProviderName(), BigDecimal.ZERO);
     }
 
     public DefaultAccount(UUID id, String externalKey, String email, String name, int firstNameLength,
-                          String phone, Currency currency, int billCycleDay, String paymentProviderName) {
+                          String phone, Currency currency, int billCycleDay, String paymentProviderName,
+                          BigDecimal balance) {
         super(id);
         this.externalKey = externalKey;
         this.email = email;
@@ -62,6 +65,7 @@ public class DefaultAccount extends CustomizableEntityBase implements Account {
         this.currency = currency;
         this.billCycleDay = billCycleDay;
         this.paymentProviderName = paymentProviderName;
+        this.balance = balance;
 
         this.tags = new DefaultTagStore(id, getObjectName());
     }
@@ -151,4 +155,9 @@ public class DefaultAccount extends CustomizableEntityBase implements Account {
     public boolean processPayment() {
         return tags.processPayment();
     }
+
+    @Override
+    public BigDecimal getBalance() {
+        return balance;
+    }
 }
diff --git a/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java b/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java
index 873b690..e05e967 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java
@@ -19,6 +19,7 @@ package com.ning.billing.account.api.user;
 import com.ning.billing.account.api.DefaultAccount;
 import com.ning.billing.catalog.api.Currency;
 
+import java.math.BigDecimal;
 import java.util.UUID;
 
 public class AccountBuilder {
@@ -31,6 +32,7 @@ public class AccountBuilder {
     private Currency currency;
     private int billingCycleDay;
     private String paymentProviderName;
+    private BigDecimal balance;
 
     public AccountBuilder() {
         this(UUID.randomUUID());
@@ -80,7 +82,13 @@ public class AccountBuilder {
         return this;
     }
 
+    public AccountBuilder balance(BigDecimal balance) {
+        this.balance = balance;
+        return this;
+    }
+
     public DefaultAccount build() {
-        return new DefaultAccount(id, externalKey, email, name, firstNameLength, phone, currency, billingCycleDay, paymentProviderName);
+        return new DefaultAccount(id, externalKey, email, name, firstNameLength,
+                                  phone, currency, billingCycleDay, paymentProviderName, balance);
     }
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java b/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java
index 2676753..862071d 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java
@@ -40,6 +40,7 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import java.math.BigDecimal;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.UUID;
@@ -69,12 +70,15 @@ public interface AccountSqlDao extends EntityDao<Account>, Transactional<Account
             int billingCycleDay = result.getInt("billing_cycle_day");
             Currency currency = Currency.valueOf(result.getString("currency"));
             String paymentProviderName = result.getString("payment_provider_name");
+            BigDecimal balance = result.getBigDecimal("balance");
 
             return new AccountBuilder(id).externalKey(externalKey).email(email)
                                          .name(name).firstNameLength(firstNameLength)
                                          .phone(phone).currency(currency)
                                          .billingCycleDay(billingCycleDay)
-                                         .paymentProviderName(paymentProviderName).build();
+                                         .paymentProviderName(paymentProviderName)
+                                         .balance(balance)
+                                         .build();
         }
     }
 
diff --git a/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg b/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg
index b92dcd9..ecf866c 100644
--- a/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg
+++ b/account/src/main/resources/com/ning/billing/account/dao/AccountSqlDao.sql.stg
@@ -17,9 +17,14 @@ getAccountByKey() ::= <<
 >>
 
 getById() ::= <<
-    select id, external_key, email, name, first_name_length, phone, currency, billing_cycle_day, payment_provider_name
-    from accounts
-    where id = :id;
+    select
+      a.id, a.external_key, a.email, a.name, a.first_name_length,
+      a.phone, a.currency, a.billing_cycle_day, a.payment_provider_name
+    from accounts a
+      left join invoices i on i.account_id = a.id
+      left join invoice_items ii on ii.invoice_id = i.id
+      left join invoice_payments ip ON ip.invoice_id = i.id
+    where a.id = :id;
 >>
 
 get() ::= <<
diff --git a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
index c565e59..70ea6e7 100644
--- a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
+++ b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
@@ -40,8 +40,11 @@ public abstract class AccountDaoTestBase {
         // Healthcheck test to make sure MySQL is setup properly
         try {
             AccountModuleMock module = new AccountModuleMock();
-            final String ddl = IOUtils.toString(AccountSqlDao.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
-            module.createDb(ddl);
+            final String accountDdl = IOUtils.toString(AccountSqlDao.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
+            final String invoiceDdl = IOUtils.toString(AccountSqlDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
+            module.startDb();
+            module.initDb(accountDdl);
+            module.initDb(invoiceDdl);
 
             final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
             dbi = injector.getInstance(IDBI.class);
diff --git a/account/src/test/java/com/ning/billing/account/glue/AccountModuleMock.java b/account/src/test/java/com/ning/billing/account/glue/AccountModuleMock.java
index 54a761e..33330eb 100644
--- a/account/src/test/java/com/ning/billing/account/glue/AccountModuleMock.java
+++ b/account/src/test/java/com/ning/billing/account/glue/AccountModuleMock.java
@@ -25,8 +25,11 @@ import java.io.IOException;
 public class AccountModuleMock extends AccountModule {
     private final MysqlTestingHelper helper = new MysqlTestingHelper();
 
-    public void createDb(String ddl) throws IOException {
+    public void startDb() throws IOException {
         helper.startMysql();
+    }
+
+    public void initDb(String ddl) throws IOException {
         helper.initDb(ddl);
     }
 
diff --git a/api/src/main/java/com/ning/billing/account/api/Account.java b/api/src/main/java/com/ning/billing/account/api/Account.java
index 1cc9aa9..543f280 100644
--- a/api/src/main/java/com/ning/billing/account/api/Account.java
+++ b/api/src/main/java/com/ning/billing/account/api/Account.java
@@ -16,9 +16,10 @@
 
 package com.ning.billing.account.api;
 
+import java.math.BigDecimal;
 import com.ning.billing.util.customfield.CustomizableEntity;
 import com.ning.billing.util.tag.Taggable;
 
 public interface Account extends AccountData, CustomizableEntity, Taggable {
-
+    public BigDecimal getBalance();
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
index b9bddb8..13d7dcc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
@@ -30,7 +30,6 @@ import static org.testng.Assert.fail;
 
 public abstract class InvoiceDaoTestBase {
     protected InvoiceDao invoiceDao;
-    protected InvoiceItemSqlDao invoiceItemDao;
 
     @BeforeClass()
     protected void setup() throws IOException {
@@ -45,9 +44,6 @@ public abstract class InvoiceDaoTestBase {
             invoiceDao = injector.getInstance(InvoiceDao.class);
             invoiceDao.test();
 
-            invoiceItemDao = injector.getInstance(InvoiceItemSqlDao.class);
-            invoiceItemDao.test();
-
             EventBusService busService = injector.getInstance(EventBusService.class);
             ((DefaultEventBusService) busService).startBus();
         }