docs: Spec A11 - Ist-Serie als reservierter Name System-Ist

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-28 18:33:59 +02:00
co-authored by Claude Opus 5.5
parent dd6110b53f
commit d3c752e2b9
@@ -8,8 +8,9 @@
## Nutzerentscheidungen (2026-09-28)
- Szenario-Vergleich vor heute: **Ist-Gesamtsaldo als eigene Serie „Ist"**,
Szenario-Kurven erst ab heute.
- Szenario-Vergleich vor heute: **Ist-Gesamtsaldo als eigene Serie
„System-Ist"** (bewusst systemeigen benannt, Name für Szenarien
reserviert), Szenario-Kurven erst ab heute.
- Veraltete Szenarien: **automatisch neu rechnen** beim Seitenaufruf.
- Planungs-Diagramm: **Einnahmen + Ausgaben mit Vorzeichen** (Semantik wie
„Monat nach Kategorie").
@@ -54,7 +55,7 @@
Neue Definition, Spalten unverändert (`scenario, day, balance`):
1. **Ist-Serie:** `SELECT 'Ist', day, balance FROM v_balance_total`
1. **Ist-Serie:** `SELECT 'System-Ist', day, balance FROM v_balance_total`
(reicht bis `CURRENT_DATE`).
2. **Szenario-Startpunkt:** je Szenario mit mindestens einem
Projektionspunkt eine Zeile `(s.name, CURRENT_DATE, <Ist-Saldo heute>)`
@@ -71,8 +72,15 @@ stehen (ist bereits so; Reihenfolge beibehalten). Achtung: DROP … CASCADE
von `v_balance_total` im Fallback-Pfad würde `v_projection` mitreißen — da
`v_projection` danach ohnehin neu angelegt wird, ist das unkritisch.
Bekannte Grenze: ein Szenario namens „Ist" würde mit der Ist-Serie
verschmelzen. Wird hingenommen (keine Namensvalidierung eingeführt).
Reservierter Name: Die Serienbezeichnung `System-Ist` ist als Modul-Konstante
(`RESERVED_SCENARIO_NAME` in `models/views.py`, dort auch in der View-SQL
verwendet) hinterlegt. `routers/scenarios.py` lehnt `POST` und `PATCH` mit
diesem Namen (Vergleich nach `strip().casefold()`) mit **422** und der
Meldung „Der Name »System-Ist« ist für die Ist-Kurve reserviert" ab, damit
kein Szenario mit der Ist-Serie verschmelzen kann. Bestandsszenarien mit
diesem Namen existieren nicht (live geprüft: 3 Szenarien, andere Namen).
Tests: POST/PATCH mit `System-Ist`, `system-ist`, ` System-Ist ` → 422;
normale Namen unverändert 201/200.
### 2b. Automatisches Neurechnen (`services/projection_service.py`)