<?php // на 12:33
$secondsInMonth = 60 * 60 * 24 * 30; // количество секунд в периоде оплаты (30 дней)
echo '$secondsInMonth = ' . $secondsInMonth; // 2592000
$paidBefore = strtotime('2021-05-30 23:50:00'); // дата окончания подписки
$now = strtotime('now'); // текущее время
echo $now; // 1620984782
$currentTariffPrice = 1590; // цена текущего тарифа (за 30 дней)
$newTariffPrice = 7990; // цена нового тарифа (за 30 дней)
$currentTariffPriceBySecond = $currentTariffPrice / $secondsInMonth;// получаем цену текущего тарифа за секунду, разделив цену тарифа на количество секунд
echo '$currentTariffPriceBySecond = ' . $currentTariffPriceBySecond;// 0.00061342592592593
$newTariffPriceBySecond = $newTariffPrice / $secondsInMonth; // аналогично получаем цену нового тарифа за секунду
echo '$newTariffPriceBySecond = ' . $newTariffPriceBySecond; // 0.0030825617283951
$secondsRemain = $paidBefore - $now; // получаем оставшееся время, вычитая текущее время из даты окончания подписки
echo '$secondsRemain = ' . $secondsRemain; // 1423018
$secondsPaid = $secondsRemain * $currentTariffPriceBySecond; // получаем остаток в деньгах по текущему тарифу, умножив оставшееся количество секунд на цену за секунду
echo '$secondsPaid = ' . $secondsPaid; // 872.91613425926
$newTariffSecondsRemain = $secondsPaid / $newTariffPriceBySecond; // получаем оставшееся количество секунд по цене нового тарифа
echo '$newTariffSecondsRemain = ' . $newTariffSecondsRemain; // 283178.80100125
$newTariffPaidBefore = $now + $newTariffSecondsRemain; // получаем дату окончания подписки по новому тарифу, добавляя к текущему времени оставшееся количество секунд по новому тарифу
echo '$newTariffPaidBefore = ' . $newTariffPaidBefore; // 1621267960.801
echo date('Y-m-d H:i:s', $newTariffPaidBefore); // 2021-05-17 19:12:40
и да, я понимаю, что расчёт верен.
и про логику, которая изменила, понимаю.
Но задачу это всё не решает(
Нужно дать пользователям менять тариф в любой момент.
Дата не должна увеличиваться: она должна быть стабильной.
По моему расчёту дата получается не стабильной с течением времени.
Значит, для реальной возможности дать пользователям менять тариф, когда заблагорассудится, этот расчёт не применим: щёлкая тарифы туда-сюда можно накрутить "бесплатное" время.
Получается, даты для всех тарифов нужно считать заранее, в момент оплаты, по этому расчёту, и хранить до истечения очередной подписки.
У меня только такая идея...