What's Changed
Full Changelog: v2.1.9...v2.2.0
🧮 Обновление системы ценообразования подписок
🔄 Основные изменения
Переработана логика расчета цен с учетом периодичности платежей:
- Новая формула расчета: Базовая цена за период + (Дополнительные услуги × Количество месяцев в периоде)
- Для новых подписок: цена рассчитывается исходя из выбранного периода (30/90/180 дней = 1/3/6 месяцев)
- Для продления: стоимость текущей конфигурации умножается на количество месяцев
- Для дополнений: цена за месяц умножается на оставшиеся месяцы подписки
📊 Детали реализации
Добавлены новые утилиты для работы с периодами:
app/utils/pricing_utils.py- функции расчета месяцев, валидации цен, форматирования периодовcalculate_months_from_days()- конвертация дней в месяцыget_remaining_months()- расчет оставшихся месяцев подпискиcalculate_prorated_price()- пропорциональный расчет цены
Обновлены сервисы:
subscription_service.py- новые методы расчета с учетом месяцевsubscription.py(CRUD) - функции для работы с ценами за период
Исправлены обработчики:
confirm_purchase()- корректный расчет цены новой подпискиconfirm_extend_subscription()- расчет продления с учетом всех услугconfirm_add_traffic/devices()- доплата за оставшиеся месяцыapply_countries_changes()- добавление серверов с правильной ценой
Улучшены интерфейсы:
- Клавиатуры добавления услуг теперь показывают финальную цену за период
- Детализация расчетов в сводке заказа с разбивкой по месяцам
- Корректное отображение цен серверов при управлении странами
🛠 Технические улучшения
- Добавлена валидация расчетов для предотвращения ошибок
- Улучшено логирование всех ценовых операций
- Исправлены проблемы с округлением при отображении цен
💡 Принцип работы
Пример расчета для подписки на 180 дней:
- Базовый период: 400₽
- Трафик безлимит: 200₽/мес × 6 мес = 1200₽
- 4 устройства: 50₽/мес × 6 мес = 300₽
- 2 сервера: 100₽/мес × 6 мес = 1200₽
- Итого: 3100₽
Система теперь корректно работает с любыми периодами подписки и обеспечивает прозрачность ценообразования для пользователей.