Алгоритм начисления, примеры тарифов

Модуль определяет потребление договором абонплаты по наличию услуги из модуля в договоре. Алгоритм работы следующий. Начисление производится за определённый месяц.

  1. Производится выборка потребителей услуг данного модуля, получая набор сочетаний: договоры - услуга - период - количество;

  2. Для каждого сочетания производится разбивка по действующим на период тарифные планы, получая тарифицируемые сочетания: договор - услуга - тариф - период - количество;

Пример получения

В договоре определены:

  • Абонплата 1 - с 1 по 10 число;

  • Абонплата 2 - с 9 по 31 число;

  • Тариф 1 - с 2 по 31 число.

Получаем два тарифицируемых сочетания:

  • Абонплата 1 - Тариф 1 - с 2 по 10 число;

  • Абонплата 2 - Тариф 1 - с 9 по 31 число;

Каждое сочетание тарифицируется по тарифу.

1) При помесячном режиме начисления цена в тарифе запрашивается один раз, используя дату окончания периода для передачи в тарифный запрос. При стоимости пропорционально периоду цена определяется пропорционально отношению количество дней, когда абонплата в месяце была открыта и статус активен к общему числу дней месяца. Количества для помесячного режима также всегда рассчитываются на дату окончания периода. Помесячный режим всегда рассчитывается до конца расчётного месяца.

2) При подневном режиме передаётся запрос в тариф на каждый день, входящий в период сочетания. Для каждого дня оценивается стоимость и количества, анализируется статус договора. Снятие может быть произведено как до текущего дня, так и до конца месяца, в зависимости от настройки узла.

Исходя из этого, помесячный режим начислений оптимальнее в плане тарификации, однако цена и количество сущностей, которым пропорциональна абонплата в нем может изменятся только один раз в месяц. В этом её отличие от подневного режима с начислением до конца месяца.

3) При погодовом режиме начисление производится только в том месяце, в который была добавлена абонплата. Стоимость абонплаты определяется на конец месяца.

4) При авансовом режиме начисления:

Если период абонплаты закрыт, то цена запрашивается на день начала периода и абонплата снимается только за месяц начала согласно стоимости дня или месяца. При указании цены за месяц дневная цена получается делением месячной на количество дней в месяце начала абонплаты. Соответственно при начислении за месяц авансовые абонплаты с закрытым периодом, открытые не в месяце начисления игнорируются.

Если период абонплаты открыт, то цена запрашивается на ДАТУ_НАЧАЛА=МАКСИМУМ(День начала периода; День начала месяца). Стоимость дня умножается на количество дней от ДАТЫ_НАЧАЛА до конца месяца. При указании цены за месяц дневная цена получается делением месячной на количество дней в месяце начисления.

Рассмотрим несколько примеров. Для начала, простейшие абонплаты, не зависящие от наработок в других модулях.

Абонплаты, не зависящие от других модулей

Пропорциональная абонплата 40 рублей за месяц.

При этом, если человек подключён в середине месяца, то за первый месяц должно сняться только 20 рублей (половина). Название услуги - Абонплата.

Пропорциональная абонплата

Простая абонплата - 100 рублей в месяц независимо от даты подключения услуги.

Простая абонплата

Начисление 1 го рубля за каждый день до текущей даты

Подневной режим

Погодовой режим снятия - начисление только в месяц добавления абонплаты на договор (раз в год).

Погодовой режим

Авансовый режим снятия - начисление ежемесячно (открытый период), либо единоразово в месяц открытия (закрытый период).

Авансовый режим

Абонплаты, зависящие от наработки по объёму в других модулях

Модуль абонплат может производить начисление в зависимости от объёмов наработок в других модулях.

Зависимости можно выставить только для подневного и помесячного режима начислений.

Все используемые при тарификации объёмы должны быть описаны в конфигурации экземпляра модуля. Объём наработки описывается в конфигурации экземпляра модуля абонплат следующим образом.

module.amount.<id>.title=<title>
module.amount.<id>.mid=<mid>
module.amount.<id>.class=<class_name>
module.amount.<id>.sids=<sids>

Где:

  • <id> - уникальный числовой идентификатор объёма, нумерация должна быть последовательной и непреревной, число не должно меняться впоследствии, при изменении нумерации необходима правка всех тарифов, где используются данные объёмы;

  • <title> - название объёма;

  • <mid> - код экземпляра модуля, в котором рассчитывается объём;

  • <class_name> - класс, рассчитывающий объём;

  • <sids> - коды услуг через запятую.

В данный момент поддерживаются следующие классы, которые могут быть указаны в <class_name> для расчёта объёма услуги (байт, либо секунд):

  • avantis.billing.server.npay.bean.DialUpModuleAmount - количество байт или секунд в экземпляре модуля DialUp;

  • avantis.billing.server.npay.bean.IPNModuleAmount - количествто байт в экземпляре модуля IPN;

  • ru.avantis.abilling.modules.inet.npay.InetModuleAmount - количествто байт в экземпляре модуля Inet;

  • avantis.billing.server.npay.bean.PhoneModuleAmount - количество секунд округлённой длительности в экземляре модуля Phone.

