Уважаемые знатоки, прошу помощи, ибо голова кругом.
Есть сервис с подпиской, на котором есть несколько тарифов.
Нужно дать пользователю возможность в любой момент перейти на любой тариф, - соответственно, пересчитав оплаченное время с текущего тарифа на новый.
Расчёт простейший:
$secondsInMonth = 60 * 60 * 24 * 30; // количество секунд в периоде оплаты (30 дней)
$paidBefore = strtotime('2021-05-30 23:50:00'); // дата окончания подписки
$now = strtotime('now'); // текущее время
$currentTariffPrice = 1590; // цена текущего тарифа (за 30 дней)
$newTariffPrice = 7990; // цена нового тарифа (за 30 дней)
$currentTariffPriceBySecond = $currentTariffPrice / $secondsInMonth;// получаем цену текущего тарифа за секунду, разделив цену тарифа на количество секунд
$newTariffPriceBySecond = $newTariffPrice / $secondsInMonth; // аналогично получаем цену нового тарифа за секунду
$secondsRemain = $paidBefore - $now; // получаем оставшееся время, вычитая текущее время из даты окончания подписки
$secondsPaid = $secondsRemain * $currentTariffPriceBySecond; // получаем остаток в деньгах по текущему тарифу, умножив оставшееся количество секунд на цену за секунду
$newTariffSecondsRemain = $secondsPaid / $newTariffPriceBySecond; // получаем оставшееся количество секунд по цене нового тарифа
$newTariffPaidBefore = $now + $newTariffSecondsRemain; // получаем дату окончания подписки по новому тарифу, добавляя к текущему времени оставшееся количество секунд по новому тарифу
return date('Y-m-d H:i:s', $newTariffPaidBefore); // выводим
Как будто бы, пересчёт на момент запроса происходит корректно, - однако, при следующем запросе результат становится больше.
То есть, считаем - получаем дату.
Ждём 10 минут, считаем заново, - получаем дату на 10 минут больше.
Но, если мне не изменяет логика, раз оставшееся время по текущему тарифу закономерно уменьшилось на прошедшие, допустим, 10 минут, - то и остаток в деньгах уменьшится, - а, значит, пропорционально уменьшится и оставшееся время по новому тарифу, - и дата окончания подписки по новому тарифу должна остаться неизменной с течением времени.
Что я не учёл?