Details
diff --git a/api/src/main/java/com/ning/billing/ErrorCode.java b/api/src/main/java/com/ning/billing/ErrorCode.java
index 5b8e22f..17e40bf 100644
--- a/api/src/main/java/com/ning/billing/ErrorCode.java
+++ b/api/src/main/java/com/ning/billing/ErrorCode.java
@@ -179,7 +179,6 @@ public enum ErrorCode {
TAG_CANNOT_BE_REMOVED(3951, "The tag %s cannot be removed because %s"),
TAG_ALREADY_EXISTS(3952, "The tag %s already exists"),
-
/*
*
* Range 4000: INVOICE
@@ -201,6 +200,8 @@ public enum ErrorCode {
EXTERNAL_CHARGE_AMOUNT_INVALID(4015, "External charge amount %s should be strictly positive"),
INVOICE_WOULD_BE_NEGATIVE(4016, "Cannot execute operation, the invoice balance would become negative"),
INVOICE_ALREADY_EXISTS(4017, "The invoice already exists %s"),
+ INVOICE_NUMBER_NOT_FOUND(4018, "No invoice could be found for number %s."),
+ INVOICE_INVALID_NUMBER(4019, "Invalid invoice number %s."),
/*
*
@@ -292,7 +293,6 @@ public enum ErrorCode {
TENANT_UPDATE_FAILED(10005, "Tenant update failed."),
TENANT_NO_SUCH_KEY(10006, "Tenant %s does not have a key %s"),
-
CUSTOM_FIELD_ALREADY_EXISTS(11000, "The custom field %s already exists"),
__UNKNOWN_ERROR_CODE(-1, "Unknown ErrorCode");
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 730fbbc..142ac74 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
@@ -38,7 +38,6 @@ import com.ning.billing.invoice.api.InvoiceItemType;
import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
import com.ning.billing.invoice.api.user.DefaultInvoiceAdjustmentEvent;
import com.ning.billing.invoice.model.InvoiceItemList;
-import com.ning.billing.invoice.model.RecurringInvoiceItem;
import com.ning.billing.invoice.notification.NextBillingDatePoster;
import com.ning.billing.util.callcontext.InternalCallContext;
import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -156,7 +155,24 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
@Override
public InvoiceModelDao getByNumber(final Integer number, final InternalTenantContext context) throws InvoiceApiException {
- return getByRecordId(number.longValue(), context);
+
+ if (number == null) {
+ throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_NUMBER, "(null)");
+ }
+
+ return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<InvoiceModelDao>() {
+ @Override
+ public InvoiceModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+ final InvoiceSqlDao invoiceDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
+
+ final InvoiceModelDao invoice = invoiceDao.getByRecordId(number.longValue(), context);
+ if (invoice == null) {
+ throw new InvoiceApiException(ErrorCode.INVOICE_NUMBER_NOT_FOUND, number.longValue());
+ }
+ populateChildren(invoice, entitySqlDaoWrapperFactory, context);
+ return invoice;
+ }
+ });
}
@Override
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 c4dd373..2d1bb07 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
@@ -164,4 +164,14 @@ public class InvoiceDaoTestBase extends InvoicingTestBase {
Assert.assertEquals(InvoiceModelDaoHelper.getBalance(invoice).doubleValue(), balance);
Assert.assertEquals(InvoiceModelDaoHelper.getCBAAmount(invoice).doubleValue(), cbaAmount);
}
+
+ protected void checkInvoicesEqual(final InvoiceModelDao retrievedInvoice, final Invoice invoice) {
+ Assert.assertEquals(retrievedInvoice.getId(), invoice.getId());
+ Assert.assertEquals(retrievedInvoice.getAccountId(), invoice.getAccountId());
+ Assert.assertEquals(retrievedInvoice.getCurrency(), invoice.getCurrency());
+ Assert.assertEquals(retrievedInvoice.getInvoiceDate(), invoice.getInvoiceDate());
+ Assert.assertEquals(retrievedInvoice.getTargetDate(), invoice.getTargetDate());
+ Assert.assertEquals(retrievedInvoice.getInvoiceItems().size(), invoice.getInvoiceItems().size());
+ Assert.assertEquals(retrievedInvoice.getInvoicePayments().size(), invoice.getPayments().size());
+ }
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index 2b668f8..43269b5 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -75,6 +75,17 @@ import static org.testng.Assert.assertTrue;
public class TestInvoiceDao extends InvoiceDaoTestBase {
@Test(groups = "slow")
+ public void testSimple() throws Exception {
+ final UUID accountId = UUID.randomUUID();
+ final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
+ createInvoice(invoice, true, internalCallContext);
+
+ final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
+ checkInvoicesEqual(retrievedInvoice, invoice);
+ checkInvoicesEqual(invoiceDao.getByNumber(retrievedInvoice.getInvoiceNumber(), internalCallContext), invoice);
+ }
+
+ @Test(groups = "slow")
public void testCreationAndRetrievalByAccount() {
final UUID accountId = UUID.randomUUID();
final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
index a7494e6..6b87f60 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
@@ -28,20 +28,20 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
public class DefaultOverdueChangeEvent extends DefaultBusInternalEvent implements OverdueChangeInternalEvent {
+
private final UUID overdueObjectId;
private final Blockable.Type overdueObjectType;
private final String previousOverdueStateName;
private final String nextOverdueStateName;
-
@JsonCreator
public DefaultOverdueChangeEvent(@JsonProperty("overdueObjectId") final UUID overdueObjectId,
- @JsonProperty("overdueObjectType") final Blockable.Type overdueObjectType,
- @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
- @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
- @JsonProperty("userToken") final UUID userToken,
- @JsonProperty("accountRecordId") final Long accountRecordId,
- @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+ @JsonProperty("overdueObjectType") final Blockable.Type overdueObjectType,
+ @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
+ @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
+ @JsonProperty("userToken") final UUID userToken,
+ @JsonProperty("accountRecordId") final Long accountRecordId,
+ @JsonProperty("tenantRecordId") final Long tenantRecordId) {
super(userToken, accountRecordId, tenantRecordId);
this.overdueObjectId = overdueObjectId;
this.overdueObjectType = overdueObjectType;