70 lines
4.3 KiB
Markdown
70 lines
4.3 KiB
Markdown
# Тарифы 2.0
|
||
|
||
Бот поддерживает каталог тарифов в JSON-файле. Путь задается через `TARIFFS_CONFIG_PATH`, по умолчанию `config/tariffs.json`.
|
||
|
||
Если файл отсутствует, включается legacy fallback: используются старые `.env` поля `RUB_PRICE_*`, `STARS_PRICE_*`, `USER_TRAFFIC_LIMIT_GB`, `USER_SQUAD_UUIDS`, а также старый режим `TRAFFIC_PACKAGES`.
|
||
|
||
## Конфиг
|
||
|
||
См. пример: [`config/tariffs.example.json`](../config/tariffs.example.json).
|
||
|
||
Основные поля:
|
||
|
||
| Поле | Описание |
|
||
| --- | --- |
|
||
| `default_tariff` | Тариф для миграции существующих подписок и выбора по умолчанию |
|
||
| `topup_packages_default` | Пакеты докупки для period-тарифов без собственных пакетов |
|
||
| `tariffs[].billing_model` | `period` или `traffic` |
|
||
| `tariffs[].squad_uuids` | Internal squads Remnawave для тарифа |
|
||
| `prices_rub` / `prices_stars` | Цены period-тарифов по месяцам |
|
||
| `traffic_packages` | Пакеты GB для traffic-тарифов |
|
||
|
||
## Period-Тариф
|
||
|
||
Period-тариф продает доступ на срок и лимит трафика с календарным ежемесячным сбросом.
|
||
|
||
- `monthly_gb` превращается в `tier_baseline_bytes`.
|
||
- Докупленные пакеты хранятся в `topup_balance_bytes`.
|
||
- В Remnawave пушится `trafficLimitBytes = tier_baseline_bytes + topup_balance_bytes`.
|
||
- Для period-тарифов бот выставляет `trafficLimitStrategy = MONTH`, а дальнейший reset делает сама панель.
|
||
- Дата сброса больше не считается в боте.
|
||
- Если покупка или продление были в середине месяца, сброс всё равно произойдёт по правилам панели для `MONTH`.
|
||
- Бот только меняет лимиты в GB и следит за предупреждениями/throttle на основе текущего usage из панели.
|
||
|
||
## Traffic-Тариф
|
||
|
||
Traffic-тариф продает GB без срока действия.
|
||
|
||
- `end_date` технически ставится в `2099-01-01 UTC`.
|
||
- `period_start_at = NULL`.
|
||
- `trafficLimitStrategy = NO_RESET`.
|
||
- Новая покупка добавляет GB к фактическому остатку: `limit = used + remaining + purchased`.
|
||
- Доступ ограничивается только при исчерпании купленного трафика.
|
||
|
||
## Смена Тарифа
|
||
|
||
Смена пишется в `tariff_changes`.
|
||
|
||
- `period -> period`: расчет идет от `effective_monthly_price_rub`; пересчет дней использует `floor`.
|
||
- `period -> traffic`: остаток оплаченных дней конвертируется в GB по `conversion_rate_rub_per_gb` или минимальной цене GB в RUB-пакетах.
|
||
- `traffic -> period`: пользователь покупает период, а остаток GB сохраняется как топ-ап поверх нового тарифа.
|
||
|
||
## Платежи
|
||
|
||
Новые платежи сохраняют:
|
||
|
||
- `sale_mode`: `subscription`, `traffic_package`, `topup`, `tariff_upgrade`;
|
||
- `tariff_key`;
|
||
- `purchased_gb` для GB-покупок.
|
||
|
||
Legacy поле `subscription_duration_months` остается для совместимости.
|
||
|
||
## Воркеры
|
||
|
||
`TariffTrafficWorker` запускается, только если активен `tariffs.json`.
|
||
|
||
- Раз в несколько минут синхронизирует `trafficLimitStrategy = MONTH` для period-тарифов, если панель ещё не переключена.
|
||
- Отправляет/дедуплицирует уровни предупреждений из `TARIFF_TRAFFIC_WARNING_LEVELS` (по умолчанию `85,90,95`) через `traffic_warnings`.
|
||
- При 100% удаляет пользователя из squad-ов тарифа и ставит `is_throttled`.
|
||
- Возвращает пользователя в squad-ы, когда лимит снова больше использованного трафика.
|