Billing Logic

Major Players

  • BillingCycle has a period, frequency, anniversary, time_unit_measure, periodicity, next_payment_date, etc.

  • CurrentState holds a set of profiles and can iterate through them or return current_products or active_products

  • PaymentCommandBuilder, initialized with an array of products, generates commands for creating recurring payments for those products; also takes a set of profile_ids and generates commands for canceling their recurring payments

  • [Base|IndependentPayment|SinglePaymentStrategy], initialized with a current state, desired state and builder class, calculates how to achieve the desired state

  • ProrationCalculator, initialized with a hash of billing_cycle, price and date, calculates a prorated price

  • BillingEngine::Client::Product, arrays of these are manipulated via Billing Logic. “Product” in Billing Logic generally refers to BillingEngine::Client::Products

Structure

module BillingLogic
    class BillingCycle
    module CommandBuilders
        module BuilderHelpers
        class ProductList
        class ProductStub
        class ActionObject
        class BasicBuilder
        class WordBuilder < BasicBuilder
        class AggregateWordBuilder < BasicBuilder
    class CurrentState
    module CurrentStateMixin
    class PaymentCommandBuilder
    class ProrationCalculator
    module Strategies
        class BaseStrategy
        class IndependentPaymentStrategy
        class SinglePaymentStrategy

BillingLogic::Strategies

You create a BillingLogic::Strategy by passing in a hash with your current state, desired state and builder class:

strategy = <strategy class>.new(:payment_command_builder_class => <your builder class>,
				:current_state => <an array of payment profiles>
				:desired_state => <an array of products>)

You then ask the strategy to return you an array of commands:

strategy.command_list => An Array of commands provided by the command builder class

There are three strategies available:

  • BaseStrategy:

    • Contains most of the methods

  • IndependentPaymentStrategy:

    • Each product gets its own PaymentProfile

    • Default payment_command_builder_class: BillingLogic::CommandBuilders::WordBuilder

  • SinglePaymentStrategy:

    • All products share a single PaymentProfile

    • Default payment_command_builder_class: BillingLogic::CommandBuilders::AggregateWordBuilder

BaseStrategy also has these public methods:

#command_list
#products_to_be_added
#products_to_be_added_grouped_by_date
#products_to_be_removed
#inactive_products
#active_products
#active_profiles
#profiles_by_status(active_or_pending)

BillingLogic::BillingCycle

constants:

TIME_UNITS = { :day => 1, :week => 7, :month => 365/12.0, :semimonth=> 365/24, :year => 365 }

fields:

:frequency (e.g., 1 or 45)
:period (e.g., :day, :week, :semimonth, :month, :year)
:anniversary (a date)

methods include:

#days_in_billing_cycle_including(date)
#next_payment_date
#closest_anniversary_date_including(date)
#periodicity ( TIME_UNITS[self.period] * frequency )

BillingLogic::PaymentCommandBuilder

instance methods:

#group_products_by_billing_cycle

class methods:

.create_recurring_payment_commands(products, next_payment_date = Date.current)
.cancel_recurring_payment_commands(*profile_ids)