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());
}