# Use Case → Function Mapping: Screening & Intake

**Versie:** 1.0
**Datum:** 04-02-2026
**Doel:** Concrete mapping van use cases naar CRUD, UI, Intents en Nudges

---

## Leeswijzer

Dit document vertaalt de client journey naar concrete EPD-functionaliteiten:

```
┌─────────────────────────────────────────────────────────────────────────────┐
│  USE CASE → FUNCTION STACK                                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  Use Case: "Screener bekijkt risico-informatie"                            │
│      │                                                                      │
│      ├── Data:   risk_assessments, intakes                                 │
│      ├── CRUD:   READ                                                       │
│      ├── UI:     Query Block (RisicoBlock)                                 │
│      ├── Intent: "risico_query" → "Wat is het risico?"                     │
│      └── Nudge:  Bij hoog risico → "Veiligheidsplan opstellen?"            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
```

**Legenda Status:**
- ✅ Gebouwd en werkend
- 🔨 In ontwikkeling
- ❌ Nog te bouwen
- 💡 Nice-to-have

---

## Fase 1: Verwijzing & Aanmelding

### Actor: Zorgadministratie

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Nieuwe aanmelding registreren | `screenings` | CREATE | ActionBlock: AanmeldFormulier | `aanmelding_nieuw` "Nieuwe aanmelding voor [naam]" | - | ❌ |
| Verwijsbrief uploaden | `screening_documents` | CREATE | ActionBlock: DocumentUpload | `document_upload` "Upload verwijsbrief" | Bij ontbrekende info → "Verwijzer bellen?" | ❌ |
| Aanmelding op werklijst zetten | `screenings.status` | UPDATE | ActionBlock: StatusUpdate | `werklijst_toevoegen` "Zet op werklijst screening" | - | ❌ |
| Werklijst bekijken | `screenings` (filtered) | READ | QueryBlock: WerklijstBlock | `werklijst_query` "Toon werklijst" | Bij lange wachttijd → "Prioriteit aanpassen?" | ❌ |
| Administratieve check uitvoeren | `screenings.admin_check` | UPDATE | ActionBlock: ChecklistBlock | `admin_check` "Administratieve check" | Bij incomplete → "Cliënt bellen voor [x]?" | ❌ |

### Actor: Cliënt (via portaal)

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Vragenlijst invullen | `screening_questionnaires` | CREATE | ActionBlock: VragenlijstForm | - (geen voice) | Bij niet ingevuld → "Herinnering sturen?" | ❌ |
| Status aanmelding bekijken | `screenings.status` | READ | StatusBlock: AanmeldStatusBlock | - (geen voice) | - | ❌ |

---

## Fase 2: Screening

### Actor: Screener (Psycholoog)

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Screening starten | `screenings`, `intakes` | UPDATE/CREATE | NavigationBlock | `intake_navigeer` "Open screening [naam]" | - | ✅ |
| Screening status bekijken | `intakes`, `screenings` | READ | StatusBlock: IntakeStatusBlock | `intake_status` "Wat is de status van de intake?" | Bij incomplete → "Nog te doen: [items]" | ✅ |
| Contactmoment registreren | `contact_moments` | CREATE | ActionBlock: ContactForm | `contact_nieuw` "Noteer contactmoment met [naam]" | Bij geen reactie → "Follow-up inplannen?" | ❌ |
| Kindcheck uitvoeren | `child_checks` | CREATE/UPDATE | ActionBlock: KindcheckForm | `kindcheck_start` "Start kindcheck" | Bij kinderen aanwezig → "Kindcheck verplicht" | ❌ |
| Risico inschatten | `risk_assessments` | CREATE/UPDATE | ActionBlock: RisicoForm | `risico_invoer` "Registreer risico" | Bij hoog risico → "Veiligheidsplan?" | ❌ |
| Risico bekijken | `risk_assessments` | READ | QueryBlock: RisicoBlock | `risico_query` "Wat is het risico?" | - | ✅ |
| Triage bepalen | `screenings.triage_result` | UPDATE | ActionBlock: TriageForm | `triage_bepaal` "Bepaal triage" | Bij urgentie → "Direct intake inplannen?" | ❌ |

---

## Fase 3: Intake

### Actor: Intaker (GZ-psycholoog/Psychiater)

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Intake openen | - | - | NavigationBlock | `intake_navigeer` "Open intake [naam]" | - | ✅ |
| Anamnese afnemen | `anamneses` | CREATE/UPDATE | ActionBlock: AnamneseForm | `anamnese_start` "Start anamnese" | Bij lacunes → "Vraag door over [topic]" | ❌ |
| Anamnese dicteren | `anamneses` | CREATE/UPDATE | ActionBlock: DicteerBlock | `anamnese_dicteer` "Dicteer anamnese: [tekst]" | - | ❌ |
| Diagnose stellen | `conditions` | CREATE | ActionBlock: DiagnoseForm | `diagnose_nieuw` "Stel diagnose [DSM-5 code]" | Bij comorbiditeit → "Overweeg [gerelateerde diagnose]" | ❌ |
| Diagnose bekijken | `conditions` | READ | QueryBlock: DiagnoseBlock | `diagnose_query` "Wat is de diagnose?" | - | ✅ |
| ROM afnemen | `questionnaire_responses` | CREATE | ActionBlock: ROMForm | `rom_start` "Start ROM [vragenlijst]" | Bij hoge score → "Bespreek uitkomst met cliënt" | ❌ |
| Onderzoek aanvragen | `examinations` | CREATE | ActionBlock: OnderzoekAanvraag | `onderzoek_aanvraag` "Vraag [type] onderzoek aan" | - | ❌ |
| Onderzoek resultaat bekijken | `examinations` | READ | QueryBlock: OnderzoekBlock | `onderzoek_query` "Toon onderzoeksresultaten" | Bij afwijking → "Bespreek met psychiater?" | ❌ |

