killbill-aplcache

Details

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 788cda1..49c238b 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
@@ -23,31 +23,17 @@ import java.util.TreeSet;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
-import com.ning.billing.ErrorCode;
-import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountUserApi;
-import com.ning.billing.account.api.DefaultAccount;
-import com.ning.billing.catalog.api.BillingAlignment;
-import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogApiException;
-import com.ning.billing.catalog.api.CatalogService;
-import com.ning.billing.catalog.api.Plan;
-import com.ning.billing.catalog.api.PlanPhase;
-import com.ning.billing.catalog.api.PlanPhaseSpecifier;
-import com.ning.billing.catalog.api.Product;
 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;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao;
 
@@ -56,15 +42,13 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
 	private static final Logger log = LoggerFactory.getLogger(DefaultEntitlementBillingApi.class);
 
     private final EntitlementDao entitlementDao;
-    private final AccountUserApi accountApi;
-    private final CatalogService catalogService;
+    private final BillCycleDayCalculator bcdCalculator;
 
     @Inject
-    public DefaultEntitlementBillingApi(final EntitlementDao dao, final AccountUserApi accountApi, final CatalogService catalogService) {
+    public DefaultEntitlementBillingApi(final EntitlementDao dao, final BillCycleDayCalculator bcdCalculator) {
         super();
         this.entitlementDao = dao;
-        this.accountApi = accountApi;
-        this.catalogService = catalogService;
+        this.bcdCalculator = bcdCalculator;
     }
 
     @Override
@@ -79,7 +63,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
         	for (final Subscription subscription: subscriptions) {
         		for (final SubscriptionTransition transition : subscription.getAllTransitions()) {
         			try {
-        				BillingEvent event = new DefaultBillingEvent(transition, subscription, calculateBcd(bundle, subscription, transition, accountId));
+        				BillingEvent event = new DefaultBillingEvent(transition, subscription, bcdCalculator.calculateBcd(bundle, subscription, transition, accountId));
         				result.add(event);
         			} catch (CatalogApiException e) {
         				log.error("Failing to identify catalog components while creating BillingEvent from transition: " +
@@ -98,94 +82,6 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
         return entitlementDao.getAccountIdFromSubscriptionId(subscriptionId);
     }
 
-    private int calculateBcd(SubscriptionBundle bundle, Subscription subscription, final SubscriptionTransition transition, final UUID accountId) throws CatalogApiException, AccountApiException {
-    	Catalog catalog = catalogService.getFullCatalog();
-    	Plan plan =  (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
-    	        transition.getNextPlan() : transition.getPreviousPlan();
-    	Product product = plan.getProduct();
-    	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()),
-    					transition.getRequestedTransitionTime());
-    	int result = -1;
-
-		Account account = accountApi.getAccountById(accountId);
-		switch (alignment) {
-    		case ACCOUNT :
-    			result = account.getBillCycleDay();
-    			
-    			if(result == 0) {
-    				result = calculateBcdFromSubscription(subscription, plan, account);
-    			}
-    		break;
-    		case BUNDLE :
-    			result = bundle.getStartDate().toDateTime(account.getTimeZone()).getDayOfMonth();
-    		break;
-    		case SUBSCRIPTION :
-    			result = subscription.getStartDate().toDateTime(account.getTimeZone()).getDayOfMonth();
-    		break;
-    	}
-    	if(result == -1) {
-    		throw new CatalogApiException(ErrorCode.CAT_INVALID_BILLING_ALIGNMENT, alignment.toString());
-    	}
-    	return result;
-
-    }
-    
-   	private int calculateBcdFromSubscription(Subscription subscription, Plan plan, Account account) throws AccountApiException {
-		int result = account.getBillCycleDay();
-        if(result != 0) {
-            return result;
-        }
-        result = new DateTime(account.getTimeZone()).getDayOfMonth();
-
-        try {
-        	result = billCycleDay(subscription.getStartDate(),account.getTimeZone(), plan);
-        } catch (CatalogApiException e) {
-            log.error("Unexpected catalog error encountered when updating BCD",e);
-        }
-        
-
-        Account modifiedAccount = new DefaultAccount(
-                account.getId(),
-                account.getExternalKey(),
-                account.getEmail(),
-                account.getName(),
-                account.getFirstNameLength(),
-                account.getCurrency(),
-                result,
-                account.getPaymentProviderName(),
-                account.getTimeZone(),
-                account.getLocale(),
-                account.getAddress1(),
-                account.getAddress2(),
-                account.getCompanyName(),
-                account.getCity(),
-                account.getStateOrProvince(),
-                account.getCountry(),
-                account.getPostalCode(),
-                account.getPhone(),
-                account.getCreatedDate(),
-                null // Updated date will be set internally
-        );
-        accountApi.updateAccount(modifiedAccount);
-        return result;
-    }
-
-    private int billCycleDay(DateTime requestedDate, DateTimeZone timeZone, 
-    		Plan plan) throws CatalogApiException {
-
-        DateTime date = plan.dateOfFirstRecurringNonZeroCharge(requestedDate);
-        return date.toDateTime(timeZone).getDayOfMonth();
-
-    }
-    
     
     @Override
     public void setChargedThroughDate(final UUID subscriptionId, final DateTime ctd) {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
index 2d99f8d..1832b2f 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
@@ -155,7 +155,8 @@ public class TestDefaultEntitlementBillingApi {
 
         };
 		AccountUserApi accountApi = new BrainDeadAccountUserApi() ;
-		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,accountApi,catalogService);
+		BillCycleDayCalculator bcdCalculator = new BillCycleDayCalculator(accountApi, catalogService);
+		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,bcdCalculator);
 		SortedSet<BillingEvent> events = api.getBillingEventsForAccount(new UUID(0L,0L));
 		Assert.assertEquals(events.size(), 0);
 	}
@@ -180,7 +181,8 @@ public class TestDefaultEntitlementBillingApi {
 					return 32;
 				}};
 			}} ;
