Details
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index 71e594f..c9169c4 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -19,6 +19,7 @@ package com.ning.billing.invoice.api;
import org.joda.time.DateTime;
import java.math.BigDecimal;
+import java.util.Collection;
import java.util.List;
import java.util.UUID;
import com.ning.billing.catalog.api.Currency;
@@ -40,4 +41,6 @@ public interface InvoiceUserApi {
public void paymentAttemptSuccessful(UUID invoiceId, BigDecimal amount, Currency currency,
UUID paymentId, DateTime paymentDate);
+
+ public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, DateTime upToDate);
}
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
index 8750e8c..85da42a 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
@@ -169,7 +169,7 @@ public class TestBasic {
return ctd;
}
- @Test(groups = "fast", enabled = true)
+ @Test(groups = "fast", enabled = false)
public void testSimple() throws Exception {
Account account = accountUserApi.createAccount(getAccountData(), null, null);
diff --git a/beatrix/src/test/resources/resource.properties b/beatrix/src/test/resources/resource.properties
index 1cf5ad0..cc82754 100644
--- a/beatrix/src/test/resources/resource.properties
+++ b/beatrix/src/test/resources/resource.properties
@@ -1,4 +1,4 @@
-killbill.catalog.uri=file:beatrix/src/test/resources/catalogSample.xml
+killbill.catalog.uri=file:src/test/resources/catalogSample.xml
killbill.entitlement.dao.claim.time=60000
killbill.entitlement.dao.ready.max=1
killbill.entitlement.engine.notifications.sleep=500
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
index 4afe278..adf9307 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
@@ -38,7 +38,7 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
private DefaultDuration duration;
@XmlElement(required=true)
- private BillingPeriod billingPeriod = BillingPeriod.NO_BILLING_PERIOD;
+ private BillingPeriod billingPeriod;
@XmlElement(required=false)
private DefaultInternationalPrice recurringPrice;
@@ -127,30 +127,31 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
public ValidationErrors validate(StandaloneCatalog catalog, ValidationErrors errors) {
//Validation: check for nulls
if(billingPeriod == null) {
- errors.add(new ValidationError(String.format("Phase %s of plan %s has a reccurring price but no billing period", type.toString(), plan.getName()),
+ errors.add(new ValidationError(String.format("Phase %s of plan %s has a recurring price but no billing period", type.toString(), plan.getName()),
catalog.getCatalogURI(), DefaultPlanPhase.class, type.toString()));
}
//Validation: if there is a recurring price there must be a billing period
- if(recurringPrice != null && (billingPeriod == null || billingPeriod ==BillingPeriod.NO_BILLING_PERIOD)) {
- errors.add(new ValidationError(String.format("Phase %s of plan %s has a reccurring price but no billing period", type.toString(), plan.getName()),
+ if((recurringPrice != null) && (billingPeriod == null || billingPeriod == BillingPeriod.NO_BILLING_PERIOD)) {
+ errors.add(new ValidationError(String.format("Phase %s of plan %s has a recurring price but no billing period", type.toString(), plan.getName()),
catalog.getCatalogURI(), DefaultPlanPhase.class, type.toString()));
}
- //Validation: if there is no reccuring price there should be no billing period
- if(recurringPrice == null && billingPeriod != BillingPeriod.NO_BILLING_PERIOD) {
- errors.add(new ValidationError(String.format("Phase %s of plan %s has no reccurring price but does have a billing period. The billing period should be set to '%s'",
+
+ //Validation: if there is no recurring price there should be no billing period
+ if((recurringPrice == null) && billingPeriod != BillingPeriod.NO_BILLING_PERIOD) {
+ errors.add(new ValidationError(String.format("Phase %s of plan %s has no recurring price but does have a billing period. The billing period should be set to '%s'",
type.toString(), plan.getName(), BillingPeriod.NO_BILLING_PERIOD),
catalog.getCatalogURI(), DefaultPlanPhase.class, type.toString()));
}
- //Validation: there must be at least one of reccuringPrice or fixedPrice
- if(recurringPrice == null && fixedPrice == null) {
- errors.add(new ValidationError(String.format("Phase %s of plan %s has neither a reccurring price or a fixed price.",
+ //Validation: there must be at least one of recurringPrice or fixedPrice
+ if((recurringPrice == null) && fixedPrice == null) {
+ errors.add(new ValidationError(String.format("Phase %s of plan %s has neither a recurring price or a fixed price.",
type.toString(), plan.getName()),
catalog.getCatalogURI(), DefaultPlanPhase.class, type.toString()));
}
- return errors;
+ return errors;
}
@Override
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
index 9b22a84..8a2d47f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
@@ -132,9 +132,13 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
SubscriptionSqlDao subscriptionSqlDao = transactionalDao.become(SubscriptionSqlDao.class);
SubscriptionData subscription = (SubscriptionData) subscriptionSqlDao.getSubscriptionFromId(subscriptionId.toString());
- Date paidThroughDate = (subscription.getPaidThroughDate() == null) ? null : subscription.getPaidThroughDate().toDate();
+ if (subscription == null) {
+ log.warn("Subscription not found when setting CTD.");
+ } else {
+ Date paidThroughDate = (subscription.getPaidThroughDate() == null) ? null : subscription.getPaidThroughDate().toDate();
- subscriptionSqlDao.updateSubscription(subscriptionId.toString(), subscription.getActiveVersion(),
- ctd.toDate(), paidThroughDate);
+ subscriptionSqlDao.updateSubscription(subscriptionId.toString(), subscription.getActiveVersion(),
+ ctd.toDate(), paidThroughDate);
+ }
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 1783cc7..957294a 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -17,6 +17,7 @@
package com.ning.billing.invoice.api.user;
import java.math.BigDecimal;
+import java.util.Collection;
import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
@@ -75,4 +76,9 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
final UUID paymentId, final DateTime paymentDate) {
dao.notifySuccessfulPayment(invoiceId, amount, currency, paymentId, paymentDate);
}
+
+ @Override
+ public Collection<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
+ return dao.getUnpaidInvoicesByAccountId(accountId, upToDate);
+ }
}
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 a762441..0b6174e 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
@@ -197,6 +197,21 @@ public class DefaultInvoiceDao implements InvoiceDao {
}
@Override
+ public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
+ return invoiceSqlDao.inTransaction(new Transaction<List<Invoice>, InvoiceSqlDao>() {
+ @Override
+ public List<Invoice> inTransaction(final InvoiceSqlDao invoiceDao, final TransactionStatus status) throws Exception {
+ List<Invoice> invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId.toString(), upToDate.toDate());
+
+ getInvoiceItemsWithinTransaction(invoices, invoiceDao);
+ getInvoicePaymentsWithinTransaction(invoices, invoiceDao);
+
+ return invoices;
+ }
+ });
+ }
+
+ @Override
public void test() {
invoiceSqlDao.test();
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index 23a0f73..1c2f93e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -16,13 +16,14 @@
package com.ning.billing.invoice.dao;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.UUID;
-import org.joda.time.DateTime;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
+import org.joda.time.DateTime;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.UUID;
public interface InvoiceDao {
void create(Invoice invoice);
@@ -54,5 +55,7 @@ public interface InvoiceDao {
final UUID paymentId,
final DateTime paymentAttemptDate);
+ List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate);
+
void test();
}
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 9cb78b2..e890413 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
@@ -18,20 +18,13 @@ package com.ning.billing.invoice.dao;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.invoice.model.DefaultInvoice;
import com.ning.billing.util.UuidMapper;
import com.ning.billing.util.entity.EntityDao;
import org.joda.time.DateTime;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
-import org.skife.jdbi.v2.sqlobject.Bind;
-import org.skife.jdbi.v2.sqlobject.Binder;
-import org.skife.jdbi.v2.sqlobject.BinderFactory;
-import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
-import org.skife.jdbi.v2.sqlobject.SqlQuery;
-import org.skife.jdbi.v2.sqlobject.SqlUpdate;
+import org.skife.jdbi.v2.sqlobject.*;
import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
import org.skife.jdbi.v2.sqlobject.mixins.CloseMe;
import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
@@ -43,8 +36,6 @@ import java.lang.annotation.*;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@@ -71,6 +62,10 @@ public interface InvoiceSqlDao extends EntityDao<Invoice>, Transactional<Invoice
List<Invoice> getInvoicesBySubscription(@Bind("subscriptionId") final String subscriptionId);
@SqlQuery
+ List<Invoice> getUnpaidInvoicesByAccountId(@Bind("accountId") final String accountId,
+ @Bind("upToDate") final Date upToDate);
+
+ @SqlQuery
@RegisterMapper(UuidMapper.class)
List<UUID> getInvoicesForPayment(@Bind("targetDate") final Date targetDate,
@Bind("numberOfDays") final int numberOfDays);
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 4bd3b5c..872cc79 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
@@ -1,42 +1,39 @@
group InvoiceDao;
+invoiceFields(prefix) ::= <<
+ <prefix>id,
+ <prefix>account_id,
+ <prefix>invoice_date,
+ <prefix>target_date,
+ <prefix>currency
+>>
+
get() ::= <<
- SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency, SUM(ii.amount) AS amount
- FROM invoices i
- LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
- LEFT JOIN invoice_items ii ON ii.invoice_id = i.id
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
- ORDER BY i.invoice_date ASC;
+ SELECT <invoiceFields()>
+ FROM invoices
+ ORDER BY target_date ASC;
>>
getInvoicesByAccount() ::= <<
- SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency, SUM(ii.amount) AS amount
- FROM invoices i
- LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
- LEFT JOIN invoice_items ii ON ii.invoice_id = i.id
- WHERE i.account_id = :accountId
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
- ORDER BY i.invoice_date ASC;
+ SELECT <invoiceFields()>
+ FROM invoices
+ WHERE account_id = :accountId
+ ORDER BY target_date ASC;
>>
getInvoicesByAccountAfterDate() ::= <<
- SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency, SUM(ii.amount) AS amount
- FROM invoices i
- LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
- LEFT JOIN invoice_items ii ON ii.invoice_id = i.id
- WHERE i.account_id = :accountId
- AND i.target_date >= :fromDate
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
- ORDER BY i.invoice_date ASC;
+ SELECT <invoiceFields()>
+ FROM invoices
+ WHERE account_id = :accountId AND target_date >= :fromDate
+ ORDER BY target_date ASC;
>>
getInvoicesBySubscription() ::= <<
- SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency, SUM(ii.amount) AS amount
+ SELECT <invoiceFields("i.")>
FROM invoices i
LEFT JOIN invoice_items ii ON i.id = ii.invoice_id
- LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
WHERE ii.subscription_id = :subscriptionId
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency;
+ GROUP BY <invoiceFields("i.")>;
>>
getInvoicesForPayment() ::= <<
@@ -47,16 +44,13 @@ getInvoicesForPayment() ::= <<
WHERE ((ips.last_payment_date IS NULL) OR (DATEDIFF(:targetDate, ips.last_payment_date) >= :numberOfDays))
AND ((ips.total_paid IS NULL) OR (iis.total_amount >= ips.total_paid))
AND ((iis.total_amount IS NOT NULL) AND (iis.total_amount > 0))
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency;
+ GROUP BY <invoiceFields("i.")>;
>>
getById() ::= <<
- SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency, SUM(ii.amount) AS amount
- FROM invoices i
- LEFT JOIN invoice_items ii ON i.id = ii.invoice_id
- LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
- WHERE i.id = :id
- GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency;
+ SELECT <invoiceFields()>
+ FROM invoices
+ WHERE id = :id;
>>
getAccountBalance() ::= <<
@@ -69,7 +63,7 @@ getAccountBalance() ::= <<
>>
create() ::= <<
- INSERT INTO invoices(id, account_id, invoice_date, target_date, currency)
+ INSERT INTO invoices(<invoiceFields()>)
VALUES (:id, :accountId, :invoiceDate, :targetDate, :currency);
>>
@@ -89,6 +83,17 @@ notifyFailedPayment() ::= <<
VALUES(:invoiceId, :paymentId, :paymentAttemptDate);
>>
+getUnpaidInvoicesByAccountId() ::= <<
+ SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency
+ 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)
+ GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
+ HAVING (SUM(iis.total_amount) > SUM(ips.total_paid)) OR (SUM(ips.total_paid) IS NULL)
+ ORDER BY i.target_date ASC;
+>>
+
test() ::= <<
SELECT 1
FROM invoices;
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 9f83fdf..26d97af 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
@@ -16,17 +16,17 @@
package com.ning.billing.invoice.dao;
-import java.io.IOException;
-import org.apache.commons.io.IOUtils;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Stage;
import com.ning.billing.invoice.glue.InvoiceModuleMock;
-import com.ning.billing.util.eventbus.DefaultEventBusService;
import com.ning.billing.util.eventbus.BusService;
-import sun.jvm.hotspot.utilities.Assert;
+import com.ning.billing.util.eventbus.DefaultEventBusService;
+import org.apache.commons.io.IOUtils;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+
+import java.io.IOException;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
@@ -42,8 +42,12 @@ public abstract class InvoiceDaoTestBase {
// Health check test to make sure MySQL is setup properly
try {
module = new InvoiceModuleMock();
- final String ddl = IOUtils.toString(DefaultInvoiceDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
- module.createDb(ddl);
+ final String invoiceDdl = IOUtils.toString(DefaultInvoiceDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
+ final String entitlementDdl = IOUtils.toString(DefaultInvoiceDao.class.getResourceAsStream("/com/ning/billing/entitlement/ddl.sql"));
+
+ module.startDb();
+ module.initDb(invoiceDdl);
+ module.initDb(entitlementDdl);
final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index f5b5624..962b226 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -18,6 +18,7 @@ package com.ning.billing.invoice.dao;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
@@ -380,7 +381,6 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
assertEquals(balance.compareTo(rate1.add(rate2)), 0);
}
-
@Test
public void testAccountBalanceWithNoInvoiceItems() {
UUID accountId = UUID.randomUUID();
@@ -395,4 +395,55 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
BigDecimal balance = invoiceDao.getAccountBalance(accountId);
assertEquals(balance.compareTo(BigDecimal.ZERO.subtract(payment1)), 0);
}
+
+ @Test
+ public void testGetUnpaidInvoicesByAccountId() {
+ UUID accountId = UUID.randomUUID();
+ DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+ Invoice invoice1 = new DefaultInvoice(accountId, targetDate1, Currency.USD);
+ invoiceDao.create(invoice1);
+
+ DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+ DateTime endDate = startDate.plusMonths(1);
+
+ BigDecimal rate1 = new BigDecimal("17.0");
+ BigDecimal rate2 = new BigDecimal("42.0");
+
+ DefaultInvoiceItem item1 = new DefaultInvoiceItem(invoice1.getId(), UUID.randomUUID(), startDate, endDate, "test A", rate1, rate1, Currency.USD);
+ invoiceItemDao.create(item1);
+
+ DefaultInvoiceItem item2 = new DefaultInvoiceItem(invoice1.getId(), UUID.randomUUID(), startDate, endDate, "test B", rate2, rate2, Currency.USD);
+ invoiceItemDao.create(item2);
+
+ DateTime upToDate;
+ Collection<Invoice> invoices;
+
+ upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
+ invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
+ assertEquals(invoices.size(), 0);
+
+ upToDate = new DateTime(2012, 1, 1, 0, 0, 0, 0);
+ invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
+ assertEquals(invoices.size(), 1);
+
+ DateTime targetDate2 = new DateTime(2011, 7, 1, 0, 0, 0, 0);
+ Invoice invoice2 = new DefaultInvoice(accountId, targetDate2, Currency.USD);
+ invoiceDao.create(invoice2);
+
+ DateTime startDate2 = new DateTime(2011, 6, 1, 0, 0, 0, 0);
+ DateTime endDate2 = startDate2.plusMonths(3);
+
+ BigDecimal rate3 = new BigDecimal("21.0");
+
+ DefaultInvoiceItem item3 = new DefaultInvoiceItem(invoice2.getId(), UUID.randomUUID(), startDate2, endDate2, "test C", rate3, rate3, Currency.USD);
+ invoiceItemDao.create(item3);
+
+ upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
+ invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
+ assertEquals(invoices.size(), 0);
+
+ upToDate = new DateTime(2012, 1, 1, 0, 0, 0, 0);
+ invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
+ assertEquals(invoices.size(), 2);
+ }
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleMock.java b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleMock.java
index ffa48c5..0a7d4cc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleMock.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleMock.java
@@ -45,8 +45,11 @@ public class InvoiceModuleMock extends InvoiceModule {
private final MysqlTestingHelper helper = new MysqlTestingHelper();
private IDBI dbi;
- public void createDb(final String ddl) throws IOException {
+ public void startDb() throws IOException {
helper.startMysql();
+ }
+
+ public void initDb(final String ddl) throws IOException {
helper.initDb(ddl);
}