Описание процессов биллинга общепринятыми терминами и ООП стало главной идеей абстракции. Библиотека писалась под предметную область хостинговой компании, но реализация достаточно абстрактна, чтобы ее можно было применить в другой предметной области. Ниже вкратце описаны идеи этой библиотеки:
Тариф/план - Plan
Тарифный план - собирательная сущность, которая включает в себя набор цен (Price) и служит для порождения списаний (Charge) для событий (Action).
Цена - Price
Price - информационная единица, которая содержит стоимость и тип, который он представляет. В нашей предметной области Price бывает поштучный (SinglePrice) или из списка (EnumPrice). Например, Plan для доменных имён мог бы содержать два Price: по одному для операций типа "покупка домена" и "продление домена".
Действие - Action
Action - действие, подлежащее оплате.
Допустим, мы хотим купить домен example.com.
Для этого мы создаём действие (Action) с данными о цели (action.target = Domain(example.com)
),
устанавливаем тип "покупка домена" (action.type
) и срок регистрации (action.quantity
) в один год.
Используя Plan::calculateCharges()
, можно получить массив списаний (Charge) для этого действия.
Заказ - Order
Закказ - цельная операция, которая состоит из множества товаров или услуг (Action). Order - аггрегирующая сущность для объединения Action в единое целое. Например, всю корзину можно представить одним заказом.
Списание - Charge
Класс представляет непосредственно списание средств как результат действия (Action) тарифицированного по соответствующей цене (Price).
Платёж - Bill
Списания объединяются в платежи. Например, платёж за абонплату сервера один на $30, но может включать в себя списания за абонплату за железо $20, за колокейшен $5, за IP-адреса $5.
Калькулятор - Calculator
Калькулятор вычисляет все списания для конкретного заказа (Order) таким способом: находит соответствующий тариф и пытается применить все цены тарифы ко всем действиям заказа.
Продажа/подписка - Sale
Продажа (или подписка) представляет привязку клиента к купленной услуге/объекту (Target) по такому-то тарифу. Также может хранить другие данные описывающие конкрентную продажу: например дату окончания услуги.