Bundle Prorating


Change Log

DateAuthorVersionChanges
03 September 2018Rune Westphal1.0Doc created.

 

1 - Configuration

Prorating of bundles has been implemented on the bundle configuration level and is available from core 10.10.1 version. The older way of prorating was to configure it on campaign level through the ProrateActivation campaign method and should now be considered deprecated.

The bundles are configured through a ProrateBundleStrategy which can be set in the Rator MainMenu Product Configuration Tool, under the Product Campaign tab => Edit Campaign => Bundles => Edit Bundle => Bundle metadata => Prorate strategy, as shown in the screenshot below.

 

 

2 - Available Strategies

The following strategies are available. Bundle values should be the smallest meaningful units so rounding is performed only on the first decimal, by rounding half up, e.g. a calculated value of 20.5 will result in 21 while a value 20.49 will be rounded to 20.

The date being calculated against is taken from the subscription_campaign.from_date and occurs upon campaign activation, in the same way that the old ProrateActivation method was invoked by the campaign framework.

Strategy NameDescriptionCalculationExample
ProrateDayOfMonthUsing30DayMonth

This strategy will prorate based on remaining days of a fixed month length of 30.
This means that prorating done on the 5th of any month will result in the same outcome.

bundleValue * ((30-dayOfMonth) + 1) / 30).For the 5th the calculation would always be bundleValue * (26/30) irrespective of the actual month length.
ProrateRemainingCalendarDaysUsing30DayMonth

This strategy calculates actual remaining days of the month (including the date itself) but uses a
30-day month length as divisor regardless of actual month length.

bundleValue * ((monthLength - dayOfMonth + 1)/30)

Example 1: January 5th would be calculated by bundleValue * (27/30).


Example 2: February 5th would be calculated by bundleValue * (24/30).

ProrateRemainingDaysOfMonth

This strategy will prorate a bundle based on the actual remaining days of the month (including the date itself), using the calendar month length.
This implies that the prorated result will differ for the same day of month, in different months.

bundleValue * (remainingDays / lengthOfMonth)

Example 1: February 27, 2018 would be bundleValue * (2 / 28).


Example 2: February 27, 2016 (leap year) would be bundleValue * (3 / 29).


Example 3: January 10, 2018 would be bundleValue * (22 / 31).

ProrateRemainingDaysOnInvoiceSchedule

This strategy will prorate a bundle based on the remaining days of the current invoice schedule, compared to the associated billing cycle length.

bundleValue * (remainingDays / billing_cycle.length)

Let the billing_cycle have a length of 14 and the current invoice_schedule be from 1st-14th January.
Let the date the bundle is activated be the 8th of January.


The prorated value will be bundleValue * (7 / 14).

 

3 - Implementation Details

The implemented available strategies are identified using the implementation finder framework.

Thus, new strategies implementing the ProrateBundleStrategy interface and subsequently added in the service resource file (i.e., resources/META-INF/services/com.CDRator.billing.campaign.bundle.strategy.ProrateBundleStrategy) will be automatically discovered and available in the GUI for configuration.