"""Startup-Seeds. Phase 0: nur der erste Admin-Benutzer. Fachliche Startdaten (Standard-Kategorien usw.) folgen in späteren Phasen. """ from sqlalchemy.orm import Session from .config import get_settings from .models import Category, CategoryGroup, CategoryKind, Role, User from .security import hash_password # Vorgefertigte, gruppierte Startkategorien je Benutzer. Alles frei änderbar; # wer eine Gruppe/Kategorie löscht, bekommt sie nicht automatisch zurück. # (Gruppe, Art, Gruppen-Icon, Gruppen-Farbe, [(Kategoriename, Icon), ...]) STARTER_CATEGORIES: list[tuple[str, CategoryKind, str, str, list[tuple[str, str]]]] = [ ("Fixkosten", CategoryKind.expense, "landmark", "#3f51b5", [ ("Wohnen", "home"), ("Versicherungen", "shield"), ("Telefon & Internet", "wifi"), ("Abos & Streaming", "refresh-ccw"), ]), ("Lebenshaltung", CategoryKind.expense, "shopping-cart", "#2e7d55", [ ("Lebensmittel", "shopping-cart"), ("Restaurant", "utensils"), ("Mobilität", "car"), ("Gesundheit", "heart-pulse"), ("Kleidung", "shirt"), ]), ("Freizeit & Persönliches", CategoryKind.expense, "film", "#b06f14", [ ("Freizeit", "film"), ("Reisen", "plane"), ("Sport & Fitness", "dumbbell"), ("Bildung", "graduation-cap"), ("Haustiere", "paw-print"), ("Geschenke & Spenden", "gift"), ]), ("Finanzen", CategoryKind.expense, "piggy-bank", "#2a78d6", [ ("Sparen & Investments", "piggy-bank"), ("Steuern & Gebühren", "percent"), ]), ("Sonstiges", CategoryKind.expense, "more-horizontal", "#6b7480", [ ("Sonstiges", "more-horizontal"), ]), ("Einnahmen", CategoryKind.income, "coins", "#2e7d55", [ ("Gehalt", "banknote"), ("Nebeneinkünfte", "coins"), ("Erstattungen", "receipt"), ]), ] def ensure_starter_categories(db: Session, user: User) -> None: """Legt die Startkategorien für einen Benutzer an – nur, wenn er noch keine hat.""" exists = db.query(CategoryGroup).filter(CategoryGroup.owner_id == user.id).first() if exists is not None: return for gpos, (gname, kind, gicon, gcolor, cats) in enumerate(STARTER_CATEGORIES): group = CategoryGroup( owner_id=user.id, name=gname, kind=kind, icon=gicon, color=gcolor, position=gpos, is_builtin=True, ) db.add(group) db.flush() for cpos, (cname, cicon) in enumerate(cats): db.add(Category( owner_id=user.id, group_id=group.id, name=cname, type=kind, icon=cicon, color=gcolor, position=cpos, is_builtin=True, )) db.commit() def ensure_first_admin(db: Session) -> None: """Legt einen Admin an, solange noch gar kein Benutzer existiert.""" if db.query(User).first() is not None: return settings = get_settings() admin = User( username=settings.admin_username, password_hash=hash_password(settings.admin_password), role=Role.admin, is_active=True, must_change_password=False, ) db.add(admin) db.commit() db.refresh(admin) ensure_starter_categories(db, admin)