Разработчикам: заморозка услуг
Параметр "Не уходить в минус" в самой услуге
В услуге в таблице services в поле param вставляется фрагмент: 'wait_pos_balance' => '1'. Когда эта конкретная услуга подключается клиенту, то проверяется: $service_new->{param}{wait_pos_balance} && $user->{balance} < $service_new->{approximate_price} и тогда в этой подключаемой услуге устанавливается нулевая стоимость и тег wait_pos_balance. Длительность услуги 1 сек - т.е. как можно скорейшее завершение.
В этом варианте заморозки wait_pos_balance вроде как не проверяется модулем ядра services - он просто постоянно пытается завершить эту услугу. А если денег недостаточно и в услуге уже есть тег wait_pos_balance, то ее завершение блокируется (die в самой услуге). Как только денег становится достаточно - замораживаемая услуга таки завершается и подключается новая на полную стоимость.
- ajUserSrvInfo.pl кода в тегах услуги видит wait_pos_balance, пишет: Будет активирована когда будет достаточно финансов
- ajUserSrvList.pl в поле "стоимость" пишет "Заморожена"
Параметр модуля ядра services
Настройки - Ядро - Услуги - Если после завершения услуги баланс станет отрицательным, то все услуги отключаются...
$cfg::k_services_wait_pos_balance
Модуль ядра services с основным периодом (5 сек) смотрит у кого отрицательный баланс (вернее, ниже границы отключения) с подключенными услугами, имеющими стоимость. В этом случае проходится по всем услугам клиента и завершает их. Используеьтся обычный механизм досрочного завершения, т.е. у каждой услуги меняется сумма списания пропорционально отработанному времени. Также в pays создается событие категории 208: Приостановка услуг (недостаточно финансов). В поле reason одним из параметров устанавливается сумма списаний по всем завершаемым услугам, а другим список id услуг.
С периодом 61 сек этот же модуль ядра services смотрит у кого в pays есть запись с категорией 208. Если текущий баланс больше суммы списания замороженных услуг (хранится в записи с категорией 208) - категория меняется на 209 (Возобновление услуг (появились финансы)) и устанавливаются все замороженные услуги.
Какие тут недостатки: для проверки достаточности финансов, стоимость подключаемых услуг не расчитывается, а берется по их последнему списанию. Т.е. если изменилась их стоимость или скидки у клиента или иные параметры - может так оказаться, что суммы не будет достаточно для подключения всех услуг. Либо же может возникнуть ситуация, что финансов уже достаточно, но модуль ядра "не видит" этого т.к. не знает про уменьшение стоимости услуг.
Параметр модуля ядра balance
Настройки - Ядро - Балансы - Удалять все подключенные услуги при отрицательном балансе
$cfg::k_balance_remove_service
Периодически (настраивается, по умолчанию раз в 10 секунд) для всех клиентов, у которых баланс меньше границы отключения, стоит галка "Отключать ли по балансу" и состояние "не заблокирован" (!), у всех подключенных услуг устанавливается тег end_now. Также создается событие с категорией 423 (Блокировка по задолженности) - чисто информационное.
Модуль ядра services в самом ближайшем времени завершит все услуги с тегом end_now