### Actor: Psychiater

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Casus reviewen | `intakes`, `anamneses`, `conditions` | READ | QueryBlock: CasusOverzichtBlock | `casus_review` "Toon casus [naam]" | - | ❌ |
| Medicatie voorschrijven | `medications` | CREATE | ActionBlock: MedicatieForm | `medicatie_voorschrijf` "Voorschrijf [medicatie]" | Bij interactie → "Let op: interactie met [x]" | ❌ |
| Behandeladvies opstellen | `treatment_recommendations` | CREATE | ActionBlock: BehandeladviesForm | `behandeladvies_nieuw` "Opstellen behandeladvies" | - | ❌ |

---

## Fase 4: MDO & Afsluiting Intake

### Actor: MDO Team

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| MDO voorbereiden | `intakes` (multiple) | READ | QueryBlock: MDOVoorbereidingBlock | `mdo_voorbereiding` "Bereid MDO voor" | Bij incomplete dossiers → "Nog aan te vullen: [items]" | ❌ |
| Casus presenteren | `intakes`, `anamneses`, `conditions` | READ | QueryBlock: CasusPresentatieBlock | `casus_presenteer` "Presenteer casus [naam]" | - | ❌ |
| Besluit vastleggen | `mdo_decisions` | CREATE | ActionBlock: MDOBesluitForm | `mdo_besluit` "Leg besluit vast: [tekst]" | - | ❌ |

### Actor: Intaker (afsluiting)

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Intake afsluiten | `intakes.status` | UPDATE | ActionBlock: IntakeAfsluitForm | `intake_afsluiten` "Sluit intake af" | Bij ontbrekende items → "Nog te doen: [checklist]" | ❌ |
| Overdracht naar behandelaar | `treatment_transfers` | CREATE | ActionBlock: OverdrachtForm | `overdracht_nieuw` "Maak overdracht naar [behandelaar]" | - | ❌ |
| Brief naar huisarts | `correspondence` | CREATE | ActionBlock: BriefForm | `brief_huisarts` "Maak brief naar huisarts" | Na intake → "Huisarts informeren?" | ❌ |

---

## Fase 5: Start Behandeling

### Actor: Behandelaar

| Use Case | Data | CRUD | UI | Intent | Nudge | Status |
|----------|------|------|-----|--------|-------|--------|
| Intake ontvangen | `treatment_transfers` | READ | QueryBlock: OverdrachtOntvangstBlock | `overdracht_bekijk` "Bekijk overdracht [naam]" | Bij vragen → "Contact opnemen met intaker?" | ❌ |
| Behandelplan opstellen | `treatment_plans` | CREATE | ActionBlock: BehandelplanForm | `behandelplan_nieuw` "Maak behandelplan" | - | ❌ |
| Eerste afspraak inplannen | `appointments` | CREATE | ActionBlock: AfspraakForm | `afspraak_nieuw` "Plan afspraak met [naam]" | - | ❌ |

---

## Samenvatting: Wat is er al?

### ✅ Bestaande Intents (4)

| Intent | Type | Trigger | Block |
|--------|------|---------|-------|
| `intake_status` | Query | "Wat is de status?" | IntakeStatusBlock |
| `risico_query` | Query | "Wat is het risico?" | RisicoBlock |
| `diagnose_query` | Query | "Wat is de diagnose?" | DiagnoseBlock |
| `intake_navigeer` | Navigation | "Open intake [naam]" | - (router.push) |

### ✅ Bestaande Database Tabellen

- `screenings` - Aanmeldingen en screening tracking
- `screening_activities` - Activiteiten per screening
- `screening_documents` - Documenten (verwijsbrieven etc.)
- `intakes` - Intake dossiers
- `anamneses` - Anamnese data
- `examinations` - Onderzoeken
- `risk_assessments` - Risicotaxaties
- `conditions` - Diagnoses (FHIR)
- `questionnaire_responses` - ROM resultaten

### ✅ Bestaande UI Pagina's

EPD Intake tabs:
1. Algemeen
2. Contactmomenten
3. Kindcheck
4. Risicotaxatie
5. Anamnese
6. Onderzoeken
7. ROM
8. Diagnose
9. Behandeladvies

---

## Prioritering: MVP Fase 1 (Q1 2026)

### Hoogste Prioriteit: Dicteren & Query

Focus op de meest gevraagde use cases uit stakeholder sessie:

| # | Use Case | Intent | Waarom |
|---|----------|--------|--------|
| 1 | Anamnese dicteren | `anamnese_dicteer` | Grootste tijdsbesparing intakers |
| 2 | Contactmoment registreren | `contact_nieuw` | Veel herhaling bij screeners |
| 3 | Kindcheck uitvoeren | `kindcheck_start` | Wettelijk verplicht, vaak vergeten |
| 4 | Werklijst bekijken | `werklijst_query` | Dagelijks gebruik administratie |
| 5 | Casus overzicht | `casus_review` | Voorbereiding MDO/psychiater |

### Hoogste Prioriteit: Nudges

| # | Nudge | Trigger | Protocol |
|---|-------|---------|----------|
| 1 | Veiligheidsplan | Hoog risico geregistreerd | Risicomanagement |
| 2 | Kindcheck herinnering | Kinderen in dossier, geen kindcheck | Meldcode |
| 3 | Huisarts informeren | Intake afgerond | Ketenzorg |
| 4 | Follow-up | Geen reactie cliënt 7 dagen | No-show protocol |

