Initial commit
This commit is contained in:
49
backend/app/routers/summary.py
Normal file
49
backend/app/routers/summary.py
Normal file
@@ -0,0 +1,49 @@
|
||||
from fastapi import APIRouter
|
||||
from ..clients.firefly_client import firefly_client
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/dashboard")
|
||||
async def dashboard_summary():
|
||||
transactions = await firefly_client.get_transactions()
|
||||
total_transactions = len(transactions)
|
||||
total_expenses = 0.0
|
||||
total_income = 0.0
|
||||
category_totals = {}
|
||||
|
||||
for transaction in transactions:
|
||||
attrs = transaction.get("attributes", {})
|
||||
legs = attrs.get("transactions", []) or []
|
||||
|
||||
# Each transaction may contain one or more legs; sum per-leg amounts
|
||||
for leg in legs:
|
||||
# amount is typically a string like "4.870000000000"
|
||||
try:
|
||||
leg_amount = float(leg.get("amount", 0))
|
||||
except Exception:
|
||||
leg_amount = 0.0
|
||||
|
||||
leg_type = (leg.get("type") or "").lower()
|
||||
# classify by leg type: 'withdrawal' -> expense, 'deposit' -> income
|
||||
if leg_type == "withdrawal" or (leg.get("destination_type") or "").lower().startswith("expense"):
|
||||
total_expenses += abs(leg_amount)
|
||||
category_name = leg.get("category_name") or leg.get("category") or attrs.get("category_name") or attrs.get("category_id") or "Uncategorized"
|
||||
category_totals[category_name] = category_totals.get(category_name, 0) + abs(leg_amount)
|
||||
elif leg_type == "deposit" or (leg.get("destination_type") or "").lower().startswith("asset"):
|
||||
total_income += leg_amount
|
||||
else:
|
||||
# fallback: if leg_amount > 0 treat as income
|
||||
if leg_amount > 0:
|
||||
total_income += leg_amount
|
||||
|
||||
top_categories = [
|
||||
{"name": name, "amount": amount}
|
||||
for name, amount in sorted(category_totals.items(), key=lambda item: item[1], reverse=True)
|
||||
][:5]
|
||||
|
||||
return {
|
||||
"total_transactions": total_transactions,
|
||||
"total_expenses": total_expenses,
|
||||
"total_income": total_income,
|
||||
"top_categories": top_categories,
|
||||
}
|
||||
Reference in New Issue
Block a user