Additional payment info in admin panel user card
- total income - total income from all user referrals
This commit is contained in:
@@ -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="Не использовал")
|
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='🏡 <b>Триал:</b>')} {hcode(trial_status)}")
|
card_parts.append(f"{_('admin_user_trial_label', default='🏡 <b>Триал:</b>')} {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='💰 <b>Всего оплачено:</b>')} {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='💸 <b>Доход по рефералам:</b>')} {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
|
# Referral stats
|
||||||
if referral_service is not None:
|
if referral_service is not None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -262,3 +262,37 @@ async def get_last_tribute_payment(
|
|||||||
Payment.created_at.desc()).limit(1))
|
Payment.created_at.desc()).limit(1))
|
||||||
result = await session.execute(stmt)
|
result = await session.execute(stmt)
|
||||||
return result.scalar_one_or_none()
|
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)
|
||||||
@@ -337,6 +337,8 @@
|
|||||||
"admin_user_na_value": "N/A",
|
"admin_user_na_value": "N/A",
|
||||||
"admin_user_subscription_none": "No active subscription",
|
"admin_user_subscription_none": "No active subscription",
|
||||||
"admin_user_actions_count_label": "📜 <b>Total actions:</b>",
|
"admin_user_actions_count_label": "📜 <b>Total actions:</b>",
|
||||||
|
"admin_user_total_paid_label": "💰 <b>Total Paid:</b>",
|
||||||
|
"admin_user_referral_revenue_label": "💸 <b>Referral Revenue:</b>",
|
||||||
"admin_user_invited_friends_label": "👥 <b>Friends invited:</b>",
|
"admin_user_invited_friends_label": "👥 <b>Friends invited:</b>",
|
||||||
"admin_user_ref_purchased_label": "💳 <b>Purchased subscription:</b>",
|
"admin_user_ref_purchased_label": "💳 <b>Purchased subscription:</b>",
|
||||||
"admin_user_subscription_active_until": "⏰ <b>Active until:</b>",
|
"admin_user_subscription_active_until": "⏰ <b>Active until:</b>",
|
||||||
|
|||||||
@@ -337,6 +337,8 @@
|
|||||||
"admin_user_na_value": "N/A",
|
"admin_user_na_value": "N/A",
|
||||||
"admin_user_subscription_none": "Нет активной подписки",
|
"admin_user_subscription_none": "Нет активной подписки",
|
||||||
"admin_user_actions_count_label": "📜 <b>Всего действий:</b>",
|
"admin_user_actions_count_label": "📜 <b>Всего действий:</b>",
|
||||||
|
"admin_user_total_paid_label": "💰 <b>Всего оплачено:</b>",
|
||||||
|
"admin_user_referral_revenue_label": "💸 <b>Доход по рефералам:</b>",
|
||||||
"admin_user_invited_friends_label": "👥 <b>Приглашено друзей:</b>",
|
"admin_user_invited_friends_label": "👥 <b>Приглашено друзей:</b>",
|
||||||
"admin_user_ref_purchased_label": "💳 <b>Купили подписку:</b>",
|
"admin_user_ref_purchased_label": "💳 <b>Купили подписку:</b>",
|
||||||
"admin_user_subscription_active_until": "⏰ <b>Действует до:</b>",
|
"admin_user_subscription_active_until": "⏰ <b>Действует до:</b>",
|
||||||
|
|||||||
Reference in New Issue
Block a user