public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides) throws CatalogApiException { List<UsagePriceOverride> resolvedUsageOverrides = new ArrayList<UsagePriceOverride>(); for (final Usage curUsage : usages) { final UsagePriceOverride curOverride = Iterables.tryFind(usagePriceOverrides, new Predicate<UsagePriceOverride>() { @Override public boolean apply(final UsagePriceOverride input) { return input.getName() != null && input.getName().equals(curUsage.getName()); } }).orNull(); if (curOverride != null) { List<TierPriceOverride> tierPriceOverrides = getResolvedTierOverrides(curUsage.getTiers(), curOverride.getTierPriceOverrides()); resolvedUsageOverrides.add(new DefaultUsagePriceOverride(curUsage.getName(), curUsage.getUsageType(), tierPriceOverrides)); } else { resolvedUsageOverrides.add(null); } } return resolvedUsageOverrides; }
this.limits = (DefaultLimit[]) in.getLimits(); this.blocks = (DefaultBlock[]) in.getBlocks(); this.tiers = new DefaultTier[in.getTiers().length]; for (int i = 0; i < in.getTiers().length; i++) { if (override != null && override.getTierPriceOverrides() != null) { final TieredBlock[] curTieredBlocks = in.getTiers()[i].getTieredBlocks(); tiers[i] = (overriddenTier != null) ? new DefaultTier(in.getTiers()[i], overriddenTier, currency) : (DefaultTier) in.getTiers()[i]; } else { tiers[i] = (DefaultTier) in.getTiers()[i];
assertEquals(usage.getBlocks().length, 0); assertEquals(usage.getTiers().length, 2); assertEquals(usage.getTiers()[0].getLimits().length, 2); assertEquals(usage.getTiers()[0].getLimits()[0].getUnit().getName(), "bandwith-meg-sec"); assertEquals(usage.getTiers()[0].getLimits()[0].getMax(), new Double("100")); assertEquals(usage.getTiers()[0].getLimits()[1].getUnit().getName(), "members"); assertEquals(usage.getTiers()[0].getLimits()[1].getMax(), new Double("500")); assertEquals(usage.getTiers()[0].getFixedPrice().getPrices().length, 1); assertEquals(usage.getTiers()[0].getFixedPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getTiers()[0].getFixedPrice().getPrices()[0].getValue(), new BigDecimal("0.007")); assertEquals(usage.getTiers()[0].getRecurringPrice().getPrices().length, 1); assertEquals(usage.getTiers()[0].getRecurringPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getTiers()[0].getRecurringPrice().getPrices()[0].getValue(), new BigDecimal("0.8")); assertEquals(usage.getTiers()[1].getLimits()[0].getUnit().getName(), "bandwith-meg-sec"); assertEquals(usage.getTiers()[1].getLimits()[0].getMax(), new Double("100")); assertEquals(usage.getTiers()[1].getLimits()[1].getUnit().getName(), "members"); assertEquals(usage.getTiers()[1].getLimits()[1].getMax(), new Double("1000")); assertEquals(usage.getTiers()[1].getFixedPrice().getPrices().length, 1); assertEquals(usage.getTiers()[1].getFixedPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getTiers()[1].getFixedPrice().getPrices()[0].getValue(), new BigDecimal("0.4")); assertEquals(usage.getTiers()[1].getRecurringPrice().getPrices().length, 1); assertEquals(usage.getTiers()[1].getRecurringPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getTiers()[1].getRecurringPrice().getPrices()[0].getValue(), new BigDecimal("1.2"));
assertEquals(usage.getBlocks().length, 0); assertEquals(usage.getTiers().length, 1); assertEquals(usage.getTiers()[0].getTieredBlocks().length, 2); 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());
private DefaultUsage toDefaultUsage(final Usage input) { final DefaultUsage result = new DefaultUsage(); result.setName(input.getName()); result.setBillingMode(input.getBillingMode()); result.setBillingPeriod(input.getBillingPeriod()); result.setUsageType(input.getUsageType()); result.setTierBlockPolicy(input.getTierBlockPolicy()); if (input.getLimits() != null && input.getLimits().length > 0) { result.setLimits(toDefaultLimits(Arrays.asList(input.getLimits()))); } if (input.getBlocks() != null && input.getBlocks().length > 0) { result.setBlocks(toDefaultBlocks(Arrays.asList(input.getBlocks()))); } if (input.getTiers() != null && input.getTiers().length > 0) { result.setTiers(toDefaultTiers(Arrays.asList(input.getTiers()))); } result.setFixedPrice(toDefaultInternationalPrice(input.getFixedPrice())); result.setRecurringPrice(toDefaultInternationalPrice(input.getRecurringPrice())); return result; }
@Test(groups = "fast") public void testUsageCapacityInAdvance() { try { final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class); final Usage[] usages = getUsages(catalog, "capacity-in-advance-monthly"); assertEquals(usages.length, 1); final Usage usage = usages[0]; assertEquals(usage.getName(), "capacity-in-advance-monthly-usage1"); assertEquals(usage.getBillingPeriod(), BillingPeriod.MONTHLY); assertEquals(usage.getUsageType(), UsageType.CAPACITY); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getTierBlockPolicy(), TierBlockPolicy.ALL_TIERS); assertEquals(usage.getBlocks().length, 0); assertEquals(usage.getTiers().length, 0); assertEquals(usage.getLimits().length, 1); assertEquals(usage.getLimits()[0].getUnit().getName(), "members"); assertEquals(usage.getLimits()[0].getMax(), new Double("100")); assertEquals(usage.getRecurringPrice().getPrices().length, 1); assertEquals(usage.getRecurringPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getRecurringPrice().getPrices()[0].getValue(), new BigDecimal("100.00")); } catch (Exception e) { Assert.fail(e.toString()); } }
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(); 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, currency, catalogEffectiveDate, inTransactionHandle, context); overrideTierDefinitionModelDaos[i] = createdOverrideTierDefinitionModelDao; } } final CatalogOverrideUsageDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageDefinitionSqlDao.class); final List<Long> targetUsageDefinitionRecordIds = getOverrideUsageDefinitionFromTransaction(overrideTierDefinitionModelDaos, inTransactionHandle, context); List<CatalogOverrideUsageDefinitionModelDao> results = sqlDao.getByAttributes(parentUsage.getName(), context); for(CatalogOverrideUsageDefinitionModelDao usage : results) { if (targetUsageDefinitionRecordIds != null && targetUsageDefinitionRecordIds.contains(usage.getRecordId())) { return usage; } } 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); for (short i = 0; i < overrideTierDefinitionModelDaos.length; i++) { if (overrideTierDefinitionModelDaos[i] != null) { createCatalogOverrideUsageTierFromTransaction(i, overrideTierDefinitionModelDaos[i], resultUsageDef, inTransactionHandle, context); } } return resultUsageDef; }
@Test(groups = "fast") public void testUsageConsumableInAdvanceTopUp() { try { final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class); final Usage[] usages = getUsages(catalog, "consumable-in-advance-topup"); assertEquals(usages.length, 1); final Usage usage = usages[0]; assertEquals(usage.getName(), "consumable-in-advance-topup-usage1"); assertEquals(usage.getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD); assertEquals(usage.getUsageType(), UsageType.CONSUMABLE); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getLimits().length, 0); assertEquals(usage.getTiers().length, 0); assertEquals(usage.getBlocks().length, 1); assertEquals(usage.getBlocks()[0].getUnit().getName(), "fastrack-tokens"); assertEquals(usage.getBlocks()[0].getSize(), new Double("10")); assertEquals(usage.getBlocks()[0].getPrice().getPrices().length, 1); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getValue(), new BigDecimal("0.10")); assertEquals(usage.getBlocks()[0].getMinTopUpCredit(), new Double("5")); } catch (Exception e) { Assert.fail(e.toString()); } }
@Test(groups = "fast") public void testUsageConsumableInAdvancePrepayCredit() { try { final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class); final Usage[] usages = getUsages(catalog, "consumable-in-advance-prepay-credit-monthly"); assertEquals(usages.length, 1); final Usage usage = usages[0]; assertEquals(usage.getName(), "consumable-in-advance-prepay-credit-monthly-usage1"); assertEquals(usage.getBillingPeriod(), BillingPeriod.MONTHLY); assertEquals(usage.getUsageType(), UsageType.CONSUMABLE); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getLimits().length, 0); assertEquals(usage.getTiers().length, 0); assertEquals(usage.getBlocks().length, 1); assertEquals(usage.getBlocks()[0].getUnit().getName(), "cell-phone-minutes"); assertEquals(usage.getBlocks()[0].getSize(), new Double("1000")); assertEquals(usage.getBlocks()[0].getPrice().getPrices().length, 1); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getValue(), new BigDecimal("0.10")); } catch (Exception e) { Assert.fail(e.toString()); } }
public static List<Tier> getCapacityInArrearTier(final Usage usage) { Preconditions.checkArgument(usage.getBillingMode() == BillingMode.IN_ARREAR && usage.getUsageType() == UsageType.CAPACITY); Preconditions.checkArgument(usage.getTiers().length > 0); return ImmutableList.copyOf(usage.getTiers()); }
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; }
public static Set<String> getCapacityInArrearUnitTypes(final Usage usage) { Preconditions.checkArgument(usage.getBillingMode() == BillingMode.IN_ARREAR && usage.getUsageType() == UsageType.CAPACITY); Preconditions.checkArgument(usage.getTiers().length > 0); final Set<String> result = new HashSet<String>(); for (Tier tier : usage.getTiers()) { for (Limit limit : tier.getLimits()) { result.add(limit.getUnit().getName()); } } return result; }
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; }
private List<UsageJson> buildUsagesJson(final Usage[] usages) throws CurrencyValueNull { List<UsageJson> usagesJson = new ArrayList<UsageJson>(); for (int i = 0; i < usages.length; i++) { usagesJson.add(new UsageJson(usages[i].getBillingPeriod().toString(), buildTiers(usages[i].getTiers()))); } return usagesJson; }
public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides) throws CatalogApiException { List<UsagePriceOverride> resolvedUsageOverrides = new ArrayList<UsagePriceOverride>(); for (final Usage curUsage : usages) { final UsagePriceOverride curOverride = Iterables.tryFind(usagePriceOverrides, new Predicate<UsagePriceOverride>() { @Override public boolean apply(final UsagePriceOverride input) { return input.getName() != null && input.getName().equals(curUsage.getName()); } }).orNull(); if (curOverride != null) { List<TierPriceOverride> tierPriceOverrides = getResolvedTierOverrides(curUsage.getTiers(), curOverride.getTierPriceOverrides()); resolvedUsageOverrides.add(new DefaultUsagePriceOverride(curUsage.getName(), curUsage.getUsageType(), tierPriceOverrides)); } else { resolvedUsageOverrides.add(null); } } return resolvedUsageOverrides; }
private DefaultUsage toDefaultUsage(final Usage input) { final DefaultUsage result = new DefaultUsage(); result.setName(input.getName()); result.setBillingMode(input.getBillingMode()); result.setBillingPeriod(input.getBillingPeriod()); result.setUsageType(input.getUsageType()); result.setTierBlockPolicy(input.getTierBlockPolicy()); if (input.getLimits() != null && input.getLimits().length > 0) { result.setLimits(toDefaultLimits(Arrays.asList(input.getLimits()))); } if (input.getBlocks() != null && input.getBlocks().length > 0) { result.setBlocks(toDefaultBlocks(Arrays.asList(input.getBlocks()))); } if (input.getTiers() != null && input.getTiers().length > 0) { result.setTiers(toDefaultTiers(Arrays.asList(input.getTiers()))); } result.setFixedPrice(toDefaultInternationalPrice(input.getFixedPrice())); result.setRecurringPrice(toDefaultInternationalPrice(input.getRecurringPrice())); return result; }
@Test(groups = "fast") public void testUsageConsumableInAdvancePrepayCredit() { try { final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class); final Usage[] usages = getUsages(catalog, "consumable-in-advance-prepay-credit-monthly"); assertEquals(usages.length, 1); final Usage usage = usages[0]; assertEquals(usage.getName(), "consumable-in-advance-prepay-credit-monthly-usage1"); assertEquals(usage.getBillingPeriod(), BillingPeriod.MONTHLY); assertEquals(usage.getUsageType(), UsageType.CONSUMABLE); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getLimits().length, 0); assertEquals(usage.getTiers().length, 0); assertEquals(usage.getBlocks().length, 1); assertEquals(usage.getBlocks()[0].getUnit().getName(), "cell-phone-minutes"); assertEquals(usage.getBlocks()[0].getSize(), new Double("1000")); assertEquals(usage.getBlocks()[0].getPrice().getPrices().length, 1); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getValue(), new BigDecimal("0.10")); } catch (Exception e) { Assert.fail(e.toString()); } }
@Test(groups = "fast") public void testUsageCapacityInAdvance() { try { final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class); final Usage[] usages = getUsages(catalog, "capacity-in-advance-monthly"); assertEquals(usages.length, 1); final Usage usage = usages[0]; assertEquals(usage.getName(), "capacity-in-advance-monthly-usage1"); assertEquals(usage.getBillingPeriod(), BillingPeriod.MONTHLY); assertEquals(usage.getUsageType(), UsageType.CAPACITY); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getTierBlockPolicy(), TierBlockPolicy.ALL_TIERS); assertEquals(usage.getBlocks().length, 0); assertEquals(usage.getTiers().length, 0); assertEquals(usage.getLimits().length, 1); assertEquals(usage.getLimits()[0].getUnit().getName(), "members"); assertEquals(usage.getLimits()[0].getMax(), new Double("100")); assertEquals(usage.getRecurringPrice().getPrices().length, 1); assertEquals(usage.getRecurringPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getRecurringPrice().getPrices()[0].getValue(), new BigDecimal("100.00")); } catch (Exception e) { Assert.fail(e.toString()); } }
@Test(groups = "fast") public void testUsageConsumableInAdvanceTopUp() { try { final StandaloneCatalog catalog = XMLLoader.getObjectFromString(Resources.getResource("UsageExperimental.xml").toExternalForm(), StandaloneCatalog.class); final Usage[] usages = getUsages(catalog, "consumable-in-advance-topup"); assertEquals(usages.length, 1); final Usage usage = usages[0]; assertEquals(usage.getName(), "consumable-in-advance-topup-usage1"); assertEquals(usage.getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD); assertEquals(usage.getUsageType(), UsageType.CONSUMABLE); assertEquals(usage.getBillingMode(), BillingMode.IN_ADVANCE); assertEquals(usage.getLimits().length, 0); assertEquals(usage.getTiers().length, 0); assertEquals(usage.getBlocks().length, 1); assertEquals(usage.getBlocks()[0].getUnit().getName(), "fastrack-tokens"); assertEquals(usage.getBlocks()[0].getSize(), new Double("10")); assertEquals(usage.getBlocks()[0].getPrice().getPrices().length, 1); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getCurrency(), Currency.BTC); assertEquals(usage.getBlocks()[0].getPrice().getPrices()[0].getValue(), new BigDecimal("0.10")); assertEquals(usage.getBlocks()[0].getMinTopUpCredit(), new Double("5")); } catch (Exception e) { Assert.fail(e.toString()); } }