-		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,accountApi,catalogService);
+			BillCycleDayCalculator bcdCalculator = new BillCycleDayCalculator(accountApi, catalogService);
+			DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,bcdCalculator);
 		SortedSet<BillingEvent> events = api.getBillingEventsForAccount(new UUID(0L,0L));
 		checkFirstEvent(events, nextPlan, 32, oneId, now, nextPhase, ApiEventType.CREATE.toString());
 	}
@@ -202,7 +204,8 @@ public class TestDefaultEntitlementBillingApi {
 		AccountUserApi accountApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);			
 		((ZombieControl)accountApi).addResult("getAccountById", account);
 				
-		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,accountApi,catalogService);
+		BillCycleDayCalculator bcdCalculator = new BillCycleDayCalculator(accountApi, catalogService);
+		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,bcdCalculator);
 		SortedSet<BillingEvent> events = api.getBillingEventsForAccount(new UUID(0L,0L));
 		checkFirstEvent(events, nextPlan, subscription.getStartDate().getDayOfMonth(), oneId, now, nextPhase, ApiEventType.CREATE.toString());
 	}
@@ -227,7 +230,8 @@ public class TestDefaultEntitlementBillingApi {
 					return 32;
 				}};
 			}} ;
-		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,accountApi,catalogService);
+			BillCycleDayCalculator bcdCalculator = new BillCycleDayCalculator(accountApi, catalogService);
+			DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,bcdCalculator);
 		SortedSet<BillingEvent> events = api.getBillingEventsForAccount(new UUID(0L,0L));
 		checkFirstEvent(events, nextPlan, 32, oneId, now, nextPhase, ApiEventType.CREATE.toString());
 	}
@@ -249,7 +253,8 @@ public class TestDefaultEntitlementBillingApi {
 		AccountUserApi accountApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);			
 		((ZombieControl)accountApi).addResult("getAccountById", account);
 				
-		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,accountApi,catalogService);
+		BillCycleDayCalculator bcdCalculator = new BillCycleDayCalculator(accountApi, catalogService);
+		DefaultEntitlementBillingApi api = new DefaultEntitlementBillingApi(dao,bcdCalculator);
 		SortedSet<BillingEvent> events = api.getBillingEventsForAccount(new UUID(0L,0L));
 		checkFirstEvent(events, nextPlan, bundles.get(0).getStartDate().getDayOfMonth(), oneId, now, nextPhase, ApiEventType.CREATE.toString());
 	}