Skip to content

Commit

Permalink
Add new policy to define how to compute usage price for consumable in…
Browse files Browse the repository at this point in the history
… arrear model. See #719
  • Loading branch information
sbrossie committed Mar 17, 2017
1 parent dce9066 commit 4ee682d
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 18 deletions.
Expand Up @@ -28,6 +28,7 @@


import org.killbill.billing.catalog.api.BlockType; import org.killbill.billing.catalog.api.BlockType;
import org.killbill.billing.catalog.api.FixedType; import org.killbill.billing.catalog.api.FixedType;
import org.killbill.billing.catalog.api.TierBlockPolicy;


public class CatalogSafetyInitializer { public class CatalogSafetyInitializer {


Expand Down Expand Up @@ -58,6 +59,8 @@ public static void initializeNonRequiredNullFieldsWithDefaultValue(final Object
initializeFieldWithValue(obj, f, FixedType.ONE_TIME); initializeFieldWithValue(obj, f, FixedType.ONE_TIME);
} else if (BlockType.class.equals(f.getType())) { } else if (BlockType.class.equals(f.getType())) {
initializeFieldWithValue(obj, f, BlockType.VANILLA); initializeFieldWithValue(obj, f, BlockType.VANILLA);
} else if (TierBlockPolicy.class.equals(f.getType())) {
initializeFieldWithValue(obj, f, TierBlockPolicy.ALL_TIERS);
} }
} else if (Integer.class.equals(f.getType())) { } else if (Integer.class.equals(f.getType())) {
initializeFieldWithValue(obj, f, DEFAULT_NON_REQUIRED_INTEGER_FIELD_VALUE); initializeFieldWithValue(obj, f, DEFAULT_NON_REQUIRED_INTEGER_FIELD_VALUE);
Expand Down Expand Up @@ -97,6 +100,8 @@ private static LinkedList<Field> initializeNonRequiredFields(final Class<?> aCla
result.add(f); result.add(f);
} else if (BlockType.class.equals(f.getType())) { } else if (BlockType.class.equals(f.getType())) {
result.add(f); result.add(f);
} else if (TierBlockPolicy.class.equals(f.getType())) {
result.add(f);
} }
} else if (Integer.class.equals(f.getType())) { } else if (Integer.class.equals(f.getType())) {
result.add(f); result.add(f);
Expand Down
Expand Up @@ -42,6 +42,8 @@
import org.killbill.billing.catalog.api.Usage; import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.catalog.api.UsagePriceOverride; import org.killbill.billing.catalog.api.UsagePriceOverride;
import org.killbill.billing.catalog.api.UsageType; import org.killbill.billing.catalog.api.UsageType;
import org.killbill.billing.catalog.api.TierBlockPolicy;

import org.killbill.xmlloader.ValidatingConfig; import org.killbill.xmlloader.ValidatingConfig;
import org.killbill.xmlloader.ValidationError; import org.killbill.xmlloader.ValidationError;
import org.killbill.xmlloader.ValidationErrors; import org.killbill.xmlloader.ValidationErrors;
Expand All @@ -63,6 +65,9 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
@XmlAttribute(required = true) @XmlAttribute(required = true)
private UsageType usageType; private UsageType usageType;


@XmlAttribute(required = false)
private TierBlockPolicy tierBlockPolicy;

@XmlElement(required = true) @XmlElement(required = true)
private BillingPeriod billingPeriod; private BillingPeriod billingPeriod;


Expand Down Expand Up @@ -98,6 +103,7 @@ public DefaultUsage() {
public DefaultUsage(final Usage in, UsagePriceOverride override, Currency currency) { public DefaultUsage(final Usage in, UsagePriceOverride override, Currency currency) {
this.name = in.getName(); this.name = in.getName();
this.usageType = in.getUsageType(); this.usageType = in.getUsageType();
this.tierBlockPolicy = in.getTierBlockPolicy();
this.billingPeriod = in.getBillingPeriod(); this.billingPeriod = in.getBillingPeriod();
this.billingMode = in.getBillingMode(); this.billingMode = in.getBillingMode();
this.limits = (DefaultLimit[]) in.getLimits(); this.limits = (DefaultLimit[]) in.getLimits();
Expand Down Expand Up @@ -153,6 +159,11 @@ public UsageType getUsageType() {
return usageType; return usageType;
} }


@Override
public TierBlockPolicy getTierBlockPolicy() {
return tierBlockPolicy;
}

@Override @Override
public BillingPeriod getBillingPeriod() { public BillingPeriod getBillingPeriod() {
return billingPeriod; return billingPeriod;
Expand Down Expand Up @@ -251,6 +262,11 @@ public DefaultUsage setUsageType(final UsageType usageType) {
return this; return this;
} }


public DefaultUsage setTierBlockPolicy(final TierBlockPolicy tierBlockPolicy) {
this.tierBlockPolicy = tierBlockPolicy;
return this;
}

public DefaultUsage setPhase(final PlanPhase phase) { public DefaultUsage setPhase(final PlanPhase phase) {
this.phase = phase; this.phase = phase;
return this; return this;
Expand Down Expand Up @@ -331,6 +347,9 @@ public boolean equals(final Object o) {
if (usageType != that.usageType) { if (usageType != that.usageType) {
return false; return false;
} }
if (tierBlockPolicy != that.tierBlockPolicy) {
return false;
}


return true; return true;
} }
Expand All @@ -340,6 +359,7 @@ public int hashCode() {
int result = name != null ? name.hashCode() : 0; int result = name != null ? name.hashCode() : 0;
result = 31 * result + (billingMode != null ? billingMode.hashCode() : 0); result = 31 * result + (billingMode != null ? billingMode.hashCode() : 0);
result = 31 * result + (usageType != null ? usageType.hashCode() : 0); result = 31 * result + (usageType != null ? usageType.hashCode() : 0);
result = 31 * result + (tierBlockPolicy != null ? tierBlockPolicy.hashCode() : 0);
result = 31 * result + (billingPeriod != null ? billingPeriod.hashCode() : 0); result = 31 * result + (billingPeriod != null ? billingPeriod.hashCode() : 0);
result = 31 * result + (limits != null ? Arrays.hashCode(limits) : 0); result = 31 * result + (limits != null ? Arrays.hashCode(limits) : 0);
result = 31 * result + (blocks != null ? Arrays.hashCode(blocks) : 0); result = 31 * result + (blocks != null ? Arrays.hashCode(blocks) : 0);
Expand Down
Expand Up @@ -27,6 +27,7 @@
import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.Plan; import org.killbill.billing.catalog.api.Plan;
import org.killbill.billing.catalog.api.PlanPhase; import org.killbill.billing.catalog.api.PlanPhase;
import org.killbill.billing.catalog.api.TierBlockPolicy;
import org.killbill.billing.catalog.api.Usage; import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.catalog.api.UsageType; import org.killbill.billing.catalog.api.UsageType;
import org.killbill.xmlloader.XMLLoader; import org.killbill.xmlloader.XMLLoader;
Expand Down Expand Up @@ -71,6 +72,7 @@ public void testUsageCapacityInAdvance() {
assertEquals(usage.getBillingPeriod(), BillingPeriod.MONTHLY); assertEquals(usage.getBillingPeriod(), BillingPeriod.MONTHLY);
assertEquals(usage.getUsageType(), UsageType.CAPACITY); assertEquals(usage.getUsageType(), UsageType.CAPACITY);
assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE);
assertEquals(usage.getTierBlockPolicy(), TierBlockPolicy.ALL_TIERS);


assertEquals(usage.getBlocks().length, 0); assertEquals(usage.getBlocks().length, 0);
assertEquals(usage.getTiers().length, 0); assertEquals(usage.getTiers().length, 0);
Expand Down
Expand Up @@ -395,11 +395,24 @@ BigDecimal computeToBeBilledCapacityInArrear(final List<RolledUpUnit> roUnits) t
BigDecimal computeToBeBilledConsumableInArrear(final RolledUpUnit roUnit) throws CatalogApiException { BigDecimal computeToBeBilledConsumableInArrear(final RolledUpUnit roUnit) throws CatalogApiException {


Preconditions.checkState(isBuilt.get()); Preconditions.checkState(isBuilt.get());
final List<TieredBlock> tieredBlocks = getConsumableInArrearTieredBlocks(usage, roUnit.getUnitType());


BigDecimal result = BigDecimal.ZERO; switch (usage.getTierBlockPolicy()) {
case ALL_TIERS:
return computeToBeBilledConsumableInArrearWith_ALL_TIERS(tieredBlocks, roUnit.getAmount());
case TOP_TIER:
return computeToBeBilledConsumableInArrearWith_TOP_TIER(tieredBlocks, roUnit.getAmount());
default:
throw new IllegalStateException("Unknwon TierBlockPolicy " + usage.getTierBlockPolicy());

This comment has been minimized.

Copy link
@pierre

pierre Mar 20, 2017

Member

Nit: typo (Unknwon).



final List<TieredBlock> tieredBlocks = getConsumableInArrearTieredBlocks(usage, roUnit.getUnitType()); }
int remainingUnits = roUnit.getAmount().intValue(); }


BigDecimal computeToBeBilledConsumableInArrearWith_ALL_TIERS(final List<TieredBlock> tieredBlocks, final Long units) throws CatalogApiException {

BigDecimal result = BigDecimal.ZERO;
int remainingUnits = units.intValue();
for (final TieredBlock tieredBlock : tieredBlocks) { for (final TieredBlock tieredBlock : tieredBlocks) {


final int blockTierSize = tieredBlock.getSize().intValue(); final int blockTierSize = tieredBlock.getSize().intValue();
Expand All @@ -417,6 +430,30 @@ BigDecimal computeToBeBilledConsumableInArrear(final RolledUpUnit roUnit) throws
return result; return result;
} }


BigDecimal computeToBeBilledConsumableInArrearWith_TOP_TIER(final List<TieredBlock> tieredBlocks, final Long units) throws CatalogApiException {

int remainingUnits = units.intValue();

// By default last last tierBlock
TieredBlock targetBlock = tieredBlocks.get(tieredBlocks.size() - 1);
// Loop through all tier block
for (final TieredBlock tieredBlock : tieredBlocks) {

final int blockTierSize = tieredBlock.getSize().intValue();
final int tmp = remainingUnits / blockTierSize + (remainingUnits % blockTierSize == 0 ? 0 : 1);
if (tmp > tieredBlock.getMax()) {
remainingUnits -= tieredBlock.getMax() * blockTierSize;
} else {
targetBlock = tieredBlock;
break;
}
}
final int lastBlockTierSize = targetBlock.getSize().intValue();
final int nbBlocks = units.intValue() / lastBlockTierSize + (units.intValue() % lastBlockTierSize == 0 ? 0 : 1);
return targetBlock.getPrice().getPrice(getCurrency()).multiply(new BigDecimal(nbBlocks));
}


/** /**
* @param filteredUsageForInterval the list of invoiceItem to consider * @param filteredUsageForInterval the list of invoiceItem to consider
* @return the price amount that was already billed for that period and usage section (across unitTypes) * @return the price amount that was already billed for that period and usage section (across unitTypes)
Expand Down
Expand Up @@ -31,6 +31,7 @@
import org.killbill.billing.catalog.api.BillingPeriod; import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.CatalogApiException; import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.TierBlockPolicy;
import org.killbill.billing.catalog.api.Usage; import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.invoice.api.InvoiceItem; import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.invoice.model.FixedPriceInvoiceItem; import org.killbill.billing.invoice.model.FixedPriceInvoiceItem;
Expand Down Expand Up @@ -84,7 +85,7 @@ public void testComputeToBeBilledUsage() {


final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE); final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE);
final DefaultTier tier = createDefaultTierWithBlocks(block); final DefaultTier tier = createDefaultTierWithBlocks(block);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);


final LocalDate targetDate = startDate.plusDays(1); final LocalDate targetDate = startDate.plusDays(1);
final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, ImmutableList.<RawUsage>of(), targetDate, false, final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, ImmutableList.<RawUsage>of(), targetDate, false,
Expand Down Expand Up @@ -116,21 +117,21 @@ public void testComputeToBeBilledUsage() {
} }


@Test(groups = "fast") @Test(groups = "fast")
public void testComputeBilledUsage() throws CatalogApiException { public void testComputeBilledUsageWith_ALL_TIERS() throws CatalogApiException {


final DefaultTieredBlock block1 = createDefaultTieredBlock("unit", 100, 10, BigDecimal.ONE); final DefaultTieredBlock block1 = createDefaultTieredBlock("unit", 100, 10, BigDecimal.ONE);
final DefaultTier tier1 = createDefaultTierWithBlocks(block1); final DefaultTier tier1 = createDefaultTierWithBlocks(block1);


final DefaultTieredBlock block2 = createDefaultTieredBlock("unit", 1000, 100, BigDecimal.ONE); final DefaultTieredBlock block2 = createDefaultTieredBlock("unit", 1000, 100, BigDecimal.ONE);
final DefaultTier tier2 = createDefaultTierWithBlocks(block2); final DefaultTier tier2 = createDefaultTierWithBlocks(block2);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier1, tier2); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier1, tier2);


final LocalDate targetDate = new LocalDate(2014, 03, 20); final LocalDate targetDate = new LocalDate(2014, 03, 20);


final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, ImmutableList.<RawUsage>of(), targetDate, false, final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, ImmutableList.<RawUsage>of(), targetDate, false,
createMockBillingEvent(targetDate.toDateTimeAtStartOfDay(DateTimeZone.UTC), createMockBillingEvent(targetDate.toDateTimeAtStartOfDay(DateTimeZone.UTC),
BillingPeriod.MONTHLY, BillingPeriod.MONTHLY,
Collections.<Usage>emptyList()) Collections.<Usage>emptyList())
); );


final BigDecimal result = intervalConsumableInArrear.computeToBeBilledConsumableInArrear(new DefaultRolledUpUnit("unit", 5325L)); final BigDecimal result = intervalConsumableInArrear.computeToBeBilledConsumableInArrear(new DefaultRolledUpUnit("unit", 5325L));
Expand All @@ -139,6 +140,51 @@ public void testComputeBilledUsage() throws CatalogApiException {
assertEquals(result, new BigDecimal("15")); assertEquals(result, new BigDecimal("15"));
} }


@Test(groups = "fast")
public void testComputeBilledUsageWith_TOP_TIER() throws CatalogApiException {

final DefaultTieredBlock block1 = createDefaultTieredBlock("unit", 100, 10, BigDecimal.ONE);
final DefaultTier tier1 = createDefaultTierWithBlocks(block1);

final DefaultTieredBlock block2 = createDefaultTieredBlock("unit", 1000, 100, BigDecimal.ONE);
final DefaultTier tier2 = createDefaultTierWithBlocks(block2);

This comment has been minimized.

Copy link
@pierre

pierre Mar 20, 2017

Member

Shouldn't max be different than block2?

This comment has been minimized.

Copy link
@sbrossie

sbrossie Mar 20, 2017

Author Member

I am so confused now.. I think the current scheme is that blocks are ordered and have 2 attributes:

  • Size (which is really the 'unit size')
  • Max (max number of units).

So a first bock defined with size =10 and max=100 means that the first 1000 units would fall in that block. Then if a second block is defined with same attributes (same max), then next 1000 units would fall in that next block.

Probably worth we review and double check this is indeed what code does and what tests expect.

final DefaultTieredBlock block3 = createDefaultTieredBlock("unit", 1000, 100, new BigDecimal("0.5"));
final DefaultTier tier3 = createDefaultTierWithBlocks(block3);

final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.TOP_TIER, tier1, tier2, tier3);

final LocalDate targetDate = new LocalDate(2014, 03, 20);

final ContiguousIntervalUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage, ImmutableList.<RawUsage>of(), targetDate, false,
createMockBillingEvent(targetDate.toDateTimeAtStartOfDay(DateTimeZone.UTC),
BillingPeriod.MONTHLY,
Collections.<Usage>emptyList())
);
//
// In this model unit amount is first used to figure out which tier we are in, and then we price all unit at that 'target' tier
//
final BigDecimal inputTier1 = intervalConsumableInArrear.computeToBeBilledConsumableInArrear(new DefaultRolledUpUnit("unit", 1000L));
// 1000 units => (tier1) : 1000 / 100 + 1000 % 100 = 10
assertEquals(inputTier1, new BigDecimal("10"));

final BigDecimal inputTier2 = intervalConsumableInArrear.computeToBeBilledConsumableInArrear(new DefaultRolledUpUnit("unit", 101000L));
// 101000 units => (tier2) : 101000 / 1000 + 101000 % 1000 = 101 + 0 = 101
assertEquals(inputTier2, new BigDecimal("101"));

final BigDecimal inputTier3 = intervalConsumableInArrear.computeToBeBilledConsumableInArrear(new DefaultRolledUpUnit("unit", 101001L));
// 101001 units => (tier3) : 101001 / 1000 + 101001 % 1000 = 101 + 1 = 102 units => $51
assertEquals(inputTier3, new BigDecimal("51.0"));

// If we pass the maximum of the last tier, we price all units at the last tier
final BigDecimal inputLastTier = intervalConsumableInArrear.computeToBeBilledConsumableInArrear(new DefaultRolledUpUnit("unit", 300000L));
// 300000 units => (tier3) : 300000 / 1000 + 300000 % 1000 = 300 units => $150
assertEquals(inputLastTier, new BigDecimal("150.0"));

}



@Test(groups = "fast") @Test(groups = "fast")
public void testComputeMissingItems() throws CatalogApiException { public void testComputeMissingItems() throws CatalogApiException {


Expand All @@ -155,7 +201,7 @@ public void testComputeMissingItems() throws CatalogApiException {


final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 10, BigDecimal.ONE); final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 10, BigDecimal.ONE);
final DefaultTier tier = createDefaultTierWithBlocks(block); final DefaultTier tier = createDefaultTierWithBlocks(block);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);


final LocalDate targetDate = endDate; final LocalDate targetDate = endDate;


Expand Down Expand Up @@ -216,7 +262,7 @@ public void testGetRolledUpUsage() {
final DefaultTier tier = createDefaultTierWithBlocks(tieredBlock1, tieredBlock2); final DefaultTier tier = createDefaultTierWithBlocks(tieredBlock1, tieredBlock2);




final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);




final LocalDate t0 = new LocalDate(2015, 03, BCD); final LocalDate t0 = new LocalDate(2015, 03, BCD);
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.killbill.billing.catalog.DefaultUsage; import org.killbill.billing.catalog.DefaultUsage;
import org.killbill.billing.catalog.api.BillingPeriod; import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.TierBlockPolicy;
import org.killbill.billing.catalog.api.Usage; import org.killbill.billing.catalog.api.Usage;
import org.killbill.billing.invoice.api.InvoiceItem; import org.killbill.billing.invoice.api.InvoiceItem;
import org.killbill.billing.invoice.model.UsageInvoiceItem; import org.killbill.billing.invoice.model.UsageInvoiceItem;
Expand All @@ -47,7 +48,7 @@ public void testWithNoItems() {
final Map<String, Usage> knownUsage = new HashMap<String, Usage>(); final Map<String, Usage> knownUsage = new HashMap<String, Usage>();
final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE); final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE);
final DefaultTier tier = createDefaultTierWithBlocks(block); final DefaultTier tier = createDefaultTierWithBlocks(block);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);
knownUsage.put(usageName, usage); knownUsage.put(usageName, usage);


final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, firstEventStartDate.plusDays(1), invoiceItems, knownUsage, internalCallContext); final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, firstEventStartDate.plusDays(1), invoiceItems, knownUsage, internalCallContext);
Expand All @@ -66,7 +67,7 @@ public void testWithOneMonthlyUsageSectionTooFewItems() {
final Map<String, Usage> knownUsage = new HashMap<String, Usage>(); final Map<String, Usage> knownUsage = new HashMap<String, Usage>();
final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE); final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE);
final DefaultTier tier = createDefaultTierWithBlocks(block); final DefaultTier tier = createDefaultTierWithBlocks(block);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);
knownUsage.put(usageName, usage); knownUsage.put(usageName, usage);


final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, targetDate, invoiceItems, knownUsage, internalCallContext); final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, targetDate, invoiceItems, knownUsage, internalCallContext);
Expand All @@ -89,7 +90,7 @@ public void testWithOneMonthlyUsageSectionAndEnoughUsageItems() {
final Map<String, Usage> knownUsage = new HashMap<String, Usage>(); final Map<String, Usage> knownUsage = new HashMap<String, Usage>();
final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE); final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE);
final DefaultTier tier = createDefaultTierWithBlocks(block); final DefaultTier tier = createDefaultTierWithBlocks(block);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);
knownUsage.put(usageName, usage); knownUsage.put(usageName, usage);


final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, targetDate, invoiceItems, knownUsage, internalCallContext); final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, targetDate, invoiceItems, knownUsage, internalCallContext);
Expand All @@ -111,12 +112,12 @@ public void testWithOneMonthlyAndOneNonActiveAnnualUsageSectionAndEnoughUsageIte
final Map<String, Usage> knownUsage = new HashMap<String, Usage>(); final Map<String, Usage> knownUsage = new HashMap<String, Usage>();
final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE); final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE);
final DefaultTier tier = createDefaultTierWithBlocks(block); final DefaultTier tier = createDefaultTierWithBlocks(block);
final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, tier); final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);
knownUsage.put(usageName, usage); knownUsage.put(usageName, usage);


final DefaultTieredBlock block2 = createDefaultTieredBlock("unit2", 10, 10000, BigDecimal.TEN); final DefaultTieredBlock block2 = createDefaultTieredBlock("unit2", 10, 10000, BigDecimal.TEN);
final DefaultTier tier2 = createDefaultTierWithBlocks(block2); final DefaultTier tier2 = createDefaultTierWithBlocks(block2);
final DefaultUsage usage2 = createConsumableInArrearUsage("usageName2", BillingPeriod.ANNUAL, tier2); final DefaultUsage usage2 = createConsumableInArrearUsage("usageName2", BillingPeriod.ANNUAL, TierBlockPolicy.ALL_TIERS, tier2);
knownUsage.put("usageName2", usage2); knownUsage.put("usageName2", usage2);


final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, targetDate, invoiceItems, knownUsage, internalCallContext); final LocalDate result = rawUsageOptimizer.getOptimizedRawUsageStartDate(firstEventStartDate, targetDate, invoiceItems, knownUsage, internalCallContext);
Expand Down

0 comments on commit 4ee682d

Please sign in to comment.