diff --git a/app/handlers/admin/users.py b/app/handlers/admin/users.py index dcbd7c89..47001e19 100644 --- a/app/handlers/admin/users.py +++ b/app/handlers/admin/users.py @@ -4942,7 +4942,10 @@ async def admin_buy_subscription_execute(callback: types.CallbackQuery, db_user: remnawave_user = await api.create_user(**create_kwargs) if remnawave_user and hasattr(remnawave_user, 'uuid'): - target_user.remnawave_uuid = remnawave_user.uuid + if settings.is_multi_tariff_enabled() and subscription: + subscription.remnawave_uuid = remnawave_user.uuid + else: + target_user.remnawave_uuid = remnawave_user.uuid await db.commit() if remnawave_user: diff --git a/app/services/remnawave_service.py b/app/services/remnawave_service.py index fba7bd20..dfb7560f 100644 --- a/app/services/remnawave_service.py +++ b/app/services/remnawave_service.py @@ -2161,7 +2161,7 @@ class RemnaWaveService: create_kwargs['external_squad_uuid'] = sub.tariff.external_squad_uuid # Определяем UUID для обновления - panel_uuid = user.remnawave_uuid + panel_uuid = sub.remnawave_uuid if settings.is_multi_tariff_enabled() else user.remnawave_uuid # Если нет UUID в базе, ищем пользователя по telegram_id в панели if not panel_uuid and user.telegram_id: diff --git a/app/services/wheel_service.py b/app/services/wheel_service.py index c4d3bf02..0bf54d57 100644 --- a/app/services/wheel_service.py +++ b/app/services/wheel_service.py @@ -336,6 +336,8 @@ class FortuneWheelService: Возвращает эквивалент в копейках. """ if not subscription: + if settings.is_multi_tariff_enabled(): + raise ValueError('Необходимо указать подписку для оплаты днями (мульти-тариф)') subscription = await get_subscription_by_user_id(db, user.id) if not subscription or not subscription.is_active: @@ -406,6 +408,21 @@ class FortuneWheelService: if prize_type == WheelPrizeType.SUBSCRIPTION_DAYS.value: # Дни подписки — use provided subscription or fallback if not subscription: + if settings.is_multi_tariff_enabled(): + # Multi-tariff: нельзя выбрать произвольную подписку, начисляем на баланс + await add_user_balance( + db, + user, + prize.prize_value_kopeks, + description=f'Выигрыш в колесе удачи: {prize.prize_value} дней (на баланс, мульти-тариф)', + create_transaction=True, + ) + logger.info( + 'Мульти-тариф: дни конвертированы в баланс (подписка не указана)', + prize_value=prize.prize_value, + user_id=user.id, + ) + return None subscription = await get_subscription_by_user_id(db, user.id) if subscription: # Проверяем суточный тариф - для него конвертируем дни в баланс @@ -472,6 +489,21 @@ class FortuneWheelService: if prize_type == WheelPrizeType.TRAFFIC_GB.value: # Бонусный трафик — use provided subscription or fallback if not subscription: + if settings.is_multi_tariff_enabled(): + # Multi-tariff: нельзя выбрать произвольную подписку, начисляем на баланс + await add_user_balance( + db, + user, + prize.prize_value_kopeks, + description=f'Выигрыш в колесе удачи: {prize.prize_value}GB (на баланс, мульти-тариф)', + create_transaction=True, + ) + logger.info( + 'Мульти-тариф: трафик конвертирован в баланс (подписка не указана)', + prize_value=prize.prize_value, + user_id=user.id, + ) + return None subscription = await get_subscription_by_user_id(db, user.id) if subscription and subscription.traffic_limit_gb > 0: subscription.traffic_limit_gb += prize.prize_value @@ -583,6 +615,18 @@ class FortuneWheelService: # Single-tariff: auto-resolve target_subscription = await get_subscription_by_user_id(db, user.id) + # Multi-tariff guard: subscription_id is required for days payment + if ( + settings.is_multi_tariff_enabled() + and not target_subscription + and payment_type == WheelSpinPaymentType.SUBSCRIPTION_DAYS.value + ): + return SpinResult( + success=False, + error='subscription_required', + message='Выберите подписку для оплаты днями', + ) + # 2. Обрабатываем оплату if payment_type == WheelSpinPaymentType.TELEGRAM_STARS.value: if not availability.can_pay_stars: