Разработчикам: заморозка услуг
Параметр "Не уходить в минус" в самой услуге
В услуге в таблице 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 (Возобновление услуг (появились финансы)) и устанавливаются все замороженные услуги.
Какие тут недостатки: для проверки достаточности финансов, стоимость подключаемых услуг не расчитывается, а берется по их последнему списанию. Т.е. если изменилась их стоимость или скидки у клиента или иные параметры - может так оказаться, что суммы не будет достаточно для подключения всех услуг. Либо же может возникнуть ситуация, что финансов уже достаточно, но модуль ядра "не видит" этого т.к. не знает про уменьшение стоимости услуг.