feat: Phase 2 – Budget-Engine + Direktzugriff (http://IP:Port)

Budget:
- Modelle + Migration 0003: budget_template_lines, planned_income_lines,
  budget_periods, budget_period_lines.
- services/budget: Perioden-Grenzen (einstellbarer Starttag, Label nach Endmonat),
  Standard-Vorlage vs. Monats-Override (Snapshot-on-Customize), Soll/Ist inkl.
  budgetierter Sparen-Transfers, geplante Einnahmen (Soll/Ist).
- routers/budgets: Vorlage, geplante Einnahmen (CRUD), Monats-Soll/Ist,
  Monats-Override, Zurücksetzen. pytest: Perioden, Soll/Ist, Override/Reset, Einnahmen.
- Frontend: Budget-Seite (Monat + Standard-Budget), Fortschrittsbalken grün/rot,
  Monats-Navigation, editierbare Soll-Beträge; Sparen-Option im Transfer-Formular.

Deployment-Fix (Nutzer-Anforderung: http://IP:Port muss funktionieren):
- Dienst bindet an APP_BIND_HOST=0.0.0.0 (direkt im LAN erreichbar).
- APP_COOKIE_SECURE=false als Standard (sonst kein Login über reines HTTP);
  für reinen HTTPS-Betrieb umstellbar. Doku + install.sh entsprechend angepasst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-19 19:16:27 +02:00
co-authored by Claude Opus 4.8
parent d692c04cc1
commit 8ed4bf5254
21 changed files with 1352 additions and 22 deletions
+24 -1
View File
@@ -150,6 +150,29 @@
"allTypes": "Alle Typen",
"deleteConfirm": "Diese Buchung löschen?",
"amountRequired": "Bitte einen Betrag eingeben.",
"accountRequired": "Bitte ein Konto wählen."
"accountRequired": "Bitte ein Konto wählen.",
"budgetAsSavings": "Als Sparen ins Budget zählen",
"budgetCategory": "Budget-Kategorie"
},
"budget": {
"title": "Budget",
"monthMode": "Monat",
"templateMode": "Standard-Budget",
"income": "Einnahmen",
"expenses": "Ausgaben",
"planned": "Geplant",
"totalIncome": "Einnahmen gesamt",
"totalExpense": "Ausgaben gesamt",
"reset": "Auf Standard zurücksetzen",
"resetTitle": "Monat zurücksetzen",
"resetConfirm": "Diesen Monat auf das Standard-Budget zurücksetzen? Die Anpassungen dieses Monats gehen verloren.",
"templateHint": "Das Standard-Budget gilt für jeden Monat, solange du ihn nicht einzeln anpasst.",
"addIncome": "Geplante Einnahme",
"editIncome": "Einnahme bearbeiten",
"noIncome": "Noch keine geplanten Einnahmen.",
"deleteIncomeConfirm": "Diese geplante Einnahme löschen?",
"incomeLabel": "Bezeichnung",
"incomeCategory": "Kategorie",
"targetAccount": "Zielkonto"
}
}