public List<TieredBlockPriceOverride> getResolvedTieredBlockPriceOverrides(TieredBlock[] tieredBlocks, List<TieredBlockPriceOverride> tieredBlockPriceOverrides) throws CatalogApiException { List<TieredBlockPriceOverride> resolvedTieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>(); for (final TieredBlock curTieredBlock : tieredBlocks) { final TieredBlockPriceOverride curOverride = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() { @Override public boolean apply(final TieredBlockPriceOverride input) { 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(); if (curOverride != null) { resolvedTieredBlockPriceOverrides.add(new DefaultTieredBlockPriceOverride(curTieredBlock.getUnit().getName(), curOverride.getSize(), curOverride.getPrice(), curOverride.getCurrency(), curOverride.getMax())); } else { resolvedTieredBlockPriceOverrides.add(null); } } return resolvedTieredBlockPriceOverrides; }
@Override public boolean apply(final CatalogOverrideBlockDefinitionModelDao input) { return (input.getParentUnitName().equals(curTieredBlock.getUnit().getName()) && Double.compare(input.getSize(), curTieredBlock.getSize()) == 0 && Double.compare(input.getMax(), curTieredBlock.getMax()) == 0); } }).orNull();
public static Set<String> getConsumableInArrearUnitTypes(final Usage usage) { Preconditions.checkArgument(usage.getBillingMode() == BillingMode.IN_ARREAR && usage.getUsageType() == UsageType.CONSUMABLE); Preconditions.checkArgument(usage.getTiers().length > 0); final Set<String> result = new HashSet<String>(); for (Tier tier : usage.getTiers()) { for (TieredBlock tierBlock : tier.getTieredBlocks()) { result.add(tierBlock.getUnit().getName()); } } return result; }
private DefaultTieredBlock toDefaultTieredBlock(TieredBlock input) { DefaultTieredBlock result = null; if (input != null) { result = new DefaultTieredBlock(); result.setUnit(toDefaultUnit(input.getUnit())); result.setMax(input.getMax()); result.setType(input.getType()); result.setSize(input.getSize()); result.setPrice(toDefaultInternationalPrice(input.getPrice())); } return result; }
@Override public boolean apply(final TieredBlockPriceOverride input) { 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();
public List<TieredBlockPriceOverride> getResolvedTieredBlockPriceOverrides(TieredBlock[] tieredBlocks, List<TieredBlockPriceOverride> tieredBlockPriceOverrides) throws CatalogApiException { List<TieredBlockPriceOverride> resolvedTieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>(); for (final TieredBlock curTieredBlock : tieredBlocks) { final TieredBlockPriceOverride curOverride = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() { @Override public boolean apply(final TieredBlockPriceOverride input) { 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(); if (curOverride != null) { resolvedTieredBlockPriceOverrides.add(new DefaultTieredBlockPriceOverride(curTieredBlock.getUnit().getName(), curOverride.getSize(), curOverride.getPrice(), curOverride.getCurrency(), curOverride.getMax())); } else { resolvedTieredBlockPriceOverrides.add(null); } } return resolvedTieredBlockPriceOverrides; }
assertEquals(usage.getTiers()[0].getTieredBlocks()[0].getUnit().getName(), "cell-phone-minutes"); assertEquals(usage.getTiers()[0].getTieredBlocks()[0].getSize(), new Double("1000")); assertEquals(usage.getTiers()[0].getTieredBlocks()[0].getMax(), new Double("10000")); assertEquals(usage.getTiers()[0].getTieredBlocks()[0].getPrice().getPrices().length, 1); assertEquals(usage.getTiers()[0].getTieredBlocks()[0].getPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getTiers()[0].getTieredBlocks()[0].getPrice().getPrices()[0].getValue(), new BigDecimal("0.5")); assertEquals(usage.getTiers()[0].getTieredBlocks()[1].getUnit().getName(), "Mbytes"); assertEquals(usage.getTiers()[0].getTieredBlocks()[1].getSize(), new Double("512")); assertEquals(usage.getTiers()[0].getTieredBlocks()[1].getMax(), new Double("512000")); assertEquals(usage.getTiers()[0].getTieredBlocks()[1].getPrice().getPrices().length, 1); assertEquals(usage.getTiers()[0].getTieredBlocks()[1].getPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getTiers()[0].getTieredBlocks()[1].getPrice().getPrices()[0].getValue(), new BigDecimal("0.3")); } catch (Exception e) { Assert.fail(e.toString());
@Override public boolean apply(final TierPriceOverride input) { if (input != null) { final List<TieredBlockPriceOverride> blockPriceOverrides = input.getTieredBlockPriceOverrides(); for (TieredBlockPriceOverride blockDef : blockPriceOverrides) { String unitName = blockDef.getUnitName(); Double max = blockDef.getMax(); Double size = blockDef.getSize(); for (TieredBlock curTieredBlock : curTieredBlocks) { if (unitName.equals(curTieredBlock.getUnit().getName()) && Double.compare(size, curTieredBlock.getSize()) == 0 && Double.compare(max, curTieredBlock.getMax()) == 0) { return true; } } } } return false; } }).orNull();
public static List<TieredBlock> getConsumableInArrearTieredBlocks(final Usage usage, final String unitType) { Preconditions.checkArgument(usage.getBillingMode() == BillingMode.IN_ARREAR && usage.getUsageType() == UsageType.CONSUMABLE); Preconditions.checkArgument(usage.getTiers().length > 0); final List<TieredBlock> result = Lists.newLinkedList(); for (Tier tier : usage.getTiers()) { boolean found = false; for (TieredBlock tierBlock : tier.getTieredBlocks()) { if (tierBlock.getUnit().getName().equals(unitType)) { result.add(tierBlock); found = true; break; } } // We expect this method to return an ordered list of TieredBlock, each for each tier. Preconditions.checkState(found, "Catalog issue in usage section '%s': Missing tierBlock definition for unit '%s'", usage.getName(), unitType); } return result; }
@Override public boolean apply(final CatalogOverrideTierDefinitionModelDao input) { final List<CatalogOverrideBlockDefinitionModelDao> blockDefs = overrideDao.getOverriddenTierBlocks(input.getRecordId(), context); for (CatalogOverrideBlockDefinitionModelDao blockDef : blockDefs) { String unitName = blockDef.getParentUnitName(); Double max = blockDef.getMax(); Double size = blockDef.getSize(); for (TieredBlock curTieredBlock : curTieredBlocks) { if (unitName.equals(curTieredBlock.getUnit().getName()) && Double.compare(size, curTieredBlock.getSize()) == 0 && Double.compare(max, curTieredBlock.getMax()) == 0) { return true; } } } return false; }
private List<TieredBlockJson> buildTieredBlocks(final TieredBlock[] tieredBlocks) throws CurrencyValueNull { List<TieredBlockJson> tieredBlocksJson = new ArrayList<TieredBlockJson>(); if (tieredBlocks != null && tieredBlocks.length > 0) { for (int i = 0; i < tieredBlocks.length; i++) { tieredBlocksJson.add(new TieredBlockJson(tieredBlocks[i].getUnit().getName(), tieredBlocks[i].getSize().toString(), tieredBlocks[i].getMax().toString(), buildPrices(tieredBlocks[i].getPrice()))); } } return tieredBlocksJson; } }
@Override public boolean apply(final TierPriceOverride input) { if (input.getTieredBlockPriceOverrides() != null) { for (TieredBlockPriceOverride blockPriceOverride : input.getTieredBlockPriceOverrides()) { String unitName = blockPriceOverride.getUnitName(); Double max = blockPriceOverride.getMax(); Double size = blockPriceOverride.getSize(); for (int i = 0; i < curTier.getTieredBlocks().length; i++) { TieredBlock curTieredBlock = curTier.getTieredBlocks()[i]; if (unitName.equals(curTieredBlock.getUnit().getName()) && Double.compare(size, curTieredBlock.getSize()) == 0 && Double.compare(max, curTieredBlock.getMax()) == 0) { return true; } } } } return false; } }).orNull();
UsageConsumableInArrearTierUnitAggregate computeToBeBilledConsumableInArrearWith_TOP_TIER(final List<TieredBlock> tieredBlocks, final List<UsageConsumableInArrearTierUnitAggregate> previousUsage, final Long units) throws CatalogApiException { int remainingUnits = units.intValue(); // By default last last tierBlock TieredBlock targetBlock = tieredBlocks.get(tieredBlocks.size() - 1); int targetTierNum = tieredBlocks.size(); int tierNum = 0; // Loop through all tier block for (final TieredBlock tieredBlock : tieredBlocks) { tierNum++; final int blockTierSize = tieredBlock.getSize().intValue(); final int tmp = remainingUnits / blockTierSize + (remainingUnits % blockTierSize == 0 ? 0 : 1); if ( tmp > tieredBlock.getMax()) { /* Includes the case where max is unlimited (-1) */ remainingUnits -= tieredBlock.getMax() * blockTierSize; } else { targetBlock = tieredBlock; targetTierNum = tierNum; break; } } final int lastBlockTierSize = targetBlock.getSize().intValue(); final int nbBlocks = units.intValue() / lastBlockTierSize + (units.intValue() % lastBlockTierSize == 0 ? 0 : 1); return new UsageConsumableInArrearTierUnitAggregate(targetTierNum, targetBlock.getUnit().getName(), targetBlock.getPrice().getPrice(getCurrency()), targetBlock.getSize().intValue(), nbBlocks); }
@Override public boolean apply(final CatalogOverrideBlockDefinitionModelDao input) { return (input.getParentUnitName().equals(curTieredBlock.getUnit().getName()) && Double.compare(input.getSize(), curTieredBlock.getSize()) == 0 && Double.compare(input.getMax(), curTieredBlock.getMax()) == 0); } }).orNull();
private DefaultTieredBlock toDefaultTieredBlock(TieredBlock input) { DefaultTieredBlock result = null; if (input != null) { result = new DefaultTieredBlock(); result.setUnit(toDefaultUnit(input.getUnit())); result.setMax(input.getMax()); result.setType(input.getType()); result.setSize(input.getSize()); result.setPrice(toDefaultInternationalPrice(input.getPrice())); } return result; }
final int blockTierSize = tieredBlock.getSize().intValue(); final int tmp = remainingUnits / blockTierSize + (remainingUnits % blockTierSize == 0 ? 0 : 1); int nbUsedTierBlocks; if (tieredBlock.getMax() != (double) -1 && tmp > tieredBlock.getMax() ) { nbUsedTierBlocks = tieredBlock.getMax().intValue(); remainingUnits -= tieredBlock.getMax() * blockTierSize; } else { nbUsedTierBlocks = tmp; if (tierNum < lastPreviousUsageTier) { Preconditions.checkState(nbUsedTierBlocks == previousUsageQuantity, String.format("Expected usage for tier='%d', unit='%s' to be full, instead found units='[%d/%d]'", tierNum, tieredBlock.getUnit().getName(), nbUsedTierBlocks, previousUsageQuantity)); } else { Preconditions.checkState(nbUsedTierBlocks - previousUsageQuantity >= 0, String.format("Expected usage for tier='%d', unit='%s' to contain at least as mush as current usage, instead found units='[%d/%d]", tierNum, tieredBlock.getUnit().getName(), nbUsedTierBlocks, previousUsageQuantity)); toBeBilledDetails.add(new UsageConsumableInArrearTierUnitAggregate(tierNum, tieredBlock.getUnit().getName(), tieredBlock.getPrice().getPrice(getCurrency()), blockTierSize, nbUsedTierBlocks));