Типы смены тарифа
При смене тарифного плана система автоматически определяет тип операции на основе дневных ставок текущего и нового планов.
| Тип | Описание | Оплата |
|---|---|---|
upgrade | Переход на более дорогой план — доплата за оставшиеся дни | Да (доплата) |
upgrade_convert | Переход на более дорогой план — конвертация дней (меньше дней) | Нет |
downgrade | Переход на более дешёвый план — конвертация в большее количество дней | Нет |
alternative | Одинаковая цена за день — просто переключение | Нет |
subscription_to_traffic | Конвертация оставшихся дней подписки в ГБ трафика | Нет |
traffic_to_subscription | Конвертация оставшегося трафика в дни подписки | Нет |
Расчёт дневной ставки
Для каждого тарифа вычисляется дневная ставка — это основа всех расчётов. Берётся первая ненулевая цена из доступных периодов (1, 3, 6 или 12 месяцев) и делится на количество дней:
дневная_ставка = первая_ненулевая_цена / (количество_месяцев × 30)Пример: Тариф стоит 300 ₽ за 1 месяц → 300 / (1 × 30) = 10 ₽/день.
Формула апгрейда (с оплатой)
При апгрейде пользователь доплачивает разницу в стоимости за оставшиеся дни. Количество дней не меняется.
разница_в_цене = новая_ставка - текущая_ставка
доплата = оставшиеся_дни × разница_в_ценеПример расчёта
Текущий тариф: 300 ₽/мес (10 ₽/день), новый: 450 ₽/мес (15 ₽/день), осталось 20 дней.
разница = 15 - 10 = 5 ₽/деньдоплата = 20 × 5 = 100 ₽
Пользователь платит 100 ₽, дни остаются 20, план меняется.
Формула конвертации без оплаты (upgrade_convert)
Пользователь может перейти на более дорогой план без доплаты — вместо этого уменьшается количество дней.
оставшаяся_стоимость = оставшиеся_дни × текущая_ставка
новые_дни = round(оставшаяся_стоимость / новая_ставка)Пример расчёта
Текущий тариф: 10 ₽/день, новый: 15 ₽/день, осталось 30 дней.
оставшаяся_стоимость = 30 × 10 = 300 ₽новые_дни = round(300 / 15) = 20 дней
Пользователь не платит, но получает 20 дней вместо 30.
Формула даунгрейда
При даунгрейде пользователь получает больше дней на более дешёвом плане. Формула аналогична конвертации:
оставшаяся_стоимость = оставшиеся_дни × текущая_ставка
новые_дни = round(оставшаяся_стоимость / новая_ставка)Пример расчёта
Текущий тариф: 15 ₽/день, новый: 10 ₽/день, осталось 20 дней.
оставшаяся_стоимость = 20 × 15 = 300 ₽новые_дни = round(300 / 10) = 30 дней
Пользователь не платит и получает 30 дней вместо 20.
Кросс-тип конвертация
Система поддерживает переход между подпиской (дни) и трафиком (ГБ), а также между трафиковыми планами. Все кросс-тип конвертации всегда бесплатны.
Расчёт ставки за ГБ
Для трафиковых планов вычисляется ставка за ГБ:
- Если у тарифа задана цена за ГБ — используется она.
- Иначе — берутся все пакеты дополнительного трафика, суммируются их цены и объёмы, и вычисляется средняя цена:
ставка_за_ГБ = общая_цена_пакетов / общий_объём_ГБ.
Подписка → Трафик
Оставшиеся дни подписки конвертируются в ГБ трафика на новом плане.
оставшаяся_стоимость = оставшиеся_дни × дневная_ставка
новый_трафик_ГБ = round(оставшаяся_стоимость / ставка_за_ГБ)Пример расчёта
Текущий план: подписка 10 ₽/день, новый: трафик 50 ₽/ГБ, осталось 30 дней.
оставшаяся_стоимость = 30 × 10 = 300 ₽новый_трафик = round(300 / 50) = 6 ГБ
Пользователь получает 6 ГБ трафика вместо 30 дней подписки.
Трафик → Подписка
Оставшийся трафик (лимит минус использованный) конвертируется в дни подписки.
оставшаяся_стоимость = оставшийся_трафик_ГБ × ставка_за_ГБ
новые_дни = round(оставшаяся_стоимость / дневная_ставка)Пример расчёта
Текущий план: трафик 50 ₽/ГБ, осталось 10 ГБ, новый: подписка 10 ₽/день.
оставшаяся_стоимость = 10 × 50 = 500 ₽новые_дни = round(500 / 10) = 50 дней
Пользователь получает 50 дней подписки вместо 10 ГБ трафика.
Трафик → Трафик
Оставшийся трафик конвертируется в ГБ на новом трафиковом плане.
оставшаяся_стоимость = оставшийся_трафик_ГБ × текущая_ставка_за_ГБ
новый_трафик_ГБ = round(оставшаяся_стоимость / новая_ставка_за_ГБ)Пример расчёта
Текущий план: 50 ₽/ГБ, осталось 10 ГБ, новый: 25 ₽/ГБ.
оставшаяся_стоимость = 10 × 50 = 500 ₽новый_трафик = round(500 / 25) = 20 ГБ
Пользователь получает 20 ГБ на новом плане вместо 10 ГБ.
Примечание
Для повышения точности система выполняет промежуточные расчёты в минутах (для подписок) и мегабайтах (для трафика), округляя только финальный результат.
Флаги тарифных планов
Каждый тариф имеет флаги, управляющие доступностью смены:
| Флаг | Описание |
|---|---|
ChangeFromDisabled | Запрещает уход с этого тарифа — пользователь не может сменить его на другой |
ChangeToDisabled | Запрещает переход на этот тариф — он не отображается как вариант для смены |
ConversionDisabled | Разрешён только платный апгрейд — даунгрейд и конвертация без оплаты недоступны |
Настройки системы
| Настройка | Описание |
|---|---|
plan_change_penalty_days | Штрафные дни, вычитаемые при конвертации |
plan_change_daily_limit | Максимальное количество смен тарифа в день на одного пользователя |
Лимит проверяется по таблице истории смен тарифов — если лимит исчерпан, смена заблокирована до следующего дня.
Промокоды при апгрейде
Если у пользователя есть активный промокод, скидка применяется к рассчитанной сумме доплаты:
итого = доплата × (100 - процент_скидки) / 100После успешной оплаты промокод отмечается как использованный.
Экстра-устройства при апгрейде
При апгрейде дополнительные устройства пересчитываются пропорционально оставшимся дням:
стоимость_за_устройство = месячная_цена_устройства × оставшиеся_дни / 30
доплата_за_устройства = ceil(стоимость_за_устройство) × количество_экстра_устройств
итого = доплата_за_план + доплата_за_устройстваПолный flow смены тарифа
Шаг 1: Выбор нового тарифа
Пользователь выбирает новый тариф через Telegram-бота или Mini App. Система рассчитывает варианты смены и показывает доступные опции.
Шаг 2: Расчёт
Система определяет тип операции (upgrade / downgrade / convert) и рассчитывает сумму доплаты или количество новых дней.
Шаг 3: Оплата или конвертация
Если апгрейд (платный):
- Пользователь выбирает способ оплаты.
- Создаётся инвойс на доплату.
- Пользователь оплачивает.
- Вебхук обрабатывает результат оплаты.
- План меняется в Remnawave, дни остаются прежними.
Если даунгрейд / конвертация (бесплатно):
Пользователь подтверждает.
Выполняется конвертация.
План и количество дней меняются в Remnawave.
Шаг 4: Обновление данных
Обновляется подписка в Remnawave.
При даунгрейде сбрасываются экстра-устройства.
Обновляется текущий план пользователя и план автоплатежа.
Шаг 5: Фиксация результата
Запись в историю смен тарифов.
Уведомление пользователю.
Обработка промокода (если был).
Выдача чека (если включён МойНалог).