From 095c3a8490df2c0f12feb3feda3bd2ae48eb3813 Mon Sep 17 00:00:00 2001 From: Egor Date: Sat, 6 Sep 2025 02:05:49 +0300 Subject: [PATCH] Update subscription.py --- app/handlers/subscription.py | 77 ++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/app/handlers/subscription.py b/app/handlers/subscription.py index c52648cb..120cf6c1 100644 --- a/app/handlers/subscription.py +++ b/app/handlers/subscription.py @@ -1801,35 +1801,54 @@ async def confirm_purchase( existing_subscription = db_user.subscription - if existing_subscription: - logger.info(f"Обновляем существующую подписку пользователя {db_user.telegram_id}") - - existing_subscription.is_trial = False - existing_subscription.status = SubscriptionStatus.ACTIVE.value - existing_subscription.traffic_limit_gb = final_traffic_gb - existing_subscription.device_limit = data['devices'] - existing_subscription.connected_squads = data['countries'] - - existing_subscription.start_date = datetime.utcnow() - existing_subscription.end_date = datetime.utcnow() + timedelta(days=data['period_days']) - existing_subscription.updated_at = datetime.utcnow() - - existing_subscription.traffic_used_gb = 0.0 - - await db.commit() - await db.refresh(existing_subscription) - subscription = existing_subscription - - else: - logger.info(f"Создаем новую подписку для пользователя {db_user.telegram_id}") - subscription = await create_paid_subscription_with_traffic_mode( - db=db, - user_id=db_user.id, - duration_days=data['period_days'], - device_limit=data['devices'], - connected_squads=data['countries'], - traffic_gb=final_traffic_gb - ) + if existing_subscription: + logger.info(f"Обновляем существующую подписку пользователя {db_user.telegram_id}") + + if existing_subscription.is_trial: + logger.info(f"🎯 Конверсия из триала в платную для пользователя {db_user.telegram_id}") + + trial_duration = (datetime.utcnow() - existing_subscription.start_date).days + + try: + from app.database.crud.subscription_conversion import create_subscription_conversion + await create_subscription_conversion( + db=db, + user_id=db_user.id, + trial_duration_days=trial_duration, + payment_method="balance", + first_payment_amount_kopeks=final_price, + first_paid_period_days=data['period_days'] + ) + logger.info(f"✅ Записана конверсия: {trial_duration} дн. триал → {data['period_days']} дн. платная за {final_price/100}₽") + except Exception as conversion_error: + logger.error(f"❌ Ошибка записи конверсии: {conversion_error}") + + existing_subscription.is_trial = False + existing_subscription.status = SubscriptionStatus.ACTIVE.value + existing_subscription.traffic_limit_gb = final_traffic_gb + existing_subscription.device_limit = data['devices'] + existing_subscription.connected_squads = data['countries'] + + existing_subscription.start_date = datetime.utcnow() + existing_subscription.end_date = datetime.utcnow() + timedelta(days=data['period_days']) + existing_subscription.updated_at = datetime.utcnow() + + existing_subscription.traffic_used_gb = 0.0 + + await db.commit() + await db.refresh(existing_subscription) + subscription = existing_subscription + + else: + logger.info(f"Создаем новую подписку для пользователя {db_user.telegram_id}") + subscription = await create_paid_subscription_with_traffic_mode( + db=db, + user_id=db_user.id, + duration_days=data['period_days'], + device_limit=data['devices'], + connected_squads=data['countries'], + traffic_gb=final_traffic_gb + ) from app.utils.user_utils import mark_user_as_had_paid_subscription await mark_user_as_had_paid_subscription(db, db_user)