diff --git a/app/handlers/subscription/links.py b/app/handlers/subscription/links.py index ae8307a4..0059b30a 100644 --- a/app/handlers/subscription/links.py +++ b/app/handlers/subscription/links.py @@ -36,6 +36,42 @@ async def handle_connect_subscription( return texts = get_texts(db_user.language) + + # В режиме мульти-тарифов без явного sub_id в callback — показываем выбор подписки. + if settings.is_multi_tariff_enabled() and callback.data == 'subscription_connect': + from app.database.crud.subscription import get_active_subscriptions_by_user_id + + active_subs = await get_active_subscriptions_by_user_id(db, db_user.id) + if len(active_subs) > 1: + from datetime import UTC, datetime + + from app.database.crud.tariff import get_tariff_by_id as _get_tariff + + keyboard = [] + for sub in sorted(active_subs, key=lambda s: s.id): + tariff_name = '' + if sub.tariff_id: + _t = await _get_tariff(db, sub.tariff_id) + tariff_name = _t.name if _t else f'#{sub.id}' + else: + tariff_name = f'Подписка #{sub.id}' + days_left = max(0, (sub.end_date - datetime.now(UTC)).days) if sub.end_date else 0 + keyboard.append( + [ + types.InlineKeyboardButton( + text=f'🔗 {tariff_name} ({days_left}д.)', + callback_data=f'sl:{sub.id}', + ) + ] + ) + keyboard.append([types.InlineKeyboardButton(text='◀️ Назад', callback_data='back_to_menu')]) + await callback.message.edit_text( + '🔗 Подключиться\n\nВыберите подписку:', + reply_markup=types.InlineKeyboardMarkup(inline_keyboard=keyboard), + ) + await callback.answer() + return + subscription, sub_id = await _resolve_subscription(callback, db_user, db, state) if subscription is None: return diff --git a/app/handlers/subscription/traffic.py b/app/handlers/subscription/traffic.py index 84c8b195..6b145817 100644 --- a/app/handlers/subscription/traffic.py +++ b/app/handlers/subscription/traffic.py @@ -55,9 +55,44 @@ async def _resolve_subscription(callback, db_user, db, state=None): async def handle_add_traffic(callback: types.CallbackQuery, db_user: User, db: AsyncSession, state: FSMContext = None): from app.config import settings + from app.database.crud.subscription import get_active_subscriptions_by_user_id from app.database.crud.tariff import get_tariff_by_id texts = get_texts(db_user.language) + + # В режиме мульти-тарифов без явного sub_id в callback — показываем выбор подписки. + if settings.is_multi_tariff_enabled() and callback.data == 'buy_traffic': + active_subs = await get_active_subscriptions_by_user_id(db, db_user.id) + if len(active_subs) > 1: + from app.database.crud.tariff import get_tariff_by_id as _get_tariff + + keyboard = [] + for sub in sorted(active_subs, key=lambda s: s.id): + if sub.is_trial: + continue + tariff_name = '' + if sub.tariff_id: + _t = await _get_tariff(db, sub.tariff_id) + tariff_name = _t.name if _t else f'#{sub.id}' + else: + tariff_name = f'Подписка #{sub.id}' + days_left = max(0, (sub.end_date - datetime.now(UTC)).days) if sub.end_date else 0 + keyboard.append( + [ + types.InlineKeyboardButton( + text=f'📊 {tariff_name} ({days_left}д.)', + callback_data=f'st:{sub.id}', + ) + ] + ) + keyboard.append([types.InlineKeyboardButton(text='◀️ Назад', callback_data='back_to_menu')]) + await callback.message.edit_text( + '📊 Докупить трафик\n\nВыберите подписку:', + reply_markup=types.InlineKeyboardMarkup(inline_keyboard=keyboard), + ) + await callback.answer() + return + subscription, sub_id = await _resolve_subscription(callback, db_user, db, state) if subscription is None: return