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": "⏰ Действует до:",