@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()); } }
public DefaultUsage(final Usage in, UsagePriceOverride override, Currency currency) { this.name = in.getName(); this.usageType = in.getUsageType(); this.tierBlockPolicy = in.getTierBlockPolicy(); this.billingPeriod = in.getBillingPeriod(); this.billingMode = in.getBillingMode();
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; }
@VisibleForTesting List<UsageConsumableInArrearTierUnitAggregate> computeToBeBilledConsumableInArrear(final RolledUpUnit roUnit, final List<UsageConsumableInArrearTierUnitAggregate> previousUsage) throws CatalogApiException { Preconditions.checkState(isBuilt.get()); final List<TieredBlock> tieredBlocks = getConsumableInArrearTieredBlocks(usage, roUnit.getUnitType()); switch (usage.getTierBlockPolicy()) { case ALL_TIERS: return computeToBeBilledConsumableInArrearWith_ALL_TIERS(tieredBlocks, previousUsage, roUnit.getAmount()); case TOP_TIER: return Arrays.asList(computeToBeBilledConsumableInArrearWith_TOP_TIER(tieredBlocks, previousUsage, roUnit.getAmount())); default: throw new IllegalStateException("Unknown TierBlockPolicy " + usage.getTierBlockPolicy()); } }
public PhasePriceJson(final String planName, final String phaseName, final String phaseType, final BigDecimal fixedPrice, final BigDecimal recurringPrice, final Usage[] usagePrices, final Currency currency) throws CatalogApiException { this.planName = planName; this.phaseName = phaseName; this.phaseType = phaseType; this.fixedPrice = fixedPrice; this.recurringPrice = recurringPrice; this.usagePrices = new LinkedList<UsagePriceJson>(); for (final Usage usage : usagePrices) { List<TierPriceJson> usageTierPrices = new LinkedList<TierPriceJson>(); for (final Tier tier : usage.getTiers()) { List<BlockPriceJson> blockPrices = new LinkedList<BlockPriceJson>(); for (final TieredBlock block : tier.getTieredBlocks()) { BlockPriceJson blockPriceJson = new BlockPriceJson(block.getUnit().getName(), block.getSize(), block.getPrice().getPrice(currency), block.getMax()); blockPrices.add(blockPriceJson); } TierPriceJson tierPriceJson = new TierPriceJson(blockPrices); usageTierPrices.add(tierPriceJson); } final UsagePriceJson usagePriceJson = new UsagePriceJson(usage.getName(), usage.getUsageType(), usage.getBillingMode(), usage.getTierBlockPolicy(), usageTierPrices); this.usagePrices.add(usagePriceJson); } }
@Override protected void populateResults(final LocalDate startDate, final LocalDate endDate, final BigDecimal billedUsage, final BigDecimal toBeBilledUsage, final UsageInArrearAggregate toBeBilledUsageDetails, final boolean areAllBilledItemsWithDetails, final boolean isPeriodPreviouslyBilled, final List<InvoiceItem> result) throws InvoiceApiException { // In the case past invoice items showed the details (areAllBilledItemsWithDetails=true), billed usage has already been taken into account // as it part of the reconciliation logic, so no need to subtract it here final BigDecimal amountToBill = (usage.getTierBlockPolicy() == TierBlockPolicy.ALL_TIERS && areAllBilledItemsWithDetails) ? toBeBilledUsage : toBeBilledUsage.subtract(billedUsage); if (amountToBill.compareTo(BigDecimal.ZERO) < 0) { throw new InvoiceApiException(ErrorCode.UNEXPECTED_ERROR, String.format("ILLEGAL INVOICING STATE: Usage period start='%s', end='%s', previously billed amount='%.2f', new proposed amount='%.2f'", startDate, endDate, billedUsage, toBeBilledUsage)); } else /* amountToBill.compareTo(BigDecimal.ZERO) >= 0 */ { if (!isPeriodPreviouslyBilled || amountToBill.compareTo(BigDecimal.ZERO) > 0) { if (UsageDetailMode.DETAIL == usageDetailMode) { for (UsageConsumableInArrearTierUnitAggregate toBeBilledUsageDetail : ((UsageConsumableInArrearAggregate) toBeBilledUsageDetails).getTierDetails()) { final String itemDetails = toJson(toBeBilledUsageDetail); final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(), getPhaseName(), usage.getName(), startDate, endDate, toBeBilledUsageDetail.getAmount(), toBeBilledUsageDetail.getTierPrice(), getCurrency(), toBeBilledUsageDetail.getQuantity(), itemDetails); result.add(item); } } else { final String itemDetails = toJson(toBeBilledUsageDetails); final InvoiceItem item = new UsageInvoiceItem(invoiceId, accountId, getBundleId(), getSubscriptionId(), getProductName(), getPlanName(), getPhaseName(), usage.getName(), startDate, endDate, amountToBill, null, getCurrency(), null, itemDetails); result.add(item); } } } }
@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()); } }
public DefaultUsage(final Usage in, UsagePriceOverride override, Currency currency) { this.name = in.getName(); this.usageType = in.getUsageType(); this.tierBlockPolicy = in.getTierBlockPolicy(); this.billingPeriod = in.getBillingPeriod(); this.billingMode = in.getBillingMode();
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; }