killbill-aplcache
Changes
beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java 2(+1 -1)
catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java 329(+160 -169)
catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg 2(+2 -0)
Details
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
index 698b887..93920a0 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
@@ -103,7 +103,7 @@ public class TestWithEntilementPlugin extends TestIntegrationBase {
clock.setDay(new LocalDate(2012, 4, 1));
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN));
+ overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN, null));
testEntitlementPluginApi.setPlanPhasePriceOverride(overrides);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java
index 144514f..b2c1f6b 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java
@@ -57,7 +57,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
clock.setDay(new LocalDate(2012, 4, 1));
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-trial", account.getCurrency(), BigDecimal.ONE, null));
+ overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-trial", account.getCurrency(), BigDecimal.ONE, null, null));
final DefaultEntitlement bpSubscription = createBaseEntitlementWithPriceOverrideAndCheckForCompletion(account.getId(), "bundleKey", "Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, overrides, NextEvent.CREATE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
// Check bundle after BP got created otherwise we get an error from auditApi.
@@ -77,7 +77,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
clock.setDay(new LocalDate(2012, 4, 1));
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN));
+ overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN, null));
final DefaultEntitlement bpSubscription = createBaseEntitlementWithPriceOverrideAndCheckForCompletion(account.getId(), "bundleKey", "Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, overrides, NextEvent.CREATE, NextEvent.INVOICE);
// Check bundle after BP got created otherwise we get an error from auditApi.
@@ -120,7 +120,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
invoiceChecker.checkInvoice(account.getId(), 2, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2012, 6, 1), InvoiceItemType.RECURRING, new BigDecimal("249.95")));
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, new BigDecimal("279.95")));
+ overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, new BigDecimal("279.95"), null));
busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
bpSubscription.changePlanOverrideBillingPolicy("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, overrides, new LocalDate(2012, 5, 1), BillingActionPolicy.IMMEDIATE, ImmutableList.<PluginProperty>of(), callContext);
@@ -167,7 +167,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
clock.addDays(4);
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- overrides.add(new DefaultPlanPhasePriceOverride("telescopic-scope-monthly-evergreen", account.getCurrency(), null, new BigDecimal("1200.00")));
+ overrides.add(new DefaultPlanPhasePriceOverride("telescopic-scope-monthly-evergreen", account.getCurrency(), null, new BigDecimal("1200.00"), null));
busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
aoEntitlement.changePlanOverrideBillingPolicy("Telescopic-Scope", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, overrides, new LocalDate(2012, 5, 5), BillingActionPolicy.IMMEDIATE, ImmutableList.<PluginProperty>of(), callContext);
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
index 6cc7549..3696b2f 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
@@ -72,15 +72,12 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
@Override
public CatalogOverridePlanDefinitionModelDao inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
-
-
-
- final CatalogOverridePhaseDefinitionModelDao[] overridePhaseDefinitionModelDaos = new CatalogOverridePhaseDefinitionModelDao[resolvedOverride.length];
+ final CatalogOverridePhaseDefinitionModelDao[] overridePhaseDefinitionModelDaos = new CatalogOverridePhaseDefinitionModelDao[resolvedOverride.length];
for (int i = 0; i < resolvedOverride.length; i++) {
final PlanPhasePriceOverride curOverride = resolvedOverride[i];
if (curOverride != null) {
PlanPhase parentPlanPhase = parentPlan.getAllPhases()[i];
- final CatalogOverridePhaseDefinitionModelDao createdOverridePhaseDefinitionModelDao = getOrCreateOverridePhaseDefinitionFromTransaction(parentPlanPhase, curOverride.getPhaseName(), catalogEffectiveDate, curOverride, handle, context);
+ final CatalogOverridePhaseDefinitionModelDao createdOverridePhaseDefinitionModelDao = getOrCreateOverridePhaseDefinitionFromTransaction(parentPlanPhase, curOverride.getPhaseName(),curOverride.getCurrency(), catalogEffectiveDate, curOverride, handle, context);
overridePhaseDefinitionModelDaos[i] = createdOverridePhaseDefinitionModelDao;
}
}
@@ -106,51 +103,6 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
});
}
- @Override
- public List<CatalogOverridePhaseDefinitionModelDao> getOverriddenPlanPhases(final Long planDefRecordId, final InternalTenantContext context) {
- return dbi.inTransaction(new TransactionCallback<List<CatalogOverridePhaseDefinitionModelDao>>() {
- @Override
- public List<CatalogOverridePhaseDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
- final CatalogOverridePhaseDefinitionSqlDao sqlDao = handle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
- return sqlDao.getOverriddenPlanPhases(planDefRecordId, context);
- }
- });
- }
-
- @Override
- public List<CatalogOverrideUsageDefinitionModelDao> getOverriddenPhaseUsages(final Long phaseDefRecordId, final InternalTenantContext context) {
- return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideUsageDefinitionModelDao>>() {
- @Override
- public List<CatalogOverrideUsageDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
- final CatalogOverrideUsageDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideUsageDefinitionSqlDao.class);
- return sqlDao.getOverriddenPhaseUsages(phaseDefRecordId, context);
- }
- });
- }
-
- @Override
- public List<CatalogOverrideTierDefinitionModelDao> getOverriddenUsageTiers(final Long usageDefRecordId, final InternalTenantContext context) {
- return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideTierDefinitionModelDao>>() {
- @Override
- public List<CatalogOverrideTierDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
- final CatalogOverrideTierDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideTierDefinitionSqlDao.class);
- return sqlDao.getOverriddenUsageTiers(usageDefRecordId, context);
- }
- });
- }
-
-
- @Override
- public List<CatalogOverrideBlockDefinitionModelDao> getOverriddenTierBlocks(final Long tierDefRecordId, final InternalTenantContext context) {
- return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideBlockDefinitionModelDao>>() {
- @Override
- public List<CatalogOverrideBlockDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
- final CatalogOverrideBlockDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
- return sqlDao.getOverriddenTierBlocks(tierDefRecordId, context);
- }
- });
- }
-
private Long getOverridePlanDefinitionFromTransaction(final CatalogOverridePhaseDefinitionModelDao[] overridePhaseDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
final CatalogOverridePlanPhaseSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePlanPhaseSqlDao.class);
@@ -159,11 +111,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
final CatalogOverridePhaseDefinitionModelDao cur = overridePhaseDefinitionModelDaos[i];
if (cur != null) {
// Each key is the concatenation of the phase_number, phase_definition_record_id
- final StringBuffer key = new StringBuffer();
- key.append(i);
- key.append(",");
- key.append(cur.getRecordId());
- keys.add(key.toString());
+ keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
}
}
return keys.size() > 0 ? sqlDao.getTargetPlanDefinition(keys, keys.size(), context) : null;
@@ -175,74 +123,91 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
sqlDao.create(modelDao, context);
}
- private CatalogOverridePhaseDefinitionModelDao getOrCreateOverridePhaseDefinitionFromTransaction(final PlanPhase parentPlanPhase, final String parentPhaseName, final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
- final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
-
- boolean isUsageOverrideNull = true;
- for (UsagePriceOverride usagePriceOverride: override.getUsagePriceOverrides()) {
- if (usagePriceOverride != null) {
- isUsageOverrideNull = false;
- break;
- }
- }
-
- if(isUsageOverrideNull) {
- List<CatalogOverridePhaseDefinitionModelDao> results = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
- for(CatalogOverridePhaseDefinitionModelDao resultPhase : results)
- if (resultPhase != null && getOverriddenPhaseUsages(resultPhase.getRecordId(), context).size() == 0)
- return resultPhase;
-
- final CatalogOverridePhaseDefinitionModelDao phaseDef = new CatalogOverridePhaseDefinitionModelDao(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(),
- catalogEffectiveDate);
- sqlDao.create(phaseDef, context);
- final Long recordId = sqlDao.getLastInsertId();
- CatalogOverridePhaseDefinitionModelDao result = sqlDao.getByRecordId(recordId, context);
- return result;
- }
+ private CatalogOverridePhaseDefinitionModelDao getOrCreateOverridePhaseDefinitionFromTransaction(final PlanPhase parentPlanPhase, final String parentPhaseName,final Currency currency, final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
+ final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
- final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos = new CatalogOverrideUsageDefinitionModelDao[override.getUsagePriceOverrides().size()];
+ if(override.getUsagePriceOverrides() != null && isUsageOverrideListHasOnlyNull(override.getUsagePriceOverrides())) {
+ getOrCreatePhaseDefinitionFromTransactionWithoutUsageOverrides(parentPhaseName, catalogEffectiveDate, override, inTransactionHandle, context);
+ }
+
+ final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos = new CatalogOverrideUsageDefinitionModelDao[override.getUsagePriceOverrides().size()];
List<UsagePriceOverride> resolvedUsageOverrides = override.getUsagePriceOverrides();
- for (int i = 0; i < resolvedUsageOverrides.size(); i++) {
- final UsagePriceOverride curOverride = resolvedUsageOverrides.get(i);
- if (curOverride != null) {
- Usage parentUsage = parentPlanPhase.getUsages()[i];
- final CatalogOverrideUsageDefinitionModelDao createdOverrideUsageDefinitionModelDao = getOrCreateOverrideUsageDefinitionFromTransaction(parentUsage, curOverride.getName(), catalogEffectiveDate, curOverride, inTransactionHandle, context);
- overrideUsageDefinitionModelDaos[i] = createdOverrideUsageDefinitionModelDao;
- }
+ for (int i = 0; i < resolvedUsageOverrides.size(); i++) {
+ final UsagePriceOverride curOverride = resolvedUsageOverrides.get(i);
+ if (curOverride != null) {
+ Usage parentUsage = parentPlanPhase.getUsages()[i];
+ final CatalogOverrideUsageDefinitionModelDao createdOverrideUsageDefinitionModelDao = getOrCreateOverrideUsageDefinitionFromTransaction(parentUsage,currency, catalogEffectiveDate, curOverride, inTransactionHandle, context);
+ overrideUsageDefinitionModelDaos[i] = createdOverrideUsageDefinitionModelDao;
}
+ }
+
+ final List<Long> targetPhaseDefinitionRecordIds = getOverridePhaseDefinitionFromTransaction(overrideUsageDefinitionModelDaos, inTransactionHandle, context);
+ List<CatalogOverridePhaseDefinitionModelDao> results = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
- final List<Long> targetPhaseDefinitionRecordIds = getOverridePhaseDefinitionFromTransaction(overrideUsageDefinitionModelDaos, inTransactionHandle, context);
- List<CatalogOverridePhaseDefinitionModelDao> results = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
- for(CatalogOverridePhaseDefinitionModelDao phase : results)
- if(targetPhaseDefinitionRecordIds!= null && targetPhaseDefinitionRecordIds.contains(phase.getRecordId()))
- return phase;
+ for(CatalogOverridePhaseDefinitionModelDao phase : results) {
+ if (targetPhaseDefinitionRecordIds != null && targetPhaseDefinitionRecordIds.contains(phase.getRecordId()))
+ return phase;
+ }
final CatalogOverridePhaseDefinitionModelDao inputPhaseDef = new CatalogOverridePhaseDefinitionModelDao(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(),
catalogEffectiveDate);
- sqlDao.create(inputPhaseDef, context);
- final Long recordId = sqlDao.getLastInsertId();
- final CatalogOverridePhaseDefinitionModelDao resultPhaseDef = sqlDao.getByRecordId(recordId, context);
+ sqlDao.create(inputPhaseDef, context);
+ final Long recordId = sqlDao.getLastInsertId();
+ final CatalogOverridePhaseDefinitionModelDao resultPhaseDef = sqlDao.getByRecordId(recordId, context);
- for (short i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
- if (overrideUsageDefinitionModelDaos[i] != null) {
- createCatalogOverridePhaseUsageFromTransaction(i, overrideUsageDefinitionModelDaos[i], resultPhaseDef, inTransactionHandle, context);
- }
- }
- return resultPhaseDef;
+ for (short i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
+ if (overrideUsageDefinitionModelDaos[i] != null) {
+ createCatalogOverridePhaseUsageFromTransaction(i, overrideUsageDefinitionModelDaos[i], resultPhaseDef, inTransactionHandle, context);
+ }
+ }
+ return resultPhaseDef;
+ }
+
+ private CatalogOverridePhaseDefinitionModelDao getOrCreatePhaseDefinitionFromTransactionWithoutUsageOverrides(String parentPhaseName,final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
+
+ final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
+ List<CatalogOverridePhaseDefinitionModelDao> resultPhases = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
+ for(CatalogOverridePhaseDefinitionModelDao resultPhase : resultPhases)
+ if (resultPhase != null && getOverriddenPhaseUsages(resultPhase.getRecordId(), context).size() == 0)
+ return resultPhase;
+
+ final CatalogOverridePhaseDefinitionModelDao phaseDef = new CatalogOverridePhaseDefinitionModelDao(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(),
+ catalogEffectiveDate);
+ sqlDao.create(phaseDef, context);
+ final Long recordId = sqlDao.getLastInsertId();
+ return sqlDao.getByRecordId(recordId, context);
+ }
+
+ private List<Long> getOverridePhaseDefinitionFromTransaction(final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
+ final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
+
+ final List<String> keys = new ArrayList<String>();
+ for (int i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
+ final CatalogOverrideUsageDefinitionModelDao cur = overrideUsageDefinitionModelDaos[i];
+ // Each key is the concatenation of the usage_number, usage_definition_record_id
+ if (cur != null) {
+ keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
+ }
+ }
+ return keys.size() > 0 ? sqlDao.getTargetPhaseDefinition(keys, keys.size(), context) : null;
}
+ private void createCatalogOverridePhaseUsageFromTransaction(final short usageNum, final CatalogOverrideUsageDefinitionModelDao usageDef, final CatalogOverridePhaseDefinitionModelDao phaseDef, final Handle inTransactionHandle, final InternalCallContext context) {
+ final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
+ final CatalogOverridePhaseUsageModelDao modelDao = new CatalogOverridePhaseUsageModelDao(usageNum, usageDef.getRecordId(), phaseDef.getRecordId());
+ sqlDao.create(modelDao, context);
+ }
- private CatalogOverrideUsageDefinitionModelDao getOrCreateOverrideUsageDefinitionFromTransaction(final Usage parentUsage, final String parentUsageName, final DateTime catalogEffectiveDate, final UsagePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context){
+ private CatalogOverrideUsageDefinitionModelDao getOrCreateOverrideUsageDefinitionFromTransaction(final Usage parentUsage, Currency currency, final DateTime catalogEffectiveDate, final UsagePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context){
final List<TierPriceOverride> resolvedTierOverrides = override.getTierPriceOverrides();
- int index = 0;
final CatalogOverrideTierDefinitionModelDao[] overrideTierDefinitionModelDaos = new CatalogOverrideTierDefinitionModelDao[resolvedTierOverrides.size()];
for (int i = 0; i < resolvedTierOverrides.size(); i++) {
final TierPriceOverride curOverride = resolvedTierOverrides.get(i);
if (curOverride != null) {
Tier parentTier = parentUsage.getTiers()[i];
- final CatalogOverrideTierDefinitionModelDao createdOverrideTierDefinitionModelDao = getOrCreateOverrideTierDefinitionFromTransaction(parentTier, curOverride,catalogEffectiveDate, inTransactionHandle, context);
+ final CatalogOverrideTierDefinitionModelDao createdOverrideTierDefinitionModelDao = getOrCreateOverrideTierDefinitionFromTransaction(parentTier, curOverride, currency, catalogEffectiveDate, inTransactionHandle, context);
overrideTierDefinitionModelDaos[i] = createdOverrideTierDefinitionModelDao;
}
}
@@ -253,7 +218,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
return sqlDao.getByRecordId(targetUsageDefinitionRecordId, context);
}
- final CatalogOverrideUsageDefinitionModelDao inputUsageDef = new CatalogOverrideUsageDefinitionModelDao(parentUsage.getName(), parentUsage.getUsageType().name(), "USD", null, null, catalogEffectiveDate);
+ final CatalogOverrideUsageDefinitionModelDao inputUsageDef = new CatalogOverrideUsageDefinitionModelDao(parentUsage.getName(), parentUsage.getUsageType().name(), currency.name(), null, null, catalogEffectiveDate);
sqlDao.create(inputUsageDef, context);
final Long recordId = sqlDao.getLastInsertId();
final CatalogOverrideUsageDefinitionModelDao resultUsageDef = sqlDao.getByRecordId(recordId, context);
@@ -266,7 +231,27 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
return resultUsageDef;
}
- private CatalogOverrideTierDefinitionModelDao getOrCreateOverrideTierDefinitionFromTransaction(final Tier parentTier, final TierPriceOverride tierPriceOverride, final DateTime catalogEffectiveDate, final Handle inTransactionHandle, final InternalCallContext context){
+ private Long getOverrideUsageDefinitionFromTransaction(final CatalogOverrideTierDefinitionModelDao[] overrideTierDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
+ final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
+
+ final List<String> keys = new ArrayList<String>();
+ for (int i = 0; i < overrideTierDefinitionModelDaos.length; i++) {
+ final CatalogOverrideTierDefinitionModelDao cur = overrideTierDefinitionModelDaos[i];
+ if (cur != null) {
+ // Each key is the concatenation of the tier_number, tier_definition_record_id
+ keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
+ }
+ }
+ return keys.size() > 0 ? sqlDao.getTargetUsageDefinition(keys, keys.size(), context) : null;
+ }
+
+ private void createCatalogOverrideUsageTierFromTransaction(final short tierNum, final CatalogOverrideTierDefinitionModelDao tierDef, final CatalogOverrideUsageDefinitionModelDao usageDef, final Handle inTransactionHandle, final InternalCallContext context) {
+ final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
+ final CatalogOverrideUsageTierModelDao modelDao = new CatalogOverrideUsageTierModelDao(tierNum, tierDef.getRecordId(), usageDef.getRecordId());
+ sqlDao.create(modelDao, context);
+ }
+
+ private CatalogOverrideTierDefinitionModelDao getOrCreateOverrideTierDefinitionFromTransaction(final Tier parentTier, final TierPriceOverride tierPriceOverride,Currency currency, final DateTime catalogEffectiveDate, final Handle inTransactionHandle, final InternalCallContext context){
final List<TieredBlockPriceOverride> resolvedTierBlockOverrides = tierPriceOverride.getTieredBlockPriceOverrides();
@@ -274,7 +259,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
for (int i = 0; i < resolvedTierBlockOverrides.size(); i++) {
final TieredBlockPriceOverride curOverride = resolvedTierBlockOverrides.get(i);
if (curOverride != null) {
- final CatalogOverrideBlockDefinitionModelDao createdOverrideBlockDefinitionModelDao = getOrCreateOverriddenBlockDefinitionFromTransaction(curOverride,catalogEffectiveDate,"USD", inTransactionHandle, context);
+ final CatalogOverrideBlockDefinitionModelDao createdOverrideBlockDefinitionModelDao = getOrCreateOverriddenBlockDefinitionFromTransaction(curOverride,catalogEffectiveDate, currency.name(), inTransactionHandle, context);
overrideBlockDefinitionModelDaos[i] = createdOverrideBlockDefinitionModelDao;
}
}
@@ -285,7 +270,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
return sqlDao.getByRecordId(targetTierDefinitionRecordId, context);
}
- final CatalogOverrideTierDefinitionModelDao inputTierDef = new CatalogOverrideTierDefinitionModelDao("USD", null, null, catalogEffectiveDate);
+ final CatalogOverrideTierDefinitionModelDao inputTierDef = new CatalogOverrideTierDefinitionModelDao(currency.name(), null, null, catalogEffectiveDate);
sqlDao.create(inputTierDef, context);
final Long recordId = sqlDao.getLastInsertId();
final CatalogOverrideTierDefinitionModelDao resultTierDef = sqlDao.getByRecordId(recordId, context);
@@ -299,6 +284,12 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
}
+ private void createCatalogOverrideTierBlockFromTransaction(final short blockNum, final CatalogOverrideBlockDefinitionModelDao blockDef, final CatalogOverrideTierDefinitionModelDao tierDef, final Handle inTransactionHandle, final InternalCallContext context) {
+ final CatalogOverrideTierBlockSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideTierBlockSqlDao.class);
+ final CatalogOverrideTierBlockModelDao modelDao = new CatalogOverrideTierBlockModelDao(blockNum, blockDef.getRecordId(), tierDef.getRecordId());
+ sqlDao.create(modelDao, context);
+ }
+
private Long getOverrideTierDefinitionFromTransaction(final CatalogOverrideBlockDefinitionModelDao[] overrideBlockDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
final CatalogOverrideTierBlockSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideTierBlockSqlDao.class);
@@ -307,86 +298,86 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
final CatalogOverrideBlockDefinitionModelDao cur = overrideBlockDefinitionModelDaos[i];
if (cur != null) {
// Each key is the concatenation of the block_number, block_definition_record_id
- final StringBuffer key = new StringBuffer();
- key.append(i);
- key.append(",");
- key.append(cur.getRecordId());
- keys.add(key.toString());
+ keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
}
}
return keys.size() > 0 ? sqlDao.getTargetTierDefinition(keys, keys.size(), context) : null;
}
- private void createCatalogOverrideTierBlockFromTransaction(final short blockNum, final CatalogOverrideBlockDefinitionModelDao blockDef, final CatalogOverrideTierDefinitionModelDao tierDef, final Handle inTransactionHandle, final InternalCallContext context) {
- final CatalogOverrideTierBlockSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideTierBlockSqlDao.class);
- final CatalogOverrideTierBlockModelDao modelDao = new CatalogOverrideTierBlockModelDao(blockNum, blockDef.getRecordId(), tierDef.getRecordId());
- sqlDao.create(modelDao, context);
- }
-
-
- private Long getOverrideUsageDefinitionFromTransaction(final CatalogOverrideTierDefinitionModelDao[] overrideTierDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
- final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
+ private CatalogOverrideBlockDefinitionModelDao getOrCreateOverriddenBlockDefinitionFromTransaction(TieredBlockPriceOverride tieredBlockPriceOverride,final DateTime catalogEffectiveDate, String currency, final Handle inTransactionHandle, final InternalCallContext context)
+ {
+ final CatalogOverrideBlockDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
- final List<String> keys = new ArrayList<String>();
- for (int i = 0; i < overrideTierDefinitionModelDaos.length; i++) {
- final CatalogOverrideTierDefinitionModelDao cur = overrideTierDefinitionModelDaos[i];
- if (cur != null) {
- // Each key is the concatenation of the tier_number, tier_definition_record_id
- final StringBuffer key = new StringBuffer();
- key.append(i);
- key.append(",").append(cur.getRecordId());
- keys.add(key.toString());
- }
+ CatalogOverrideBlockDefinitionModelDao result = sqlDao.getByAttributes(tieredBlockPriceOverride.getUnitName(),
+ currency, tieredBlockPriceOverride.getPrice(), tieredBlockPriceOverride.getMax(),
+ tieredBlockPriceOverride.getSize(),context);
+ if (result == null) {
+ final CatalogOverrideBlockDefinitionModelDao blockDef = new CatalogOverrideBlockDefinitionModelDao(tieredBlockPriceOverride.getUnitName(),currency, tieredBlockPriceOverride.getPrice(),
+ tieredBlockPriceOverride.getSize(),tieredBlockPriceOverride.getMax(), catalogEffectiveDate);
+ sqlDao.create(blockDef, context);
+ final Long recordId = sqlDao.getLastInsertId();
+ result = sqlDao.getByRecordId(recordId, context);
}
- return keys.size() > 0 ? sqlDao.getTargetUsageDefinition(keys, keys.size(), context) : null;
+ return result;
}
- private void createCatalogOverrideUsageTierFromTransaction(final short tierNum, final CatalogOverrideTierDefinitionModelDao tierDef, final CatalogOverrideUsageDefinitionModelDao usageDef, final Handle inTransactionHandle, final InternalCallContext context) {
- final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
- final CatalogOverrideUsageTierModelDao modelDao = new CatalogOverrideUsageTierModelDao(tierNum, tierDef.getRecordId(), usageDef.getRecordId());
- sqlDao.create(modelDao, context);
+ @Override
+ public List<CatalogOverridePhaseDefinitionModelDao> getOverriddenPlanPhases(final Long planDefRecordId, final InternalTenantContext context) {
+ return dbi.inTransaction(new TransactionCallback<List<CatalogOverridePhaseDefinitionModelDao>>() {
+ @Override
+ public List<CatalogOverridePhaseDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+ final CatalogOverridePhaseDefinitionSqlDao sqlDao = handle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
+ return sqlDao.getOverriddenPlanPhases(planDefRecordId, context);
+ }
+ });
}
+ @Override
+ public List<CatalogOverrideUsageDefinitionModelDao> getOverriddenPhaseUsages(final Long phaseDefRecordId, final InternalTenantContext context) {
+ return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideUsageDefinitionModelDao>>() {
+ @Override
+ public List<CatalogOverrideUsageDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+ final CatalogOverrideUsageDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideUsageDefinitionSqlDao.class);
+ return sqlDao.getOverriddenPhaseUsages(phaseDefRecordId, context);
+ }
+ });
+ }
- private List<Long> getOverridePhaseDefinitionFromTransaction(final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
- final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
-
- final List<String> keys = new ArrayList<String>();
- for (int i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
- final CatalogOverrideUsageDefinitionModelDao cur = overrideUsageDefinitionModelDaos[i];
- if (cur != null) {
- StringBuffer key = new StringBuffer();
- key.append(i);
- key.append(",");
- key.append(cur.getRecordId());
- keys.add(key.toString());
+ @Override
+ public List<CatalogOverrideTierDefinitionModelDao> getOverriddenUsageTiers(final Long usageDefRecordId, final InternalTenantContext context) {
+ return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideTierDefinitionModelDao>>() {
+ @Override
+ public List<CatalogOverrideTierDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+ final CatalogOverrideTierDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideTierDefinitionSqlDao.class);
+ return sqlDao.getOverriddenUsageTiers(usageDefRecordId, context);
}
- }
- return keys.size() > 0 ? sqlDao.getTargetPhaseDefinition(keys, keys.size(), context) : null;
+ });
}
- private void createCatalogOverridePhaseUsageFromTransaction(final short usageNum, final CatalogOverrideUsageDefinitionModelDao usageDef, final CatalogOverridePhaseDefinitionModelDao phaseDef, final Handle inTransactionHandle, final InternalCallContext context) {
- final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
- final CatalogOverridePhaseUsageModelDao modelDao = new CatalogOverridePhaseUsageModelDao(usageNum, usageDef.getRecordId(), phaseDef.getRecordId());
- sqlDao.create(modelDao, context);
+ @Override
+ public List<CatalogOverrideBlockDefinitionModelDao> getOverriddenTierBlocks(final Long tierDefRecordId, final InternalTenantContext context) {
+ return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideBlockDefinitionModelDao>>() {
+ @Override
+ public List<CatalogOverrideBlockDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+ final CatalogOverrideBlockDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
+ return sqlDao.getOverriddenTierBlocks(tierDefRecordId, context);
+ }
+ });
}
- private CatalogOverrideBlockDefinitionModelDao getOrCreateOverriddenBlockDefinitionFromTransaction(TieredBlockPriceOverride tieredBlockPriceOverride,final DateTime catalogEffectiveDate, String currency, final Handle inTransactionHandle, final InternalCallContext context)
- {
- final CatalogOverrideBlockDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
- CatalogOverrideBlockDefinitionModelDao result = sqlDao.getByAttributes(tieredBlockPriceOverride.getUnitName(),
- currency, tieredBlockPriceOverride.getPrice(), tieredBlockPriceOverride.getMax(),
- tieredBlockPriceOverride.getSize(),context);
- if (result == null) {
- final CatalogOverrideBlockDefinitionModelDao blockDef = new CatalogOverrideBlockDefinitionModelDao(tieredBlockPriceOverride.getUnitName(),currency, tieredBlockPriceOverride.getPrice(),
- tieredBlockPriceOverride.getSize(),tieredBlockPriceOverride.getMax(), catalogEffectiveDate);
- sqlDao.create(blockDef, context);
- final Long recordId = sqlDao.getLastInsertId();
- result = sqlDao.getByRecordId(recordId, context);
- }
- return result;
+ private boolean isUsageOverrideListHasOnlyNull(List<UsagePriceOverride> usagePriceOverrides) {
+ for (UsagePriceOverride override : usagePriceOverrides)
+ if (override != null) return false;
+ return true;
}
+ private StringBuffer getConcatenatedKey(int index, Long recordId) {
+ final StringBuffer key = new StringBuffer();
+ key.append(index);
+ key.append(",");
+ key.append(recordId);
+ return key;
+ }
}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
index 12c8ab3..112c7c3 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
@@ -91,7 +91,7 @@ public class DefaultBlock extends ValidatingConfig<StandaloneCatalog> implements
}
- public DefaultBlock(final DefaultUnit unit, final Double size,final DefaultInternationalPrice prices, final BigDecimal overriddenPrice, Currency currency) {
+ public DefaultBlock(final DefaultUnit unit, final Double size, final DefaultInternationalPrice prices, final BigDecimal overriddenPrice, Currency currency) {
this.unit = unit;
this.size = size;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
index b5c36d3..7e40cfc 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
@@ -62,7 +62,6 @@ public class DefaultInternationalPrice extends ValidatingConfig<StandaloneCatalo
public DefaultInternationalPrice(final DefaultInternationalPrice in, final BigDecimal overriddenPrice, final Currency currency) {
this.prices = in.getPrices() != null ? new DefaultPrice[in.getPrices().length] : null;
- // There is a question on whether we keep the other prices that were not overridden or only have one entry for the overridden price on that currency.
for (int i = 0; i < in.getPrices().length; i++) {
final DefaultPrice curPrice = (DefaultPrice) in.getPrices()[i];
if (curPrice.getCurrency().equals(currency)){
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
index 6f39664..2043107 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
@@ -83,6 +83,7 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
public DefaultUsage(final Usage in, UsagePriceOverride override, Currency currency) {
this.name = in.getName();
this.usageType = in.getUsageType();
+ this.billingPeriod = in.getBillingPeriod();
this.billingMode = in.getBillingMode();
this.limits = (DefaultLimit[]) in.getLimits();
this.blocks = (DefaultBlock[]) in.getBlocks();
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
index 3a0424d..1f7ccdd 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
@@ -99,17 +99,14 @@ public class DefaultPriceOverride implements PriceOverride {
}
- public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides){
+ public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides) throws CatalogApiException{
List<UsagePriceOverride> resolvedUsageOverrides = new ArrayList<UsagePriceOverride>();
- int index = 0;
+
for (final Usage curUsage : usages) {
final UsagePriceOverride curOverride = Iterables.tryFind(usagePriceOverrides, new Predicate<UsagePriceOverride>() {
@Override
public boolean apply(final UsagePriceOverride input) {
- if (input.getName() != null) {
- return input.getName().equals(curUsage.getName());
- }
- return false;
+ return input.getName() != null && input.getName().equals(curUsage.getName());
}
}).orNull();
if(curOverride != null)
@@ -117,18 +114,19 @@ public class DefaultPriceOverride implements PriceOverride {
else
resolvedUsageOverrides.add(null);
}
+
return resolvedUsageOverrides;
}
- public List<TierPriceOverride> getResolvedTierOverrides(Tier[] tiers, List<TierPriceOverride> tierPriceOverrides){
+ public List<TierPriceOverride> getResolvedTierOverrides(Tier[] tiers, List<TierPriceOverride> tierPriceOverrides) throws CatalogApiException{
List<TierPriceOverride> resolvedTierOverrides = new ArrayList<TierPriceOverride>();
- int index = 0;
+
for (final Tier curTier : tiers) {
final TierPriceOverride curOverride = Iterables.tryFind(tierPriceOverrides, new Predicate<TierPriceOverride>() {
@Override
public boolean apply(final TierPriceOverride input) {
- if (input.getTieredBlockPriceOverrides() != null)
+ if (input.getTieredBlockPriceOverrides() != null) {
for (TieredBlockPriceOverride blockPriceOverride : input.getTieredBlockPriceOverrides()) {
String unitName = blockPriceOverride.getUnitName();
Double max = blockPriceOverride.getMax();
@@ -143,12 +141,13 @@ public class DefaultPriceOverride implements PriceOverride {
}
}
}
+ }
return false;
}
}).orNull();
if(curOverride != null)
- resolvedTierOverrides.add(new DefaultTierPriceOverride(getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides())));
+ resolvedTierOverrides.add(new DefaultTierPriceOverride(getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides())));
else
resolvedTierOverrides.add(null);
}
@@ -156,19 +155,18 @@ public class DefaultPriceOverride implements PriceOverride {
return resolvedTierOverrides;
}
- public List<TieredBlockPriceOverride> getResolvedTieredBlockPriceOverrides(TieredBlock[] tieredBlocks, List<TieredBlockPriceOverride> tieredBlockPriceOverrides){
+ public List<TieredBlockPriceOverride> getResolvedTieredBlockPriceOverrides(TieredBlock[] tieredBlocks, List<TieredBlockPriceOverride> tieredBlockPriceOverrides) throws CatalogApiException {
List<TieredBlockPriceOverride> resolvedTieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
- int index = 0;
+
for (final TieredBlock curTieredBlock : tieredBlocks) {
final TieredBlockPriceOverride curOverride = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() {
@Override
public boolean apply(final TieredBlockPriceOverride input) {
- if (input.getUnitName() != null && input.getSize()!=null && input.getMax()!=null) {
-
- return (input.getUnitName().equals(curTieredBlock.getUnit().getName()) && Double.compare(input.getSize(),curTieredBlock.getSize())==0 && Double.compare(input.getMax(),curTieredBlock.getMax())==0);
- }
- return false;
+ return input.getUnitName() != null && input.getSize() != null && input.getMax() != null &&
+ (input.getUnitName().equals(curTieredBlock.getUnit().getName()) &&
+ Double.compare(input.getSize(), curTieredBlock.getSize()) == 0 &&
+ Double.compare(input.getMax(), curTieredBlock.getMax()) == 0);
}
}).orNull();
@@ -179,7 +177,19 @@ public class DefaultPriceOverride implements PriceOverride {
resolvedTieredBlockPriceOverrides.add(null);
}
- return resolvedTieredBlockPriceOverrides;
+ for (int i = 0; i < resolvedTieredBlockPriceOverrides.size(); i++) {
+ final TieredBlockPriceOverride curOverride = resolvedTieredBlockPriceOverrides.get(i);
+ if (curOverride != null) {
+ final DefaultTieredBlock curTieredBlock = (DefaultTieredBlock)tieredBlocks[i];
+
+ if (curTieredBlock.getPrice() == null && curOverride.getPrice() != null) {
+ final String error = String.format("There is no existing price for the tiered block %s", curTieredBlock.getUnit().getName());
+ throw new CatalogApiException(ErrorCode.CAT_INVALID_INVALID_UNIT_PRICE_OVERRIDE, curTieredBlock.getUnit().getName() , error);
+ }
+ }
+ }
+
+ return resolvedTieredBlockPriceOverrides;
}
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
index 316e1dc..c9582cc 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
@@ -8,6 +8,7 @@ tableFields(prefix) ::= <<
, <prefix>effective_date
, <prefix>created_date
, <prefix>created_by
+, <prefix>currency
, <prefix>tenant_record_id
>>
@@ -23,6 +24,7 @@ tableValues() ::= <<
, :effectiveDate
, :createdDate
, :createdBy
+, :currency
, :tenantRecordId
>>
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql b/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
index 8b5aa8e..aa2c415 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
@@ -42,12 +42,78 @@ CREATE TABLE catalog_override_plan_phase (
) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
CREATE INDEX catalog_override_plan_phase_idx ON catalog_override_plan_phase(tenant_record_id, phase_number, phase_def_record_id);
+DROP TABLE IF EXISTS catalog_override_usage_definition;
+create table catalog_override_usage_definition
+(
+record_id serial unique,
+parent_usage_name varchar(255) NOT NULL,
+type varchar(255) NOT NULL,
+fixed_price decimal(15,9) NULL,
+recurring_price decimal(15,9) NULL,
+currency varchar(3) NOT NULL,
+effective_date datetime NOT NULL,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_usage_definition_idx ON catalog_override_usage_definition(tenant_record_id, parent_usage_name, currency);
+
+
+DROP TABLE IF EXISTS catalog_override_tier_definition;
+create table catalog_override_tier_definition
+(
+record_id serial unique,
+fixed_price decimal(15,9) NULL,
+recurring_price decimal(15,9) NULL,
+currency varchar(3) NOT NULL,
+effective_date datetime NOT NULL,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_tier_definition_idx ON catalog_override_usage_definition(tenant_record_id, currency);
+
+DROP TABLE IF EXISTS catalog_override_block_definition;
+create table catalog_override_block_definition
+(
+record_id serial unique,
+parent_unit_name varchar(255) NOT NULL,
+size double NOT NULL,
+max double NULL,
+currency varchar(3) NOT NULL,
+price decimal(15,9) NOT NULL,
+effective_date datetime NOT NULL,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_block_definition_idx ON catalog_override_block_definition(tenant_record_id, parent_unit_name, currency);
+
+
+DROP TABLE IF EXISTS catalog_override_phase_usage;
+create table catalog_override_phase_usage
+(
+record_id serial unique,
+usage_number smallint(5) unsigned,
+usage_def_record_id bigint /*! unsigned */ not null,
+target_phase_def_record_id bigint /*! unsigned */ not null,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_phase_usage_idx ON catalog_override_phase_usage(tenant_record_id, usage_number, usage_def_record_id);
+
+
DROP TABLE IF EXISTS catalog_override_usage_tier;
create table catalog_override_usage_tier
(
record_id serial unique,
-tier_number smallint(5) /*! unsigned */ unsigned,
+tier_number smallint(5) unsigned,
tier_def_record_id bigint /*! unsigned */ not null,
target_usage_def_record_id bigint /*! unsigned */ not null,
created_date datetime NOT NULL,
@@ -56,3 +122,20 @@ tenant_record_id bigint /*! unsigned */ not null default 0,
PRIMARY KEY(record_id)
);
CREATE INDEX catalog_override_usage_tier_idx ON catalog_override_usage_tier(tenant_record_id, tier_number, tier_def_record_id);
+
+
+DROP TABLE IF EXISTS catalog_override_tier_block;
+create table catalog_override_tier_block
+(
+block_number smallint(5) unsigned,
+record_id serial unique,
+block_def_record_id bigint /*! unsigned */ not null,
+target_tier_def_record_id bigint /*! unsigned */ not null,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ NOT NULL default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_tier_block_idx ON catalog_override_tier_block(tenant_record_id, block_number, block_def_record_id);
+
+
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java
index cbff820..348af33 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java
@@ -45,8 +45,8 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
resolvedOverrides[0] = null;
- resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("128.76"));
- final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan.getName(), new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+ resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("128.76"), null);
+ final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
assertEquals(newPlan.getParentPlanName(), "standard-monthly");
assertTrue(newPlan.getIsActive());
}
@@ -58,15 +58,29 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
- resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, null);
+ resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, null, null);
resolvedOverrides[1] = null;
- resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("348.64"));
- final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan.getName(), new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+ resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("348.64"), null);
+ final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+
+ final PlanPhasePriceOverride[] resolvedOverrides1 = new PlanPhasePriceOverride[plan.getAllPhases().length];
+ resolvedOverrides1[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, null, null);
+ resolvedOverrides1[1] = null;
+ resolvedOverrides1[2] = null;
+ final CatalogOverridePlanDefinitionModelDao newPlan1 = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides1, internalCallContext);
+
+
assertEquals(newPlan.getParentPlanName(), "discount-standard-monthly");
assertTrue(newPlan.getIsActive());
+ assertEquals(newPlan1.getParentPlanName(), "discount-standard-monthly");
+ assertTrue(newPlan1.getIsActive());
+
final List<CatalogOverridePhaseDefinitionModelDao> phases = catalogOverrideDao.getOverriddenPlanPhases(newPlan.getRecordId(), internalCallContext);
assertEquals(phases.size(), 2);
+
+ final List<CatalogOverridePhaseDefinitionModelDao> phases1 = catalogOverrideDao.getOverriddenPlanPhases(newPlan1.getRecordId(), internalCallContext);
+ assertEquals(phases1.size(), 1);
}
@Test(groups = "slow")
@@ -76,11 +90,11 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
- resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, BigDecimal.ONE);
- resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[1].getName(), Currency.USD, BigDecimal.ONE, BigDecimal.TEN);
- resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, BigDecimal.ZERO, new BigDecimal("348.64"));
+ resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, BigDecimal.ONE, null);
+ resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[1].getName(), Currency.USD, BigDecimal.ONE, BigDecimal.TEN, null);
+ resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, BigDecimal.ZERO, new BigDecimal("348.64"), null);
- final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan.getName(), new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+ final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
final List<CatalogOverridePhaseDefinitionModelDao> phases = catalogOverrideDao.getOverriddenPlanPhases(newPlan.getRecordId(), internalCallContext);
assertEquals(phases.size(), 3);
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
index aa2dc48..6090a65 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
@@ -103,7 +103,7 @@ public class TestCatalogOverridePhaseDefinitionSqlDao extends CatalogTestSuiteWi
}
private void checkRehydrated(final CatalogOverridePhaseDefinitionModelDao obj, final CatalogOverridePhaseDefinitionSqlDao sqlDao) {
- final CatalogOverridePhaseDefinitionModelDao rehydrated = sqlDao.getByAttributes(obj.getParentPhaseName(), obj.getCurrency(), obj.getFixedPrice(), obj.getRecurringPrice(), internalCallContext);
+ final CatalogOverridePhaseDefinitionModelDao rehydrated = sqlDao.getByAttributes(obj.getParentPhaseName(), obj.getCurrency(), obj.getFixedPrice(), obj.getRecurringPrice(), internalCallContext).get(0);
assertEquals(rehydrated.getParentPhaseName(), obj.getParentPhaseName());
if (obj.getFixedPrice() != null) {
assertEquals(rehydrated.getFixedPrice().compareTo(obj.getFixedPrice()), 0);
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
index 0af9c4a..2813984 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
@@ -51,9 +51,9 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null);
+ final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null,null);
overrides.add(phase1);
- final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"));
+ final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"),null);
overrides.add(phase3);
final DefaultPlan overriddenPlan = priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -104,7 +104,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, null, BigDecimal.ONE);
+ final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, null, BigDecimal.ONE,null);
overrides.add(phase1);
priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -118,9 +118,9 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
- final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null);
+ final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null, null);
overrides.add(phase1);
- final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"));
+ final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"),null);
overrides.add(phase3);
final DefaultPlan overriddenPlanCreated = priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
index 07053ca..32eb734 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
@@ -41,34 +41,34 @@ public class PhasePriceOverrideJson {
private final String phaseType;
private final BigDecimal fixedPrice;
private final BigDecimal recurringPrice;
- private final List<UsageOverrideJson> usageOverrides;
+ private final List<UsagePriceOverrideJson> usagePriceOverrides;
@JsonCreator
public PhasePriceOverrideJson(@JsonProperty("phaseName") final String phaseName,
@JsonProperty("phaseType") final String phaseType,
@Nullable @JsonProperty("fixedPrice") final BigDecimal fixedPrice,
@Nullable @JsonProperty("recurringPrice") final BigDecimal recurringPrice,
- @Nullable @JsonProperty("usageOverrides") final List<UsageOverrideJson> usageOverrides) {
+ @Nullable @JsonProperty("usageOverrides") final List<UsagePriceOverrideJson> usagePriceOverrides) {
this.phaseName = phaseName;
this.phaseType = phaseType;
this.fixedPrice = fixedPrice;
this.recurringPrice = recurringPrice;
- this.usageOverrides = usageOverrides;
+ this.usagePriceOverrides = usagePriceOverrides;
}
public PhasePriceOverrideJson(final String phaseName,
final String phaseType,
final BigDecimal fixedPrice,
final BigDecimal recurringPrice,
- final Usage[] usageOverrides,
+ final Usage[] usagePriceOverrides,
final Currency currency) throws CatalogApiException {
this.phaseName = phaseName;
this.phaseType = phaseType;
this.fixedPrice = fixedPrice;
this.recurringPrice = recurringPrice;
- this.usageOverrides = new LinkedList<UsageOverrideJson>();
+ this.usagePriceOverrides = new LinkedList<UsagePriceOverrideJson>();
- for (final Usage usage : usageOverrides) {
+ for (final Usage usage : usagePriceOverrides) {
List <TierPriceOverrideJson> tierPriceOverridesJson = new LinkedList<TierPriceOverrideJson>();
for(final Tier tier :usage.getTiers())
{
@@ -82,8 +82,8 @@ public class PhasePriceOverrideJson {
TierPriceOverrideJson tierPriceOverrideJson = new TierPriceOverrideJson(blockPriceOverridesJson);
tierPriceOverridesJson.add(tierPriceOverrideJson);
}
- final UsageOverrideJson usageOverrideJson = new UsageOverrideJson(usage.getName(), usage.getUsageType(),usage.getBillingMode(), tierPriceOverridesJson);
- this.usageOverrides.add(usageOverrideJson);
+ final UsagePriceOverrideJson usagePriceOverrideJson = new UsagePriceOverrideJson(usage.getName(), usage.getUsageType(),usage.getBillingMode(), tierPriceOverridesJson);
+ this.usagePriceOverrides.add(usagePriceOverrideJson);
}
}
@@ -104,8 +104,8 @@ public class PhasePriceOverrideJson {
return phaseType;
}
- public List<UsageOverrideJson> getUsageOverrides() {
- return usageOverrides;
+ public List<UsagePriceOverrideJson> getUsagePriceOverrides() {
+ return usagePriceOverrides;
}
@@ -116,7 +116,7 @@ public class PhasePriceOverrideJson {
"phaseType='" + phaseType + '\'' +
", fixedPrice=" + fixedPrice +
", recurringPrice=" + recurringPrice +
- ", usageOverrides=" + usageOverrides +
+ ", usageOverrides=" + usagePriceOverrides +
'}';
}
@@ -144,7 +144,7 @@ public class PhasePriceOverrideJson {
if (recurringPrice != null ? recurringPrice.compareTo(that.recurringPrice) != 0 : that.recurringPrice != null) {
return false;
}
- if (usageOverrides != null ? usageOverrides.equals(that.usageOverrides) : that.usageOverrides != null) {
+ if (usagePriceOverrides != null ? usagePriceOverrides.equals(that.usagePriceOverrides) : that.usagePriceOverrides != null) {
return false;
}
return true;
@@ -156,7 +156,7 @@ public class PhasePriceOverrideJson {
result = 31 * result + (recurringPrice != null ? recurringPrice.hashCode() : 0);
result = 31 * result + (phaseType != null ? phaseType.hashCode() : 0);
result = 31 * result + (recurringPrice != null ? recurringPrice.hashCode() : 0);
- result = 31 * result + (usageOverrides != null ? usageOverrides.hashCode() : 0);
+ result = 31 * result + (usagePriceOverrides != null ? usagePriceOverrides.hashCode() : 0);
return result;
}
@@ -170,10 +170,10 @@ public class PhasePriceOverrideJson {
public PlanPhasePriceOverride apply(@Nullable final PhasePriceOverrideJson input) {
List <UsagePriceOverride> usagePriceOverrides = new LinkedList<UsagePriceOverride>();
- if(input.getUsageOverrides()!=null) {
- for (final UsageOverrideJson usageOverrideJson : input.getUsageOverrides()) {
+ assert input != null;
+ if(input.getUsagePriceOverrides()!=null) {
+ for (final UsagePriceOverrideJson usageOverrideJson : input.getUsagePriceOverrides()) {
List<TierPriceOverride> tierPriceOverrides = new LinkedList<TierPriceOverride>();
-
for (final TierPriceOverrideJson tierPriceOverrideJson : usageOverrideJson.getTierPriceOverrides()) {
List<TieredBlockPriceOverride> blockPriceOverrides = new LinkedList<TieredBlockPriceOverride>();
for (final BlockPriceOverrideJson block : tierPriceOverrideJson.getBlockPriceOverrides()) {
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java
index 170187f..14e7b6e 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java
@@ -51,8 +51,7 @@ public class TestEntitlementJsonWithEvents extends JaxrsTestSuiteNoDB {
final DateTime effectiveDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
final UUID eventId = UUID.randomUUID();
final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
- final List<UsageOverrideJson> usageOverrideJson = new ArrayList<UsageOverrideJson>();
- usageOverrideJson.add(new UsageOverrideJson("test",null,null,null));
+
final EventSubscriptionJson newEvent = new EventSubscriptionJson(eventId.toString(),
BillingPeriod.NO_BILLING_PERIOD.toString(),
requestedDate.toLocalDate(),
@@ -67,7 +66,7 @@ public class TestEntitlementJsonWithEvents extends JaxrsTestSuiteNoDB {
PhaseType.DISCOUNT.toString(),
auditLogs);
- final PhasePriceOverrideJson priceOverride = new PhasePriceOverrideJson("bar", null, BigDecimal.TEN, BigDecimal.ONE,usageOverrideJson);
+ final PhasePriceOverrideJson priceOverride = new PhasePriceOverrideJson("bar", null, BigDecimal.TEN, BigDecimal.ONE,null);
final SubscriptionJson entitlementJsonWithEvents = new SubscriptionJson(accountId,
bundleId,