В файлике - готовый патч. Делал под себя, возможно не всем подойдёт. Действует только на помесячную оплату. Если у клиента подключено несколько услуг, время начала всех услуг становится равно времени оплаты.
Это похвально, что ты сделал патч. Но несколько замечаний, по теме и нет. Старайся в коде не делать строки, которые не помещаются по ширине экрана, реально неудобно работать. Например,
Db->sql(
"SELECT ... ".
"FROM ..."
);
В коде ты делаешь eval и если там повреждена структура, то скрипт просто вылетит. Я сделал специальный метод для этого:
my $param = Debug->do_eval($d{param}) or next;
Если структура повреждена, что Debug->do_eval вернет пустую строку, поэтому сработает or next - т.е. выполнение следующей итерации цикла (выборка следующей строки из БД)
Плз, не делайте так, даже если уверены, что $tm_start не включает sql- инъекции:
"UPDATE users_services SET tm_start=".$tm_start
Надо юзать плейсхолдеры:
"UPDATE users_services SET tm_start=? ....", $tm_start
Кстати, смещать время услуги у меня была такая мысль. И привязываться не обязательно к месяцу:
"UPDATE users_services SET tm_start=?, tm_end=tm_end+?-tm_start ...", $tm_start, $tm_start
Или даже
"UPDATE users_services SET tm_start=UNIX_TIMESTAMP(), tm_end=tm_end+UNIX_TIMESTAMP()-tm_start ..."
А почему я не заюзал такую схему? Вот:
1) Клиент берут кредит на 3 дня
2) Подключается услуга на 1 месяц, через 3 дня отключается
3) Клиент пополняет счет и пользуется месяц. Итого месяц + 3 дня
И это не единственная ситуация. По-корректному делать так как я ранее написал. Будет время - сделаю