Files
triqura-ecd/docs/roadmap/use-case-function-mapping-intake.md
colinislit 6c6dae5eb7 feat(cortex): enhance intake workflow with new navigation and status features
- Introduced new navigation handler for intake_navigeer intent, allowing users to navigate to specific patient intake pages.
- Added intake status display to show completion percentage and section checklist.
- Updated action-parser schema to include new intake intents and improved routing for better user experience.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 12:26:33 +01:00

48 KiB

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

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

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

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

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)