diff --git a/docs/superpowers/plans/2026-07-20-ausbaustufe-6.md b/docs/superpowers/plans/2026-07-20-ausbaustufe-6.md index 75bc60a..eaa6a6e 100644 --- a/docs/superpowers/plans/2026-07-20-ausbaustufe-6.md +++ b/docs/superpowers/plans/2026-07-20-ausbaustufe-6.md @@ -1,6 +1,6 @@ # Ausbaustufe 6 Implementation Plan — Szenario-Einträge-Tabelle (v0.7.0) -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [x]`) syntax for tracking. **Goal:** Pro Szenario eine immer sichtbare, editierbare Tabelle „Einträge" (Modifikatoren + szenario-eigene Einmalzahlungen gemeinsam) mit Inline-Bearbeiten und einem gemeinsamen Anlege-Formular; Release v0.7.0. @@ -32,7 +32,7 @@ - Consumes: `ModifierIn`/`ModifierOut`, `ScenarioPlannedIn`/`ScenarioPlannedOut`, `_get_scenario` (alle vorhanden in `scenarios.py`). - Produces: `PATCH /api/scenarios/{scenario_id}/modifiers/{mod_id}` (Body `ModifierIn`, Antwort `ModifierOut`, 404 „Modifikator nicht gefunden") und `PATCH /api/scenarios/{scenario_id}/planned/{item_id}` (Body `ScenarioPlannedIn`, Antwort `ScenarioPlannedOut`, 404 „Einmalzahlung nicht gefunden"). Task 2 (GUI) sendet auf genau diese URLs. -- [ ] **Step 1: Failing Tests** — in `tests/test_crud_api.py` ergänzen: +- [x] **Step 1: Failing Tests** — in `tests/test_crud_api.py` ergänzen: ```python def test_modifier_patch(client, db): @@ -85,7 +85,7 @@ def test_scenario_planned_patch(client, db): Run: `.venv/bin/python -m pytest tests/test_crud_api.py -q` → neue Tests FAIL (405 Method Not Allowed) -- [ ] **Step 2: Endpunkte implementieren** — `app/routers/scenarios.py`, direkt nach `delete_modifier` bzw. nach `delete_scenario_planned`: +- [x] **Step 2: Endpunkte implementieren** — `app/routers/scenarios.py`, direkt nach `delete_modifier` bzw. nach `delete_scenario_planned`: ```python @router.patch("/{scenario_id}/modifiers/{mod_id}", response_model=ModifierOut) @@ -119,14 +119,14 @@ def patch_scenario_planned(scenario_id: int, item_id: int, data: ScenarioPlanned return ScenarioPlannedOut.model_validate(item) ``` -- [ ] **Step 3: Tests grün + Suite** +- [x] **Step 3: Tests grün + Suite** Run: `.venv/bin/python -m pytest tests/test_crud_api.py -q && .venv/bin/python -m pytest -q` Expected: alles PASS (178 + 2) -- [ ] **Step 4: Fable-Testagent-Abnahme** (Faktencheck: Validator-Wirkung beim PATCH [ende↔andere Arten], 404-Pfade, keine Nebenwirkungen auf Projektion). Erst nach VERIFIED weiter. +- [x] **Step 4: Fable-Testagent-Abnahme** (Faktencheck: Validator-Wirkung beim PATCH [ende↔andere Arten], 404-Pfade, keine Nebenwirkungen auf Projektion). Erst nach VERIFIED weiter. -- [ ] **Step 5: Commit** +- [x] **Step 5: Commit** ```bash cd /home/wlfb/bin && git add finance/app/routers/scenarios.py finance/tests/test_crud_api.py @@ -147,7 +147,7 @@ git commit -m "feat: PATCH-Endpunkte fuer Szenario-Modifikatoren und -Einmalzahl - Consumes: PATCH-Endpunkte aus Task 1; `toggleEdit`, `onModTargetTypeChange`, Filter `|eur`/`|de_label`, Kontext `row.modifiers`/`row.planned_items`/`modifier_kinds`/`recurring_names`/`category_names` (alle vorhanden). - Produces: Element-IDs `mod-row-{id}`/`mod-edit-{id}` und `spi-row-{id}`/`spi-edit-{id}`; JS `onEntryArtChange(select)` (ersetzt `onModKindChange` vollständig — auch in den Art-Selects); Anlege-Formular mit `data-modifiers-url`/`data-planned-url` und Eintragsart-Option `value="einmal"`. -- [ ] **Step 1: Failing GUI-Test** — in `tests/test_gui.py` ergänzen (Imports `Scenario, ScenarioModifier, ScenarioPlannedItem` existieren dort seit A5): +- [x] **Step 1: Failing GUI-Test** — in `tests/test_gui.py` ergänzen (Imports `Scenario, ScenarioModifier, ScenarioPlannedItem` existieren dort seit A5): ```python def test_szenario_eintraege_tabelle(client, db): @@ -182,7 +182,7 @@ def test_szenario_eintraege_tabelle(client, db): Run: → FAIL -- [ ] **Step 2: `_scenario_rows` sortieren** — `app/routers/gui.py`, Modifikator-Query um `.order_by(ScenarioModifier.id)` ergänzen: +- [x] **Step 2: `_scenario_rows` sortieren** — `app/routers/gui.py`, Modifikator-Query um `.order_by(ScenarioModifier.id)` ergänzen: ```python modifiers = session.execute( @@ -191,7 +191,7 @@ Run: → FAIL ).scalars().all() ``` -- [ ] **Step 3: Einträge-Tabelle** — in `planning.html` die BEIDEN `
`-Blöcke „Modifikatoren" und „Einmalzahlungen in diesem Szenario" komplett ersetzen durch: +- [x] **Step 3: Einträge-Tabelle** — in `planning.html` die BEIDEN `
`-Blöcke „Modifikatoren" und „Einmalzahlungen in diesem Szenario" komplett ersetzen durch: ```html

Einträge

@@ -289,7 +289,7 @@ Run: → FAIL ``` -- [ ] **Step 4: Anlege-Formular „Neuer Eintrag"** — direkt nach der Tabelle (Default-Art ist die erste Option `percent` → Wert aktiv, Datumsfelder/Einmal-Felder disabled): +- [x] **Step 4: Anlege-Formular „Neuer Eintrag"** — direkt nach der Tabelle (Default-Art ist die erste Option `percent` → Wert aktiv, Datumsfelder/Einmal-Felder disabled): ```html
`-Block von `planning.html` die Funktion `onModKindChange` ERSETZEN durch: +- [x] **Step 5: JS** — im `