Details
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/migration/V20161220000000__unit_price_override.sql b/catalog/src/main/resources/org/killbill/billing/catalog/migration/V20161220000000__unit_price_override.sql
new file mode 100644
index 0000000..85f5589
--- /dev/null
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/migration/V20161220000000__unit_price_override.sql
@@ -0,0 +1,94 @@
+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,
+tier_def_record_id bigint /*! unsigned */ not null,
+target_usage_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_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
+(
+record_id serial unique,
+block_number smallint(5) unsigned,
+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 d202118..47c58c1 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
@@ -36,6 +36,7 @@ import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
import org.killbill.billing.catalog.api.UsagePriceOverride;
import org.killbill.billing.catalog.api.UsageType;
import org.killbill.xmlloader.XMLLoader;
+import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.io.Resources;
@@ -154,5 +155,61 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
assertEquals(curTieredBlock.getSize(),tieredBlockPriceOverride.getSize());
assertEquals(curTieredBlock.getMax(),tieredBlockPriceOverride.getMax());
}
+
+ @Test(groups = "slow")
+ public void testGetOverrideOneOutOfTwoTieredBlocks() throws Exception {
+
+ final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class);
+ final Plan plan = catalog.findCurrentPlan("chocolate-monthly");
+
+ final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
+
+ List<TieredBlockPriceOverride> tieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
+ DefaultTieredBlockPriceOverride tieredBlockPriceOverride = new DefaultTieredBlockPriceOverride("chocolate-videos", new Double("1"), new BigDecimal(0.75), Currency.USD, new Double("10000"));
+ tieredBlockPriceOverrides.add(tieredBlockPriceOverride);
+
+ List<TierPriceOverride> tierPriceOverrides = new ArrayList<TierPriceOverride>();
+ DefaultTierPriceOverride tierPriceOverride = new DefaultTierPriceOverride(tieredBlockPriceOverrides);
+
+ tierPriceOverrides.add(null);
+ tierPriceOverrides.add(tierPriceOverride);
+
+ List<UsagePriceOverride> usagePriceOverrides = new ArrayList<UsagePriceOverride>();
+ DefaultUsagePriceOverride usagePriceOverride = new DefaultUsagePriceOverride("chocolate-monthly-videos", UsageType.CONSUMABLE, tierPriceOverrides);
+ usagePriceOverrides.add(usagePriceOverride);
+
+ //Override chocolate-videos unit price with size = 1 and max value = 10000 from $1 to $0.75
+ resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, null, usagePriceOverrides);
+
+ final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+
+ final List<CatalogOverridePhaseDefinitionModelDao> phases = catalogOverrideDao.getOverriddenPlanPhases(newPlan.getRecordId(), internalCallContext);
+ assertEquals(phases.size(), 1);
+ final CatalogOverridePhaseDefinitionModelDao curPhase = phases.get(0);
+
+ assertEquals(curPhase.getCurrency(), resolvedOverrides[0].getCurrency().name());
+ Assert.assertNull(curPhase.getFixedPrice());
+ Assert.assertNull(curPhase.getRecurringPrice());
+ assertEquals(curPhase.getParentPhaseName(), resolvedOverrides[0].getPhaseName());
+
+ final List<CatalogOverrideUsageDefinitionModelDao> usages = catalogOverrideDao.getOverriddenPhaseUsages(curPhase.getRecordId(), internalCallContext);
+ assertEquals(usages.size(), 1);
+ final CatalogOverrideUsageDefinitionModelDao curUsage = usages.get(0);
+ assertEquals(curUsage.getParentUsageName(), usagePriceOverride.getName());
+ assertEquals(curUsage.getType(), usagePriceOverride.getUsageType().toString());
+
+ final List<CatalogOverrideTierDefinitionModelDao> tiers = catalogOverrideDao.getOverriddenUsageTiers(curUsage.getRecordId(), internalCallContext);
+ assertEquals(tiers.size(), 1);
+ final CatalogOverrideTierDefinitionModelDao curTier = tiers.get(0);
+
+ final List<CatalogOverrideBlockDefinitionModelDao> tierBlocks = catalogOverrideDao.getOverriddenTierBlocks(curTier.getRecordId(), internalCallContext);
+ assertEquals(tierBlocks.size(), 1);
+ final CatalogOverrideBlockDefinitionModelDao curTieredBlock = tierBlocks.get(0);
+ assertEquals(curTieredBlock.getParentUnitName(),tieredBlockPriceOverride.getUnitName());
+ assertEquals(curTieredBlock.getPrice().compareTo(tieredBlockPriceOverride.getPrice()), 0);
+ assertEquals(curTieredBlock.getSize(),tieredBlockPriceOverride.getSize());
+ assertEquals(curTieredBlock.getMax(),tieredBlockPriceOverride.getMax());
+ }
+
}
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 325b7a2..d0d5892 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
@@ -30,6 +30,10 @@ import org.killbill.billing.catalog.api.InternationalPrice;
import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
import org.killbill.billing.catalog.api.Price;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
+import org.killbill.billing.catalog.api.UsageType;
import org.killbill.billing.catalog.override.DefaultPriceOverride;
import org.killbill.xmlloader.XMLLoader;
import org.testng.annotations.Test;
@@ -180,4 +184,192 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
}
}
}
+
+ @Test(groups = "slow")
+ public void testOverrideOneOutOfTwoTieredBlockPrices() throws Exception {
+
+ final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class);
+ final Plan plan = catalog.findCurrentPlan("chocolate-monthly");
+
+ final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
+
+ final List<TieredBlockPriceOverride> tieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
+ tieredBlockPriceOverrides.add(new DefaultTieredBlockPriceOverride("chocolate-videos", new Double("1"), new BigDecimal("0.75"), Currency.USD, new Double("10000")));
+
+ final List<TierPriceOverride> tierPriceOverrides = new ArrayList<TierPriceOverride>();
+ tierPriceOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides));
+
+ final List<UsagePriceOverride> usagePriceOverrides = new ArrayList<UsagePriceOverride>();
+ usagePriceOverrides.add(new DefaultUsagePriceOverride("chocolate-monthly-videos", UsageType.CONSUMABLE, tierPriceOverrides));
+
+ final PlanPhasePriceOverride phase = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(),Currency.USD, null, null, usagePriceOverrides);
+ overrides.add(phase);
+
+ //Overriding only the tieredblockprice for unit - 'chocolate-videos' with size = 1 and max = 10000 from $1 to $0.75
+ final DefaultPlan overriddenPlan = priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
+
+ final Matcher m = DefaultPriceOverride.CUSTOM_PLAN_NAME_PATTERN.matcher(overriddenPlan.getName());
+
+ assertTrue(m.matches());
+ assertEquals(m.group(1), plan.getName());
+ assertEquals(overriddenPlan.getProduct().getName(), plan.getProduct().getName());
+ assertEquals(overriddenPlan.getRecurringBillingPeriod(), plan.getRecurringBillingPeriod());
+ if (plan.getEffectiveDateForExistingSubscriptions() != null) {
+ assertEquals(overriddenPlan.getEffectiveDateForExistingSubscriptions().compareTo(plan.getEffectiveDateForExistingSubscriptions()), 0);
+ }
+ assertNotEquals(overriddenPlan.getFinalPhase().getName(), plan.getFinalPhase().getName());
+
+ for(int i = 0 ; i < overriddenPlan.getFinalPhase().getUsages().length; i++) {
+ final DefaultUsage initialUsage = (DefaultUsage) plan.getFinalPhase().getUsages()[i];
+ final DefaultUsage newUsage = (DefaultUsage) overriddenPlan.getFinalPhase().getUsages()[i];
+
+ assertEquals(newUsage.getName(), initialUsage.getName());
+ assertEquals(newUsage.getUsageType(), initialUsage.getUsageType());
+ assertEquals(newUsage.getBillingPeriod(), initialUsage.getBillingPeriod());
+ assertEquals(newUsage.getBillingPeriod(), initialUsage.getBillingPeriod());
+ assertEquals(newUsage.getTiers().length, initialUsage.getTiers().length);
+
+ for(int j = 0 ; j < newUsage.getTiers().length; j++){
+ final DefaultTier initialTier = (DefaultTier) initialUsage.getTiers()[j];
+ final DefaultTier newTier = (DefaultTier) newUsage.getTiers()[j];
+ assertEquals(newTier.getTieredBlocks().length, initialTier.getTieredBlocks().length);
+
+ for(int k = 0; k < newTier.getTieredBlocks().length; k++){
+ final DefaultTieredBlock initialTieredBlock = (DefaultTieredBlock) initialTier.getTieredBlocks()[k];
+ final DefaultTieredBlock newTieredBlock = (DefaultTieredBlock) newTier.getTieredBlocks()[k];
+ final TieredBlockPriceOverride override = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() {
+ @Override
+ public boolean apply(final TieredBlockPriceOverride input) {
+
+ return input.getUnitName().equals(initialTieredBlock.getUnit().getName()) &&
+ Double.compare(input.getSize(), initialTieredBlock.getSize()) == 0 &&
+ Double.compare(input.getMax(), initialTieredBlock.getMax()) == 0;
+ }
+ }).orNull();
+
+ assertEquals(newTieredBlock.getUnit().getName(), initialTieredBlock.getUnit().getName());
+ assertEquals(newTieredBlock.getMax(),newTieredBlock.getMax());
+ assertEquals(newTieredBlock.getSize(), newTieredBlock.getSize());
+ assertTieredBlockInternationalPrice(newTieredBlock.getPrice(), initialTieredBlock.getPrice(), override);
+ }
+ }
+ }
+ }
+
+ @Test(groups = "slow")
+ public void testOverrideTwoOutOfTwoTieredBlockPrices() throws Exception {
+
+ final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class);
+ final Plan plan = catalog.findCurrentPlan("chocolate-monthly");
+
+ final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
+
+ final List<TieredBlockPriceOverride> tieredBlockPriceOverrides1 = new ArrayList<TieredBlockPriceOverride>();
+ tieredBlockPriceOverrides1.add(new DefaultTieredBlockPriceOverride("chocolate-videos", new Double("1"), new BigDecimal("1.5"), Currency.USD, new Double("5")));
+
+ final List<TieredBlockPriceOverride> tieredBlockPriceOverrides2 = new ArrayList<TieredBlockPriceOverride>();
+ tieredBlockPriceOverrides2.add(new DefaultTieredBlockPriceOverride("chocolate-videos", new Double("1"), new BigDecimal("0.75"), Currency.USD, new Double("10000")));
+
+ final List<TierPriceOverride> tierPriceOverrides = new ArrayList<TierPriceOverride>();
+ tierPriceOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides1));
+ tierPriceOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides2));
+
+ final List<UsagePriceOverride> usagePriceOverrides = new ArrayList<UsagePriceOverride>();
+ usagePriceOverrides.add(new DefaultUsagePriceOverride("chocolate-monthly-videos", UsageType.CONSUMABLE, tierPriceOverrides));
+
+ final PlanPhasePriceOverride phase = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(),Currency.USD, null, new BigDecimal("35"), usagePriceOverrides);
+ overrides.add(phase);
+
+ /* Overriding phase recurring price from $30 to $35, tieredblockprice from $2 to $1.5 for unit- 'chocolate-videos' with size = 1 and max = 5 and
+ also overriding tieredblockprice from $1 to $0.75 for unit - 'chocolate-videos' with size = 1 and max = 10000 */
+ final DefaultPlan overriddenPlan = priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
+
+ final Matcher m = DefaultPriceOverride.CUSTOM_PLAN_NAME_PATTERN.matcher(overriddenPlan.getName());
+
+ assertTrue(m.matches());
+ assertEquals(m.group(1), plan.getName());
+ assertEquals(overriddenPlan.getProduct().getName(), plan.getProduct().getName());
+ assertEquals(overriddenPlan.getRecurringBillingPeriod(), plan.getRecurringBillingPeriod());
+ if (plan.getEffectiveDateForExistingSubscriptions() != null) {
+ assertEquals(overriddenPlan.getEffectiveDateForExistingSubscriptions().compareTo(plan.getEffectiveDateForExistingSubscriptions()), 0);
+ }
+ assertNotEquals(overriddenPlan.getFinalPhase().getName(), plan.getFinalPhase().getName());
+
+ final DefaultPlanPhase initialPhase = (DefaultPlanPhase) plan.getFinalPhase();
+ final DefaultPlanPhase newPhase = (DefaultPlanPhase) overriddenPlan.getFinalPhase();
+
+ final PlanPhasePriceOverride override = Iterables.tryFind(overrides, new Predicate<PlanPhasePriceOverride>() {
+ @Override
+ public boolean apply(final PlanPhasePriceOverride input) {
+ return input.getPhaseName().equals(initialPhase.getName());
+ }
+ }).orNull();
+
+ assertNotEquals(newPhase.getName(), initialPhase.getName());
+ assertEquals(newPhase.getName(), overriddenPlan.getName() + "-" + initialPhase.getName().split("-")[initialPhase.getName().split("-").length -1]);
+ assertEquals(newPhase.getDuration(), initialPhase.getDuration());
+ assertEquals(newPhase.getPhaseType(), initialPhase.getPhaseType());
+ assertEquals(newPhase.getUsages().length, initialPhase.getUsages().length);
+ if (initialPhase.getFixed() != null) {
+ assertEquals(newPhase.getFixed().getType(), initialPhase.getFixed().getType());
+ assertInternationalPrice(newPhase.getFixed().getPrice(), initialPhase.getFixed().getPrice(), override, true);
+ }
+ if (initialPhase.getRecurring() != null) {
+ assertInternationalPrice(newPhase.getRecurring().getRecurringPrice(), initialPhase.getRecurring().getRecurringPrice(), override, false);
+ }
+
+ for(int i = 0 ; i < overriddenPlan.getFinalPhase().getUsages().length; i++) {
+ final DefaultUsage initialUsage = (DefaultUsage) plan.getFinalPhase().getUsages()[i];
+ final DefaultUsage newUsage = (DefaultUsage) overriddenPlan.getFinalPhase().getUsages()[i];
+
+ assertEquals(newUsage.getName(), initialUsage.getName());
+ assertEquals(newUsage.getUsageType(), initialUsage.getUsageType());
+ assertEquals(newUsage.getBillingPeriod(), initialUsage.getBillingPeriod());
+ assertEquals(newUsage.getBillingPeriod(), initialUsage.getBillingPeriod());
+ assertEquals(newUsage.getTiers().length, initialUsage.getTiers().length);
+
+ for(int j = 0 ; j < newUsage.getTiers().length; j++){
+ final DefaultTier initialTier = (DefaultTier) initialUsage.getTiers()[j];
+ final DefaultTier newTier = (DefaultTier) newUsage.getTiers()[j];
+ assertEquals(newTier.getTieredBlocks().length, initialTier.getTieredBlocks().length);
+
+ for(int k = 0; k < newTier.getTieredBlocks().length; k++){
+ final DefaultTieredBlock initialTieredBlock = (DefaultTieredBlock) initialTier.getTieredBlocks()[k];
+ final DefaultTieredBlock newTieredBlock = (DefaultTieredBlock) newTier.getTieredBlocks()[k];
+ List<TieredBlockPriceOverride> tieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
+ tieredBlockPriceOverrides.addAll(tieredBlockPriceOverrides1);
+ tieredBlockPriceOverrides.addAll(tieredBlockPriceOverrides2);
+ final TieredBlockPriceOverride tieredBlockPriceOverride = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() {
+ @Override
+ public boolean apply(final TieredBlockPriceOverride input) {
+
+ return input.getUnitName().equals(initialTieredBlock.getUnit().getName()) &&
+ Double.compare(input.getSize(), initialTieredBlock.getSize()) == 0 &&
+ Double.compare(input.getMax(), initialTieredBlock.getMax()) == 0;
+ }
+ }).orNull();
+
+ assertEquals(newTieredBlock.getUnit().getName(), initialTieredBlock.getUnit().getName());
+ assertEquals(newTieredBlock.getMax(),newTieredBlock.getMax());
+ assertEquals(newTieredBlock.getSize(), newTieredBlock.getSize());
+ assertTieredBlockInternationalPrice(newTieredBlock.getPrice(), initialTieredBlock.getPrice(), tieredBlockPriceOverride);
+ }
+ }
+ }
+ }
+
+ private void assertTieredBlockInternationalPrice(final InternationalPrice newInternationalPrice, final InternationalPrice initInternationalPrice, final TieredBlockPriceOverride override) throws CurrencyValueNull {
+ assertEquals(newInternationalPrice.getPrices().length, initInternationalPrice.getPrices().length);
+ for (int i = 0; i < newInternationalPrice.getPrices().length; i++) {
+ final Price initPrice = initInternationalPrice.getPrices()[i];
+ final Price newPrice = newInternationalPrice.getPrices()[i];
+ if (override != null && override.getCurrency() == initPrice.getCurrency() && override.getPrice() != null) {
+ assertEquals(newPrice.getValue().compareTo(override.getPrice()), 0);
+ } else {
+ if (initPrice != null && initPrice.getValue() != null) {
+ assertEquals(newPrice.getValue().compareTo(initPrice.getValue()), 0);
+ }
+ }
+ }
+ }
}
diff --git a/catalog/src/test/resources/UsageExperimental.xml b/catalog/src/test/resources/UsageExperimental.xml
index 11f3d17..9fd614f 100644
--- a/catalog/src/test/resources/UsageExperimental.xml
+++ b/catalog/src/test/resources/UsageExperimental.xml
@@ -38,6 +38,7 @@
<unit name="fastrack-tokens"/>
<unit name="bandwith-meg-sec"/>
<unit name="Mbytes"/>
+ <unit name="chocolate-videos" />
</units>
<products>
@@ -59,6 +60,9 @@
<product name="ConsumableInArrear">
<category>BASE</category>
</product>
+ <product name="Chocolate">
+ <category>BASE</category>
+ </product>
</products>
<rules>
@@ -264,6 +268,60 @@
</finalPhase>
</plan>
+ <plan name="chocolate-monthly">
+ <product>Chocolate</product>
+ <finalPhase type="EVERGREEN">
+ <duration>
+ <unit>UNLIMITED</unit>
+ </duration>
+ <recurring>
+ <billingPeriod>MONTHLY</billingPeriod>
+ <recurringPrice>
+ <price>
+ <currency>USD</currency>
+ <value>30.00</value>
+ </price>
+ </recurringPrice>
+ </recurring>
+ <usages>
+ <usage name="chocolate-monthly-videos" billingMode="IN_ARREAR" usageType="CONSUMABLE">
+ <billingPeriod>MONTHLY</billingPeriod>
+ <tiers>
+ <tier>
+ <blocks>
+ <tieredBlock>
+ <unit>chocolate-videos</unit>
+ <size>1</size>
+ <prices>
+ <price>
+ <currency>USD</currency>
+ <value>2</value>
+ </price>
+ </prices>
+ <max>5</max>
+ </tieredBlock>
+ </blocks>
+ </tier>
+ <tier>
+ <blocks>
+ <tieredBlock>
+ <unit>chocolate-videos</unit>
+ <size>1</size>
+ <prices>
+ <price>
+ <currency>USD</currency>
+ <value>1</value>
+ </price>
+ </prices>
+ <max>10000</max>
+ </tieredBlock>
+ </blocks>
+ </tier>
+ </tiers>
+ </usage>
+ </usages>
+ </finalPhase>
+ </plan>
</plans>
<priceLists>
@@ -274,6 +332,7 @@
<plan>consumable-in-advance-topup</plan>
<plan>capacity-in-arrear</plan>
<plan>consumable-in-arrear</plan>
+ <plan>chocolate-monthly</plan>
</plans>
</defaultPriceList>
</priceLists>