From 779cccffe6a8396846e44ee0c7c5de4837fc8f27 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 1 Feb 2026 00:53:50 +0300 Subject: [PATCH 1/2] Update tribute.py --- app/external/tribute.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/external/tribute.py b/app/external/tribute.py index bcecd5a2..7fc1b948 100644 --- a/app/external/tribute.py +++ b/app/external/tribute.py @@ -91,7 +91,7 @@ class TributeService: amount_kopeks = data.get('amount', 0) telegram_user_id = data.get('telegram_user_id') - if event_name == 'new_donation': + if event_name in ('new_donation', 'recurrent_donation'): status = 'paid' elif event_name == 'cancelled_subscription': status = 'cancelled' From d611eecece0fc6a2a82c0f122b6ad84c1c514640 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 1 Feb 2026 00:54:17 +0300 Subject: [PATCH 2/2] Update user.py --- app/database/crud/user.py | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/app/database/crud/user.py b/app/database/crud/user.py index e8b94d06..3420f09b 100644 --- a/app/database/crud/user.py +++ b/app/database/crud/user.py @@ -408,29 +408,33 @@ async def add_user_balance( # Автоматическое возобновление приостановленной суточной подписки try: from app.database.crud.subscription import resume_daily_subscription + from app.database.crud.tariff import get_tariff_by_id from app.database.models import SubscriptionStatus subscription = user.subscription if subscription and subscription.status == SubscriptionStatus.DISABLED.value: # Проверяем что это суточный тариф is_daily = getattr(subscription, 'is_daily_tariff', False) - if is_daily and subscription.tariff: - daily_price = getattr(subscription.tariff, 'daily_price_kopeks', 0) - # Если баланс достаточный для суточной оплаты - возобновляем - if daily_price > 0 and user.balance_kopeks >= daily_price: - await resume_daily_subscription(db, subscription) - logger.info( - f'✅ Автоматически возобновлена суточная подписка {subscription.id} ' - f'после пополнения баланса (user_id={user.id})' - ) - # Синхронизируем с RemnaWave - try: - from app.services.subscription_service import SubscriptionService + if is_daily and subscription.tariff_id: + # Загружаем тариф явно, чтобы избежать lazy loading + tariff = await get_tariff_by_id(db, subscription.tariff_id) + if tariff: + daily_price = getattr(tariff, 'daily_price_kopeks', 0) + # Если баланс достаточный для суточной оплаты - возобновляем + if daily_price > 0 and user.balance_kopeks >= daily_price: + await resume_daily_subscription(db, subscription) + logger.info( + f'✅ Автоматически возобновлена суточная подписка {subscription.id} ' + f'после пополнения баланса (user_id={user.id})' + ) + # Синхронизируем с RemnaWave + try: + from app.services.subscription_service import SubscriptionService - subscription_service = SubscriptionService() - await subscription_service.update_remnawave_user(db, subscription) - except Exception as sync_err: - logger.warning(f'Не удалось синхронизировать с RemnaWave: {sync_err}') + subscription_service = SubscriptionService() + await subscription_service.update_remnawave_user(db, subscription) + except Exception as sync_err: + logger.warning(f'Не удалось синхронизировать с RemnaWave: {sync_err}') except Exception as resume_err: logger.warning(f'Ошибка при попытке возобновить суточную подписку: {resume_err}')