add design spec for step-wise mock data, flow bug fixes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 11:11:28 +01:00
parent 496cf40989
commit 1ca696e8cb

View File

@@ -0,0 +1,99 @@
# Step-wise Mock Data & Flow Bug Fixes
## Problem
The app has two categories of issues preventing a complete flow-through:
1. **Data integrity bugs** — process step transitions don't update all relevant `nutzer` fields, so the antrag checklist can never fully complete even when the user follows the happy path.
2. **Mock data gaps** — the existing `seedMockData()` creates a single fixed state (eigensuche with 20 therapists) but doesn't set `nutzer.dringlichkeitscode` or `nutzer.tss_beantragt`, making it impossible to test the full flow or individual steps.
## Goal
Fix the flow bugs so the real UI path works end-to-end, and replace the single mock-data button with a step-wise scenario dropdown in dev settings that seeds the complete app state for any given process step.
## Changes
### 1. Bug fix: SprechstundeForm (process-stepper.tsx)
**Current behavior:** `SprechstundeForm.onSubmit` inserts into `sprechstunde` table with `dringlichkeitscode`, then separately updates `nutzer.aktueller_schritt = 'diagnose_erhalten'`. It never writes `nutzer.dringlichkeitscode` or `nutzer.dringlichkeitscode_datum`.
**Fix:** Replace the two separate queries with a single `sprechstunde` INSERT and a combined `nutzer` UPDATE:
```sql
UPDATE nutzer SET
aktueller_schritt = 'diagnose_erhalten',
dringlichkeitscode = $1,
dringlichkeitscode_datum = CASE WHEN $1 THEN $2 ELSE NULL END,
aktualisiert_am = NOW()
WHERE id = 1
```
Where `$1` is the dringlichkeitscode boolean and `$2` is the sprechstunde datum.
### 2. Bug fix: TSS advance button (process-stepper.tsx)
**Current behavior:** The `AdvanceButton` for `diagnose_erhalten → tss_beantragt` only updates `nutzer.aktueller_schritt`. It never sets `nutzer.tss_beantragt` or `nutzer.tss_beantragt_datum`.
**Fix:** Replace the generic `AdvanceButton` for this specific transition with a custom handler:
```sql
UPDATE nutzer SET
aktueller_schritt = 'tss_beantragt',
tss_beantragt = TRUE,
tss_beantragt_datum = CURRENT_DATE,
aktualisiert_am = NOW()
WHERE id = 1
```
The `StepAction` switch case for `diagnose_erhalten` gets an inline button instead of the generic `AdvanceButton`.
### 3. Scenario module (new file)
**File:** `src/features/einstellungen/scenarios.ts`
**Exports:** `seedToStep(step: ProzessSchritt)`
**Behavior:** Clears all data except `nutzer`, then builds state cumulatively based on the target step:
| Target step | State seeded |
|-------------|-------------|
| `neu` | Reset nutzer to `aktueller_schritt = 'neu'`, all flags false, clear therapists/contacts/sprechstunden |
| `diagnose_erhalten` | 1 therapist + 1 sprechstunde with dringlichkeitscode=true, nutzer flags set accordingly |
| `tss_beantragt` | Above + `nutzer.tss_beantragt = true`, `nutzer.tss_beantragt_datum` set |
| `eigensuche` | Above + 20 therapists with mixed contact attempts |
| `antrag_gestellt` | Above + ensures ≥5 absagen/keine_antwort contacts for checklist item 4 |
**Mock data constants** (MOCK_VORNAMEN, MOCK_NACHNAMEN, MOCK_STAEDTE, etc.) move here from `kontakte/hooks.ts`.
### 4. Settings UI (settings-page.tsx)
Replace the current dev mode section (single "Testdaten einfügen" button) with a dropdown + button:
- **Label:** "Szenario laden"
- **Description:** "App-Zustand für einen bestimmten Prozessschritt laden"
- **Dropdown options:**
- Schritt 1 — Erstgespräch
- Schritt 2 — Diagnose erhalten
- Schritt 3 — TSS kontaktiert
- Schritt 4 — Eigensuche
- Schritt 5 — Antrag gestellt
- **Button:** "Laden"
- **Feedback:** Brief "Fertig" text after seeding (same pattern as current)
### 5. Cleanup in kontakte/hooks.ts
- Delete `seedMockData()` function
- Delete all `MOCK_*` constants (MOCK_VORNAMEN, MOCK_NACHNAMEN, MOCK_STAEDTE, MOCK_THERAPIEFORMEN, MOCK_ERGEBNISSE)
- Delete `daysAgoISO()` helper
- `deleteAllData()` stays — it's user-facing and deletes the nutzer row (full reset to onboarding)
## Out of scope
- **Antrag checklist "Absagenliste exportiert"** — stays hardcoded to `false`. Tracking PDF export clicks is a separate feature. The checklist will show 4/5 at `antrag_gestellt`.
## Files changed
- **Modify:** `src/features/prozess/components/process-stepper.tsx` — fix SprechstundeForm and TSS advance button
- **Create:** `src/features/einstellungen/scenarios.ts` — step-wise seed logic + mock constants
- **Modify:** `src/features/einstellungen/components/settings-page.tsx` — dropdown UI replacing single button
- **Modify:** `src/features/kontakte/hooks.ts` — remove seedMockData, mock constants, daysAgoISO