---

## Technische Implementatie Pattern

### Voor elke nieuwe Use Case:

```
1. Database
   └── Migration: supabase/migrations/YYYYMMDD_[feature].sql
   └── Types: pnpm types:generate

2. API Route
   └── app/api/cortex/[domain]/[action]/route.ts
   └── Zod validation (let op: || undefined voor optionals!)

3. Block Component
   └── components/cortex/blocks/[naam]-block.tsx
   └── Gebruik: useBlockData, useIntakeContext
   └── Shared: BlockLoading, BlockError, BlockEmpty

4. Intent Registratie
   └── lib/cortex/types.ts (CortexIntent type, BLOCK_CONFIGS)
   └── lib/cortex/reflex-classifier.ts (patterns)
   └── app/api/cortex/chat/route.ts (system prompt)
   └── lib/cortex/action-parser.ts (routing)
   └── components/cortex/artifacts/artifact-container.tsx

5. Nudge (indien van toepassing)
   └── lib/cortex/nudge.ts (protocol rule)
   └── components/cortex/command-center/command-center.tsx (handler)
```

---

## Use Case Specificaties (MVP Fase 1)

### Template structuur

Elke use case bevat:
- **Omschrijving** - Wat doet de gebruiker?
- **Actor** - Wie voert dit uit?
- **Voorwaarden** - Wat moet er al zijn?
- **Handelingen** - Stap-voor-stap flow
- **EPD Interacties** - Schermen, klikken, invoer
- **Gewenste uitkomst** - Wat is "klaar"?
- **Validatieregels** - Verplichte velden, business rules
- **Foutscenario's** - Wat kan misgaan?
- **Intent & Nudge** - Voice/text triggers
- **Acceptatiecriteria** - Definition of Done

---

### UC-01: Anamnese Dicteren

**ID:** `UC-01`
**Intent:** `anamnese_dicteer`
**Prioriteit:** 🔴 Hoog (grootste tijdsbesparing)

#### Omschrijving
De intaker spreekt de anamnese in tijdens of na het gesprek met de cliënt. Het systeem transcribeert de spraak en structureert de tekst in de juiste anamnese-secties.

#### Actor
- Primair: Intaker (GZ-psycholoog, psychiater)
- Secundair: Screener (bij verkorte anamnese)

#### Voorwaarden
| # | Voorwaarde | Check |
|---|------------|-------|
| 1 | Cliënt is geselecteerd in context | `patientId` aanwezig |
| 2 | Intake is aangemaakt | `intakeId` aanwezig |
| 3 | Gebruiker heeft schrijfrechten | role = intaker/psychiater |
| 4 | Microfoon toegang | browser permission granted |

#### Handelingen

