Настройка задач планировщика
Для корректной работы модуля должны быть настроены следующие задачи планировщика. Подробности в соответствующих подразделах. Рекомендуемое (ориентировочное) время запуска задач:
-
Установка договоров картам CerberCrypt - 00:01;
-
Установка статусов пакетам карт CerberCrypt - 00:01;
-
Начисление CerberCrypt - 00:40;
-
Блокировка Cerber Crypt - 01:50;
-
Синхронизация CerberCrypt - 02:00;
-
Постепенное продление подписок - необязательная задача, для некоторых протоколов, выполняется до синхронизации, например, 01:50;
-
Контроль синхронизации - необязательная задача, период по желанию, например, «каждый час».
Сопоставление договоров картам
В менеджере задач каждой загруженной карте указывается сопоставленный в настоящий момент договор. В случае, если карта заносится на договор текущей датой, то привязка договора к карте обновляется сразу, иначе это делает задача планировщика Установка договоров картам CerberCrypt. Задача должна быть установлена на 0 часов 0 минут каждого дня.
В конфигурации задачи указывается код модуля.
mid=<код модуля>
Установка актуальных статусов пакетов в картах договоров
Задача Установка статусов пакетам карт CerberCrypt устанавливает картам договора актуальные статусы, основываясь на заданиях по смене статуса. Должна запускаться в 0 часов 0 минут каждых суток, в параметрах указывается код экземпляра модуля. Данная задача необходима для случаев, когда статусы пакетов карты изменяются будущим числом.
mid=<код модуля>
Начисление CerberCrypt
Осуществляется задачей планировщика Начисление CerberCrypt. Рекомендуемая частота запуска - один раз в сутки. Целесообразно запускать задачу в первом часе каждых суток (например, в 0 часов 30 минут каждые сутки), тарификация производится включая текущие сутки с учётом актуальных статусов пакетов, установленных задачей Установка статусов пакетам карт CerberCrypt.
В конфигурации задачи указывается код модуля.
mid=<код модуля>
Блокировка должников
Осуществляется задачей Блокировка Cerber Crypt. Минимальная частота запуска - один раз в сутки после задачи начисления (например 2 часа). Если в договоре присутствуют иные виды списаний кроме начисления за использование цифрового ТВ, то задачу можно установить несколько раз в сутки.
В конфигурации задачи указывается код модуля. При блокировке пакеты всех договоров, баланс которых менее лимита, переводятся в статус заблокировано. Параметр forgive.hours определяет сколько часов от суток "прощать" клиенту. Под "прощением" понимается, что если задача запускается ранее указанного часа суток, то блокировка производится мгновенно и прошедшие часы достаются клиенту даром. Если задача запускается после этого часа, до добавляется задание на блокировку с 0 часов последующих суток, клиент может смотреть канал до конца суток.
"Прощение" определённого числа часов предотвращает недовольство клиентов в связи с отключением каналов в 0 часов, как это должно следовать из требования корректности начислений (при снятии денег посуточно блокировка должна происходить на границе суток).
mid=<код модуля>
# сколько часов от суток "прощать" при блокировке
forgive.hours=2
В данном примере если блокировка производится после 2х часов ночи, статус заблокировано устанавливается со следующего дня, позволяя абоненту доработать день.
Если у пакета установлен параметр "Не блокируемый", то в этой задаче он обрабатываться не будет.
Обновление подписок
Осуществляется задачей планировщика Синхронизация CerberCrypt. Для всех активных в текущий день карт открываются указанные на текущий момент пакеты со статусом активен. Данная задача производит синхронизацию подписок по результатам работ задач Установка статусов пакетам карт CerberCrypt и Блокировка Cerber Crypt. Обновление подписок при их смене оператором, либо клиентом через Web интерфейс происходит мгновенно.
В параметрах задачи указывается код модуля и адрес E-Mail на который высылаются сообщения о недоступности сервера CerberCrypt.
mid=<код модуля>
error.mail=bill@bill.ru
#через запятую можно указать номера карт, подписку для которых обновлять не следует
#ignore.cards=
#указываются группы договоров, подписку на которых обновлять не следует
#ignore.contract.groups=
Постепенное продление подписок
Специфика некоторых систем (CTI/NordE, conax и т.д.) такова, что при указании подписки они требуют период активации, в отличие от протокола CerberCrypt, например, где подписка ставится/снимается сиюминутная. В данном случае существует примерно такое стандартное поведение:
-
Открываем пакет с закрытой датой закрытия — так и отсылаем;
-
Открываем пакет с бесконечностью — ставим большой правый период.
Встаёт задача: как-то решить недостаток от продления пакета в бесконечность и последующим отключением пользователем самого себя от системы с целью пользоваться картой вечно. Сократить подобное пользование до разумного периода. Т.е. в том числе это защита от "хитрых клиентов".
Как написано в конфигурации для активатора CTI/NordE при активации на бесконечный срок можно сделать период активации, например, 30 дней от начала периода, после, если есть деньги, перепосылать активацию (т.е. каждый день, выходит, ибо карты в разные дни активируются).
Это делается через задачу планировщика «Постепенное продление подписок пакетов». Приэтом в БД создается отдельная таблица «продление пакетов/каналов», поля: entityId — идентификатор картпакета, date — дата последнего продления «сущности». Таблица не критичная, её содержимое можно удалить, тогда просто считается, что последний раз для закрытых периодов картпакетов уже было отослано, а для открытых было отослано в начале открытия на месяц, так что при следующем запуске этой задачи все они снова продлятся. В любом случае всё продлится и заново начнётся отсчёт при любом редактировании картпакета.
Сам алгоритм имеет такую логику: запускается раз в сутки, перебирает все картпакеты, активные в текущий момент. Активные картпакеты могут быть:
-
С закрытым периодом - ничего не делаем, т.к. полагаем, что уже было всё отослано один раз;
-
С открытым периодом - берётся для каждого картпакета из указанной таблички одна дата — дата последнего успешного продления (точнее, до какого числа РЕАЛЬНО было продлено).
Если истекает эта дата (а системный открыт), тогда он заново отсылает команду с датой начала из картпакета (т.е. дата начала всегда одинакова будет, а конец каждый месяц отодвигаться) и датой конца из этой таблички+месяц . После этого новая реальная дата снова записыватся в БД и через месяц снова будет использоваться.
Период (например, как выше названо «месяц») настраивается в задаче самой конфигурации модуля (т.е. в конфигурации данного активатора).
period.gradually.subscription=30
Если в конфигурации указан небесконечный период, то это обязует использовать эту задачу для периодического продления подписки. Этот период используется как в самом модуле (для информации о том, на сколько конкретно продлить при открытии на бесконечный период), так и в этой задаче для информации о том, на сколько сделать последующее продление.
Пользователь открывает пакет в биллинге, указывает дату начала активации и конца активации: на карту шлются эти периоды, в таблице реальный период и системный совпадают.
Пользователь открывает пакет в биллинге, указывает только дату начала активации пакета: на карту шлётся период ДАТА_НАЧАЛА — ДАТА_КОНЦА, где ДАТА_КОНЦА = ДАТА_НАЧАЛА + 30 дней; в таблицу записывается реальный период и системный (реальный — ДАТА_НАЧАЛА — ДАТА_КОНЦА, а системный ДАТА_НАЧАЛА — (открытая_дата))
Пользователь меняет период активации пакета в биллинге, даты активации перепосылаются и перезаписываются в базу с учетом вышестоящих двух пунктов.
Контроль синхронизации
Имеется специальная задача контроля синхронизации, которая отвечает за корректную отправку синхронизаций по картам. То есть, если в момент синхронизаций сервер УД был недоступен, то подписка уйдёт только в лучшем случае при следующем изменении карты или на границе суток, когда запустится задача общей синхронизации (если она будет успешна). Задача контроля синхронизации следит за картами с флагом "требует синхронизации" и при наличии карт с ним ставит синхронизатор по ним снова в очередь. Задача необязательна, период настраивается также по желанию нужной оперативности при возможных сбоях сервера УД.
У каждой карты пользователя для этого есть флажок "требует синхронизации". При любом изменении карты он ставится, т.е. это значит "надо синхронизовать", после успешной синхронизации (в синхронизаторе) оно сбрасывается и это значит "карту уже не надо синхронизовать", т.е. "подписка актуальна". Это же поле выводится в табличке для карт пользователя (см. выше).
При нормальной работе эта задача будет просто проверять, что ошибок синхронизации нет (отсутствуют "грязные" несинхронизованные карты) и завершаться. Использовать с осторожностью в плане периодов. Если система подразумевает таймауты обращения и синхронизаторы не просто завершаются с ошибкой при ошибке доступа, а висят и ждут, то при использовании этой задачи их может скопиться слишком много в запущенном состоянии.