52 lines
2.0 KiB
Markdown
52 lines
2.0 KiB
Markdown
# Saldo Architektur
|
|
|
|
## Zielbild
|
|
|
|
Saldo ist eine mobile-first Flask-PWA für monatliche Haushaltsplanung. Der Schwerpunkt liegt auf wiederkehrenden Kosten, variablen Einkommen, Restverteilung und externer Beteiligung ohne Benutzerkonto.
|
|
|
|
## Schichten
|
|
|
|
`app/__init__.py`
|
|
Initialisiert App-Factory, Extensions, Logging, Blueprints und CLI-Kommandos.
|
|
|
|
`app/models.py`
|
|
Enthält das relationale Kernmodell für Monate, Kostenstruktur, Einkommen, Verteilungen, Beteiligungsregeln und Benachrichtigungen.
|
|
|
|
`app/services/month_service.py`
|
|
Domänenlogik für automatische Monatsanlage, Seed-Fallback, Kopieren eines Monats und Berechnung zentraler Kennzahlen.
|
|
|
|
`app/services/allocation_service.py`
|
|
Regel-Engine für Vorschlagsverteilungen. Gesperrte Zielkonten bleiben unangetastet, der restliche Betrag wird gewichtet verteilt.
|
|
|
|
`app/services/comparison_service.py`
|
|
Vergleicht Monate und erzeugt Deltas sowie Top-Veränderungen.
|
|
|
|
`app/services/share_service.py`
|
|
Berechnet interne und externe Anteile pro Eintrag und aggregiert externe Forderungen pro Monat.
|
|
|
|
`app/services/notification_service.py`
|
|
Erstellt In-App-Hinweise und triggert optional Web-Push für Monatsende, fehlende Verteilung und starke Einkommensänderungen.
|
|
|
|
## Request Flow
|
|
|
|
1. Authentifizierter Request startet.
|
|
2. `before_request` ruft `MonthService.ensure_month()` auf.
|
|
3. Falls der aktuelle Kalendermonat fehlt, wird er automatisch aus dem jüngsten Monat erzeugt.
|
|
4. Views lesen die Monatszusammenfassung über `compute_summary()`.
|
|
5. Änderungen an Einkommen oder Planwerten triggern `refresh_suggestions()`.
|
|
6. Benutzer übernehmen Vorschläge komplett oder zielkontenweise.
|
|
|
|
## Datenhaltung
|
|
|
|
- Standard: SQLite
|
|
- Pfad per `DATABASE_URL` oder `SALDO_DATA_DIR`
|
|
- SQLAlchemy-Modelle sind bewusst nicht SQLite-spezifisch, damit ein Wechsel auf PostgreSQL später möglich bleibt
|
|
|
|
## Deployment
|
|
|
|
- WSGI-Entry: `wsgi.py`
|
|
- Produktionsserver: Gunicorn
|
|
- Healthcheck: `/health`
|
|
- Migrationen: Flask-Migrate/Alembic in `migrations/`
|
|
- Cloudron-Datenpfad: `/app/data`
|