Указанный в конфигурации объём можно использовать в узле тарифного плана типа Условие по объёму услуги. При размещении данного узла в узле типа Дневной режим снятия объем будет вычисляться за каждый день для использования в условиях по объёму. При размещении в узле типа Месячный режим снятия объем будет вычисляться за рассчитываемый период (период сочетания, см. алгоритм).

Рассмотрим пример конфигурации экземпляра модуля для начисления несколько типов абонплат и использующую при начислении значения входящих трафиков модуля DialUP, IPN и голосового трафика модуля Телефонии. Если необходимо учитывать суммарную наработку по нескольким услугам, они перечисляются через запятую.

module.amount.1.title=Входящий DialUP трафик
module.amount.1.mid=21
module.amount.1.class=avantis.billing.server.npay.bean.DialUpModuleAmount
module.amount.1.sids=23
#
module.amount.2.title=Входящий внешний IPN трафик
module.amount.2.mid=33
module.amount.2.class=avantis.billing.server.npay.bean.IPNModuleAmount
module.amount.2.sids=40
#
module.amount.3.title=Объем трафика телефонии
module.amount.3.mid=73
module.amount.3.class=avantis.billing.server.npay.bean.PhoneModuleAmount
module.amount.3.sids=83,84,85,86
#
module.amount.4.title=Входящий трафик INET
module.amount.4.mid=179
module.amount.4.class=ru.avantis.abilling.modules.inet.npay.InetModuleAmount
module.amount.4.sids=203
#
module.amount.5.title=Входящий Voiceip трафик
module.amount.5.mid=79
module.amount.5.class=avantis.billing.server.npay.bean.VoipModuleAmount
module.amount.5.sids=122

Приведённая выше конфигурация используется в следующих примерах тарифов:

Начисление 1 го рубля только за те дни, когда была наработка в модуле DialUP

Модуль DialUP

Начисление за дни, когда у клиента не было достаточной наработки по IPN, "штрафа" в 10 рублей, стимулирующий тариф.

Стимулирующий тариф

Все приведённые выше примеры могут быть совмещены с узлами типа: Фильтр по времени и Период.

Тариф, снимающий абонплату за предоплаченные 100 МБ в месяц, если клиент наработал меньше, то снятие происходит пропорционально реально потреблённому объёму.

Пропорциональное снятие

Тот же тариф, но снимающий в случае, если объем менее 100, как выгоднее: т.е. анализируется доля потреблённых дней в месяце и доля потреблённого объёма, большая доля умножается на цену за месяц.

Как выгоднее

Необходимо учитывать, что в узле типа "Условие" нижняя граница включена в диапазон, а верхняя - нет. 0 в верхней границе диапазона означает неограниченный объем.

Абонплаты, зависящие от денежной наработки в других модуля

Модуль абонплат может производить начисление в зависимости от денежной наработки за услуги других модулей. Все используемые при тарификации денежные наработки должны быть описаны в конфигурации экземпляра модуля абонплат следующим образом.

module.account.<id>.title=<title>
module.account.<id>.mid=<mid>
module.account.<id>.class=<class_name>
#module.account.<id>.sids=<sids>

Где:

  • <id> - уникальный числовой идентификатор денежной наработки, нумерация должна быть последовательной и непреревной, число не должно меняться впоследствии, при изменении нумерации необходима правка всех тарифов, где используются данные денежные наработки;

  • <title> - название денежной наработки;

  • <mid> - код экземпляра модуля, в котором рассчитывается объём, 0 для класса KernelAccount;

  • <class_name> - класс, рассчитывающий объём;

  • <sids> - коды услуг через запятую (необязательный параметр).

В данный момент поддерживаются следующие классы, которые могут быть указаны в <class_name> для расчёта денежной наработки:

  • avantis.billing.server.npay.bean.DialUpModuleAccount - денежная наработка в экземпляре модуля DialUp;

  • avantis.billing.server.npay.bean.PhoneModuleAccount - денежная наработка в экземпляре модуля Phone;

  • ru.avantis.abilling.modules.inet.npay.InetModuleAccount - денежная наработка в экземпляре модуля Inet;

  • avantis.billing.server.npay.bean.KernelAccount - денежная наработка в ядре, возможен расчёт только целиком за месяц.

  • avantis.billing.server.npay.bean.VoipModuleAccount - денежная наработка в экземпляре модуля Voiceip;

Указанную в конфигурации денежную наработку использовать в узле тарифного плана типа Условие денежной наработке. Данный узел может быть размещён только в узле типа Месячный режим снятия, денежная наработка будет вычисляться за рассчитываемый период (период сочетания, см. алгоритм) за исключением случая использования класса KernelAccount, который может вычислить только сумму за весь месяц, зато подходит для вычисления наработки любого модуля.

