Update subscription.py

This commit is contained in:
Egor
2025-09-06 02:04:17 +03:00
committed by GitHub
parent 3d75543cf0
commit f7c8c82775

View File

@@ -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(