```
┌─────────────────────────────────────────────────────────────────┐
│ FLOW: Anamnese Dicteren                                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Intaker opent Command Center (⌘K of klik)                  │
│       │                                                         │
│  2. Spreekt: "Dicteer anamnese"                                │
│       │                                                         │
│  3. Systeem opent DicteerBlock met:                            │
│       ├── Sectie-keuze (hulpvraag/voorgeschiedenis/etc.)       │
│       └── Start opname knop                                     │
│       │                                                         │
│  4. Intaker selecteert sectie (optioneel, default = algemeen)  │
│       │                                                         │
│  5. Intaker klikt "Start opname" of zegt "Start"               │
│       │                                                         │
│  6. Intaker dicteert vrije tekst                               │
│       │                                                         │
│  7. Real-time transcriptie wordt getoond                       │
│       │                                                         │
│  8. Intaker klikt "Stop" of zegt "Stop opname"                 │
│       │                                                         │
│  9. Systeem toont preview met:                                 │
│       ├── Getranscribeerde tekst                               │
│       ├── Voorgestelde sectie-indeling (AI)                    │
│       └── Bewerken / Opslaan / Annuleren knoppen               │
│       │                                                         │
│  10. Intaker reviewt en past aan indien nodig                  │
│       │                                                         │
│  11. Intaker klikt "Opslaan"                                   │
│       │                                                         │
│  12. Systeem slaat op in anamneses tabel                       │
│       │                                                         │
│  13. Toast: "Anamnese opgeslagen"                              │
│       │                                                         │
│  14. [NUDGE] Bij bepaalde keywords:                            │
│       ├── "suïcide/zelfbeschadiging" → "Risicotaxatie doen?"   │
│       ├── "kinderen" → "Kindcheck uitvoeren?"                  │
│       └── "medicatie" → "Medicatie-overzicht bijwerken?"       │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

#### EPD Interacties

| Stap | Scherm | Element | Actie |
|------|--------|---------|-------|
| 1 | Dashboard/Dossier | Command Center | Open (⌘K) |
| 2 | Command Center | Input field | Voice input |
| 3 | Command Center | DicteerBlock | Render |
| 4 | DicteerBlock | Sectie dropdown | Selecteer |
| 5 | DicteerBlock | Opname knop | Klik |
| 6-7 | DicteerBlock | Transcriptie area | Real-time update |
| 8 | DicteerBlock | Stop knop | Klik |
| 9 | DicteerBlock | Preview area | Render |
| 10 | DicteerBlock | Tekst editor | Inline edit |
| 11 | DicteerBlock | Opslaan knop | Klik |
| 12 | - | API call | POST /api/cortex/anamnese |
| 13 | Global | Toast | Toon |

#### Gewenste Uitkomst

| Criterium | Verwacht resultaat |
|-----------|-------------------|
| Data opgeslagen | `anamneses` record met `intake_id`, `section`, `content`, `created_by` |
| UI feedback | Toast "Anamnese opgeslagen" |
| Navigatie | Block sluit, focus terug naar dossier |
| Audit trail | `created_at`, `created_by` timestamps |

#### Validatieregels

| Veld | Regel | Foutmelding |
|------|-------|-------------|
| `content` | Minimaal 10 karakters | "Anamnese tekst is te kort" |
| `section` | Enum: hulpvraag, voorgeschiedenis, psychiatrisch, somatisch, sociaal, algemeen | "Ongeldige sectie" |
| `intake_id` | Moet bestaan | "Intake niet gevonden" |
| Audio | Minimaal 2 seconden | "Opname te kort" |

#### Foutscenario's

| Scenario | Oorzaak | Systeem reactie | Gebruiker actie |
|----------|---------|-----------------|-----------------|
| Microfoon geweigerd | Browser permission denied | Error: "Microfoon toegang vereist" | Browser settings openen |
| Transcriptie mislukt | Deepgram API error | Error: "Spraakherkenning mislukt, probeer opnieuw" | Retry of handmatig typen |
| Netwerk timeout | Slow connection | Spinner > 10s → "Verbinding traag" | Wachten of retry |
| Opslaan mislukt | Database error | Error: "Opslaan mislukt" + retry knop | Retry |
| Geen intake context | Missing intakeId | Error: "Selecteer eerst een intake" | Intake openen |

#### Intent & Nudge

**Intent Triggers:**
```
"Dicteer anamnese"
"Anamnese inspreken"
"Spreek anamnese in"
"Start dictaat"
"Dicteer [sectie]" → prefill sectie
```

**Entities:**
- `section`: optioneel, een van de anamnese secties
- `patientName`: optioneel, voor context switch

**Nudges (post-save):**
| Trigger in tekst | Nudge |
|-----------------|-------|
| "suïcide", "zelfmoord", "zelfbeschadiging" | "Risicotaxatie uitvoeren?" |
| "kinderen", "kind", "dochter", "zoon" | "Kindcheck starten?" |
| "medicatie", "medicijnen", "pillen" | "Medicatieoverzicht controleren?" |

#### Acceptatiecriteria

- [ ] Voice input start transcriptie binnen 500ms
- [ ] Real-time transcriptie updates elke 200ms
- [ ] Transcriptie nauwkeurigheid >90% voor Nederlandse medische termen
- [ ] Opslaan duurt <2 seconden
- [ ] Opgeslagen tekst verschijnt in Anamnese tab
- [ ] Nudges triggeren bij relevante keywords
- [ ] Werkt op Chrome, Safari, Edge
- [ ] Toegankelijk met keyboard (Tab navigatie)

---

### UC-02: Contactmoment Registreren

**ID:** `UC-02`
**Intent:** `contact_nieuw`
**Prioriteit:** 🔴 Hoog (veel herhaling)

#### Omschrijving
De screener of administratie registreert een contactmoment met de cliënt (telefonisch, email, face-to-face). Inclusief notitie van wat besproken is en eventuele follow-up acties.

#### Actor
- Primair: Screener, Zorgadministratie
- Secundair: Intaker

#### Voorwaarden
| # | Voorwaarde | Check |
|---|------------|-------|
| 1 | Cliënt is geselecteerd | `patientId` aanwezig |
| 2 | Screening of Intake bestaat | `screeningId` of `intakeId` |
| 3 | Gebruiker heeft schrijfrechten | role in [screener, admin, intaker] |

#### Handelingen

```
┌─────────────────────────────────────────────────────────────────┐
│ FLOW: Contactmoment Registreren                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Medewerker zegt: "Noteer contactmoment"                    │
│       │                                                         │
│  2. Systeem opent ContactForm block met:                       │
│       ├── Type contact (telefoon/email/gesprek/brief)          │
│       ├── Richting (inkomend/uitgaand)                         │
│       ├── Datum/tijd (default: nu)                             │
│       ├── Notitie tekstveld                                    │
│       └── Follow-up checkbox + datum                           │
│       │                                                         │
│  3. Medewerker vult type en richting in                        │
│       │                                                         │
│  4. Medewerker typt of dicteert notitie                        │
│       │                                                         │
│  5. Optioneel: vink follow-up aan + kies datum                 │
│       │                                                         │
│  6. Klik "Opslaan"                                             │
│       │                                                         │
│  7. Systeem slaat op in contact_moments tabel                  │
│       │                                                         │
│  8. Toast: "Contactmoment opgeslagen"                          │
│       │                                                         │
│  9. [NUDGE] Bij follow-up:                                     │
│       └── "Herinnering instellen voor [datum]?"                │
│                                                                 │
│  10. [NUDGE] Bij geen reactie na 3 pogingen:                   │
│       └── "Cliënt niet bereikbaar, escaleren?"                 │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

#### EPD Interacties

| Stap | Scherm | Element | Actie |
|------|--------|---------|-------|
| 1 | Command Center | Input | "Noteer contactmoment" |
| 2 | Command Center | ContactForm | Render |
| 3 | ContactForm | Type dropdown | Selecteer |
| 3 | ContactForm | Richting radio | Selecteer |
| 4 | ContactForm | Notitie textarea | Type/dicteer |
| 5 | ContactForm | Follow-up checkbox | Toggle |
| 5 | ContactForm | Datum picker | Selecteer |
| 6 | ContactForm | Opslaan knop | Klik |

