Наверное многих интересует вопрос: Возможно ли корректно изменить тарифный план абоненту "когда вздумается"?
Эксперименты привели к следующим выводам:
Так как в UTM нет встроенной возможности изменения тарифа в любой момент времени, нужно сначала удалить текущий тариф.
Заходим в "Тариф" и жмем кнопку удалить.
1. Происходит вызов функции 0x3019 rpcf_unlink_user_tariff
2. Создается новый расчетный период, аналогичный текущему расчетному периоду тарифа, но с датой окончания на 3 секунды вперед от текущего времени.
3. Изменяются сервисные связки для всех услуг на новый расчетный период.
4. Выполняется процедура расчета услуг по уже новому расчетному периоду и списание денежных средств.
5. При наступлении времени закрытия нового расчетного периода, выполняется процедура аналогичная пункту 4, плюс выполняется процедура закрытия расчетного периода (она хорошо описана в документации)
На текущий момент имеем пользователя без тарифа, с полным списанием периодических стоимостей всех услуг включенных в удаленный тариф.
В принципе все корректно кроме того, что со счета были списаны полные суммы периодических составляющих услуг, не взирая на то что тариф удалён вручную и до конца реального расчетного периода, на который он расчитан еще есть время. Дальше интереснее.
6. Создается еще один расчетный период с датой начала равной дате закрытия того периода, который был создан для удаления тарифа, и длинной равной длинне своего предшественника (у большинства это месяц). Этот самый расчетный период и остается висеть в списке расчетных периодов и про него частенько спрашивают на этом форуме.
7. Обновляются сервисные связки (для услуг входивших в удаленный тариф) на новый расчетный период. Затем эти связки помечаются как удаленные (!). Также как удаленные помечаются все данные принадлежащие услугам удаленного тарифа. (ip адреса, логины, пароли...).
Вывод. При такой антипользовательской логике работы ядра, получаем полный набор развлечений при попытке изменить тарифный план.
На мой взгляд, для того чтобы корректно выполнять требуемую процедуру удаления тарифа, небходимо чтобы ядро:
1. При закрытии фиктивного учетного периода, создаваемого для удаления тарифа, не списывалось никаких средств со счета абонента. Достаточно выполнить окончательное, на момент удаления тарифа, списание средств по текущему расчетному периоду и выполнить расчет остатков трафика.
2. Не создавать второй расчетный период, после закрытия предыдущего, а сервисные связки вернуть в состояние аналогичное исходному.
Очень хочется услышать комментарий разработчиков!