"""Anwendungsweite Einstellungen. Die Tabelle enthält genau eine Zeile. Fehlt sie – etwa direkt nach der Migration –, liefert `load_settings` die Vorgaben, ohne sie zu schreiben. Erst ein Speichern legt die Zeile an. """ from sqlalchemy.ext.asyncio import AsyncSession from app.core.clock import DEFAULT_MONTH_START_DAY from app.models import AppSetting SETTING_ID = 1 async def load_settings(session: AsyncSession) -> AppSetting: """Die Einstellungen; ohne gespeicherte Zeile ein Objekt mit den Vorgaben.""" vorhanden = await session.get(AppSetting, SETTING_ID) if vorhanden is not None: return vorhanden return AppSetting(id=SETTING_ID, month_start_day=DEFAULT_MONTH_START_DAY) async def month_start_day(session: AsyncSession) -> int: """Der eingestellte Gehaltstag – ab ihm beginnt der Abrechnungsmonat.""" return (await load_settings(session)).month_start_day async def save_settings(session: AsyncSession, *, month_start_day: int) -> AppSetting: """Schreibt die Einstellungen und legt die Zeile bei Bedarf an.""" eintrag = await session.get(AppSetting, SETTING_ID) if eintrag is None: eintrag = AppSetting(id=SETTING_ID) session.add(eintrag) eintrag.month_start_day = month_start_day await session.flush() return eintrag