# Use Cases × Technische Componenten — Validatiematrix > **Type**: Architectuur Validatiedocument > **Versie**: 1.0 > **Datum**: 2026-02-14 > **Doel**: Valideer of de enterprise architectuur alle use cases ondersteunt. Identificeer gaten. > **Relatie**: Valideert `enterprise-epd-architectuur.md` en `intent-system-architectuur-nl.md` --- ## 1. Use Case Catalogus Alle use cases uit de huidige codebase, uitgebreid met enterprise-scenario's die nog ontbreken. ### 1.1 Bestaande use cases (geïmplementeerd in prototype) | ID | Use Case | Categorie | Intent | Status | |----|----------|-----------|--------|--------| | UC-01 | Dagnotitie aanmaken via spraak/tekst | Rapportage | `dagnotitie` | ✅ Volledig | | UC-02 | Rapportage tijdlijn bekijken (per shift) | Rapportage | — (UI) | ✅ Volledig | | UC-03 | Notitie markeren voor overdracht | Rapportage | — (UI) | ✅ Volledig | | UC-04 | Overdracht overzicht bekijken | Overdracht | `overdracht` | ✅ Volledig | | UC-05 | AI-samenvatting genereren voor overdracht | Overdracht | `overdracht` | ✅ Volledig | | UC-06 | Bronverwijzing volgen vanuit AI-samenvatting | Overdracht | — (UI) | ✅ Volledig | | UC-07 | Patiënt zoeken op naam/BSN | Zoeken | `zoeken` | ✅ Volledig | | UC-08 | Patiëntdossier openen | Navigatie | — (UI) | ✅ Volledig | | UC-09 | Agenda bekijken (vandaag/week) | Agenda | `agenda_query` | ✅ Volledig | | UC-10 | Afspraak aanmaken | Agenda | `create_appointment` | ✅ Volledig | | UC-11 | Afspraak annuleren | Agenda | `cancel_appointment` | ✅ Volledig | | UC-12 | Afspraak verzetten | Agenda | `reschedule_appointment` | ✅ Volledig | | UC-13 | Intake status bekijken | Intake | `intake_status` | ⚠️ MVP | | UC-14 | Risicotaxatie bekijken | Intake | `risico_query` | ⚠️ MVP | | UC-15 | Diagnoses bekijken | Intake | `diagnose_query` | ⚠️ MVP | | UC-16 | Navigeren naar intake-sectie | Intake | `intake_navigeer` | ⚠️ MVP | | UC-17 | Spraak-naar-tekst voor invoer | Invoer | — (Deepgram) | ✅ Volledig | | UC-18 | Samengestelde opdracht (multi-intent) | Classificatie | Meerdere | ✅ Volledig | | UC-19 | Context-afhankelijke verwijzingen ("hem", "haar") | Classificatie | — (Orchestrator) | ✅ Volledig | | UC-20 | Nudge na actie (vervolgactie suggestie) | Protocol | — (Nudge) | ⚠️ Code bestaat, niet aangeroepen | ### 1.2 Ontbrekende enterprise use cases | ID | Use Case | Categorie | Waarom nodig | |----|----------|-----------|-------------| | UC-21 | Behandelplan opstellen en bijwerken | Behandeling | Kernfunctie GGZ-EPD | | UC-22 | Medicatieoverzicht bekijken/bijwerken | Medicatie | Wettelijk verplicht, hoog-risico | | UC-23 | Incident/MIC-melding registreren | Veiligheid | Wkkgz verplichting | | UC-24 | Wvggz-dwangmaatregel registreren | Juridisch | Wvggz verplichting | | UC-25 | Toestemming registreren/intrekken | Juridisch | AVG + Wvggz | | UC-26 | Audit log doorzoeken (compliance officer) | Audit | NEN 7513 verplichting | | UC-27 | Patiëntdata exporteren (FHIR Bundle) | Interoperabiliteit | Dataportabiliteit (AVG) | | UC-28 | Gebruikersbeheer (admin) | Beheer | Multi-tenancy | | UC-29 | Protocolregel toevoegen/valideren | Knowledge | Protocol Engine beheer | | UC-30 | Dashboard: team-overzicht per afdeling | Overzicht | Management informatie | | UC-31 | Rapportage verwijderen (soft delete) + versioning | Rapportage | Wkkgz dossierplicht | | UC-32 | Groepstherapie sessie rapporteren (meerdere patiënten) | Rapportage | GGZ-specifiek | | UC-33 | Noodtoegang ("break the glass") | Beveiliging | NEN 7510, noodsituaties | --- ## 2. Technische Componenten Register Alle componenten die de architectuur beschrijft, met hun verantwoordelijkheid en status. ### 2.1 Component overzicht ``` LAAG 1: INTERFACE ├── C01 Traditionele EPD UI (Next.js pages + forms) ├── C02 Intent Command Center (⌘K overlay) ├── C03 Spraak Input (Deepgram integratie) └── C04 Block/Artifact systeem (canvas + forms) LAAG 2: INTENT SYSTEEM ├── C05 Intent Registry (declaratieve definities) ├── C06 Reflex Classifier (lokale regex matching) ├── C07 Orchestrator (LLM classificatie) ├── C08 Entity Extractor + Date Parser ├── C09 Action System (intent → UI artifact mapping) └── C10 Protocol Engine / Nudge LAAG 3: KNOWLEDGE LAYER ├── C11 Protocol Rules Store (gevalideerde regels) ├── C12 RAG Pipeline (protocol indexering + vector search) ├── C13 Regelvalidatie UI (admin) └── C14 Kennisbron Connectors (wet/protocol/kwaliteitsdoc importers) LAAG 4: DOMEIN / BUSINESS LOGIC ├── C15 Rapportage Service (CRUD, versioning, soft delete) ├── C16 Overdracht Service (samenvatting generatie) ├── C17 Agenda Service (CRUD, conflictdetectie) ├── C18 Behandelplan Service ├── C19 Medicatie Service ├── C20 Intake Service ├── C21 Patiënt Service (CRUD, zoeken, toewijzing) └── C22 Toestemming Service (Wvggz, AVG) LAAG 5: ENTERPRISE FUNDAMENT ├── C23 Auth + SSO (Supabase Auth, SAML) ├── C24 Multi-tenancy (RLS, tenant context) ├── C25 RBAC + ABAC Engine (policy evaluatie) ├── C26 Audit Trail (NEN 7513 immutable log) ├── C27 Field Encryption (AES-256-GCM) ├── C28 FHIR Export Service ├── C29 CDS Hooks Service ├── C30 Observability (Pino, OpenTelemetry) ├── C31 Circuit Breaker / Resilience ├── C32 Health Check Service └── C33 PII Filter (sanitisatie voor AI prompts) LAAG 6: PLATFORM SERVICES (zie enterprise-componenten-uitbreiding.md) ├── C34 Notificatie Service (in-app + email + escalatie) ├── C35 Workflow Engine (state machine voor klinische workflows) ├── C36 Full-Text Search Service (klinische notities doorzoeken) ├── C37 Caching Layer (AI responses, API responses, sessiedata) ├── C38 Scheduled Jobs Service (BullMQ repeatable jobs) └── C39 Webhook System (outbound event webhooks) LAAG 7: EXTERNE INTEGRATIES (zie enterprise-componenten-uitbreiding.md) ├── C40 ZPM Facturatie Service (Zorgprestatiemodel) ├── C41 Vecozo Connector (voorbereiding) └── C42 Zorgdomein Connector (voorbereiding) LAAG 8: ANALYTICS (zie enterprise-componenten-uitbreiding.md) └── C43 BI Module (materialized views, data-export) ``` ### 2.2 Component status | Component | Prototype status | Enterprise gereed? | Werk nodig | |-----------|-----------------|-------------------|------------| | C01 EPD UI | Gedeeltelijk (rapportage, overdracht, agenda) | Nee | Uitbreiden: behandelplan, medicatie, admin | | C02 Command Center | Volledig | Ja (refactor) | Store splitsen, Registry migratie | | C03 Spraak Input | Volledig | Ja | Minimale wijzigingen | | C04 Block/Artifact | Volledig | Ja | Uitbreiden met nieuwe block types | | C05 Intent Registry | 40% (patronen verspreid over code) | Nee | **Kernwijziging**: centraliseren in config/DB | | C06 Reflex Classifier | 85% werkend | Gedeeltelijk | Patronen naar Registry verplaatsen | | C07 Orchestrator | 85% werkend | Gedeeltelijk | Prompt extractie, unified pipeline | | C08 Entity Extractor | 60% werkend | Gedeeltelijk | Pattern tables externaliseren | | C09 Action System | 70% werkend | Gedeeltelijk | Meer artifact types | | C10 Protocol Engine | 30% (code niet aangeroepen) | Nee | **Nieuw bouwen** op basis van Knowledge Layer | | C11 Protocol Rules Store | 0% | Nee | **Volledig nieuw** | | C12 RAG Pipeline | 0% | Nee | **Volledig nieuw** | | C13 Regelvalidatie UI | 0% | Nee | **Volledig nieuw** | | C14 Kennisbron Connectors | 0% | Nee | **Volledig nieuw** | | C15 Rapportage Service | 80% (CRUD werkt) | Nee | Versioning, multi-tenant | | C16 Overdracht Service | 90% werkend | Gedeeltelijk | Multi-tenant, audit integratie | | C17 Agenda Service | 80% werkend | Gedeeltelijk | Conflictdetectie, multi-tenant | | C18 Behandelplan Service | 0% | Nee | **Volledig nieuw** | | C19 Medicatie Service | 0% | Nee | **Volledig nieuw** | | C20 Intake Service | 40% (MVP blocks) | Nee | Uitbreiden, multi-tenant | | C21 Patiënt Service | 70% | Nee | Toewijzing, multi-tenant | | C22 Toestemming Service | 0% | Nee | **Volledig nieuw** | | C23 Auth + SSO | 60% (Supabase Auth) | Nee | SSO/SAML, MFA, session management | | C24 Multi-tenancy | 0% | Nee | **Volledig nieuw** | | C25 RBAC + ABAC | 10% (basis RLS) | Nee | **Grotendeels nieuw** | | C26 Audit Trail | 0% | Nee | **Volledig nieuw** | | C27 Field Encryption | 0% | Nee | **Volledig nieuw** | | C28 FHIR Export | 10% (Patient endpoint) | Nee | Uitbreiden naar alle resources | | C29 CDS Hooks | 0% | Nee | **Volledig nieuw** | | C30 Observability | 10% (console.log) | Nee | **Grotendeels nieuw** | | C31 Circuit Breaker | 20% (classifyWithTimeout) | Nee | Generaliseren | | C32 Health Check | 0% | Nee | **Volledig nieuw** | | C33 PII Filter | 40% (logger.ts sanitisatie) | Nee | Uitbreiden voor AI prompts | --- ## 3. Validatiematrix — Use Case × Component Elke cel toont welke componenten een use case nodig heeft. **Rode cellen** zijn gaten. ### 3.1 Rapportage use cases #### UC-01: Dagnotitie aanmaken via spraak/tekst ``` FLOW: Zorgverlener spreekt/typt → "Notitie Jan medicatie onrustige nacht" ┌─────────────┐ │ C03 Spraak │ (optioneel) Audio → tekst │ of C02 ⌘K │ Tekst invoer └──────┬──────┘ ▼ ┌──────────────┐ ┌──────────────┐ │ C05 Registry │────►│ C06 Reflex │ Pattern match: "notitie" → dagnotitie └──────────────┘ └──────┬───────┘ │ confidence 0.9 ▼ ┌──────────────┐ │ C08 Entity │ "Jan" → patient fuzzy match │ Extractor │ "medicatie" → category └──────┬───────┘ ▼ ┌──────────────┐ │ C09 Action │ Open dagnotitie-block met prefill │ System │ { patient: Jan, category: medicatie } └──────┬───────┘ ▼ ┌──────────────┐ │ C04 Block │ Formulier met vooringevulde data │ (UI) │ Gebruiker bevestigt + voegt content toe └──────┬───────┘ │ [gebruiker klikt "Opslaan"] ▼ ┌──────────────┐ ┌──────────────┐ │ C25 RBAC │────►│ C15 Rapportage│ Insert report │ check │ │ Service │ shift_date berekend └──────────────┘ └──────┬───────┘ │ ┌─────────────────────┤ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ C26 Audit │ │ C10 Protocol │ Evalueer nudges │ Trail │ │ Engine │ → "Check vitale functies?" └──────────────┘ └──────────────┘ COMPONENTEN NODIG: C02/C03, C05, C06, C08, C09, C04, C25, C15, C26, C10 GATEN: 🔴 C05 Intent Registry bestaat niet als centraal component 🔴 C25 RBAC check ontbreekt volledig 🔴 C26 Audit trail ontbreekt volledig 🔴 C10 Protocol Engine is niet aangesloten (code bestaat, niet aangeroepen) 🟡 C15 Rapportage Service mist versioning en multi-tenant ``` #### UC-05: AI-samenvatting genereren voor overdracht ``` FLOW: Zorgverlener → "Overdracht" of klikt in UI ┌─────────────┐ │ C02 ⌘K │ of C01 UI → navigatie naar overdracht pagina └──────┬──────┘ ▼ ┌──────────────┐ ┌──────────────┐ │ C06 Reflex │────►│ C09 Action │ Open overdracht-block └──────────────┘ └──────┬───────┘ ▼ ┌──────────────┐ │ C16 Overdracht│ Haal patiëntenlijst op │ Service │ Filter op afdeling/dienst └──────┬───────┘ │ [voor elke actieve patiënt] ▼ ┌──────────────┐ │ C33 PII │ Minimaliseer patiëntdata voor AI │ Filter │ └──────┬───────┘ ▼ ┌──────────────┐ │ C07 Claude │ Genereer samenvatting │ API │ Aandachtspunten + actiepunten └──────┬───────┘ │ ┌──────┴───────┐ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ C26 Audit │ │ C04 Block │ Render samenvatting │ Trail │ │ (UI) │ met bronverwijzingen └──────────────┘ └──────────────┘ COMPONENTEN NODIG: C01/C02, C06, C09, C16, C33, C07 (Claude), C26, C04 GATEN: 🔴 C26 Audit trail ontbreekt — wie heeft welke samenvatting gegenereerd? 🔴 C33 PII filter is onvolledig — welke data gaat naar Claude? 🟡 C16 Overdracht Service mist tenant-filtering 🟡 Geen caching — elke keer opnieuw genereren is duur ``` #### UC-31: Rapportage verwijderen + versioning ``` FLOW: Zorgverlener wil rapport wijzigen of verwijderen ┌─────────────┐ │ C01 UI │ Klik op "bewerken" of "verwijderen" in tijdlijn └──────┬──────┘ ▼ ┌──────────────┐ │ C25 RBAC │ Mag deze gebruiker dit rapport wijzigen? │ + ABAC │ Check: auteur OF hoofdbehandelaar OF admin └──────┬───────┘ ▼ ┌──────────────┐ │ C15 Rapportage│ WIJZIGEN: nieuwe versie aanmaken │ Service │ → version++, previous_version_id link │ │ VERWIJDEREN: soft delete (deleted_at) │ │ → NOOIT hard delete (Wkkgz) └──────┬───────┘ ▼ ┌──────────────┐ │ C26 Audit │ Log: wie, wat, wanneer, waarom │ Trail │ + data_before / data_after snapshot └──────────────┘ COMPONENTEN NODIG: C01, C25, C15, C26 GATEN: 🔴 C15 Rapportage Service heeft GEEN versioning (alleen soft delete) 🔴 C25 Eigenaarschap-check ontbreekt 🔴 C26 Audit trail ontbreekt — geen bewijs van wijzigingen ``` ### 3.2 Enterprise use cases (nieuw) #### UC-23: Incident/MIC-melding registreren ``` FLOW: Zorgverlener → "Incident melding: patiënt gevallen op kamer 3" ┌─────────────┐ │ C02 ⌘K │ "incident melding patiënt gevallen" └──────┬──────┘ ▼ ┌──────────────┐ │ C06 Reflex │ Pattern: "incident" / "melding" / "MIC" / "gevallen" │ │ → intent: NEW "incident_melding" (ONTBREEKT) └──────┬───────┘ ▼ ┌──────────────┐ │ C08 Entity │ Extraheer: patiënt, locatie, type incident │ Extractor │ "gevallen" → incident_type: "val" └──────┬───────┘ ▼ ┌──────────────┐ │ C09 Action │ Open incident-formulier (ONTBREEKT) │ │ Velden: patiënt, datum/tijd, locatie, beschrijving, │ │ ernst, getuigen, maatregelen genomen └──────┬───────┘ │ [gebruiker bevestigt] ▼ ┌──────────────┐ ┌──────────────┐ │ C15 Rapportage│ │ C26 Audit │ │ report_type:│ │ Trail │ │ 'incident' │ └──────────────┘ └──────┬───────┘ ▼ ┌──────────────┐ │ C10 Protocol │ Nudges: │ Engine │ → "Valpreventie protocol activeren?" │ │ → "Informeer hoofdbehandelaar" │ │ → "Plan follow-up observatie" └──────────────┘ COMPONENTEN NODIG: C02, C06, C08, C09, C04, C15, C26, C10 NIEUWE COMPONENTEN NODIG: 🔴 Intent 'incident_melding' toevoegen aan Registry 🔴 Incident-formulier block (UI component) 🔴 Protocol rules voor incidentopvolging 🟡 Ernst-classificatie schema 🟡 Notificatie naar hoofdbehandelaar (C-NEW: Notificatie Service) ``` #### UC-24: Wvggz-dwangmaatregel registreren ``` FLOW: Arts → Registreer dwangmaatregel (bijv. separatie, gedwongen medicatie) ┌─────────────┐ │ C01 UI │ Via traditionele formulier (te complex voor intent) │ │ OF C02 ⌘K → "dwangmaatregel registreren [patient]" └──────┬──────┘ ▼ ┌──────────────┐ │ C25 RBAC │ Check: alleen arts/psychiater mag dwangmaatregel registreren │ + ABAC │ Check: patiënt heeft Wvggz legal_status │ │ Check: toestemming/machtiging is actief (C22) └──────┬───────┘ ▼ ┌──────────────┐ │ NEW: C34 │ Dwangmaatregel formulier │ Wvggz Service │ Velden: type maatregel, start/eind, reden, │ │ alternatieven overwogen, proportionaliteit │ │ Juridische grondslag (zorgmachtiging nr.) └──────┬───────┘ ▼ ┌──────────────┐ ┌──────────────┐ │ C22 Toestem- │ │ C26 Audit │ EXTRA LOGGING: │ ming Service│ │ Trail │ Wvggz-maatregel = P1 audit event │ Verify OK │ │ │ purpose: 'wvggz_dwangmaatregel' └──────────────┘ └──────────────┘ ▼ ┌──────────────┐ │ C10 Protocol │ Nudges: │ Engine │ → "Plan evaluatie dwangmaatregel (binnen 24u)" │ │ → "Informeer geneesheer-directeur" │ │ → "Registreer in Wvggz-register" └──────────────┘ NIEUWE COMPONENTEN NODIG: 🔴 C34 Wvggz Service (registratie, evaluatie, rapportage) 🔴 C22 Toestemming Service (verificatie juridische grondslag) 🔴 Wvggz-specifieke ABAC policies 🔴 Protocol rules voor Wvggz-termijnen 🔴 Notificatie naar geneesheer-directeur ``` #### UC-26: Audit log doorzoeken ``` FLOW: Compliance officer → "Wie heeft dossier patiënt X bekeken afgelopen maand?" ┌─────────────┐ │ C01 UI │ Admin → Audit log pagina │ (admin) │ Zoekfilters: patiënt, gebruiker, periode, actie └──────┬──────┘ ▼ ┌──────────────┐ │ C25 RBAC │ Check: rol = 'audit' of 'admin' │ │ Audit officers hebben read-only toegang tot ALLE logs └──────┬───────┘ ▼ ┌──────────────┐ │ C26 Audit │ Query: forensische zoekopdracht │ Trail │ Filters: entity_type, entity_id, user_id, date range │ │ Resultaat: gesorteerd op timestamp └──────┬───────┘ ▼ ┌──────────────┐ │ C26 Audit │ META: het doorzoeken van de audit log │ Trail │ wordt ZELF ook gelogd (wie zoekt wat op) └──────────────┘ COMPONENTEN NODIG: C01, C25, C26 GATEN: 🔴 C26 Audit log UI (admin pagina) ontbreekt volledig 🔴 Export functie (CSV/PDF voor externe auditor) 🟡 Anomalie-detectie dashboard ``` #### UC-33: Noodtoegang ("break the glass") ``` FLOW: Arts in noodsituatie → toegang nodig tot patiënt die niet is toegewezen ┌─────────────┐ │ C01 UI │ Patiëntdossier → "Geen toegang" melding │ │ → Knop: "Noodtoegang aanvragen" └──────┬──────┘ ▼ ┌──────────────┐ │ C25 RBAC │ Normale check FAALT (niet toegewezen) │ + ABAC │ → Noodtoegang flow activeren └──────┬───────┘ ▼ ┌──────────────────────────────────────┐ │ NEW: Break-the-Glass Dialog │ │ "U bent niet toegewezen aan deze │ │ patiënt. Noodtoegang vereist een │ │ reden." │ │ │ │ Reden: [dropdown] │ │ - Medisch noodgeval │ │ - Dienstdoend arts (geen toewijzing) │ │ - Vervanging collega │ │ Toelichting: [vrij tekstveld] │ │ │ │ [Annuleren] [Noodtoegang activeren] │ └──────┬───────────────────────────────┘ │ [gebruiker bevestigt] ▼ ┌──────────────┐ │ C26 Audit │ P1 AUDIT EVENT: │ Trail │ action: 'emergency_access' │ │ purpose: reden uit formulier │ │ → Automatische notificatie naar privacy officer └──────┬───────┘ ▼ ┌──────────────┐ │ C21 Patiënt │ Tijdelijke toegang (bijv. 4 uur) │ Service │ Auto-expire na timeout └──────────────┘ NIEUWE COMPONENTEN NODIG: 🔴 Break-the-glass UI component 🔴 Tijdelijke toegang mechanisme in C25 🔴 Automatische notificatie service 🔴 Auto-expire logica ``` --- ## 4. Gap Analyse — Samenvatting ### 4.1 Kritieke gaten (blokkeren enterprise deployment) | # | Gap | Impact | Benodigde componenten | Inspanning | |---|-----|--------|----------------------|------------| | G1 | **Geen audit trail** | NEN 7513 niet-compliant, geen bewijs bij audit | C26 volledig bouwen | 2-3 weken | | G2 | **Geen multi-tenancy** | Kan niet bij meerdere instellingen draaien | C24 volledig bouwen | 2-3 weken | | G3 | **Geen RBAC/ABAC** | Iedereen ziet alles, geen rolgebaseerde toegang | C25 volledig bouwen | 2-3 weken | | G4 | **Intent Registry ontbreekt** | Patronen verspreid over 3-4 bestanden | C05 centraliseren | 2-3 dagen | | G5 | **Protocol Engine niet actief** | Nudges bestaan maar worden nooit getoond | C10 aansluiten + C11 rules store | 1-2 weken | | G6 | **Geen versioning op rapportages** | Wijzigingsgeschiedenis niet traceerbaar | C15 uitbreiden | 3-5 dagen | | G7 | **Geen field encryptie** | BSN en diagnoses onversleuteld in DB | C27 bouwen | 1 week | ### 4.2 Functionele gaten (ontbrekende GGZ-modules) | # | Gap | Impact | Inspanning | |---|-----|--------|------------| | G8 | **Behandelplan module** | Kernfunctie GGZ ontbreekt volledig | C18: 3-4 weken | | G9 | **Medicatie module** | Wettelijk verplicht, hoog-risico domein | C19: 3-4 weken | | G10 | **Wvggz registratie** | Kan geen verplichte zorg registreren | C34 + C22: 2-3 weken | | G11 | **Incident/MIC module** | Wkkgz niet-compliant | Uitbreiding C15 + intent: 1-2 weken | | G12 | **Knowledge Layer** | Geen protocol-gestuurde nudges | C11-C14: 4-6 weken | ### 4.3 Technische gaten | # | Gap | Impact | Inspanning | |---|-----|--------|------------| | G13 | **Geen SSO/SAML** | Enterprise instellingen vereisen SSO | C23 uitbreiden: 1 week | | G14 | **Geen structured logging** | Console.log in productie = blind vliegen | C30: 1 week | | G15 | **Geen health checks** | Geen alerting bij uitval | C32: 2-3 dagen | | G16 | **Circuit breaker incompleet** | Alleen voor classify, niet generiek | C31 generaliseren: 3-5 dagen | | G17 | **PII filter incompleet** | Patiëntdata lekt naar AI prompts | C33 uitbreiden: 3-5 dagen | | G18 | **Geen FHIR Bundle export** | Alleen Patient endpoint, rest ontbreekt | C28 uitbreiden: 1-2 weken | | G19 | **Geen notificatie service** | Geen alerts bij incidenten, Wvggz-termijnen | Nieuw component: 1-2 weken | | G20 | **Geen caching** | AI samenvattingen elke keer opnieuw genereren | Cache layer toevoegen: 3-5 dagen | --- ## 5. Use Case × Component Kruistabel Welk component is nodig voor welke use case? `●` = nodig, `○` = optioneel, `-` = niet relevant. ``` UC UC UC UC UC UC UC UC UC UC UC UC UC Component 01 05 07 10 11 21 23 24 26 27 31 32 33 dag ovdr zoek afsp ann beh inc wvgz aud fhir ver grp nood ───────────────────────────────────────────────────────────────────────────── C01 EPD UI ○ ● ○ ○ ○ ● ● ● ● ● ● ● ● C02 Command Center ● ● ● ● ● ○ ● ○ - - - ○ - C03 Spraak ○ - - - - - ○ - - - - ○ - C04 Block/Artifact ● ● ● ● ● - ● - - - - - - C05 Intent Registry ● ● ● ● ● - ● - - - - - - C06 Reflex ● ● ● ● ● - ● - - - - - - C07 Orchestrator ○ ○ ○ ○ ○ - ○ - - - - - - C08 Entity Extract ● - ● ● ● - ● - - - - - - C09 Action System ● ● ● ● ● - ● - - - - - - C10 Protocol Engine ● ● - - - ● ● ● - - - - - C15 Rapportage Svc ● ● - - - - ● - - - ● ● - C16 Overdracht Svc - ● - - - - - - - - - - - C17 Agenda Svc - - - ● ● - - - - - - - - C18 Behandelplan - - - - - ● - - - ○ - - - C21 Patiënt Svc ● ● ● ● - ● ● ● - ● - - ● C22 Toestemming - - - - - - - ● - - - - - C24 Multi-tenancy ● ● ● ● ● ● ● ● ● ● ● ● ● C25 RBAC/ABAC ● ● ● ● ● ● ● ● ● ● ● ● ● C26 Audit Trail ● ● ● ● ● ● ● ● ● ● ● ● ● C27 Field Encrypt - - ○ - - - - ● - ● - - - C28 FHIR Export - - - - - - - - - ● - - - C30 Observability ● ● ● ● ● ● ● ● ● ● ● ● ● C31 Circuit Breaker ○ ● - - - - - - - - - - - C33 PII Filter ○ ● - - - - - - - - - - - C34 Wvggz Svc - - - - - - - ● - - - - - ``` **Leeswijzer**: C24 (Multi-tenancy), C25 (RBAC), C26 (Audit) en C30 (Observability) zijn nodig voor **elke** use case. Dit zijn de vier horizontale lagen die als eerste gebouwd moeten worden. --- ## 6. Bouwvolgorde — Prioritering op basis van gaps ### Fase 0: Horizontale lagen (weken 1-4) Bouw de vier componenten die **elke** use case nodig heeft: ``` Week 1-2: C24 Multi-tenancy (RLS, tenant context middleware) C26 Audit Trail (immutable log, NEN 7513) Week 3-4: C25 RBAC + ABAC Engine (rollen, policies, evaluatie) C30 Observability (Pino structured logging) ``` **Waarom eerst**: Zonder deze vier werkt geen enkele enterprise use case. Retrofit is exponentieel duurder. ### Fase 1: Intent systeem solide maken (weken 5-6) ``` Week 5: C05 Intent Registry (centraliseer patronen uit reflex-classifier) C06 Reflex refactor (lees uit Registry) C07 Orchestrator refactor (unified pipeline met Classify) Week 6: C10 Protocol Engine activeren (nudge.ts aansluiten) C15 Rapportage versioning + soft delete (G6) C33 PII Filter uitbreiden ``` **Na deze fase**: UC-01 t/m UC-20 werken enterprise-grade. ### Fase 2: Ontbrekende GGZ-modules (weken 7-12) ``` Week 7-8: C18 Behandelplan Service (UC-21) C19 Medicatie Service (UC-22) Week 9-10: C22 Toestemming Service (UC-25) C34 Wvggz Service (UC-24) UC-23 Incident/MIC formulier Week 11-12: C27 Field Encryption (BSN, diagnoses) C23 Auth uitbreiden (SSO/SAML, MFA) UC-33 Break-the-glass noodtoegang ``` ### Fase 3: Knowledge Layer + interoperabiliteit (weken 13-18) ``` Week 13-14: C11 Protocol Rules Store (database) C13 Regelvalidatie UI (admin) Week 15-16: C12 RAG Pipeline (pgvector, protocol indexering) C14 Kennisbron Connectors (eerste protocollen inladen) Week 17-18: C28 FHIR Export (alle resources) C29 CDS Hooks Service C32 Health Check + C31 Circuit Breaker generaliseren ``` --- ## 7. Technische Specificaties per Component ### 7.1 C24 Multi-tenancy — Specificatie **Verantwoordelijkheid**: Isoleer data per instelling/tenant. **Database wijzigingen**: - `tenant_id UUID NOT NULL` kolom op ELKE tabel met patiëntdata - RLS policy per tabel: `USING (tenant_id = get_current_tenant())` - Helper function: `get_current_tenant()` leest uit `app.current_tenant_id` setting **Middleware**: ```typescript // Elke request: // 1. Haal user op uit Supabase Auth // 2. Lees tenant_id uit user metadata // 3. Zet als header voor Server Components // 4. Zet als PostgreSQL setting voor RLS ``` **Bestanden**: - `lib/auth/tenant-context.ts` — Helper om tenant te zetten/lezen - `middleware.ts` — Injecteer tenant in elke request - Migratie: `add_tenant_id_to_all_tables.sql` - Migratie: `create_rls_policies.sql` **Test**: Maak twee tenants, voeg patiënt toe aan tenant A, verifieer dat tenant B de patiënt NIET kan zien. --- ### 7.2 C26 Audit Trail — Specificatie **Verantwoordelijkheid**: Onwijzigbare log van alle toegang en wijzigingen aan patiëntdata. **Database**: - Tabel `audit_logs` (zie enterprise-epd-architectuur.md §5.2) - Partitionering per maand - Triggers die UPDATE/DELETE blokkeren - Hash chain voor integriteitsverificatie **API**: ```typescript // lib/audit/logger.ts logAuditEvent({ entityType, entityId, action, purpose, cortexIntent?, metadata? }) // Automatisch: // - user_id, user_role, user_name uit auth context // - tenant_id uit tenant context // - timestamp server-side // - data_hash berekend // - previous_hash opgehaald ``` **Integratiepunten**: Elke API route roept `logAuditEvent()` aan na succesvolle actie. Dit is een **hard requirement** — geen route zonder audit log. **Bestanden**: - `lib/audit/logger.ts` — Core logging functie - `lib/audit/hash.ts` — Hash chain berekening - `app/api/audit/route.ts` — Query endpoint (admin only) - Migratie: `create_audit_logs.sql` --- ### 7.3 C25 RBAC + ABAC — Specificatie **Verantwoordelijkheid**: Bepaal of een gebruiker een actie mag uitvoeren op een resource. **Twee lagen**: 1. **RBAC** (snel): Rol → vaste permissions set 2. **ABAC** (verfijnd): Context-afhankelijke policies (toewijzing, toestemming, tijdvenster) **API**: ```typescript // lib/access-control/evaluator.ts const { allowed, reason } = await evaluateAccess({ userId, action, resource, resourceId, tenantId }); if (!allowed) { return Response.json({ error: 'Geen toegang', reason }, { status: 403 }); } ``` **Bestanden**: - `lib/access-control/roles.ts` — Rol definities en basis permissions - `lib/access-control/policies.ts` — ABAC policy definities - `lib/access-control/evaluator.ts` — Policy evaluatie engine - Migratie: `create_access_policies.sql` --- ### 7.4 C05 Intent Registry — Specificatie **Verantwoordelijkheid**: Single source of truth voor alle intent definities. **Structuur per intent**: ```typescript interface IntentDefinition { id: CortexIntent; // 'dagnotitie', 'zoeken', etc. label: { nl: string; en: string }; // Mensleesbare labels description: string; // Voor LLM context priority: 'P1' | 'P2' | 'P3'; // Reflex patterns reflexPatterns: Array<{ pattern: RegExp; weight: number; extractHints?: string[]; // Welke entities te extracten }>; // Orchestrator hints aiExamples: Array<{ input: string; expectedIntent: CortexIntent; expectedEntities: Record; }>; // Entity configuratie entities: { required: string[]; // Welke entities verplicht optional: string[]; }; // Action mapping artifactType: string; // Welk block/formulier openen requiresConfirmation: boolean; // Destructieve actie? // Access control allowedRoles?: string[]; // Welke rollen mogen dit intent gebruiken featureFlag?: string; // Feature flag voor geleidelijke uitrol enabled: boolean; } ``` **Opslag**: TypeScript config file (fase 1), migreerbaar naar database (fase 3). **Bestanden**: - `lib/cortex/registry/intent-registry.ts` — Registry class - `lib/cortex/registry/definitions/dagnotitie.ts` — Per intent een definitie - `lib/cortex/registry/definitions/zoeken.ts` - `lib/cortex/registry/definitions/index.ts` — Barrel export - `lib/cortex/registry/types.ts` — IntentDefinition interface --- ### 7.5 C10 Protocol Engine — Specificatie **Verantwoordelijkheid**: Evalueer klinische regels na afgeronde acties. Stel vervolgacties voor. **Pure function**: `(completedAction, patientContext, rules) → suggestions[]` **Regel evaluatie**: ```typescript // lib/cortex/protocol-engine/evaluator.ts async function evaluateRules( completedAction: CompletedAction, patientContext: PatientContext, rules: ProtocolRule[] ): Promise { const applicableRules = rules.filter(rule => rule.status === 'actief' && rule.trigger.afterIntent?.includes(completedAction.intent) ); const suggestions: NudgeSuggestion[] = []; for (const rule of applicableRules) { const conditionMet = await evaluateCondition(rule.condition, patientContext); if (conditionMet) { suggestions.push({ ruleId: rule.id, message: rule.suggestion.message, priority: rule.suggestion.priority, evidence: rule.suggestion.evidence, suggestedIntent: rule.suggestion.suggestedIntent, source: rule.source, }); } } return suggestions.sort((a, b) => a.priority.localeCompare(b.priority) // P1 eerst ); } ``` **Bestanden**: - `lib/cortex/protocol-engine/evaluator.ts` — Rule evaluatie - `lib/cortex/protocol-engine/conditions.ts` — Conditie evaluatie (static + query) - `lib/cortex/protocol-engine/rules/` — Gevalideerde regels per domein - `app/api/cortex/nudge/route.ts` — API endpoint --- ## 8. Validatie Conclusie ### De architectuur ondersteunt alle use cases MITS: 1. **De vier horizontale lagen eerst gebouwd worden** (G1-G3 + G14): multi-tenancy, audit, RBAC, logging 2. **Het intent systeem gecentraliseerd wordt** (G4): Intent Registry als single source of truth 3. **De Protocol Engine aangesloten wordt** (G5): nudge.ts → protocol-engine met rules store 4. **Ontbrekende GGZ-modules gebouwd worden** (G8-G12): behandelplan, medicatie, Wvggz, incidenten ### Wat de architectuur GOED doet: - Dual interface (traditioneel + intent) ondersteunt alle use cases via twee paden - De pipeline (Registry → Classify → Resolve → Action → Protocol) is generiek genoeg voor nieuwe intents - Multi-tenancy via RLS is pragmatisch en past bij Supabase - Audit trail als horizontale laag dekt alle use cases zonder per-module implementatie ### Wat nog aandacht nodig heeft: - ~~**Notificatie service** (niet in architectuur): incidenten, Wvggz-termijnen, break-the-glass alerts~~ → **Opgelost: C34** (zie `enterprise-componenten-uitbreiding.md`) - **Groepstherapie** (UC-32): één rapportage voor meerdere patiënten — huidige datamodel is 1:1 - ~~**Caching strategie**: AI-samenvattingen zijn duur, caching ontbreekt in architectuur~~ → **Opgelost: C37** (zie `enterprise-componenten-uitbreiding.md`) - **Offline support**: niet besproken, maar relevant voor mobiele zorgverleners ### Uitbreiding: 10 nieuwe componenten (C34–C43) Na de initiële gap analyse zijn 10 aanvullende enterprise componenten geïdentificeerd en gespecificeerd. Deze zijn gedocumenteerd in **`enterprise-componenten-uitbreiding.md`** en omvatten: | Component | Laag | Status | |-----------|------|--------| | C34 Notificatie Service | Platform Services | Interface gedefinieerd | | C35 Workflow Engine (State Machine) | Platform Services | Interface + voorbeeldworkflows | | C36 Full-Text Search | Platform Services | Interface + PostgreSQL tsvector schema | | C37 Caching Layer | Platform Services | Interface + TTL strategie | | C38 Scheduled Jobs | Platform Services | Interface + job definities | | C39 Webhook System | Platform Services | Interface + security (HMAC) | | C40 ZPM Facturatie | Externe Integraties | Interface + database schema | | C41 Vecozo Connector | Externe Integraties | Interface + mock (voorbereiding) | | C42 Zorgdomein Connector | Externe Integraties | Interface + mock (voorbereiding) | | C43 BI Module | Analytics | Materialized views gedefinieerd | De gap items G19 (notificatie) en G20 (caching) uit §4.3 zijn hiermee opgelost. Zie het uitbreidingsdocument voor volledige interface definities, database schemas en integratiepunten.