killbill-memoizeit

Code now compiles. Needs to be integrated with IRS. Also use

1/3/2012 6:34:46 PM

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
index e6c2dfa..c8485f9 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
@@ -128,4 +128,9 @@ public class MockSubscription implements Subscription
     public List<SubscriptionTransition> getActiveTransitions() {
         throw new UnsupportedOperationException();
     }
+
+    @Override
+    public List<SubscriptionTransition> getAllTransitions() {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
index cbc9f8d..b7da39b 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
@@ -16,14 +16,15 @@
 
 package com.ning.billing.entitlement.api.billing;
 
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 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.catalog.api.InternationalPrice;
-import org.joda.time.DateTime;
-
-import java.math.BigDecimal;
-import java.util.UUID;
 
 public interface BillingEvent extends Comparable<BillingEvent> {
 
@@ -89,4 +90,20 @@ public interface BillingEvent extends Comparable<BillingEvent> {
      * @return the recurring price for the phase
      */
     public InternationalPrice getRecurringPrice();
+
+    /**
+     * Syntactic sugar to wrap currency access call
+     * 
+     * @param currency
+     * @return price value
+     */
+    public BigDecimal getRecurringPrice(Currency currency) throws CatalogApiException ;
+
+    /**
+     * Syntactic sugar to wrap currency access call
+     * 
+     * @param currency
+     * @return price value
+     */
+    public BigDecimal getFixedPrice(Currency currency) throws CatalogApiException ;
 }
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");
 
     }