From 4800a2da80b3fc9fd173c014ba00a0bfeb9541e4 Mon Sep 17 00:00:00 2001 From: Bogdan Strielecki Date: Mon, 27 Oct 2025 13:38:37 +0300 Subject: [PATCH] Additional payment info in admin panel user card - total income - total income from all user referrals --- bot/handlers/admin/user_management.py | 14 +++++++++++ db/dal/payment_dal.py | 34 +++++++++++++++++++++++++++ locales/en.json | 2 ++ locales/ru.json | 2 ++ 4 files changed, 52 insertions(+) diff --git a/bot/handlers/admin/user_management.py b/bot/handlers/admin/user_management.py index 548bfd9..db0e602 100644 --- a/bot/handlers/admin/user_management.py +++ b/bot/handlers/admin/user_management.py @@ -192,6 +192,20 @@ async def format_user_card(user: User, session: AsyncSession, trial_status = _("admin_user_trial_used", default="Использовал") if had_subscriptions else _("admin_user_trial_not_used", default="Не использовал") card_parts.append(f"{_('admin_user_trial_label', default='🏡 Триал:')} {hcode(trial_status)}") + # Financial analytics (admin-only) + try: + from db.dal import payment_dal + + # Total amount paid by this user + total_paid = await payment_dal.get_user_total_paid(session, user.user_id) + card_parts.append(f"{_('admin_user_total_paid_label', default='💰 Всего оплачено:')} {hcode(f'{total_paid:.2f} RUB')}") + + # Total revenue from referrals + referral_revenue = await payment_dal.get_referral_revenue(session, user.user_id) + card_parts.append(f"{_('admin_user_referral_revenue_label', default='💸 Доход по рефералам:')} {hcode(f'{referral_revenue:.2f} RUB')}") + except Exception as e_fin: + logging.error(f"Failed to build financial analytics for admin card {user.user_id}: {e_fin}") + # Referral stats if referral_service is not None: try: diff --git a/db/dal/payment_dal.py b/db/dal/payment_dal.py index 939ff2b..cfd63de 100644 --- a/db/dal/payment_dal.py +++ b/db/dal/payment_dal.py @@ -262,3 +262,37 @@ async def get_last_tribute_payment( Payment.created_at.desc()).limit(1)) result = await session.execute(stmt) return result.scalar_one_or_none() + + +async def get_user_total_paid(session: AsyncSession, user_id: int) -> float: + """Get total amount paid by a specific user (sum of all succeeded payments).""" + stmt = select(func.sum(Payment.amount)).where( + and_( + Payment.user_id == user_id, + Payment.status == 'succeeded' + ) + ) + result = await session.execute(stmt) + total = result.scalar() + return float(total or 0) + + +async def get_referral_revenue(session: AsyncSession, referrer_id: int) -> float: + """Get total revenue generated from referred users' payments. + + This calculates the sum of all succeeded payments made by users + where referred_by_id equals the referrer_id. + """ + from db.models import User + + stmt = select(func.sum(Payment.amount)).join( + User, Payment.user_id == User.user_id + ).where( + and_( + User.referred_by_id == referrer_id, + Payment.status == 'succeeded' + ) + ) + result = await session.execute(stmt) + total = result.scalar() + return float(total or 0) \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index d74e821..cc2437e 100644 --- a/locales/en.json +++ b/locales/en.json @@ -337,6 +337,8 @@ "admin_user_na_value": "N/A", "admin_user_subscription_none": "No active subscription", "admin_user_actions_count_label": "📜 Total actions:", + "admin_user_total_paid_label": "💰 Total Paid:", + "admin_user_referral_revenue_label": "💸 Referral Revenue:", "admin_user_invited_friends_label": "👥 Friends invited:", "admin_user_ref_purchased_label": "💳 Purchased subscription:", "admin_user_subscription_active_until": "⏰ Active until:", diff --git a/locales/ru.json b/locales/ru.json index c20d53c..ad106ae 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -337,6 +337,8 @@ "admin_user_na_value": "N/A", "admin_user_subscription_none": "Нет активной подписки", "admin_user_actions_count_label": "📜 Всего действий:", + "admin_user_total_paid_label": "💰 Всего оплачено:", + "admin_user_referral_revenue_label": "💸 Доход по рефералам:", "admin_user_invited_friends_label": "👥 Приглашено друзей:", "admin_user_ref_purchased_label": "💳 Купили подписку:", "admin_user_subscription_active_until": "⏰ Действует до:",