Рассмотрим пример конфигурации экземпляра модуля абонплат для начисления несколько типов абонплат и использующую при начислении значения денежной наработки экземпляра модуля DialUp с кодом 21.

module.account.1.title=Наработка в DialUp
module.account.1.mid=21
module.account.1.class=avantis.billing.server.npay.bean.DialUpModuleAccount
module.account.1.sids=<если нужно, уточнение услуг модуля>
#
module.account.1.title=Наработка в модуле Inet
module.account.1.mid=179
module.account.1.class=ru.avantis.abilling.modules.inet.npay.InetModuleAccount

Приведённая выше конфигурация используется в следующих примерах тарифов:

Тариф начисляет дополнительную наработку в случае, если клиент недостаточно наработал по услугам DialUP модуля.

Дополнительная наработка

В данном случае Догнать до 600 - это название услуги модуля абонплаты. Пропорциональный периоду режим обозначает, что 600 будет преобразовано в 300, если клиент подключён в середине месяца и период абонплаты в услугах договора также будет открыт серединой месяца. При этом наработка DialUP модуля также анализируется за этот период. Возможен и безусловный режим снятия, когда "доводимая" сумма не изменяется в зависимости от периода действия абонплаты. Режим как выгоднее оценивает сумму снятия при безусловном и пропорциональном режимах и выбирает максимальную из них.

Тариф начисляет клиенту абонплату в 100 рублей в том случае, если его наработка DialUP была менее 400 рублей и 60 рублей в противном случае. Абонплата называется 60 в месяц.

60 в месяц

Абонплаты, пропорциональные количеству телефонов, логинов и сервисов

В модуле возможно создание абонплат, начисляемых пропорционально количеству поинтов (телефонов) в модуле Phone, либо логинов в модулях VoiceIP, DialUP или количеству сервисов в модуле Inet. Предположим, существует абонплата с кодом 103, в тарифном плане для него установлена обычная месячная стоимость, 73 - код модуля телефонии.

Зависимость поддерживается только для помесячного и подневного режимов начисления абонплат.

Предположим что абонплата с кодом 103 - это абонплата за аренду телефонного модуля, в тарифном плане для него установлена обычная месячная стоимость, 73 - код модуля телефонии.

Добавление подобной конструкции в конфигурацию модуля умножит сумму абонплаты на количество телефонов в договоре.

module.quantity.1.mid=73
module.quantity.1.class=avantis.billing.server.npay.bean.PhoneModuleQuantity
module.quantity.1.sids=103

Аналогично для модулей VoiceIP, DialUP возможно использования класса (вместо <mid> - код модуля DialUP, VoiceIP):

module.quantity.1.mid=<mid>
module.quantity.1.class=avantis.billing.server.npay.bean.CallModuleQuantity
module.quantity.1.sids=103

Для модуля Inet используйте (<mid> - код модуля Inet)

module.quantity.1.mid=<mid>
module.quantity.1.class=ru.avantis.abilling.modules.inet.npay.InetModuleQuantity
module.quantity.1.sids=103

В параметре sids могут быть указаны несколько кодов услуг через запятую.

При помесячном режиме начисления количество высчитывается для даты окончания периода сочетания абонплата-тариф (см. алгоритм). При подневном количество вычисляется для каждых суток.

Данный коэффициент используется совместно с количеством услуги, указываемым в свойствах абонплаты. При указании в свойствах абонплаты количества A и вычисленном количестве B по конфигурации, абонплата составит СУММА * A * B.

Абонплаты, зависящие от тарифных опций

На активированную тарифную опцию можно делать начисление. Начисление по тарифной опции работает как для подневного режима снятия, так и для помесячного, при этом учитывается период (день/месяц).

Дополнительные услуги помесячный режим снятия

Для этого в услуге добавьте ветку Опция и выберите нужную опцию в редакторе ветки. "+" или "=" означает соответственно добавить цену к текущей или установить цену принудительно.

Параметры начисления для опции:

  • Безусловно - если опция была активирована один или более раз за месяц (для помесячного режима снятия) или день (для подневного режима снятия), то добавить (установить) цену, расчитанную из потомков ветки.

  • Пропорционально - пропорционально периоду активации. Для помесячного режима снятия период - месяц, подневного - день. Если опция была активирована несколько раз за период, то периоды складываются. Расчитывается с точностью до секунды.

  • Пропорционально количеству - пропорционально количеству активаций. Цена умножается на количество активаций опции за период.

Цена, в зависимости от параметров начисления, рассчитывается после прохождения подветок.

Подветки Опции работают также, как описано выше для тарифов без использования ветки Опции, т.е. установка в подветке Стоимость режима пропорц. периоду будет означать, что цена зависит от периода услуги.

Для большей наглядности наработки для отдельных опций или для групп опций можно создавать отдельные услуги.