#### Gewenste Uitkomst

| Criterium | Verwacht resultaat |
|-----------|-------------------|
| Data opgeslagen | `contact_moments` record |
| Weergave | Contactmoment in Contactmomenten tab |
| Follow-up | Taak aangemaakt indien aangevinkt |
| Audit | Timestamp + user logged |

#### Validatieregels

| Veld | Regel | Foutmelding |
|------|-------|-------------|
| `type` | Enum: telefoon, email, gesprek, brief, portaal | "Selecteer type contact" |
| `direction` | Enum: inkomend, uitgaand | "Selecteer richting" |
| `notes` | Minimaal 5 karakters | "Voeg een notitie toe" |
| `contact_date` | Niet in de toekomst (max +1 uur) | "Datum kan niet in de toekomst liggen" |
| `follow_up_date` | Moet in de toekomst | "Follow-up datum moet in de toekomst liggen" |

#### Foutscenario's

| Scenario | Systeem reactie |
|----------|-----------------|
| Dubbele registratie (<5 min) | Warning: "Recent contactmoment gevonden, toch opslaan?" |
| Geen notitie | Validation error, focus op notitie veld |
| Patient niet geselecteerd | Error: "Selecteer eerst een cliënt" |

#### Intent & Nudge

**Intent Triggers:**
```
"Noteer contactmoment"
"Registreer contact"
"Log telefoontje"
"Cliënt gebeld"
"Email gestuurd naar [naam]"
"Contact met [naam]"
```

**Entities:**
- `contactType`: telefoon/email/gesprek (uit zin afleiden)
- `direction`: inkomend/uitgaand (uit zin afleiden)
- `patientName`: voor context

**Nudges:**
| Trigger | Nudge |
|---------|-------|
| Follow-up aangevinkt | "Agenda-item aanmaken voor follow-up?" |
| 3+ uitgaande contacten zonder reactie | "Escaleren naar teamleider?" |
| Eerste contact | "Welkomstbrief versturen?" |

#### Acceptatiecriteria

- [ ] Form opent binnen 300ms na intent
- [ ] Type en richting prefilled waar mogelijk uit intent
- [ ] Opslaan <1 seconde
- [ ] Contactmoment zichtbaar in timeline
- [ ] Follow-up creëert taak in takenlijst
- [ ] Voice input werkt voor notitie veld

---

### UC-03: Kindcheck Uitvoeren

**ID:** `UC-03`
**Intent:** `kindcheck_start`
**Prioriteit:** 🔴 Hoog (wettelijk verplicht)

#### Omschrijving
Bij elke intake moet worden vastgesteld of er minderjarige kinderen in het huishouden zijn en zo ja, of er zorgen zijn over hun welzijn. Dit is wettelijk verplicht (Meldcode huiselijk geweld).

#### Actor
- Primair: Screener, Intaker
- Secundair: Alle behandelaren

#### Voorwaarden
| # | Voorwaarde | Check |
|---|------------|-------|
| 1 | Cliënt geselecteerd | `patientId` aanwezig |
| 2 | Intake aanwezig | `intakeId` aanwezig |
| 3 | Geen afgeronde kindcheck | `child_checks.status != completed` |

#### Handelingen

