killbill-aplcache

Merge branch 'inv-ent-integration' of git@github.com:ning/killbill

2/4/2012 5:02:22 PM

Details

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 e708803..f77fdad 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
@@ -187,7 +187,7 @@ public class TestBasic {
     }
 
     private void testBasePlanComplete(int billingDay) throws Exception {
-        long DELAY = 5000 * 10;
+        long DELAY = 5000;
 
         Account account = accountUserApi.createAccount(getAccountData(billingDay), null, null);
         assertNotNull(account);
@@ -240,8 +240,6 @@ public class TestBasic {
         busHandler.pushExpectedEvent(NextEvent.PHASE);
         busHandler.pushExpectedEvent(NextEvent.INVOICE);
         clock.setDeltaFromReality(AT_LEAST_ONE_MONTH_MS);
-
-        Thread.sleep(600000);
         assertTrue(busHandler.isCompleted(DELAY));
 
         //
@@ -250,6 +248,7 @@ public class TestBasic {
         newTerm = BillingPeriod.MONTHLY;
         newPlanSetName = PriceListSet.DEFAULT_PRICELIST_NAME;
         newProductName = "Pistol";
+        subscription = (SubscriptionData) entitlementUserApi.getSubscriptionFromId(subscription.getId());
         subscription.changePlan(newProductName, newTerm, newPlanSetName, clock.getUTCNow());
         log.info("testSimple has passed third busHandler checkpoint (no events)");
 
@@ -258,8 +257,8 @@ public class TestBasic {
         //
         busHandler.pushExpectedEvent(NextEvent.CHANGE);
         busHandler.pushExpectedEvent(NextEvent.INVOICE);
-        clock.addDeltaFromReality(ctd.getMillis() - clock.getUTCNow().getMillis());
-        //clock.setDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
+        //clock.addDeltaFromReality(ctd.getMillis() - clock.getUTCNow().getMillis());
+        clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
         assertTrue(busHandler.isCompleted(DELAY));
         log.info("testSimple passed fourth busHandler checkpoint.");
 
@@ -269,8 +268,8 @@ public class TestBasic {
         int maxCycles = 3;
         DateTime lastCtd = null;
         do {
-            clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
             busHandler.pushExpectedEvent(NextEvent.INVOICE);
+            clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
             assertTrue(busHandler.isCompleted(DELAY));
             lastCtd = checkAndGetCTD(subscription.getId());
         } while (maxCycles-- > 0);
@@ -278,11 +277,12 @@ public class TestBasic {
         //
         // FINALLY CANCEL SUBSCRIPTION EOT
         //
+        subscription = (SubscriptionData) entitlementUserApi.getSubscriptionFromId(subscription.getId());
         subscription.cancel(clock.getUTCNow(), false);
 
         // MOVE AFTER CANCEL DATE AND EXPECT EVENT : NextEvent.CANCEL
         busHandler.pushExpectedEvent(NextEvent.CANCEL);
-        Interval it = new Interval(lastCtd, clock.getUTCNow());
+        Interval it = new Interval(clock.getUTCNow(), lastCtd);
         clock.addDeltaFromReality(it.toDurationMillis());
         assertTrue(busHandler.isCompleted(DELAY));
 
@@ -292,7 +292,13 @@ public class TestBasic {
         busHandler.reset();
         clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS + 1000);
         assertTrue(busHandler.isCompleted(DELAY));
-        lastCtd = checkAndGetCTD(subscription.getId());
+
+
+        subscription = (SubscriptionData) entitlementUserApi.getSubscriptionFromId(subscription.getId());
+        lastCtd = subscription.getChargedThroughDate();
+        assertNotNull(lastCtd);
+        log.info("Checking CTD: " + lastCtd.toString() + "; clock is " + clock.getUTCNow().toString());
+        assertTrue(lastCtd.isBefore(clock.getUTCNow()));
     }
 
     @Test(enabled=false)
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java
index d006776..54f4b4c 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBusHandler.java
@@ -121,6 +121,9 @@ public class TestBusHandler {
 
     public boolean isCompleted(long timeout) {
         synchronized (this) {
+            if (completed) {
+                return completed;
+            }
             try {
                 wait(timeout);
             } catch (Exception ignore) {
diff --git a/beatrix/src/test/resources/resource.properties b/beatrix/src/test/resources/resource.properties
index cc82754..d63334b 100644
--- a/beatrix/src/test/resources/resource.properties
+++ b/beatrix/src/test/resources/resource.properties
@@ -2,5 +2,6 @@ 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
+user.timezone=UTC
 
 
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
index dd8f92a..11c5a79 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
@@ -31,7 +31,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransition.Subscription
 
 public class DefaultBillingEvent implements BillingEvent {
 	Logger log = LoggerFactory.getLogger(DefaultBillingEvent.class);
-	
+
     final private int billCycleDay;
     final private Subscription subscription;
     final private DateTime effectiveDate;
@@ -48,15 +48,18 @@ public class DefaultBillingEvent implements BillingEvent {
         this.billCycleDay = billCycleDay;
         this.subscription = subscription;
         effectiveDate = transition.getEffectiveTransitionTime();
-        planPhase = transition.getNextPhase();
-        plan = transition.getNextPlan();
-        fixedPrice = (transition.getNextPhase() == null) ? null : 
+        planPhase = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+                transition.getNextPhase() : transition.getPreviousPhase();
+        plan = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+                transition.getNextPlan() : transition.getPreviousPlan();
+        fixedPrice = (transition.getNextPhase() == null) ? null :
         		transition.getNextPhase().getFixedPrice();
         recurringPrice = (transition.getNextPhase() == null) ? null :
         	transition.getNextPhase().getRecurringPrice();
         description = transition.getTransitionType().toString();
-        billingModeType=BillingModeType.IN_ADVANCE;
-        billingPeriod = transition.getNextPhase().getBillingPeriod();
+        billingModeType = BillingModeType.IN_ADVANCE;
+        billingPeriod =  (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+                transition.getNextPhase().getBillingPeriod() : transition.getPreviousPhase().getBillingPeriod();
         type = transition.getTransitionType();
     }
 
@@ -90,7 +93,7 @@ public class DefaultBillingEvent implements BillingEvent {
     				 return hashCode() - e1.hashCode();
     			 }
     		 }
-    	 }	
+    	 }
     }
 
     @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 efda54c..a5199a9 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
@@ -32,6 +32,7 @@ import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao;
@@ -50,7 +51,7 @@ import java.util.UUID;
 
 public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
 	private static final Logger log = LoggerFactory.getLogger(DefaultEntitlementBillingApi.class);
-	
+
     private final EntitlementDao dao;
     private final AccountUserApi accountApi;
     private final CatalogService catalogService;
@@ -66,7 +67,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
     @Override
     public SortedSet<BillingEvent> getBillingEventsForAccount(
             final UUID accountId) {
-        
+
         List<SubscriptionBundle> bundles = dao.getSubscriptionBundleForAccount(accountId);
         List<Subscription> subscriptions = new ArrayList<Subscription>();
         for (final SubscriptionBundle bundle: bundles) {
@@ -80,7 +81,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
                     BillingEvent event = new DefaultBillingEvent(transition, subscription, calculateBCD(transition, accountId));
         			result.add(event);
         		} catch (CatalogApiException e) {
-        			log.error("Failing to identify catalog components while creating BillingEvent from transition: " + 
+        			log.error("Failing to identify catalog components while creating BillingEvent from transition: " +
         					transition.getId().toString(), e);
                 } catch (Exception e) {
                     log.warn("Failed while getting BillingEvent", e);
@@ -97,26 +98,28 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
 
     private int calculateBCD(final SubscriptionTransition transition, final UUID accountId) throws CatalogApiException {
     	Catalog catalog = catalogService.getFullCatalog();
-    	Plan plan = transition.getNextPlan();
+    	Plan plan =  (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+    	        transition.getNextPlan() : transition.getPreviousPlan();
     	Product product = plan.getProduct();
-    	PlanPhase phase = transition.getNextPhase();
-    	
+    	PlanPhase phase = (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
+    	        transition.getNextPhase() : transition.getPreviousPhase();
+
     	BillingAlignment alignment = catalog.billingAlignment(
     			new PlanPhaseSpecifier(product.getName(),
-    					product.getCategory(), 
-    					phase.getBillingPeriod(), 
-    					transition.getNextPriceList(), 
-    					phase.getPhaseType()), 
+    					product.getCategory(),
+    					phase.getBillingPeriod(),
+    					transition.getNextPriceList(),
+    					phase.getPhaseType()),
     					transition.getRequestedTransitionTime());
     	int result = 0;
 
         Account account = accountApi.getAccountById(accountId);
 
     	switch (alignment) {
-    		case ACCOUNT : 
+    		case ACCOUNT :
     			result = account.getBillCycleDay();
     		break;
-    		case BUNDLE : 
+    		case BUNDLE :
     			SubscriptionBundle bundle = dao.getSubscriptionBundleFromId(transition.getBundleId());
     			//TODO result = bundle.getStartDate().toDateTime(account.getTimeZone()).getDayOfMonth();
     			result = bundle.getStartDate().getDayOfMonth();
@@ -131,9 +134,9 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
     		throw new CatalogApiException(ErrorCode.CAT_INVALID_BILLING_ALIGNMENT, alignment.toString());
     	}
     	return result;
-    		
+
     }
-    
+
     @Override
     public void setChargedThroughDate(final UUID subscriptionId, final DateTime ctd) {
         SubscriptionData subscription = (SubscriptionData) dao.getSubscriptionFromId(subscriptionId);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java b/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
index 9a4c13b..b1e2fa9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
@@ -34,7 +34,7 @@ public class DateRange {
      */
     public boolean contains(DateTime date) {
         if (endDate == null) {
-            return date.compareTo(startDate) == 0;
+            return date.compareTo(startDate) >= 0;
         }
 
         return !date.isBefore(startDate) && !date.isAfter(endDate);
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 a8b7c88..c83be80 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
@@ -214,6 +214,7 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
                                   event.getPlan().getName(), event.getPlanPhase().getName(), event.getEffectiveDate(),
                                   billThroughDate, amount, rate, fixedAmount, currency);
         items.add(item);
+        System.out.println(item);
     }
 
     private BigDecimal calculateNumberOfBillingPeriods(final BillingEvent event, final DateTime targetDate){
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java
index 439833a..1c1cdef 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceItem.java
@@ -36,7 +36,7 @@ public class DefaultInvoiceItem implements InvoiceItem {
     private DateTime endDate;
     private BigDecimal recurringAmount;
     private final BigDecimal recurringRate;
-    private BigDecimal fixedAmount;
+    private final BigDecimal fixedAmount;
     private final Currency currency;
 
     public DefaultInvoiceItem(UUID invoiceId, UUID subscriptionId, String planName, String phaseName,
@@ -223,7 +223,7 @@ public class DefaultInvoiceItem implements InvoiceItem {
         if ((value1 != null) && (value2 == null)) {return false;}
 
         if ((value1 != null) && (value2 != null)) {
-            if (!value1.equals(value2)) {return false;}
+            if (value1.compareTo(value2) != 0) {return false;}
         }
 
         return true;
@@ -271,7 +271,11 @@ public class DefaultInvoiceItem implements InvoiceItem {
         sb.append("planName = ").append(planName).append(", ");
         sb.append("phaseName = ").append(phaseName).append(", ");
         sb.append("startDate = ").append(startDate.toString()).append(", ");
-        sb.append("endDate = ").append(startDate.toString()).append(", ");
+        if (endDate != null) {
+            sb.append("endDate = ").append(endDate.toString()).append(", ");
+        } else {
+            sb.append("endDate = null");
+        }
         sb.append("recurringAmount = ");
         if (recurringAmount == null) {
             sb.append("null");