21.7. Смена тарифных планов

Биллинг поддерживает возможность смены тарифов пользователями через Web-интерфейс пользователя.

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

Для предоставления пользователю смены тарифов необходимо установить для договора группу (группы) тарифных планов. Если хотя бы одна группа тарифных планов не указана, то смена их через Web-интерфейс невозможна. Группа определяет набор взаимозаменяемых тарифов договора. Обычно это линейка тарифов на одну услугу.

Рассмотрим случай наличия в системе 3х тарифных планов Тариф1..Тариф3. При этом переход между ними необходимо разрешить только в начале месяца. Предполагается что тарифы уже созданы в редакторе тарифных планов.

В Справочники=>Группы тарифов создадим группу с названием "Первая" и установим следующие параметры.

Кроме перечня разрешённых тарифов и момента, когда можно менять тариф, необходимо установить:

  1. Позиция, которую тарифные планы данной группы занимают в договоре;

  2. Количество дней, следующих после текущей даты, в которые может быть добавлено задание на переход. Например, если сейчас 20-е число месяца, в котором 30 дней и в данной опции стоит, что задания можно добавлять вперёд на 30 дней, то будут просмотрены даты от 20-го числа текущего месяца до 20 числа последующего. При этом будут выбраны даты разрешённых переходов. В данном случае подойдёт только 1-ое число последующего месяца. Если данный параметр установить в 60, то пользователь сможет генерировать задания за 2 месяца.

Также обратите внимание, что для каждого тарифа может устанавливаться начальная и/или конечная даты периода, когда эти тарифы видны в Web-интерфейсе пользователя и доступны для выбора. Это дополнительное средство обеспечения гибкости. Можно, например, сделать доступными некоторые из тарифов группы через некоторое время. Но это не имеет никакого отношения к возможности установки на какое-то число начала действия тарифа. Это только период, когда тарифы видны в списке выбора тарифов для смены.

Теперь необходимо установить в договор группу тарифов и скрипт поведения. Сделать это следует, открыв договор и щёлкнув на дереве Группа тарифов. Значение добавляется с периодом. На страничке Web-статистики пользователя должно появится меню Смена тарифных планов. В верхней таблице приведена история смены тарифов.

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

Также для пользователей имеется возможность отменить выбор тарифа для перехода будущим числом. Таким образом, можно отменить ошибочный переход. Обратите внимание, что если на событие смены тарифа выполняются какие-либо действия, то в событии отмены перехода (см. ниже) нужно это предусмотреть и корректно обработать. Как известно, событие смены тарифа отрабатывает в момент выбора тарифа (даже, если тариф начнёт действовать только в следующем месяце). Алгоритм обработки этой ситуации работает следующим образом:

  1. при смене тарифа сохраняется информация с какого тарифа_договора происходит переход (id строки из contract_tariff);

  2. на будущих тарифах в Web-интерфейсе есть кнопка отмены перехода на тариф (и указано для удобства на какой тариф откатится, ведь мы знаем предыдущий тариф);

  3. при нажатии на неё (после проверок на хаки) генерируется синхронное событие Отмены перехода на тариф;

  4. там можно обработать что угодно, имея ContractTariff "до" и "после";

  5. там же можно установить processed (аналогично смене тарифа), чтобы штатно не обрабатывалось;

  6. штатная обработка состоит в следующем: удаляем второй тариф (новый, который отменяем) и обновляем предыдущий, продляя дату до бесконечности (то есть "окрывая" его);

  7. после этого генерируются сразу два асинхронных события ContractTariffUpdateEvent и ContractTariffDeleteEvent для соответствующих потревоженных тарифов договора.