• PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    nazgulun, я прочитал, внимательно.
    и да, я понимаю, что расчёт верен.
    и про логику, которая изменила, понимаю.
    Но задачу это всё не решает(

    Нужно дать пользователям менять тариф в любой момент.
    Дата не должна увеличиваться: она должна быть стабильной.

    По моему расчёту дата получается не стабильной с течением времени.
    Значит, для реальной возможности дать пользователям менять тариф, когда заблагорассудится, этот расчёт не применим: щёлкая тарифы туда-сюда можно накрутить "бесплатное" время.

    Получается, даты для всех тарифов нужно считать заранее, в момент оплаты, по этому расчёту, и хранить до истечения очередной подписки.

    У меня только такая идея...
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    nazgulun, принял, ок. Но задача остаётся той же: нужно дать пользователям возможность изменить тариф в любой момент. При этом должно корректно рассчитываться оставшееся время.
    Раз формулой расчёт не стабилен, - значит, выходит, нужно на момент начала периода рассчитывать дату окончания оплаты для каждого тарифа за оплаченную сумму...
    Хотя, это, конечно, странно.

    Может, есть какой-то компенсирующий увеличение дат коэффициент... ?)
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    nazgulun, значит, не в порядке, раз "прыгает" =)
    остаток чего на входе? денег? так его, как раз, считать и приходится: он же не фиксированный
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    twobomb, nazgulun,
    спасибо за наглядные разъяснения!
    "Ничего не понял, но очень интересно"))
    На самом деле, динамику осознал, и с секундами, и с днями, - причину не понимаю, как же ж так-то...
    Ладно, примем за аксиому, потом буду понимать.

    Что в этом случае делать, чтобы менять тарифы в любой момент?
    Хранить для каждого тарифа заранее (в первый день) рассчитанную дату?
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    twobomb, правильность расчёта на каждый момент выполнения кода у меня вопросов не вызывает: уже и так, и эдак проверял.
    Вопрос в том, почему при следующем таком же запросе конечная дата по новому тарифу увеличивается.
    Я ведь пока не меняю тариф: я просто выполняю один и тот же код, с одними и теми же входными данными.
    $now - как раз и единственная переменная, - остальное фиксировано.
    Потому и непонятно.

    Да, спасибо за короткую формулу, я изначально примерно так и сделал, а потом начал по косточкам разбирать, чтобы понять, где косяк у меня
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    nazgulun, тарифы не помесячные, а по 30 дней, - по сути, это не важно: период чёткий, количество секунд в периоде фиксированное, - опять же, переменная только одна, - а понимания больше не становится... >_<

    если код верный, - почему дата увеличивается-то?)
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    nazgulun, почему?
    я ведь привожу оставшееся оплаченное время к новому тарифу, деля его на цену за секунду по новому тарифу.
    Фактически, получая оставшееся оплаченное время по старому тарифу, я получаю некий оставшийся баланс непотраченных средств.
    Закономерно, баланс уменьшается с каждой секундой.
    Деля этот оставшийся баланс на цену нового тарифа за секунду, я получаю оставшиеся секунды по новому тарифу, - они закономерно уменьшаются.
    Так почему, в каком именно месте идёт увеличение даты?
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    Wataru, раз 30 проверил, - сейчас просто выполняю код, который в вопросе привёл: там переменная-то одна - текущее время...

    <?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
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    twobomb, почему понятное дело? Почему дата увеличивается? Запрос тот же, цены те же, текущий тариф и дата его окончания не меняются, - меняется только текущее время. Но оно учитывается при получении оставшегося времени по обоим тарифам, - не должна скакать дата же ж...

    Почему перемножать?
    Чтобы получить остаток денег, мы умножаем остаток секунд на цену за секунду:
    ОстатокДенег = ОстатокСекунд * ЦенаЗаСекунду
    Соответственно, по правилу пропорции, чтобы получить остаток секунд, мы делим остаток денег на цену за секунду. Вроде, всё правильно...
  • PHP пересчёт оплаченного времени при переходе на другой тариф: что я делаю не так?

    @agapofff Автор вопроса
    Akina, нет, я ничего не сохраняю: это пока расчёт без перезаписи, информационный. И дата окончания, и тариф остаются прежними. Я просто повторяю расчёт с теми же входными данными, что указал в тексте вопроса.

    Вопрос в том, почему вообще дата увеличивается от запроса к запросу, с теми же входными данными?