```
┌─────────────────────────────────────────────────────────────────┐
│ FLOW: Kindcheck Uitvoeren                                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Trigger: Medewerker of systeem-nudge                       │
│       ├── Voice: "Start kindcheck"                             │
│       └── Nudge: "Kindcheck nog niet uitgevoerd"               │
│       │                                                         │
│  2. Systeem opent KindcheckForm:                               │
│       │                                                         │
│  STAP 1: Inventarisatie                                        │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Zijn er minderjarige kinderen?                          │   │
│  │ ○ Ja, [aantal] kinderen                                 │   │
│  │ ○ Nee                                                   │   │
│  │ ○ Onbekend                                              │   │
│  └─────────────────────────────────────────────────────────┘   │
│       │                                                         │
│  [Indien Ja]                                                   │
│       │                                                         │
│  STAP 2: Kindgegevens                                          │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Kind 1: Naam [____] Leeftijd [__] Woont bij cliënt? [○] │   │
│  │ Kind 2: Naam [____] Leeftijd [__] Woont bij cliënt? [○] │   │
│  │ [+ Kind toevoegen]                                       │   │
│  └─────────────────────────────────────────────────────────┘   │
│       │                                                         │
│  STAP 3: Zorgsignalen                                          │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Zijn er zorgen over de veiligheid/ontwikkeling?         │   │
│  │ ○ Geen zorgen                                           │   │
│  │ ○ Lichte zorgen                                         │   │
│  │ ○ Ernstige zorgen → Verplichte toelichting              │   │
│  └─────────────────────────────────────────────────────────┘   │
│       │                                                         │
│  STAP 4: Afronding                                             │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Toelichting: [________________]                         │   │
│  │ [Opslaan]                                               │   │
│  └─────────────────────────────────────────────────────────┘   │
│       │                                                         │
│  3. Systeem slaat kindcheck op                                 │
│       │                                                         │
│  4. [NUDGE] Bij ernstige zorgen:                               │
│       └── "Meldcode starten? Overleg met aandachtsfunctionaris"│
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

#### EPD Interacties

| Stap | Element | Actie |
|------|---------|-------|
| 1 | Command Center | Voice "Kindcheck" |
| 2.1 | Radio buttons | Kinderen ja/nee/onbekend |
| 2.2 | Kindgegevens form | Naam, leeftijd per kind |
| 2.3 | Radio buttons | Zorgniveau |
| 2.4 | Textarea | Toelichting |
| 3 | Opslaan knop | Klik |

#### Gewenste Uitkomst

| Criterium | Verwacht resultaat |
|-----------|-------------------|
| Data opgeslagen | `child_checks` record met kinderen en zorgniveau |
| Status update | `intakes.kindcheck_status = completed` |
| UI indicator | ✅ in Kindcheck tab |
| Bij zorgen | Taak voor follow-up aangemaakt |

#### Validatieregels

| Veld | Regel | Foutmelding |
|------|-------|-------------|
| `has_children` | Verplicht | "Geef aan of er kinderen zijn" |
| `children[].name` | Verplicht als has_children=ja | "Vul naam in" |
| `children[].age` | 0-17 | "Leeftijd moet 0-17 zijn" |
| `concern_level` | Verplicht als has_children=ja | "Selecteer zorgniveau" |
| `notes` | Verplicht als concern_level=ernstig | "Toelichting verplicht bij ernstige zorgen" |

#### Foutscenario's

| Scenario | Systeem reactie |
|----------|-----------------|
| Kindcheck al gedaan | Warning: "Kindcheck al uitgevoerd op [datum]. Opnieuw doen?" |
| Ernstige zorgen zonder toelichting | Validation error |
| Kinderen > 17 jaar | Info: "Alleen minderjarigen registreren" |

#### Intent & Nudge

**Intent Triggers:**
```
"Start kindcheck"
"Kindcheck"
"Zijn er kinderen?"
"Check kinderen"
"Meldcode kindcheck"
```

**Nudges:**
| Trigger | Nudge |
|---------|-------|
| Intake gestart, geen kindcheck | "Kindcheck nog niet uitgevoerd" |
| Anamnese bevat "kinderen" | "Kindcheck bijwerken?" |
| concern_level = ernstig | "Meldcode starten?" |

#### Acceptatiecriteria

- [ ] Wizard-flow met duidelijke stappen
- [ ] Conditionele velden (kindgegevens alleen bij ja)
- [ ] Verplichte toelichting bij ernstige zorgen
- [ ] Kindcheck status zichtbaar in intake overzicht
- [ ] Nudge bij ontbrekende kindcheck
- [ ] Audit trail voor wie wanneer heeft ingevuld

---

### UC-04: Werklijst Bekijken

**ID:** `UC-04`
**Intent:** `werklijst_query`
**Prioriteit:** 🟡 Middel (dagelijks gebruik admin)

#### Omschrijving
Zorgadministratie of screener bekijkt de werklijst met openstaande aanmeldingen/screenings, gefilterd op status, prioriteit en/of toegewezen medewerker.

#### Actor
- Primair: Zorgadministratie
- Secundair: Screener, Teamleider

#### Voorwaarden
| # | Voorwaarde | Check |
|---|------------|-------|
| 1 | Gebruiker ingelogd | authenticated |
| 2 | Rol heeft toegang | role in [admin, screener, teamlead] |

#### Handelingen

```
┌─────────────────────────────────────────────────────────────────┐
│ FLOW: Werklijst Bekijken                                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Medewerker zegt: "Toon werklijst"                          │
│       │                                                         │
│  2. Systeem opent WerklijstBlock:                              │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Werklijst Screening           [Filter ▼] [Sortering ▼] │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ 🔴 Jan de Vries      Wacht 14d   Spoed    Admin check   │   │
│  │ 🟡 Marie Jansen      Wacht 7d    Normaal  Triage        │   │
│  │ 🟢 Pieter Smit       Wacht 2d    Normaal  Screening     │   │
│  │ ...                                                      │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ Totaal: 23 | Spoed: 3 | >14 dagen: 5                    │   │
│  └─────────────────────────────────────────────────────────┘   │
│       │                                                         │
│  3. Medewerker kan filteren:                                   │
│       ├── Status (admin check, triage, screening, intake)      │
│       ├── Prioriteit (spoed, normaal)                          │
│       ├── Wachttijd (>7d, >14d)                                │
│       └── Toegewezen aan (mij, team, iedereen)                 │
│       │                                                         │
│  4. Klik op rij → opent dossier                                │
│       │                                                         │
│  5. [NUDGE] Bij items >14 dagen:                               │
│       └── "5 cliënten wachten >14 dagen. Prioriteit aanpassen?"│
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

#### EPD Interacties

| Stap | Element | Actie |
|------|---------|-------|
| 1 | Command Center | "Toon werklijst" |
| 2 | WerklijstBlock | Render |
| 3 | Filter dropdowns | Selecteer |
| 4 | Rij in lijst | Klik → navigate |

#### Gewenste Uitkomst

| Criterium | Verwacht resultaat |
|-----------|-------------------|
| Data geladen | Screenings met status, wachttijd, prioriteit |
| Filters werken | Real-time filtering zonder reload |
| Stats getoond | Totalen per categorie |
| Navigatie | Klik op rij opent dossier |

#### Validatieregels

| Filter | Regel |
|--------|-------|
| `status` | Enum: admin_check, triage, screening, intake, done |
| `priority` | Enum: spoed, normaal, laag |
| `waiting_days` | Integer >= 0 |
| `assigned_to` | UUID of null (unassigned) |

#### Foutscenario's

| Scenario | Systeem reactie |
|----------|-----------------|
| Geen resultaten | "Geen items gevonden met deze filters" |
| API timeout | Skeleton loader > "Laden duurt langer dan verwacht..." |
| Geen toegang | "Je hebt geen toegang tot de werklijst" |

#### Intent & Nudge

