From 22884b5cddff8433c58cfb52c2d08856746b7cb1 Mon Sep 17 00:00:00 2001 From: Egor Date: Mon, 12 Jan 2026 15:27:05 +0300 Subject: [PATCH] Update purchase.py --- app/handlers/subscription/purchase.py | 118 +++++++++++++++++++++++++- 1 file changed, 117 insertions(+), 1 deletion(-) diff --git a/app/handlers/subscription/purchase.py b/app/handlers/subscription/purchase.py index 3a1680a2..281ca051 100644 --- a/app/handlers/subscription/purchase.py +++ b/app/handlers/subscription/purchase.py @@ -3016,7 +3016,12 @@ async def handle_subscription_settings( await callback.message.edit_text( settings_text, - reply_markup=get_updated_subscription_settings_keyboard(db_user.language, show_countries, tariff=tariff), + reply_markup=get_updated_subscription_settings_keyboard( + db_user.language, + show_countries, + tariff=tariff, + subscription=subscription + ), parse_mode="HTML" ) await callback.answer() @@ -3037,6 +3042,112 @@ async def clear_saved_cart( await callback.answer("🗑️ Корзина очищена") +# ============== ХЕНДЛЕР ПАУЗЫ СУТОЧНОЙ ПОДПИСКИ ============== + +async def handle_toggle_daily_subscription_pause( + callback: types.CallbackQuery, + db_user: User, + db: AsyncSession +): + """Переключает паузу суточной подписки.""" + from app.database.crud.subscription import toggle_daily_subscription_pause + from app.database.crud.tariff import get_tariff_by_id + + texts = get_texts(db_user.language) + subscription = db_user.subscription + + if not subscription: + await callback.answer( + texts.t("NO_SUBSCRIPTION_ERROR", "❌ У вас нет активной подписки"), + show_alert=True + ) + return + + # Проверяем что это суточный тариф + tariff = None + if subscription.tariff_id: + tariff = await get_tariff_by_id(db, subscription.tariff_id) + + if not tariff or not getattr(tariff, 'is_daily', False): + await callback.answer( + texts.t("NOT_DAILY_TARIFF_ERROR", "❌ Эта функция доступна только для суточных тарифов"), + show_alert=True + ) + return + + # Переключаем статус паузы + was_paused = subscription.is_daily_paused + subscription = await toggle_daily_subscription_pause(db, subscription) + + if was_paused: + # Была пауза, теперь возобновили + message = texts.t( + "DAILY_SUBSCRIPTION_RESUMED", + "▶️ Суточная подписка возобновлена.\n\nСписание будет произведено в ближайший цикл проверки." + ) + else: + # Была активна, теперь на паузе + message = texts.t( + "DAILY_SUBSCRIPTION_PAUSED", + "⏸️ Суточная подписка приостановлена.\n\nСписания не будут производиться до возобновления." + ) + + await callback.answer(message, show_alert=True) + + # Обновляем клавиатуру настроек + show_countries = await _should_show_countries_management(db_user) + + settings_template = texts.t( + "SUBSCRIPTION_SETTINGS_OVERVIEW", + ( + "⚙️ Настройки подписки\n\n" + "📊 Текущие параметры:\n" + "🌐 Стран: {countries_count}\n" + "📈 Трафик: {traffic_used} / {traffic_limit}\n" + "📱 Устройства: {devices_used} / {devices_limit}\n\n" + "Выберите что хотите изменить:" + ), + ) + + show_devices = settings.is_devices_selection_enabled() + if not show_devices: + settings_template = settings_template.replace( + "\n📱 Устройства: {devices_used} / {devices_limit}", + "", + ) + + if show_devices: + devices_used = await get_current_devices_count(db_user) + else: + devices_used = 0 + + modem_enabled = getattr(subscription, 'modem_enabled', False) or False + if modem_enabled and settings.is_modem_enabled(): + visible_device_limit = (subscription.device_limit or 1) - 1 + devices_limit_display = f"{visible_device_limit} + модем" + else: + devices_limit_display = str(subscription.device_limit) + + settings_text = settings_template.format( + countries_count=len(subscription.connected_squads), + traffic_used=texts.format_traffic(subscription.traffic_used_gb), + traffic_limit=texts.format_traffic(subscription.traffic_limit_gb), + devices_used=devices_used, + devices_limit=devices_limit_display, + ) + + await callback.message.edit_text( + settings_text, + reply_markup=get_updated_subscription_settings_keyboard( + db_user.language, + show_countries, + tariff=tariff, + subscription=subscription + ), + parse_mode="HTML" + ) + + # ============== ХЕНДЛЕРЫ ПЛАТНОГО ТРИАЛА ============== @error_handler @@ -3993,6 +4104,11 @@ def register_handlers(dp: Dispatcher): F.data == "subscription_settings" ) + dp.callback_query.register( + handle_toggle_daily_subscription_pause, + F.data == "toggle_daily_subscription_pause" + ) + dp.callback_query.register( handle_no_traffic_packages, F.data == "no_traffic_packages"