Expenses: GET /api/expenses/categories liefert die Kategorien

KATEGORIE_META als Dict mit id → {label, color} (preserved Order).
KATEGORIEN bleibt als Set für Validierung. Neuer Endpunkt liefert
[{id, label, color}, …] als Single Source of Truth für PWA und mobile
Clients — bisher war die Liste in JS und Python dupliziert.

Mobile-Client (banyaro-ios) holt die Liste jetzt dynamisch.
This commit is contained in:
rene 2026-05-30 12:31:59 +02:00
parent 7b3041fc94
commit 9b0c286aa3

View file

@ -12,7 +12,15 @@ from auth import get_current_user
router = APIRouter()
logger = logging.getLogger(__name__)
KATEGORIEN = {"tierarzt", "futter", "zubehoer", "versicherung", "sitter", "sonstiges"}
KATEGORIE_META = {
"futter": {"label": "Futter", "color": "#f59e0b"},
"tierarzt": {"label": "Tierarzt", "color": "#ef4444"},
"zubehoer": {"label": "Zubehör", "color": "#8b5cf6"},
"versicherung": {"label": "Versicherung", "color": "#3b82f6"},
"sitter": {"label": "Sitter", "color": "#10b981"},
"sonstiges": {"label": "Sonstiges", "color": "#6b7280"},
}
KATEGORIEN = set(KATEGORIE_META.keys())
# ------------------------------------------------------------------
@ -75,6 +83,18 @@ def _serialize(row) -> dict:
return dict(row)
# ------------------------------------------------------------------
# GET /api/expenses/categories — gültige Kategorien (id + label + color)
# Single source of truth für PWA und mobile Clients.
# ------------------------------------------------------------------
@router.get("/categories")
async def list_categories():
return [
{"id": key, **meta}
for key, meta in KATEGORIE_META.items()
]
# ------------------------------------------------------------------
# GET /api/expenses/summary — Monats- und Jahressummen
# WICHTIG: Diese Route muss VOR /{id} stehen!