From f7c8c82775dbc336fbc14910f88f9d40ea289ca1 Mon Sep 17 00:00:00 2001 From: Egor Date: Sat, 6 Sep 2025 02:04:17 +0300 Subject: [PATCH] Update subscription.py --- app/database/crud/subscription.py | 92 ++++++++++--------------------- 1 file changed, 30 insertions(+), 62 deletions(-) diff --git a/app/database/crud/subscription.py b/app/database/crud/subscription.py index b77fbfdc..dfda9e1c 100644 --- a/app/database/crud/subscription.py +++ b/app/database/crud/subscription.py @@ -354,68 +354,36 @@ async def get_subscriptions_statistics(db: AsyncSession) -> dict: ) purchased_month = month_result.scalar() - users_with_paid_subs = await db.execute( - select(func.count(User.id)) - .where(User.has_had_paid_subscription == True) - ) - total_users_with_paid = users_with_paid_subs.scalar() - - users_with_any_subscription = await db.execute( - select(func.count(func.distinct(Subscription.user_id))) - ) - total_users_with_trial = users_with_any_subscription.scalar() - - users_with_trial_subs = await db.execute( - select(func.count(func.distinct(Subscription.user_id))) - .where(Subscription.is_trial == True) - ) - users_had_trial = users_with_trial_subs.scalar() - - if users_had_trial > 0: - trial_to_paid_conversion = round((total_users_with_paid / users_had_trial) * 100, 1) - else: - trial_to_paid_conversion = 0 - - renewals_result = await db.execute( - select(func.count(Subscription.id)) - .join(User, Subscription.user_id == User.id) - .where( - and_( - Subscription.is_trial == False, - User.has_had_paid_subscription == True, - Subscription.created_at >= month_ago - ) + try: + from app.database.crud.subscription_conversion import get_conversion_statistics + conversion_stats = await get_conversion_statistics(db) + + trial_to_paid_conversion = conversion_stats.get("conversion_rate", 0) + renewals_count = conversion_stats.get("month_conversions", 0) + + logger.info(f"πŸ“Š Бтатистика конвСрсии ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ conversions:") + logger.info(f" ΠžΠ±Ρ‰Π΅Π΅ количСство конвСрсий: {conversion_stats.get('total_conversions', 0)}") + logger.info(f" ΠŸΡ€ΠΎΡ†Π΅Π½Ρ‚ конвСрсии: {trial_to_paid_conversion}%") + logger.info(f" ΠšΠΎΠ½Π²Π΅Ρ€ΡΠΈΠΉ Π·Π° мСсяц: {renewals_count}") + + except ImportError: + logger.warning("⚠️ Π’Π°Π±Π»ΠΈΡ†Π° subscription_conversions Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΡ‚Π°Ρ€ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ") + + users_with_paid_result = await db.execute( + select(func.count(User.id)) + .where(User.has_had_paid_subscription == True) ) - ) - renewals_count = renewals_result.scalar() - - actual_renewals_result = await db.execute( - select(func.count(Subscription.id)) - .where( - and_( - Subscription.is_trial == False, - Subscription.created_at >= month_ago, - Subscription.user_id.in_( - select(Subscription.user_id) - .where( - and_( - Subscription.is_trial == False, - Subscription.created_at < Subscription.created_at - ) - ) - .group_by(Subscription.user_id) - .having(func.count(Subscription.id) > 1) - ) - ) - ) - ) - actual_renewals = actual_renewals_result.scalar() - - logger.info(f"πŸ“Š Бтатистика конвСрсии:") - logger.info(f" ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с Ρ‚Ρ€ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ подписками: {users_had_trial}") - logger.info(f" ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΠ»Π°Ρ‚Π½Ρ‹ΠΌΠΈ подписками: {total_users_with_paid}") - logger.info(f" ΠšΠΎΠ½Π²Π΅Ρ€ΡΠΈΡ: {trial_to_paid_conversion}%") - logger.info(f" ΠŸΡ€ΠΎΠ΄Π»Π΅Π½ΠΈΠΉ Π·Π° мСсяц: {actual_renewals}") + users_with_paid = users_with_paid_result.scalar() + + total_users_result = await db.execute(select(func.count(User.id))) + total_users = total_users_result.scalar() + + if total_users > 0: + trial_to_paid_conversion = round((users_with_paid / total_users) * 100, 1) + else: + trial_to_paid_conversion = 0 + + renewals_count = 0 return { "total_subscriptions": total_subscriptions, @@ -426,7 +394,7 @@ async def get_subscriptions_statistics(db: AsyncSession) -> dict: "purchased_week": purchased_week, "purchased_month": purchased_month, "trial_to_paid_conversion": trial_to_paid_conversion, - "renewals_count": renewals_count + "renewals_count": renewals_count } async def update_subscription_usage(