FinSync-AI / backend /expense_manager.py
JARVISXIRONMAN's picture
Upload expense_manager.py
65db2e7 verified
import json
import os
from datetime import datetime
from typing import List, Dict, Any
DB_PATH = os.path.join(os.path.dirname(__file__), "database.json")
if not os.path.exists(DB_PATH):
with open(DB_PATH, "w") as f:
json.dump({"expenses": [], "reminders": []}, f, indent=4)
def _load_db() -> Dict[str, Any]:
"""Safely load JSON database."""
try:
with open(DB_PATH, "r") as f:
return json.load(f)
except Exception:
return {"expenses": [], "reminders": []}
def _save_db(data: Dict[str, Any]):
"""Safely write JSON database."""
with open(DB_PATH, "w") as f:
json.dump(data, f, indent=4)
def today_iso() -> str:
"""Returns today's date in ISO format."""
return datetime.now().strftime("%Y-%m-%d")
def add_expense(entry: Dict[str, Any]) -> None:
"""Add a new expense to database.json."""
db = _load_db()
if "expenses" not in db:
db["expenses"] = []
db["expenses"].append(entry)
_save_db(db)
def list_expenses(user_id: str) -> List[Dict[str, Any]]:
"""Return all expenses for a user."""
db = _load_db()
expenses = db.get("expenses", [])
return [e for e in expenses if e.get("user_id") == user_id]
def total_spent(user_id: str) -> float:
"""Compute total spent by user."""
expenses = list_expenses(user_id)
return sum([e.get("amount", 0) for e in expenses])
def expenses_by_category(user_id: str) -> Dict[str, float]:
"""Aggregate total amount per category."""
result = {}
for e in list_expenses(user_id):
cat = e.get("category", "Uncategorized")
result[cat] = result.get(cat, 0) + e.get("amount", 0)
return result
def recent_expenses(user_id: str, limit: int = 5) -> List[Dict[str, Any]]:
"""Return N most recent expenses."""
items = list_expenses(user_id)
items_sorted = sorted(items, key=lambda x: x.get("date", ""), reverse=True)
return items_sorted[:limit]