**Intent Triggers:**
```
"Toon werklijst"
"Werklijst"
"Openstaande screenings"
"Mijn werklijst"
"Wat moet ik doen?"
"Werkvoorraad"
```

**Entities:**
- `filter_status`: optioneel
- `filter_assigned`: "mijn" → current user
- `filter_priority`: "spoed" → priority=high

**Nudges:**
| Trigger | Nudge |
|---------|-------|
| Items >14 dagen in lijst | "Lange wachttijd bij [n] cliënten" |
| Spoed items niet opgepakt | "Spoed items nog niet toegewezen" |

#### Acceptatiecriteria

- [ ] Lijst laadt binnen 500ms
- [ ] Filters werken instant (client-side als <100 items)
- [ ] Wachttijd berekend vanaf aanmelddatum
- [ ] Kleurcodering op prioriteit/wachttijd
- [ ] Klik navigeert naar correct dossier
- [ ] Stats tonen actuele telling
- [ ] Voice: "Mijn werklijst" filtert op huidige gebruiker

---

### UC-05: Casus Overzicht (Review)

**ID:** `UC-05`
**Intent:** `casus_review`
**Prioriteit:** 🟡 Middel (MDO voorbereiding)

#### Omschrijving
Psychiater of MDO-team bekijkt een samenvatting van een casus: basisgegevens, anamnese, diagnose, risico's en behandeladvies. Bedoeld voor snelle review zonder door alle tabs te klikken.

#### Actor
- Primair: Psychiater
- Secundair: MDO-team, Regiebehandelaar

#### Voorwaarden
| # | Voorwaarde | Check |
|---|------------|-------|
| 1 | Cliënt/Intake geselecteerd | `patientId` of `intakeId` |
| 2 | Intake heeft minimale data | anamnese of diagnose aanwezig |
| 3 | Gebruiker heeft leesrechten | role in [psychiater, intaker, behandelaar] |

#### Handelingen

