Алгоритм начисления, примеры тарифов
Модуль определяет потребление договором абонплаты по наличию услуги из модуля в договоре. Алгоритм работы следующий. Начисление производится за определённый месяц.
1) производится выборка потребителей услуг данного модуля, получая набор сочетаний: договоры - услуга - период - количество;
2) для каждого сочетания производится разбивка по действующим на период тарифные планы, получая тарифицируемые сочетания: договор - услуга - тариф - период - количество;
В договоре определены:
Абонплата 1 - с 1 по 10 число;
Абонплата 2 - с 9 по 31 число;
Тариф 1 - с 2 по 31 число.
Получаем два тарифицируемых сочетания:
Абонплата 1 - Тариф 1 - с 2 по 10 число;
Абонплата 2 - Тариф 1 - с 9 по 31 число;
Каждое сочетание тарифицируется по тарифу.
1) При помесячном режиме начисления цена в тарифе запрашивается один раз, используя дату окончания периода для передачи в тарифный запрос. При стоимости пропорционально периоду цена определяется пропорционально отношению количество дней, когда абонплата в месяце была открыта и статус активен к общему числу дней месяца. Количества для помесячного режима также всегда рассчитываются на дату окончания периода. Помесячный режим всегда рассчитывается до конца расчётного месяца.
2) При подневном режиме передаётся запрос в тариф на каждый день, входящий в период сочетания. Для каждого дня оценивается стоимость и количества, анализируется статус договора. Снятие может быть произведено как до текущего дня, так и до конца месяца, в зависимости от настройки узла.
Исходя из этого, помесячный режим начислений оптимальнее в плане тарификации, однако цена и количество сущностей, которым пропорциональна абонплата в нем может изменятся только один раз в месяц. В этом её отличие от подневного режима с начислением до конца месяца.
3) При погодовом режиме начисление производится только в том месяце, в который была добавлена абонплата. Стоимость абонплаты определяется на конец месяца.
4) При авансовом режиме начисления:
Если период абонплаты закрыт, то цена запрашивается на день начала периода и абонплата снимается только за месяц начала согласно стоимости дня или месяца. При указании цены за месяц дневная цена получается делением месячной на количество дней в месяце начала абонплаты. Соответственно при начислении за месяц авансовые абонплаты с закрытым периодом, открытые не в месяце начисления игнорируются.
Если период абонплаты открыт, то цена запрашивается на ДАТУ_НАЧАЛА=МАКСИМУМ(День начала периода; День начала месяца). Стоимость дня умножается на количество дней от ДАТЫ_НАЧАЛА до конца месяца. При указании цены за месяц дневная цена получается делением месячной на количество дней в месяце начисления.
Рассмотрим несколько примеров. Для начала, простейшие абонплаты, не зависящие от наработок в других модулях.