diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index 2dc32ce..e8e2c78 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -16,20 +16,26 @@
package com.ning.billing.invoice.model;
-import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.billing.BillingMode;
-import com.ning.billing.entitlement.api.billing.BillingEvent;
-import com.ning.billing.invoice.api.BillingEventSet;
-import org.joda.time.DateTime;
-
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
+import org.joda.time.DateTime;
+import org.joda.time.format.ISODateTimeFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.CatalogApiException;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.entitlement.api.billing.BillingEvent;
+import com.ning.billing.entitlement.api.billing.BillingMode;
+import com.ning.billing.invoice.api.BillingEventSet;
+
public class DefaultInvoiceGenerator implements IInvoiceGenerator {
+ private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceGenerator.class);
@Override
public Invoice generateInvoice(final UUID accountId, final BillingEventSet events, final InvoiceItemList existingItems, final DateTime targetDate, final Currency targetCurrency) {
if (events == null) {return new Invoice(accountId, targetCurrency);}
@@ -110,21 +116,33 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
}
private void processEvent(UUID invoiceId, BillingEvent event, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
- BigDecimal rate = event.getPrice(targetCurrency);
- BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(event, targetDate, rate);
- IBillingMode billingMode = getBillingMode(event.getBillingMode());
- DateTime billThroughDate = billingMode.calculateEffectiveEndDate(event.getEffectiveDate(), targetDate, event.getBillCycleDay(), event.getBillingPeriod());
-
- addInvoiceItem(invoiceId, items, event, billThroughDate, invoiceItemAmount, rate, targetCurrency);
+ try {
+ BigDecimal rate = event.getRecurringPrice(targetCurrency);
+ BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(event, targetDate, rate);
+ IBillingMode billingMode = getBillingMode(event.getBillingMode());
+ DateTime billThroughDate = billingMode.calculateEffectiveEndDate(event.getEffectiveDate(), targetDate, event.getBillCycleDay(), event.getBillingPeriod());
+
+ addInvoiceItem(invoiceId, items, event, billThroughDate, invoiceItemAmount, rate, targetCurrency);
+ } catch (CatalogApiException e) {
+ log.error(String.format("Encountered a catalog error processing invoice %s for billing event on date %s",
+ invoiceId.toString(),
+ ISODateTimeFormat.basicDateTime().print(event.getEffectiveDate())), e);
+ }
}
private void processEvents(UUID invoiceId, BillingEvent firstEvent, BillingEvent secondEvent, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
- BigDecimal rate = firstEvent.getPrice(targetCurrency);
- BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(firstEvent, secondEvent, targetDate, rate);
- IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
- DateTime billThroughDate = billingMode.calculateEffectiveEndDate(firstEvent.getEffectiveDate(), secondEvent.getEffectiveDate(), targetDate, firstEvent.getBillCycleDay(), firstEvent.getBillingPeriod());
-
- addInvoiceItem(invoiceId, items, firstEvent, billThroughDate, invoiceItemAmount, rate, targetCurrency);
+ try {
+ BigDecimal rate = firstEvent.getRecurringPrice(targetCurrency);
+ BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(firstEvent, secondEvent, targetDate, rate);
+ IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
+ DateTime billThroughDate = billingMode.calculateEffectiveEndDate(firstEvent.getEffectiveDate(), secondEvent.getEffectiveDate(), targetDate, firstEvent.getBillCycleDay(), firstEvent.getBillingPeriod());
+
+ addInvoiceItem(invoiceId, items, firstEvent, billThroughDate, invoiceItemAmount, rate, targetCurrency);
+ } catch (CatalogApiException e) {
+ log.error(String.format("Encountered a catalog error processing invoice %s for billing event on date %s",
+ invoiceId.toString(),
+ ISODateTimeFormat.basicDateTime().print(firstEvent.getEffectiveDate())), e);
+ }
}
private void addInvoiceItem(UUID invoiceId, List<InvoiceItem> items, BillingEvent event, DateTime billThroughDate, BigDecimal amount, BigDecimal rate, Currency currency) {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 45f6e74..134ca4e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -16,21 +16,26 @@
package com.ning.billing.invoice.tests;
-import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.billing.BillingMode;
-import com.ning.billing.entitlement.api.billing.BillingEvent;
-import com.ning.billing.invoice.api.DefaultBillingEvent;
-import com.ning.billing.invoice.api.BillingEventSet;
-import com.ning.billing.invoice.model.*;
-import org.joda.time.DateTime;
-import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
import java.math.BigDecimal;
import java.util.UUID;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
+import org.joda.time.DateTime;
+import org.testng.annotations.Test;
+
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.entitlement.api.billing.BillingEvent;
+import com.ning.billing.entitlement.api.billing.BillingMode;
+import com.ning.billing.entitlement.api.billing.DefaultBillingEvent;
+import com.ning.billing.invoice.api.BillingEventSet;
+import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.model.IInvoiceGenerator;
+import com.ning.billing.invoice.model.Invoice;
+import com.ning.billing.invoice.model.InvoiceItem;
+import com.ning.billing.invoice.model.InvoiceItemList;
@Test(groups = {"invoicing", "invoiceGenerator"})
public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
@@ -68,8 +73,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
String planName = "World Domination";
String phaseName = "Build Space Laser";
BillingEvent event = new DefaultBillingEvent(subscriptionId, startDate, planName, phaseName,
- new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE, "Test");
events.add(event);
@@ -94,8 +99,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
String phaseName = "Build Space Laser";
BigDecimal rate = TEN;
BillingEvent event = new DefaultBillingEvent(subscriptionId, startDate, planName, phaseName,
- new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
- 15, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO), new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
+ 15, BillingMode.IN_ADVANCE,"Test");
events.add(event);
@@ -120,14 +125,14 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEvent event1 = new DefaultBillingEvent(UUID.randomUUID(), buildDateTime(2011, 9, 1),
"World Domination", "Build Space Laser",
- new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO), new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE, "Test");
events.add(event1);
BillingEvent event2 = new DefaultBillingEvent(UUID.randomUUID(), buildDateTime(2011, 10, 1),
"Groceries", "Pick Up Milk",
- new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO), new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE,"Test");
events.add(event2);
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
@@ -147,14 +152,14 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
UUID subscriptionId = UUID.randomUUID();
BillingEvent event1 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 9, 1),
"World Domination", "Build Space Laser",
- new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE,"Test");
events.add(event1);
BillingEvent event2 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 10, 15),
"World Domination", "Incinerate James Bond",
- new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
- 15, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
+ 15, BillingMode.IN_ADVANCE,"Test");
events.add(event2);
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
@@ -185,20 +190,20 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
UUID subscriptionId = UUID.randomUUID();
BillingEvent event1 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 9, 1),
"World Domination", "Build Space Laser",
- new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE,"Test");
events.add(event1);
BillingEvent event2 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 10, 1),
"World Domination", "Incinerate James Bond",
- new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE,"Test");
events.add(event2);
BillingEvent event3 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 11, 1),
"World Domination", "Cackle Gleefully",
- new InternationalPriceMock(THIRTY), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(THIRTY), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE,"Test");
events.add(event3);
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
@@ -221,8 +226,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BigDecimal rate = FIVE;
BillingEvent event1 = new DefaultBillingEvent(subscriptionId, startDate,
"World Domination", "Build Space Laser",
- new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
- 1, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
+ 1, BillingMode.IN_ADVANCE,"Test");
events.add(event1);
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
@@ -394,16 +399,16 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
private DefaultBillingEvent createBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName,
BigDecimal rate, int billCycleDay) {
return new DefaultBillingEvent(subscriptionId, startDate, planName, planPhaseName,
- new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
- billCycleDay, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
+ billCycleDay, BillingMode.IN_ADVANCE,"Test");
}
private DefaultBillingEvent createAnnualBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName,
BigDecimal rate, int billCycleDay) {
return new DefaultBillingEvent(subscriptionId, startDate, planName, planPhaseName,
- new InternationalPriceMock(rate), BillingPeriod.ANNUAL,
- billCycleDay, BillingMode.IN_ADVANCE);
+ new InternationalPriceMock(ZERO),new InternationalPriceMock(rate), BillingPeriod.ANNUAL,
+ billCycleDay, BillingMode.IN_ADVANCE,"Test");
}