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 403d176..fa1a0d1 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
@@ -38,6 +38,8 @@ public interface InvoiceUserApi {
public Invoice getInvoice(UUID invoiceId);
+ public Invoice getInvoiceByNumber(Integer number);
+
public void notifyOfPayment(InvoicePayment invoicePayment, CallContext context);
public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, DateTime upToDate);
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 0a6a8f1..19b5523 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
@@ -81,6 +81,11 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
@Override
+ public Invoice getInvoiceByNumber(final Integer number) {
+ return dao.getByNumber(number);
+ }
+
+ @Override
public List<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 3ed5c04..4652130 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
@@ -144,6 +144,12 @@ public class DefaultInvoiceDao implements InvoiceDao {
}
@Override
+ public Invoice getByNumber(final Integer number) {
+ // The invoice number is just the record id
+ return invoiceSqlDao.getByRecordId(number.longValue());
+ }
+
+ @Override
public void create(final Invoice invoice, final int billCycleDay, final CallContext context) {
invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
@Override
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 1812ed1..bef6721 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
@@ -35,6 +35,8 @@ public interface InvoiceDao {
Invoice getById(final UUID id);
+ Invoice getByNumber(final Integer number);
+
List<Invoice> get();
List<Invoice> getInvoicesByAccount(final UUID accountId);
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 6ed45be..ac5ca6e 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
@@ -51,6 +51,12 @@ getById() ::= <<
WHERE id = :id;
>>
+getByRecordId() ::= <<
+ SELECT record_id as invoice_number, <invoiceFields()>
+ FROM invoices
+ WHERE record_id = :recordId;
+>>
+
create() ::= <<
INSERT INTO invoices(<invoiceFields()>)
VALUES (:id, :accountId, :invoiceDate, :targetDate, :currency, :migrated, :userName, :createdDate);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index a81485f..5d7f2c6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -67,6 +67,19 @@ public class MockInvoiceDao implements InvoiceDao {
}
@Override
+ public Invoice getByNumber(final Integer number) {
+ synchronized (monitor) {
+ for (final Invoice invoice : invoices.values()) {
+ if (invoice.getInvoiceNumber().equals(number)) {
+ return invoice;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ @Override
public List<Invoice> get() {
synchronized (monitor) {
return new ArrayList<Invoice>(invoices.values());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
index df2dd59..8c8a947 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
@@ -26,6 +26,7 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.ning.billing.invoice.InvoiceTestSuite;
+import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.notification.NextBillingDatePoster;
import com.ning.billing.util.api.TagUserApi;
import com.ning.billing.util.callcontext.CallContext;
@@ -40,12 +41,16 @@ import com.ning.billing.util.tag.dao.TagDao;
import com.ning.billing.util.tag.dao.TagDefinitionDao;
public class TestDefaultInvoiceDao extends InvoiceTestSuite {
+ private InvoiceSqlDao invoiceSqlDao;
private TagUserApi tagUserApi;
private DefaultInvoiceDao dao;
@BeforeMethod(groups = "fast")
public void setUp() throws Exception {
final IDBI idbi = Mockito.mock(IDBI.class);
+ invoiceSqlDao = Mockito.mock(InvoiceSqlDao.class);
+ Mockito.when(idbi.onDemand(InvoiceSqlDao.class)).thenReturn(invoiceSqlDao);
+
final NextBillingDatePoster poster = Mockito.mock(NextBillingDatePoster.class);
final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
final TagDao tagDao = new MockTagDao();
@@ -54,6 +59,16 @@ public class TestDefaultInvoiceDao extends InvoiceTestSuite {
}
@Test(groups = "fast")
+ public void testFindByNumber() throws Exception {
+ final Integer number = Integer.MAX_VALUE;
+ final Invoice invoice = Mockito.mock(Invoice.class);
+ Mockito.when(invoiceSqlDao.getByRecordId(number.longValue())).thenReturn(invoice);
+
+ Assert.assertEquals(dao.getByNumber(number), invoice);
+ Assert.assertNull(dao.getByNumber(Integer.MIN_VALUE));
+ }
+
+ @Test(groups = "fast")
public void testSetWrittenOff() throws Exception {
final UUID invoiceId = UUID.randomUUID();
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
index a6a5f92..3db47da 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
@@ -36,6 +36,9 @@ public interface EntitySqlDao<T extends Entity> {
public T getById(@Bind("id") final String id);
@SqlQuery
+ public T getByRecordId(@Bind("recordId") final Long recordId);
+
+ @SqlQuery
public Long getRecordId(@Bind("id") final String id);
@SqlQuery