```
┌─────────────────────────────────────────────────────────────────┐
│ FLOW: Casus Overzicht                                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Psychiater zegt: "Toon casus" of "Casus overzicht"         │
│       │                                                         │
│  2. Systeem opent CasusOverzichtBlock:                         │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ CASUS: Jan de Vries (52j, M)           [PDF] [Presenteer]│  │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ 📋 BASISGEGEVENS                                        │   │
│  │    Aanmelddatum: 15-01-2026                             │   │
│  │    Verwijzer: Huisarts Dr. Jansen                       │   │
│  │    Hulpvraag: Slaapproblemen, somberheid                │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ 📝 ANAMNESE (samenvatting)                              │   │
│  │    Voorgeschiedenis: Depressieve episode 2019           │   │
│  │    Actueel: Sinds 3 maanden toenemende klachten...      │   │
│  │    [Lees meer →]                                         │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ 🏥 DIAGNOSE                                             │   │
│  │    F32.1 Depressieve stoornis, matig                    │   │
│  │    F51.0 Insomnie                                       │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ ⚠️ RISICO                                               │   │
│  │    Suïcidaliteit: Laag (geen actieve gedachten)         │   │
│  │    Zelfverwaarlozing: Matig                             │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ 💊 MEDICATIE                                            │   │
│  │    Geen huidige medicatie                               │   │
│  ├─────────────────────────────────────────────────────────┤   │
│  │ 📋 BEHANDELADVIES                                       │   │
│  │    Ambulante behandeling, CGT + medicatie-evaluatie     │   │
│  └─────────────────────────────────────────────────────────┘   │
│       │                                                         │
│  3. Klik op sectie → navigeer naar detail tab                  │
│       │                                                         │
│  4. [PDF] → Genereer PDF samenvatting                          │
│       │                                                         │
│  5. [Presenteer] → Full-screen MDO presentatie mode            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

#### EPD Interacties

| Stap | Element | Actie |
|------|---------|-------|
| 1 | Command Center | "Toon casus" |
| 2 | CasusOverzichtBlock | Render (aggregeert data uit meerdere tabellen) |
| 3 | Sectie header | Klik → expand of navigate |
| 4 | PDF knop | Genereer document |
| 5 | Presenteer knop | Full-screen mode |

#### Gewenste Uitkomst

| Criterium | Verwacht resultaat |
|-----------|-------------------|
| Aggregatie | Data uit intakes, anamneses, conditions, risk_assessments, medications |
| Samenvatting | Anamnese getrunceerd met "lees meer" |
| Navigatie | Klik op sectie opent detail |
| Export | PDF genereerbaar |

#### Validatieregels

| Criterium | Regel |
|-----------|-------|
| Minimale data | Tenminste 1 sectie moet gevuld zijn |
| Anamnese truncatie | Max 200 karakters in samenvatting |
| Diagnose format | DSM-5 code + omschrijving |

#### Foutscenario's

| Scenario | Systeem reactie |
|----------|-----------------|
| Geen intake data | "Intake nog niet gestart" + link naar intake starten |
| Geen anamnese | Sectie toont "Nog niet ingevuld" |
| PDF generatie faalt | Error toast + retry |

#### Intent & Nudge

**Intent Triggers:**
```
"Toon casus"
"Casus overzicht"
"Geef samenvatting"
"Casus [naam]"
"Laat dossier zien"
"MDO voorbereiding"
```

**Entities:**
- `patientName`: voor context switch
- `format`: "pdf" → direct PDF genereren

**Nudges:**
| Trigger | Nudge |
|---------|-------|
| Ontbrekende secties | "Anamnese nog niet ingevuld" |
| Verouderde risicotaxatie (>30d) | "Risicotaxatie bijwerken?" |
| MDO gepland vandaag | "Casus voorbereid voor MDO?" |

#### Acceptatiecriteria

- [ ] Block laadt alle secties binnen 1 seconde
- [ ] Anamnese samenvatting is leesbaar (geen mid-zin truncatie)
- [ ] Klikbare secties navigeren correct
- [ ] PDF bevat alle zichtbare informatie
- [ ] Presentatie mode is full-screen
- [ ] Ontbrekende secties duidelijk aangegeven
- [ ] Risico-informatie prominent zichtbaar

---

## Nudge Specificaties (MVP)

### NU-01: Veiligheidsplan bij Hoog Risico

**ID:** `NU-01`
**Trigger:** `risico_invoer` met `level = hoog` of `suicidaliteit >= matig`

#### Specificatie

| Aspect | Waarde |
|--------|--------|
| Type | Warning (oranje) |
| Timing | Direct na risico-opslag |
| Tekst | "Hoog risico geregistreerd. Veiligheidsplan opstellen?" |
| Primaire actie | "Ja, start veiligheidsplan" → open VeiligheidsplanForm |
| Secundaire actie | "Later" → dismiss + remind in 1 uur |
| Dismiss | "Niet nodig" → log reden verplicht |
| Persistentie | Blijft totdat veiligheidsplan is aangemaakt |

#### Trigger Logica
```typescript
if (
  riskAssessment.overall_risk === 'high' ||
  riskAssessment.suicidality_level >= 'moderate' ||
  riskAssessment.self_harm === true
) {
  triggerNudge('NU-01');
}
```

---

### NU-02: Kindcheck Herinnering

**ID:** `NU-02`
**Trigger:** Intake gestart + kinderen in dossier + geen kindcheck

#### Specificatie

| Aspect | Waarde |
|--------|--------|
| Type | Info (blauw) |
| Timing | Bij openen intake, check elke 24 uur |
| Tekst | "Kindcheck nog niet uitgevoerd voor deze intake" |
| Primaire actie | "Start kindcheck" → open KindcheckForm |
| Secundaire actie | "Herinner morgen" |
| Dismiss | Niet mogelijk (wettelijk verplicht) |
| Persistentie | Tot kindcheck is afgerond |

#### Trigger Logica
```typescript
if (
  intake.status === 'active' &&
  (patient.has_children === true || patient.has_children === 'unknown') &&
  !childCheck.exists
) {
  triggerNudge('NU-02');
}
```

---

### NU-03: Huisarts Informeren

**ID:** `NU-03`
**Trigger:** Intake status → afgerond

#### Specificatie

| Aspect | Waarde |
|--------|--------|
| Type | Suggestie (groen) |
| Timing | Direct na intake afsluiten |
| Tekst | "Intake afgerond. Brief naar huisarts versturen?" |
| Primaire actie | "Ja, maak brief" → open BriefForm met prefill |
| Secundaire actie | "Niet nu" |
| Dismiss | "Huisarts al geïnformeerd" |
| Persistentie | 7 dagen of tot brief is verstuurd |

#### Trigger Logica
```typescript
if (
  intake.status === 'completed' &&
  !correspondence.exists({ type: 'huisarts_brief', intake_id })
) {
  triggerNudge('NU-03');
}
```

---

### NU-04: Follow-up bij No-show

**ID:** `NU-04`
**Trigger:** Geen reactie cliënt na 7 dagen

#### Specificatie

| Aspect | Waarde |
|--------|--------|
| Type | Warning (oranje) |
| Timing | 7 dagen na laatste uitgaand contact zonder reactie |
| Tekst | "Geen reactie van [naam] sinds 7 dagen. Follow-up actie?" |
| Primaire actie | "Bel cliënt" → open ContactForm |
| Secundaire actie | "Stuur brief" → open BriefForm |
| Tertiaire actie | "Afsluiten wegens no-show" → ConfirmDialog |
| Dismiss | "Wacht nog" → herinner over 3 dagen |

#### Trigger Logica
```typescript
const lastOutgoingContact = contacts
  .filter(c => c.direction === 'outgoing')
  .sort(c => c.date)
  .last();

if (
  daysSince(lastOutgoingContact.date) >= 7 &&
  !contacts.exists({ direction: 'incoming', after: lastOutgoingContact.date })
) {
  triggerNudge('NU-04');
}
```

---

## Volgende Stappen

1. [ ] **Review dit document** met stakeholders
2. [ ] **Prioriteit valideren** op basis van business value
3. [ ] **Sprint planning** voor MVP Fase 1
4. [ ] **Technical design** per use case
5. [ ] **Nudge engine** uitbreiden met protocol rules

---

## Appendix: Intent Naming Convention

```
[domein]_[actie]

Domeinen:
- intake_    → Intake gerelateerd
- screening_ → Screening gerelateerd
- anamnese_  → Anamnese gerelateerd
- risico_    → Risico gerelateerd
- diagnose_  → Diagnose gerelateerd
- contact_   → Contactmomenten
- werklijst_ → Werklijst/administratie
- mdo_       → MDO gerelateerd
- behandel_  → Behandeling gerelateerd

Acties:
- _query     → READ operatie (QueryBlock)
- _nieuw     → CREATE operatie (ActionBlock)
- _update    → UPDATE operatie (ActionBlock)
- _start     → Starten van proces (ActionBlock)
- _dicteer   → Dicteren (ActionBlock)
- _navigeer  → Navigatie (NavigationBlock)
- _afsluiten → Afsluiten proces (ActionBlock)
```
