Add lifetime income/expense totals to UserBalance

New get_user_lifetime_totals_bql() runs tag-filtered BQL queries
(Payable + expense-entry, Receivable + income-entry) to compute
per-user lifetime totals separately from the net balance. Plumbed
through /api/v1/balance and /api/v1/balance/{user_id}; existing
clients keep working (fields default to zero / empty dict).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-05-17 16:06:16 +02:00
commit deeec7e2c5
3 changed files with 82 additions and 0 deletions

View file

@ -1591,22 +1591,34 @@ async def api_get_my_balance(
# Add all balances (positive and negative)
total_fiat_balances[currency] += amount
# Super-user totals reflect their personal submissions (if any), not org-wide
super_totals = await fava.get_user_lifetime_totals_bql(wallet.wallet.user)
# Return net position
return UserBalance(
user_id=wallet.wallet.user,
balance=net_balance,
accounts=[],
fiat_balances=total_fiat_balances,
total_expenses_sats=super_totals["total_expenses_sats"],
total_expenses_fiat=super_totals["total_expenses_fiat"],
total_income_sats=super_totals["total_income_sats"],
total_income_fiat=super_totals["total_income_fiat"],
)
# For regular users, show their individual balance from Fava
balance_data = await fava.get_user_balance_bql(wallet.wallet.user)
totals = await fava.get_user_lifetime_totals_bql(wallet.wallet.user)
return UserBalance(
user_id=wallet.wallet.user,
balance=balance_data["balance"],
accounts=[], # Could populate from balance_data["accounts"] if needed
fiat_balances=balance_data["fiat_balances"],
total_expenses_sats=totals["total_expenses_sats"],
total_expenses_fiat=totals["total_expenses_fiat"],
total_income_sats=totals["total_income_sats"],
total_income_fiat=totals["total_income_fiat"],
)
@ -1627,12 +1639,17 @@ async def api_get_user_balance(
fava = get_fava_client()
balance_data = await fava.get_user_balance_bql(user_id)
totals = await fava.get_user_lifetime_totals_bql(user_id)
return UserBalance(
user_id=user_id,
balance=balance_data["balance"],
accounts=[],
fiat_balances=balance_data["fiat_balances"],
total_expenses_sats=totals["total_expenses_sats"],
total_expenses_fiat=totals["total_expenses_fiat"],
total_income_sats=totals["total_income_sats"],
total_income_fiat=totals["total_income_fiat"],
)