package net.billforward.model; import java.util.Date; import net.billforward.exception.APIConnectionException; import net.billforward.exception.APIException; import net.billforward.exception.AuthenticationException; import net.billforward.exception.CardException; import net.billforward.exception.InvalidRequestException; import net.billforward.model.usage.Period; import net.billforward.model.usage.Usage; import net.billforward.model.usage.UsageSession; public class RealtimeUsagePriceCalculatorTest { public static PriceCalculation GetPriceForSubscription(String subscriptionID_) throws AuthenticationException, InvalidRequestException, APIConnectionException, CardException, APIException { Subscription subscription = Subscription.getByID(subscriptionID_); Period period = Period.getLatestPeriodsForSubscription(subscription.getID()); if(period == null) { return null; } System.out.println(period); System.out.println(subscription); if(subscription.getCurrentPeriodStart().getTime() > period.getStart().getTime() && period.getStart().getTime() <= subscription.getCurrentPeriodEnd().getTime()){ return null; } Usage[] usages = Usage.getUsageForSubscriptionPeriod(subscription.getID(), period.getPeriod()); long length = 0; if(usages != null) { for(Usage usage : usages) { length += usage.getUsageValue(); } } UsageSession[] usageSessions = UsageSession.getActiveSessionsForSubscription(subscription.getID()); if(usageSessions != null) { for(UsageSession usageSession : usageSessions) { Date start = usageSession.getStart(); Date stop = usageSession.getStop(); if(stop == null) { stop = new Date(); } //Deal with ongoing session if(period.getStart().getTime() > start.getTime()) { start = period.getStart(); } long lengthDifferene = stop.getTime() - start.getTime(); if(lengthDifferene > 0) { length += lengthDifferene; } } } long currentUsage = aggregateSecondsToHours(length); RatePlan plan = RatePlan.getByID(subscription.getProductRatePlanID()); PriceRequest priceRequest = new PriceRequest(); priceRequest.setProductRatePlanID(plan.getID()); for(PricingComponent pricingComponent : plan.getPricingComponents()) { PricingComponentValue value = new PricingComponentValue(); value.setSubscriptionID(pricingComponent.getID()); value.setPricingComponentID(pricingComponent.getID()); value.setValue((int)currentUsage); priceRequest.addPricingComponentValue(value); } PriceCalculation price = PricingCalculator.requestPriceCalculation(priceRequest); return price; } public static long aggregateSecondsToHours(long usageDurationInMilliseconds_) { long hour = (usageDurationInMilliseconds_ / SECOND); long rem = (usageDurationInMilliseconds_ % SECOND); if(rem > 0) { hour++; } return hour; } private static final long SECOND = 1000; private static final long MINUTE = 60 * SECOND; private static final long HOUR = 60 * MINUTE; }