| Epic | Status | Wat is gedaan |

|---------------------|---------------|---------------------|
  | E0: Foundation      |  Afgerond    | Types + DB migratie |
  | E1: Leefgebieden    |  Afgerond    | 3 componenten       |
  | E2: AI Generatie    |  Nog te doen | -                   |
  | E3: Behandelplan UI |  Nog te doen | -                   |

  Gemaakte bestanden:
  - lib/types/leefgebieden.ts - 7 domeinen met kleuren/emoji's
  - lib/types/behandelplan.ts - SMART doelen, interventies, Zod schemas
  - components/behandelplan/leefgebieden-form.tsx - Intake formulier
  - components/behandelplan/leefgebieden-scores.tsx - Score weergave
  - components/behandelplan/leefgebieden-badge.tsx - Domain badges
  - components/behandelplan/index.ts - Exports
This commit is contained in:
colinislit
2025-12-04 09:09:23 +01:00
parent 8e8a8e6f49
commit 621e1c90f9
22 changed files with 3369 additions and 12 deletions

View File

@@ -0,0 +1,438 @@
# Mission Control — Bouwplan Behandelplan Module
**Projectnaam:** Mini-EPD Prototype - Behandelplan Module
**Versie:** v1.0
**Datum:** 03-12-2024
**Auteur:** Colin Lit
---
## 1. Doel en context
**Doel:**
Een werkende MVP Behandelplan module bouwen die demonstreert hoe AI:
- **Tijdsbesparing** realiseert: van 30+ minuten naar 2-5 minuten
- **Kwaliteitsverbetering** biedt: SMART-doelen, evidence-based interventies
- **Transparantie** creëert: cliënt kan eigen plan begrijpen (B1-taal)
- **Praktische workflow** ondersteunt: intake → diagnose → behandelplan
**Context:**
Deze module is onderdeel van de AI Speedrun LinkedIn Serie. Het prototype demonstreert AI-toegevoegde waarde voor zorgprofessionals, product owners en developers.
**Gerelateerde documenten:**
- [PRD Behandelplan v2.0](./prd-behandelplan-v2-final.md)
- [FO Behandelplan v1.0](./fo-behandelplan-v1.md)
- [TO Behandelplan v1.0](./to-behandelplan-v1.md)
---
## 2. Uitgangspunten
### 2.1 Technische Stack
| Component | Technologie | Status |
|-----------|-------------|--------|
| **Frontend** | Next.js 14.2 + TailwindCSS + shadcn/ui | ✅ Bestaand |
| **Backend** | Next.js API Routes + Server Actions | ✅ Bestaand |
| **Database** | Supabase PostgreSQL + RLS | ✅ Bestaand |
| **AI/ML** | Claude 3.5 Sonnet (Anthropic) | ✅ Bestaand |
| **Hosting** | Vercel | ✅ Bestaand |
| **Auth** | Supabase Auth | ✅ Bestaand |
| **Icons** | Lucide React | ✅ Bestaand |
| **Editor** | TipTap | ✅ Bestaand |
| **Validation** | Zod | ✅ Bestaand |
| **Charts** | Recharts | ⏳ Stretch goal |
### 2.2 Projectkaders
| Kader | Waarde |
|-------|--------|
| **Tijd** | 14-19 uur bouwtijd voor MVP |
| **Budget** | €0 extra (bestaande API keys) |
| **Team** | 1 developer + AI assistentie |
| **Data** | Fictieve demo-data (geen productiegegevens) |
| **Doel** | Werkende demo voor LinkedIn serie |
### 2.3 Gekozen Aanpak
- **Foundation first**: Types en database migraties eerst, dan UI
- **Simpele visualisatie**: Progress bars i.p.v. radar chart (stretch)
- **Simple JSON**: Geen streaming, enkele API call met loading state
### 2.4 Programmeer Uitgangspunten
**Code Quality Principles:**
- **DRY (Don't Repeat Yourself)**
- Herbruikbare leefgebieden componenten
- Centrale types voor behandelplan structuur
- Utility functions voor score berekeningen
- **KISS (Keep It Simple, Stupid)**
- Simple JSON API (geen streaming complexity)
- Progress bars i.p.v. radar chart
- Bestaande UI patterns hergebruiken
- **SOC (Separation of Concerns)**
- Types in `/lib/types/behandelplan.ts`
- AI prompts in `/lib/ai/behandelplan-prompt.ts`
- Server actions in `/app/epd/patients/[id]/behandelplan/actions.ts`
- UI components in `/components/behandelplan/`
- **YAGNI (You Aren't Gonna Need It)**
- Geen versie-diff view (stretch)
- Geen real-time collaboration
- Geen notificaties/reminders
**Development Practices:**
- **Error Handling**
- Try-catch op alle AI calls
- Fallback naar manual mode bij AI failure
- User-friendly foutmeldingen
- **Security**
- ANTHROPIC_API_KEY in environment
- RLS policies op care_plans
- Zod validation op alle inputs
- **Performance**
- AI response < 8 seconden
- Skeleton loaders tijdens generatie
- Optimistic updates voor status
---
## 3. Epics & Stories Overzicht
| Epic ID | Titel | Doel | Status | Stories | Geschat |
|---------|-------|------|--------|---------|---------|
| E0 | Foundation | Types, database schema | ⏳ To Do | 3 | 2-3 uur |
| E1 | Leefgebieden | Intake formulier + score weergave | ⏳ To Do | 3 | 3-4 uur |
| E2 | AI Generatie | Claude API endpoint + prompts | ⏳ To Do | 3 | 3-4 uur |
| E3 | Behandelplan UI | Pagina + componenten | ⏳ To Do | 5 | 6-8 uur |
| E4 | Stretch | Micro-regeneratie, radar chart | ⏳ Optioneel | 3 | 3-5 uur |
**Totaal MVP (E0-E3):** 14-19 uur
**Totaal met Stretch:** 17-24 uur
---
## 4. Epics & Stories (Uitwerking)
### Epic 0 — Foundation (Types & Database)
**Epic Doel:** Solide basis met TypeScript types en database schema uitbreiding.
| Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | SP |
|----------|--------------|---------------------|--------|------------------|----|
| E0.S1 | Leefgebieden types maken | `lib/types/leefgebieden.ts` met LifeDomain, LifeDomainScore types | ⏳ | — | 1 |
| E0.S2 | Behandelplan types maken | `lib/types/behandelplan.ts` met SmartGoal, Intervention, GeneratedPlan types + Zod schemas | ⏳ | E0.S1 | 2 |
| E0.S3 | Database migratie | `care_plans` uitgebreid met version, behandelstructuur, evaluatiemomenten; `intakes` met life_domains | ⏳ | E0.S2 | 2 |
**Technical Notes:**
```typescript
// lib/types/leefgebieden.ts
export type LifeDomain = 'dlv' | 'wonen' | 'werk' | 'sociaal' | 'vrijetijd' | 'financien' | 'gezondheid'
export interface LifeDomainScore {
domain: LifeDomain
baseline: number // 1-5
current: number // 1-5
target: number // 1-5
notes: string
priority: 'laag' | 'middel' | 'hoog'
}
```
**Deliverables:**
- [ ] `lib/types/leefgebieden.ts`
- [ ] `lib/types/behandelplan.ts`
- [ ] Database migratie via Supabase MCP (cloud-only, geen lokale instantie)
- [ ] Gegenereerde database types via `mcp__supabase__generate_typescript_types`
---
### Epic 1 — Leefgebieden Componenten
**Epic Doel:** Formulier voor intake + visuele weergave van scores.
| Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | SP |
|----------|--------------|---------------------|--------|------------------|----|
| E1.S1 | Leefgebieden formulier | 7 sliders (1-5), toelichting velden, prioriteit dropdowns | ⏳ | E0.S3 | 3 |
| E1.S2 | Leefgebieden scores weergave | 7 progress bars met kleuren, baseline vs current indicator | ⏳ | E0.S1 | 2 |
| E1.S3 | Leefgebieden badge component | Gekleurde tag per domein met emoji | ⏳ | E0.S1 | 1 |
**Technical Notes:**
```typescript
// Kleuren per leefgebied
const DOMAIN_COLORS = {
dlv: '#8b5cf6', // paars
wonen: '#ec4899', // roze
werk: '#f59e0b', // oranje
sociaal: '#3b82f6', // blauw
vrijetijd: '#10b981', // groen
financien: '#eab308', // geel
gezondheid: '#ef4444', // rood
}
```
**Deliverables:**
- [ ] `components/behandelplan/leefgebieden-form.tsx`
- [ ] `components/behandelplan/leefgebieden-scores.tsx`
- [ ] `components/behandelplan/leefgebieden-badge.tsx`
---
### Epic 2 — AI Generatie
**Epic Doel:** Claude API endpoint voor behandelplan generatie.
| Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | SP |
|----------|--------------|---------------------|--------|------------------|----|
| E2.S1 | Prompt engineering | System prompt + user prompt templates, evidence-based mapping | ⏳ | E0.S2 | 2 |
| E2.S2 | Generate endpoint | `POST /api/behandelplan/generate` retourneert JSON, < 8 sec response | ⏳ | E2.S1 | 3 |
| E2.S3 | AI event logging | Calls loggen naar `ai_events` tabel | ⏳ | E2.S2 | 1 |
**Technical Notes:**
```typescript
// Prompt structuur
const messages = [
{ role: 'system', content: BEHANDELPLAN_SYSTEM_PROMPT },
{ role: 'user', content: buildUserPrompt(context) },
];
// AI settings
const settings = {
model: 'claude-3-5-sonnet-20240620',
max_tokens: 4096,
temperature: 0.3, // Consistent maar niet robotisch
};
```
**Deliverables:**
- [ ] `lib/ai/behandelplan-prompt.ts`
- [ ] `lib/ai/intervention-mapping.ts`
- [ ] `app/api/behandelplan/generate/route.ts`
---
### Epic 3 — Behandelplan UI
**Epic Doel:** Werkende behandelplan pagina met alle componenten.
| Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | SP |
|----------|--------------|---------------------|--------|------------------|----|
| E3.S1 | Behandelplan pagina | Placeholder vervangen, data loading, status weergave | ⏳ | E2.S2 | 2 |
| E3.S2 | Generate button + flow | Button triggert AI, loading state, resultaat weergave | ⏳ | E3.S1 | 2 |
| E3.S3 | SMART doelen sectie | Goal cards met progress, status, leefgebied badge | ⏳ | E3.S1, E1.S3 | 3 |
| E3.S4 | Interventies sectie | Intervention cards met gekoppelde doelen | ⏳ | E3.S3 | 2 |
| E3.S5 | Server actions | Create, update, delete, publish behandelplan | ⏳ | E3.S1 | 2 |
**Technical Notes:**
```
/app/epd/patients/[id]/behandelplan/
├── page.tsx # Server component
├── actions.ts # Server actions
└── components/
├── behandelplan-view.tsx
├── generate-button.tsx
├── goals-section.tsx
├── goal-card.tsx
└── interventions-section.tsx
```
**Deliverables:**
- [ ] `app/epd/patients/[id]/behandelplan/page.tsx` (vervangen)
- [ ] `app/epd/patients/[id]/behandelplan/actions.ts`
- [ ] `components/behandelplan/behandelplan-view.tsx`
- [ ] `components/behandelplan/generate-button.tsx`
- [ ] `components/behandelplan/goals-section.tsx`
- [ ] `components/behandelplan/goal-card.tsx`
- [ ] `components/behandelplan/interventions-section.tsx`
---
### Epic 4 — Stretch Goals (Optioneel)
**Epic Doel:** Extra features indien tijd beschikbaar.
| Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | SP |
|----------|--------------|---------------------|--------|------------------|----|
| E4.S1 | Micro-regeneratie | Per doel [↻] knop, modal met instructie, nieuw voorstel | ⏳ | E3.S3 | 3 |
| E4.S2 | Radar chart | Recharts installeren, 3-lijn spindiagram | ⏳ | E1.S2 | 3 |
| E4.S3 | Sessie-planning | Tabel met 8-12 sessies, status per sessie | ⏳ | E3.S1 | 2 |
**Technical Notes:**
- Recharts: `pnpm add recharts`
- Regenerate endpoint: `POST /api/behandelplan/regenerate-section`
---
## 5. Kwaliteit & Testplan
### Test Types
| Test Type | Scope | Tools | Status |
|-----------|-------|-------|--------|
| Unit Tests | Types, utilities | Vitest | ⏳ Nice to have |
| Integration | API endpoints | Manual + curl | ✅ Required |
| Smoke Tests | Happy flow | Manual checklist | ✅ Required |
| Performance | AI response time | Network tab | ✅ Required |
### Manual Test Checklist (Demo)
**Pre-conditions:**
- [ ] Patient bestaat met intake data
- [ ] Diagnose/probleemprofiel is ingevuld
- [ ] Leefgebieden scores zijn ingevuld
**Happy Flow:**
- [ ] Behandelplan pagina laadt zonder errors
- [ ] "Genereer Behandelplan" knop is zichtbaar
- [ ] AI genereert plan binnen 8 seconden
- [ ] 2-4 SMART doelen worden getoond
- [ ] Doelen hebben leefgebied badges
- [ ] Interventies zijn gekoppeld aan doelen
- [ ] B1-taal versie is beschikbaar per doel
- [ ] Plan kan worden opgeslagen
- [ ] Status kan worden gewijzigd (concept → actief)
**Error Scenarios:**
- [ ] Geen intake data → "Vul eerst intake in" melding
- [ ] AI API error → "AI niet beschikbaar" melding + retry optie
- [ ] Validatie error → Inline error messages
---
## 6. Demo & Presentatieplan
### Demo Scenario
**Duur:** 5-7 minuten
**Doelgroep:** LinkedIn audience (product owners, developers, zorgprofessionals)
**Flow:**
1. **Context** (30 sec)
- "Behandelplan schrijven kost 30+ minuten"
- "AI kan dit reduceren naar 2-5 minuten"
2. **Leefgebieden invullen** (1 min)
- Toon 7 domeinen met sliders
- Prioriteiten instellen
- Opslaan
3. **AI Generatie** (2 min)
- Klik op "Genereer Behandelplan"
- Toon loading state met timer
- Resultaat verschijnt (< 5 sec)
4. **Resultaat bekijken** (2 min)
- SMART doelen met leefgebied tags
- B1-taal versie voor cliënt
- Evidence-based interventies
- Behandelstructuur
5. **Aanpassen** (1 min)
- Doel bewerken
- Status wijzigen
- Publiceren
**Key Highlights:**
- Tijdsbesparing: 30 min → 5 min
- Kwaliteit: SMART-criteria automatisch
- Transparantie: B1-taal voor cliënt
---
## 7. Risico's & Mitigatie
| Risico | Kans | Impact | Mitigatie | Owner |
|--------|------|--------|-----------|-------|
| AI genereert invalide JSON | Middel | Hoog | Zod validation, retry (2x), fallback message | Dev |
| AI response > 8 seconden | Laag | Middel | Timeout handling, loading feedback | Dev |
| Leefgebieden UI te complex | Middel | Middel | Simpele sliders, geen radar chart (MVP) | Dev |
| Database migratie faalt | Laag | Hoog | Test lokaal eerst, rollback script | Dev |
| Prompt geeft slechte output | Middel | Hoog | Itereren op prompt, few-shot examples | Dev |
| Scope creep | Hoog | Middel | Strikte MVP scope, stretch als optioneel | Dev |
---
## 8. Implementatie Volgorde
```
Week 1 (14-19 uur totaal)
├── Dag 1: E0 - Foundation (2-3 uur)
│ ├── E0.S1: Leefgebieden types
│ ├── E0.S2: Behandelplan types
│ └── E0.S3: Database migratie
├── Dag 2: E1 - Leefgebieden (3-4 uur)
│ ├── E1.S1: Formulier component
│ ├── E1.S2: Scores weergave
│ └── E1.S3: Badge component
├── Dag 3: E2 - AI Generatie (3-4 uur)
│ ├── E2.S1: Prompt engineering
│ ├── E2.S2: Generate endpoint
│ └── E2.S3: Event logging
└── Dag 4-5: E3 - UI (6-8 uur)
├── E3.S1: Behandelplan pagina
├── E3.S2: Generate button
├── E3.S3: Doelen sectie
├── E3.S4: Interventies sectie
└── E3.S5: Server actions
Optioneel (indien tijd):
└── E4 - Stretch Goals
├── E4.S1: Micro-regeneratie
├── E4.S2: Radar chart
└── E4.S3: Sessie-planning
```
---
## 9. Referenties
### Mission Control Documents
- **PRD** — [prd-behandelplan-v2-final.md](./prd-behandelplan-v2-final.md)
- **FO** — [fo-behandelplan-v1.md](./fo-behandelplan-v1.md)
- **TO** — [to-behandelplan-v1.md](./to-behandelplan-v1.md)
- **UX/UI** — [ux-stylesheet.md](../ux-stylesheet.md)
### Bestaande Code
- API pattern: `/app/api/reports/classify/route.ts`
- Server actions: `/app/epd/patients/[id]/intakes/[intakeId]/actions.ts`
- Types pattern: `/lib/types/report.ts`
- AI integration: `/app/api/docs/chat/route.ts`
### External Resources
- Repository: `github.com/[org]/15-mini-epd-prototype`
- Anthropic Docs: https://docs.anthropic.com/claude/reference
- Supabase Docs: https://supabase.com/docs
---
## 10. Glossary & Abbreviations
| Term | Betekenis |
|------|-----------|
| SMART | Specifiek, Meetbaar, Acceptabel, Realistisch, Tijdgebonden |
| B1-taal | Taalniveau begrijpelijk voor algemeen publiek |
| Leefgebieden | 7 levensdomeinen volgens herstelgerichte zorg |
| DSM | Diagnostic and Statistical Manual (diagnose classificatie) |
| RLS | Row Level Security (Supabase) |
| FHIR | Fast Healthcare Interoperability Resources |
| Care Plan | FHIR resource voor behandelplan |
| SP | Story Points |
| MVP | Minimum Viable Product |
---
**Versiehistorie:**
| Versie | Datum | Auteur | Wijziging |
|--------|-------|--------|-----------|
| v1.0 | 03-12-2024 | Colin Lit | Initiële versie |

View File

@@ -0,0 +1,566 @@
# Functioneel Ontwerp (FO) — Behandelplan Module
**Projectnaam:** Mini-EPD Prototype - AI Speedrun
**Versie:** v1.0
**Datum:** 03-12-2024
**Auteur:** Colin Lit
---
## 1. Doel en relatie met het PRD
**Doel van dit document:**
Dit Functioneel Ontwerp beschrijft **hoe** de Behandelplan module uit het PRD functioneel werkt — wat de behandelaar ziet, doet en ervaart bij het genereren en beheren van behandelplannen met AI-ondersteuning.
**Relatie met PRD:**
- PRD: `prd-behandelplan-v2-final.md` — beschrijft *wat* en *waarom*
- FO (dit document): beschrijft *hoe* dit in de praktijk werkt
**Scope:**
- MVP-functionaliteit (Fase 1-4 uit implementatieplan)
- Foundation first aanpak (types → componenten → AI → UI)
- Simpele leefgebieden visualisatie (progress bars, geen radar chart)
- Simple JSON API (geen streaming)
---
## 2. Overzicht van de belangrijkste onderdelen
De Behandelplan module bestaat uit de volgende onderdelen:
| # | Onderdeel | Beschrijving |
|---|-----------|--------------|
| 1 | **Leefgebieden Intake** | Formulier voor 7 levensdomeinen met scores en prioriteiten |
| 2 | **AI Generatie** | Knop om behandelplan te laten genereren op basis van intake + diagnose |
| 3 | **Behandelplan Overzicht** | Hoofdpagina met structuur, doelen, interventies |
| 4 | **SMART Doelen** | Lijst van 2-4 behandeldoelen met voortgang |
| 5 | **Interventies** | Evidence-based interventies gekoppeld aan doelen |
| 6 | **Sessie-planning** | Tabel met geplande sessies (stretch) |
| 7 | **Evaluatiemomenten** | Tussentijdse en eindevaluatie (stretch) |
---
## 3. User Stories
### Primaire User Stories (MVP)
| ID | Rol | Doel / Actie | Verwachte waarde | Prioriteit |
|----|-----|--------------|------------------|------------|
| US-01 | Behandelaar | Leefgebieden scores invullen bij intake | Gestructureerd beeld van cliëntsituatie | Hoog |
| US-02 | Behandelaar | AI behandelplan laten genereren | Van 30 min naar 2-5 min tijdsbesparing | Hoog |
| US-03 | Behandelaar | SMART doelen bekijken en aanpassen | Kwaliteitsverbetering, passend bij cliënt | Hoog |
| US-04 | Behandelaar | Interventies koppelen aan doelen | Evidence-based behandeling | Hoog |
| US-05 | Behandelaar | Specifiek doel laten regenereren | Fijnafstelling zonder alles opnieuw | Middel |
| US-06 | Behandelaar | Plan publiceren (concept → actief) | Cliënt kan plan inzien | Middel |
### Secundaire User Stories (Stretch)
| ID | Rol | Doel / Actie | Verwachte waarde | Prioriteit |
|----|-----|--------------|------------------|------------|
| US-07 | Behandelaar | Sessie-planning invullen | Overzicht behandeltraject | Laag |
| US-08 | Behandelaar | Evaluatiemoment vastleggen | Voortgang meten en bijsturen | Laag |
| US-09 | Cliënt | Eigen behandelplan bekijken (B1-taal) | Transparantie en begrip | Laag |
---
## 4. Functionele werking per onderdeel
### 4.1 Leefgebieden Intake
**Locatie:** Onderdeel van intake-flow of aparte tab binnen cliëntdossier
**Functionaliteit:**
- Formulier met 7 levensdomeinen (leefgebieden)
- Per domein:
- **Score slider:** 1-5 (1 = zeer problematisch, 5 = goed)
- **Toelichting:** Vrij tekstveld voor context
- **Prioriteit:** Dropdown (Laag / Middel / Hoog)
**De 7 Leefgebieden:**
| # | Domein | Emoji | Kleur | Voorbeeldvragen |
|---|--------|-------|-------|-----------------|
| 1 | Dagelijkse Levensverrichtingen (DLV) | 🏠 | `#8b5cf6` | Zelfzorg, structuur, dagritme |
| 2 | Wonen | 🏡 | `#ec4899` | Woonsituatie, veiligheid thuis |
| 3 | Werk/Dagbesteding | 💼 | `#f59e0b` | Baan, opleiding, vrijwilligerswerk |
| 4 | Sociaal netwerk | 👥 | `#3b82f6` | Familie, vrienden, relaties |
| 5 | Vrijetijd/Zingeving | 🎯 | `#10b981` | Hobby's, levensdoel, spiritualiteit |
| 6 | Financiën | 💰 | `#eab308` | Schulden, inkomen, budgettering |
| 7 | Lichamelijke gezondheid | 🏃 | `#ef4444` | Slaap, beweging, voeding |
**Gedrag:**
- Opslaan: Data wordt opgeslagen als JSONB in intake/care_plan record
- Validatie: Alle 7 domeinen moeten een score hebben
- Weergave: Na opslaan worden scores getoond als progress bars met kleuren
**States:**
- **Leeg:** "Vul de leefgebieden in om een compleet beeld te krijgen"
- **Gedeeltelijk:** Waarschuwing bij minder dan 7 domeinen
- **Compleet:** Groen vinkje, klaar voor behandelplan generatie
---
### 4.2 AI Behandelplan Generatie
**Locatie:** Behandelplan tab binnen cliëntdossier
**Trigger:** Knop `[⚡ Genereer Behandelplan]`
**Voorwaarden:**
- Intake notities aanwezig (uit rich text editor)
- Diagnose/probleemprofiel ingevuld (DSM-categorie + severity)
- Leefgebieden scores ingevuld (7 domeinen)
**Input naar AI:**
```
- Intake tekst (samenvatting of volledige notities)
- DSM-categorie (bijv. "Angststoornissen")
- Severity niveau (Laag / Middel / Hoog)
- Leefgebieden scores met prioriteiten
- Optioneel: extra instructies van behandelaar
```
**AI Processing:**
- Model: Claude 3.5 Sonnet
- Response tijd: < 5 seconden
- Output: Gestructureerde JSON
**Output van AI:**
1. **Behandelstructuur:** Duur, frequentie, aantal sessies, vorm
2. **SMART Doelen:** 2-4 doelen verdeeld over leefgebieden
3. **Interventies:** Evidence-based, gekoppeld aan doelen
4. **Sessie-planning:** Grove indeling (8-12 sessies)
5. **Evaluatiemomenten:** Tussentijds + eind
6. **Veiligheidsplan:** Alleen bij severity "Hoog"
**UI tijdens generatie:**
```
┌─────────────────────────────────────┐
│ ⚡ Behandelplan wordt gegenereerd...│
│ │
│ [████████████░░░░░░░] 75% │
│ │
│ Even geduld, dit duurt ~5 seconden │
└─────────────────────────────────────┘
```
**Na generatie:**
- Plan verschijnt in bewerkbare vorm
- Status: "Concept" (niet gepubliceerd)
- Behandelaar kan reviewen en aanpassen
---
### 4.3 Behandelplan Overzicht (Hoofdpagina)
**Locatie:** `/epd/patients/[id]/behandelplan`
**Layout:**
```
┌─────────────────────────────────────────────────────────────┐
│ HEADER │
│ Behandelplan v1 Status: ● Concept │
│ [Bewerken] [Publiceer] [Nieuwe Versie] │
├─────────────────────────────────────────────────────────────┤
│ │
│ 📋 BEHANDELSTRUCTUUR │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Duur: 8 weken | Frequentie: Wekelijks | Sessies: 8 ││
│ │ Vorm: Individueel ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ 🌐 LEEFGEBIEDEN OVERZICHT │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ DLV ████████░░ 4/5 Baseline: 3 ││
│ │ Wonen ████████░░ 4/5 Baseline: 4 ││
│ │ Werk ⚠️ ████░░░░░░ 2/5 Baseline: 2 [Prioriteit] ││
│ │ Sociaal ⚠️ ████░░░░░░ 2/5 Baseline: 2 [Prioriteit] ││
│ │ Vrijetijd ██████░░░░ 3/5 Baseline: 3 ││
│ │ Financiën ██████░░░░ 3/5 Baseline: 3 ││
│ │ Gezondheid ████████░░ 4/5 Baseline: 4 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ 🎯 SMART DOELEN (3) │
│ [Doel cards - zie 4.4] │
│ │
│ 💡 INTERVENTIES (2) │
│ [Interventie cards - zie 4.5] │
│ │
└─────────────────────────────────────────────────────────────┘
```
**Acties:**
- `[Bewerken]`: Opent inline editing modus
- `[Publiceer]`: Wijzigt status naar "Actief", zichtbaar voor cliënt
- `[Nieuwe Versie]`: Maakt v2 aan op basis van huidige versie
**Status indicatoren:**
- 🔵 Concept - Bewerkbaar, niet zichtbaar voor cliënt
- 🟢 Actief - Gepubliceerd, zichtbaar voor cliënt
- 🟡 In evaluatie - Evaluatiemoment gepland
- ⚫ Afgerond - Behandeling afgerond
---
### 4.4 SMART Doelen
**Weergave per doel:**
```
┌───────────────────────────────────────────────────────────┐
│ 💼 Werk Prioriteit│
│ [Hoog] │
│ Terugkeer naar 4 werkdagen per week │
│ │
│ "Ik werk weer 4 dagen zonder paniek te krijgen" │
│ (cliënt-versie) │
│ │
│ Voortgang: ██████░░░░ 60% │
│ Status: Bezig | Deadline: 8 weken │
│ │
│ Meetbaarheid: Aantal werkdagen per week bijhouden │
│ │
│ [Bewerk] [↻ Regenereer] [Details ▼] │
└───────────────────────────────────────────────────────────┘
```
**Velden per doel:**
| Veld | Type | Beschrijving |
|------|------|--------------|
| Titel | Tekst | Korte beschrijving (1 zin) |
| Beschrijving | Tekst | SMART-uitwerking (2-3 zinnen) |
| Cliënt-versie | Tekst | B1-taal versie voor cliënt |
| Leefgebied | Tag | DLV/Wonen/Werk/Sociaal/etc. |
| Prioriteit | Dropdown | Hoog/Middel/Laag |
| Meetbaarheid | Tekst | Hoe meten we vooruitgang? |
| Tijdslijn | Getal | Binnen X weken |
| Status | Dropdown | Niet gestart/Bezig/Gehaald/Bijgesteld |
| Voortgang | Slider | 0-100% |
**Acties:**
- `[Bewerk]`: Inline editing van alle velden
- `[↻ Regenereer]`: AI genereert alternatief doel (zie 4.6)
- `[Details ▼]`: Uitklappen voor SMART-details
- `[+]`: Handmatig doel toevoegen
- `[🗑️]`: Doel verwijderen
**AI-gedrag bij generatie:**
- Focust op leefgebieden met prioriteit "Hoog"
- Verdeelt doelen over minimaal 2 verschillende domeinen
- Maakt concrete, meetbare doelen (geen vage termen)
- Genereert automatisch B1-taal cliënt-versie
---
### 4.5 Interventies
**Weergave per interventie:**
```
┌───────────────────────────────────────────────────────────┐
│ 🧠 Cognitieve Gedragstherapie (CGT) │
│ │
│ Beschrijving: │
│ Identificeren en uitdagen van negatieve gedachtenpatronen │
│ die angst en vermijding in stand houden. │
│ │
│ Rationale: │
│ CGT is de eerste keuze behandeling bij angststoornissen │
│ met sterke evidentie voor effectiviteit. │
│ │
│ Gekoppeld aan: [💼 Doel 1] [👥 Doel 2] │
│ │
│ [Bewerk] [Details ▼] │
└───────────────────────────────────────────────────────────┘
```
**Velden per interventie:**
| Veld | Type | Beschrijving |
|------|------|--------------|
| Naam | Tekst | CGT, Exposure, EMDR, ACT, etc. |
| Beschrijving | Tekst | Uitleg van de interventie |
| Rationale | Tekst | Waarom past dit bij deze cliënt? |
| Gekoppelde doelen | Multi-select | Welke doelen worden benaderd? |
**AI-mapping (evidence-based):**
| DSM-Categorie | Primaire Interventies | Sessies bij Hoog |
|---------------|----------------------|------------------|
| Angststoornissen | CGT, Exposure, ACT | 12-16 sessies |
| Stemmingsklachten | CGT, IPT, Gedragsactivatie | 8-12 sessies |
| Trauma/PTSS | EMDR, Narratieve therapie | 12+ sessies |
| Persoonlijkheid | Schematherapie, MBT | 20+ sessies |
---
### 4.6 Micro-regeneratie (Stretch)
**Trigger:** Klik op `[↻ Regenereer]` bij specifiek doel of interventie
**Flow:**
```
┌─────────────────────────────────────────────────────────────┐
│ ↻ Doel regenereren [X] │
├─────────────────────────────────────────────────────────────┤
│ │
│ Huidige doel: │
│ "Terugkeer naar 4 werkdagen per week" │
│ │
│ Extra instructie voor AI (optioneel): │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Maak meer gefocust op geleidelijke opbouw ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ [Annuleren] [↻ Regenereer] │
└─────────────────────────────────────────────────────────────┘
```
**Na regeneratie:**
```
┌─────────────────────────────────────────────────────────────┐
│ Nieuw voorstel: │
│ │
│ "Stapsgewijze opbouw naar 4 werkdagen via 2→3→4 schema" │
│ │
│ [Behoud origineel] [✓ Accepteer nieuw voorstel] │
└─────────────────────────────────────────────────────────────┘
```
**Gedrag:**
- AI behoudt context van rest van plan
- Alleen het specifieke onderdeel wordt vervangen
- Toast notification bij succes: "Doel bijgewerkt"
---
### 4.7 Publicatie Workflow
**Statussen:**
```
Concept ──→ Actief ──→ In evaluatie ──→ Afgerond
│ │
└──→ Gearchiveerd ←──────────┘
(bij nieuwe versie)
```
**Validatie voor publicatie:**
- ✓ Minimaal 1 doel ingevuld
- ✓ Minimaal 1 interventie gekoppeld
- ✓ Behandelstructuur compleet (duur, frequentie)
- ✓ Evaluatiemomenten gepland (tussentijds + eind)
**Publicatie actie:**
1. Behandelaar klikt `[Publiceer]`
2. Systeem valideert compleetheid
3. Bij succes: status → "Actief", publicatiedatum vastgelegd
4. Toast: "Behandelplan gepubliceerd"
5. Plan zichtbaar in cliëntportaal
**Versie-beheer:**
- Nummering: v1, v2, v3, etc.
- Bij "Nieuwe Versie": huidige → "Gearchiveerd", nieuwe kopie → "Concept"
- Oude versies blijven zichtbaar (read-only)
---
## 5. UI-overzicht (visuele structuur)
### Behandelplan Pagina Layout
```
┌─────────────────────────────────────────────────────────────────┐
│ HEADER │
│ Mini-EPD Logo [Cliëntnaam ▼] [Zoek...] [Profiel] │
├─────────────────┬───────────────────────────────────────────────┤
│ SIDEBAR │ MAIN CONTENT │
│ │ │
│ ← Cliënten │ ┌───────────────────────────────────────────┐ │
│ ───────── │ │ Behandelplan v1 Status: Concept │ │
│ □ Dashboard │ │ [Bewerken] [Publiceer] [Print] │ │
│ □ Intake │ └───────────────────────────────────────────┘ │
│ □ Diagnose │ │
│ ■ Behandelplan │ ┌── Behandelstructuur ──────────────────────┐ │
│ □ Rapportage │ │ Duur: 8 weken | Freq: Wekelijks | 8 sess │ │
│ □ Agenda │ └───────────────────────────────────────────┘ │
│ │ │
│ │ ┌── Leefgebieden ────────────────────────────┐ │
│ │ │ [Progress bars met scores per domein] │ │
│ │ └───────────────────────────────────────────┘ │
│ │ │
│ │ ┌── SMART Doelen ────────────────────────────┐ │
│ │ │ [Doel 1 - Werk] │ │
│ │ │ [Doel 2 - Sociaal] │ │
│ │ │ [Doel 3 - DLV] │ │
│ │ │ [+ Doel toevoegen] │ │
│ │ └───────────────────────────────────────────┘ │
│ │ │
│ │ ┌── Interventies ────────────────────────────┐ │
│ │ │ [CGT] [Exposure] │ │
│ │ └───────────────────────────────────────────┘ │
│ │ │
├─────────────────┴───────────────────────────────────────────────┤
│ FOOTER: Auto-saved 2 sec ago │
└─────────────────────────────────────────────────────────────────┘
```
### Responsive (Tablet)
```
┌─────────────────────────────────────────────┐
│ [☰] Mini-EPD Cliëntnaam [Zoek] │
├─────────────────────────────────────────────┤
│ │
│ Behandelplan v1 │
│ Status: ● Concept │
│ [Bewerken] [Publiceer] │
│ │
│ ┌── Behandelstructuur ────────────────────┐│
│ │ Duur: 8 weken | Wekelijks | 8 sessies ││
│ └─────────────────────────────────────────┘│
│ │
│ ┌── Leefgebieden ─────────────────────────┐│
│ │ [Compacte progress bars] ││
│ └─────────────────────────────────────────┘│
│ │
│ ┌── Doelen ───────────────────────────────┐│
│ │ [Gestapelde doel cards] ││
│ └─────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────┘
```
---
## 6. Interacties met AI (functionele beschrijving)
| Locatie | AI-actie | Trigger | Input | Output |
|---------|----------|---------|-------|--------|
| Behandelplan tab | Genereer plan | Klik `[⚡ Genereer]` | Intake + diagnose + leefgebieden | Compleet behandelplan (JSON) |
| Doel card | Regenereer doel | Klik `[↻ Regenereer]` | Context plan + instructie | Alternatief doel |
| Interventie card | Regenereer interventie | Klik `[↻ Regenereer]` | Context plan + instructie | Alternatieve interventie |
| Doel card | Genereer cliënt-versie | Automatisch bij nieuw doel | Behandelaar-tekst | B1-taal versie |
### AI Response Format
```typescript
interface AIGeneratedPlan {
behandelstructuur: {
duur: string // "8 weken"
frequentie: string // "Wekelijks"
aantalSessies: number // 8
vorm: string // "Individueel"
}
doelen: Array<{
id: string
title: string
description: string // SMART uitwerking
clientVersion: string // B1-taal
lifeDomain: string // "werk" | "sociaal" | etc.
priority: string // "hoog" | "middel" | "laag"
measurability: string
timelineWeeks: number
}>
interventies: Array<{
name: string
description: string
rationale: string
linkedGoalIds: string[]
}>
evaluatiemomenten: Array<{
type: string // "tussentijds" | "eind"
weekNumber: number
}>
veiligheidsplan?: { // Alleen bij severity "Hoog"
waarschuwingssignalen: string[]
copingStrategieen: string[]
contacten: string[]
}
}
```
---
## 7. Gebruikersrollen en rechten
| Rol | Toegang tot | Acties | Beperkingen |
|-----|------------|--------|-------------|
| Behandelaar | Eigen cliëntdossiers | Volledig CRUD, AI generatie | Alleen eigen cliënten |
| Behandelaar (collega) | Gedeelde cliënten | Lezen, commentaar | Geen bewerken |
| Cliënt | Eigen behandelplan | Alleen lezen | Ziet B1-versie, geen edit |
| Demo-user | Alle fictieve data | Lezen + AI testen | Geen opslaan |
---
## 8. States en Foutafhandeling
### Empty States
**Geen behandelplan:**
```
┌───────────────────────────────────────────┐
│ 📋 │
│ │
│ Nog geen behandelplan │
│ │
│ Vul eerst de intake en diagnose in, │
│ dan kan AI een behandelplan genereren. │
│ │
│ [Naar Intake] [Naar Diagnose] │
└───────────────────────────────────────────┘
```
**Incomplete voorwaarden:**
```
┌───────────────────────────────────────────┐
│ ⚠️ Nog niet klaar voor behandelplan │
│ │
│ □ Intake notities ✓ │
│ □ Diagnose/probleemprofiel ✗ │
│ □ Leefgebieden scores ✗ │
│ │
│ Vul de ontbrekende onderdelen in. │
└───────────────────────────────────────────┘
```
### Error States
| Situatie | Bericht | Actie |
|----------|---------|-------|
| AI niet beschikbaar | "AI tijdelijk niet beschikbaar" | Retry knop, handmatig alternatief |
| Validatie fout | Inline error onder veld | Focus op fout veld |
| Netwerk error | Toast: "Verbinding verloren" | Auto-retry, lokale opslag |
| Rate limit | "Even wachten..." | Countdown timer |
### Loading States
**AI generatie:**
```
⚡ Behandelplan wordt gegenereerd...
[████████████░░░░░░░] 75%
Even geduld, dit duurt ~5 seconden
```
**Auto-save:**
- Tijdens typen: "Opslaan..."
- Na succes: "✓ Opgeslagen 2 sec geleden"
---
## 9. Bijlagen & Referenties
### Interne Documenten
- [PRD Behandelplan v2.0](./prd-behandelplan-v2-final.md) — Requirements
- [Implementatieplan](~/.claude/plans/) — Technische aanpak
- [UX Stylesheet](../ux-stylesheet.md) — Kleuren, typography
### Technische Specificaties
- Database: `treatment_plans` tabel met JSONB structuur
- API: `/api/behandelplan/generate` (POST, JSON response)
- AI Model: Claude 3.5 Sonnet
### Externe Bronnen
- [GGZ Richtlijnen](https://www.ggzrichtlijnen.nl/) — Evidence-based interventies
- [WCAG 2.1 AA](https://www.w3.org/WAI/WCAG21/quickref/) — Accessibility
---
**Document Status:** v1.0 Draft
**Volgende Review:** Na implementatie Fase 1-2
**Eigenaar:** Colin Lit

View File

@@ -3,7 +3,7 @@
**Projectnaam:** Mini-ECD Prototype - AI Speedrun
**Versie:** v2.0 (volgens template, incl. Leefgebieden)
**Datum:** 2 december 2024
**Auteur:** Colin van Zeeland
**Auteur:** Colin Lit
**Changelog:**
- v2.0: Herstructurering volgens PRD template, duidelijke MVP/post-MVP scheiding, expliciete UX sectie

View File

@@ -0,0 +1,719 @@
# Technisch Ontwerp (TO) — Behandelplan Module
**Projectnaam:** Mini-EPD Prototype - AI Speedrun
**Versie:** v1.0
**Datum:** 03-12-2024
**Auteur:** Colin Lit
---
## 1. Doel en relatie met PRD en FO
**Doel van dit document:**
Dit Technisch Ontwerp beschrijft **hoe** de Behandelplan module technisch wordt gebouwd. Het PRD beschrijft het *wat*, het FO het *hoe functioneel*, en dit TO de *technische implementatie*.
**Gerelateerde documenten:**
- PRD: `prd-behandelplan-v2-final.md`
- FO: `fo-behandelplan-v1.md`
- Implementatieplan: `~/.claude/plans/effervescent-toasting-beaver.md`
**Scope:**
- Foundation first: Types → Database → Components → AI → UI
- Simple JSON API (geen streaming)
- Simpele leefgebieden visualisatie (progress bars, geen radar chart)
---
## 2. Technische Architectuur Overzicht
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ FRONTEND (Next.js 14) │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │
│ │ Behandelplan │ │ Leefgebieden │ │ SMART Doelen │ │
│ │ Page │ │ Components │ │ Components │ │
│ │ (Server Comp) │ │ (Client Comp) │ │ (Client Comp) │ │
│ └────────┬────────┘ └────────┬────────┘ └──────────────┬──────────────┘ │
│ │ │ │ │
│ └────────────────────┴──────────────────────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ Server Actions │ │
│ │ (behandelplan/ │ │
│ │ actions.ts) │ │
│ └──────────┬──────────┘ │
└────────────────────────────────────┼────────────────────────────────────────┘
┌────────────────────────────────────┼────────────────────────────────────────┐
│ API ROUTES │
│ ┌─────────────────────────────────▼─────────────────────────────────────┐ │
│ │ /api/behandelplan/generate │ │
│ │ (POST - AI Generation) │ │
│ └─────────────────────────────────┬─────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────▼─────────────────────────────────────┐ │
│ │ /api/behandelplan/regenerate-section │ │
│ │ (POST - Micro-regeneration) │ │
│ └─────────────────────────────────┬─────────────────────────────────────┘ │
└────────────────────────────────────┼────────────────────────────────────────┘
┌────────────────────────────────────┼────────────────────────────────────────┐
│ EXTERNAL SERVICES │
│ ┌─────────────────┐ │ ┌─────────────────────┐ │
│ │ Supabase │◄─────────────┴──────────────► Claude API │ │
│ │ (PostgreSQL) │ │ (Anthropic) │ │
│ │ - care_plans │ │ - claude-sonnet │ │
│ │ - patients │ │ - JSON response │ │
│ │ - intakes │ │ │ │
│ └─────────────────┘ └─────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────┘
```
---
## 3. Techstack Selectie
### Bestaande Stack (hergebruiken)
| Component | Technologie | Status | Argumentatie |
|-----------|-------------|--------|--------------|
| Frontend | Next.js 14.2.18 | ✅ Bestaand | React framework, SSR, App Router |
| Backend | Next.js API Routes | ✅ Bestaand | Co-located, TypeScript |
| Database | Supabase PostgreSQL | ✅ Bestaand | RLS, FHIR-compliant schema |
| AI | Claude Sonnet | ✅ Bestaand | API key geconfigureerd |
| Styling | TailwindCSS 3.4 | ✅ Bestaand | Utility-first, shadcn/ui |
| Icons | Lucide React | ✅ Bestaand | Consistent icon set |
| Editor | TipTap | ✅ Bestaand | Rich text editor |
| Validation | Zod | ✅ Bestaand | Schema validation |
### Nieuwe Dependencies
| Component | Technologie | Nodig voor | Alternatief |
|-----------|-------------|------------|-------------|
| Charts | Recharts 2.x | Radar chart (stretch) | ❌ Later toevoegen |
**Conclusie:** Geen nieuwe dependencies nodig voor MVP. Recharts alleen bij stretch goal.
---
## 4. Datamodel
### 4.1 Bestaande Tabellen (hergebruiken)
```sql
-- FHIR CarePlan (hoofdtabel voor behandelplannen)
care_plans (
id UUID PRIMARY KEY,
patient_id UUID REFERENCES patients(id),
title TEXT,
status careplan_status, -- draft | active | completed | revoked
intent TEXT,
goals JSONB, -- Array van doelen
activities JSONB, -- Array van interventies
based_on_intake_id UUID,
based_on_anamneses UUID[],
based_on_examinations UUID[],
based_on_risk_assessments UUID[],
care_team_ids UUID[],
author_id UUID,
period_start DATE,
period_end DATE,
created_at TIMESTAMP,
updated_at TIMESTAMP
)
-- Conditions (diagnoses - input voor AI)
conditions (
id UUID,
patient_id UUID,
code TEXT, -- DSM-5 code
code_system TEXT,
display_text TEXT,
category TEXT,
clinical_status TEXT,
severity TEXT, -- laag | middel | hoog
encounter_id UUID
)
-- Intakes (bron voor AI context)
intakes (
id UUID,
patient_id UUID,
status intake_status,
treatment_advice JSONB,
kindcheck_data JSONB,
notes TEXT
)
```
### 4.2 Nieuwe Velden / Migratie
```sql
-- Migratie: Leefgebieden toevoegen aan intakes
ALTER TABLE intakes
ADD COLUMN life_domains JSONB;
-- Migratie: Behandelplan specifieke velden aan care_plans
ALTER TABLE care_plans
ADD COLUMN version INTEGER DEFAULT 1,
ADD COLUMN published_at TIMESTAMP,
ADD COLUMN behandelstructuur JSONB,
ADD COLUMN evaluatiemomenten JSONB,
ADD COLUMN veiligheidsplan JSONB;
-- Constraint voor versie-beheer
ALTER TABLE care_plans
ADD CONSTRAINT unique_patient_version UNIQUE (patient_id, version);
```
### 4.3 JSONB Structuren
**life_domains (in intakes):**
```typescript
interface LifeDomainScore {
domain: 'dlv' | 'wonen' | 'werk' | 'sociaal' | 'vrijetijd' | 'financien' | 'gezondheid'
baseline: number // 1-5
current: number // 1-5
target: number // 1-5
notes: string
priority: 'laag' | 'middel' | 'hoog'
}
// life_domains: LifeDomainScore[]
```
**goals (in care_plans):**
```typescript
interface SmartGoal {
id: string
title: string
description: string
clientVersion: string // B1-taal
lifeDomain: LifeDomain
priority: 'hoog' | 'middel' | 'laag'
measurability: string
timelineWeeks: number
status: 'niet_gestart' | 'bezig' | 'gehaald' | 'bijgesteld'
progress: number // 0-100
}
```
**activities (in care_plans):**
```typescript
interface Intervention {
id: string
name: string
description: string
rationale: string
linkedGoalIds: string[]
}
```
**behandelstructuur:**
```typescript
interface Behandelstructuur {
duur: string // "8 weken"
frequentie: string // "Wekelijks"
aantalSessies: number // 8
vorm: string // "Individueel"
}
```
**evaluatiemomenten:**
```typescript
interface Evaluatiemoment {
id: string
type: 'tussentijds' | 'eind' | 'crisis'
weekNumber: number
plannedDate: string
actualDate?: string
status: 'gepland' | 'afgerond' | 'overgeslagen'
outcome?: string
lifeDomainUpdates?: LifeDomainScore[]
}
```
### 4.4 ERD
```
patients ─1:N─ intakes ─1:1─ life_domains (JSONB)
│ │
│ └────────── anamneses ─────────┐
│ └────────── examinations ──────┤
│ └────────── risk_assessments ──┤
│ │
└─1:N─ care_plans ────────────────────────────┘
│ (based_on_*)
├── goals (JSONB)
├── activities (JSONB)
├── behandelstructuur (JSONB)
├── evaluatiemomenten (JSONB)
└── veiligheidsplan (JSONB)
└─1:N─ conditions (diagnoses - input voor AI)
```
---
## 5. API Ontwerp
### 5.1 Endpoints Overzicht
| Endpoint | Method | Input | Output | Auth |
|----------|--------|-------|--------|------|
| `/api/behandelplan/generate` | POST | GenerateInput | GeneratedPlan | Required |
| `/api/behandelplan/regenerate-section` | POST | RegenerateInput | RegeneratedSection | Required |
### 5.2 POST /api/behandelplan/generate
**Request:**
```typescript
interface GenerateInput {
patientId: string // UUID
intakeId: string // UUID
conditionId?: string // UUID (optioneel, haalt anders laatste op)
extraInstructions?: string // Optionele aanvullende instructies
}
```
**Response:**
```typescript
interface GeneratedPlan {
behandelstructuur: Behandelstructuur
doelen: SmartGoal[]
interventies: Intervention[]
evaluatiemomenten: Evaluatiemoment[]
veiligheidsplan?: Veiligheidsplan // Alleen bij severity "Hoog"
}
```
**Error Responses:**
- `400`: Validation error (missing fields, invalid UUIDs)
- `401`: Unauthorized
- `404`: Patient/Intake/Condition not found
- `422`: Insufficient data for generation (no intake notes, no diagnosis)
- `500`: AI API error
- `503`: AI service unavailable
### 5.3 POST /api/behandelplan/regenerate-section
**Request:**
```typescript
interface RegenerateInput {
patientId: string
carePlanId: string
sectionType: 'goal' | 'intervention'
sectionId: string
instruction?: string // Extra instructie voor AI
currentPlan: GeneratedPlan // Context van huidige plan
}
```
**Response:**
```typescript
interface RegeneratedSection {
type: 'goal' | 'intervention'
original: SmartGoal | Intervention
regenerated: SmartGoal | Intervention
}
```
### 5.4 Zod Validation Schemas
```typescript
// lib/types/behandelplan.ts
export const GenerateInputSchema = z.object({
patientId: z.string().uuid(),
intakeId: z.string().uuid(),
conditionId: z.string().uuid().optional(),
extraInstructions: z.string().max(500).optional(),
});
export const RegenerateInputSchema = z.object({
patientId: z.string().uuid(),
carePlanId: z.string().uuid(),
sectionType: z.enum(['goal', 'intervention']),
sectionId: z.string().uuid(),
instruction: z.string().max(200).optional(),
currentPlan: GeneratedPlanSchema,
});
```
---
## 6. Security & Compliance
### 6.1 Security Checklist
- [x] **Authentication:** Supabase Auth (bestaand)
- [x] **Authorization:** Row Level Security op care_plans
- [x] **Data Encryption:** At rest (PostgreSQL), in transit (HTTPS)
- [x] **Input Validation:** Zod schemas op alle endpoints
- [ ] **Rate Limiting:** Toe te voegen op AI endpoints (10 req/min)
- [x] **CORS:** Restrictive origins (bestaand)
- [x] **Secrets:** Environment variables (ANTHROPIC_API_KEY)
### 6.2 RLS Policies voor care_plans
```sql
-- Bestaande RLS policy uitbreiden
ALTER TABLE care_plans ENABLE ROW LEVEL SECURITY;
-- Behandelaars kunnen alleen eigen patiënten zien
CREATE POLICY "Users can view care plans for their patients"
ON care_plans FOR SELECT
USING (
auth.uid() IN (
SELECT practitioner_id FROM patient_practitioners
WHERE patient_id = care_plans.patient_id
)
);
-- Behandelaars kunnen care plans maken voor eigen patiënten
CREATE POLICY "Users can create care plans for their patients"
ON care_plans FOR INSERT
WITH CHECK (
auth.uid() = author_id
);
-- Behandelaars kunnen eigen care plans updaten
CREATE POLICY "Users can update their care plans"
ON care_plans FOR UPDATE
USING (auth.uid() = author_id);
```
### 6.3 AVG/GDPR Overwegingen
- **Data minimalisatie:** Alleen noodzakelijke velden in AI prompt
- **Geen BSN/identificerende data naar AI:** Alleen intake notities en scores
- **Audit trail:** Bestaande `ai_events` tabel loggen van AI calls
- **Consent:** AI-gebruik gedekt onder behandelrelatie
---
## 7. AI/LLM Integratie
### 7.1 AI Stack
| Component | Waarde |
|-----------|--------|
| Provider | Anthropic |
| Model | claude-3-5-sonnet-20240620 (of claude-sonnet-4) |
| Library | Native fetch (geen SDK nodig) |
| Caching | Geen (elke generatie is uniek) |
| Fallback | Error message + manual mode optie |
### 7.2 Prompt Template
```typescript
// lib/ai/behandelplan-prompt.ts
export const BEHANDELPLAN_SYSTEM_PROMPT = `
Je bent een ervaren GGZ-behandelaar die behandelplannen opstelt.
Je maakt SMART doelen die recovery-gericht en evidence-based zijn.
INSTRUCTIES:
1. Genereer 2-4 SMART doelen gebaseerd op de intake en diagnose
2. Focus op leefgebieden met prioriteit "Hoog"
3. Verdeel doelen over minimaal 2 verschillende leefgebieden
4. Maak concrete, meetbare doelen (geen vage termen)
5. Genereer voor elk doel een B1-taal versie (cliënt-vriendelijk)
6. Kies evidence-based interventies passend bij de DSM-categorie
7. Plan 8-12 sessies afhankelijk van severity
8. Voeg veiligheidsplan toe alleen bij severity "Hoog"
OUTPUT FORMAT:
Retourneer ALLEEN valide JSON volgens het volgende schema:
{
"behandelstructuur": {
"duur": "8 weken",
"frequentie": "Wekelijks",
"aantalSessies": 8,
"vorm": "Individueel"
},
"doelen": [...],
"interventies": [...],
"evaluatiemomenten": [...],
"veiligheidsplan": null | {...}
}
`;
export function buildUserPrompt(context: PlanContext): string {
return `
CLIËNT CONTEXT:
- Intake notities: ${context.intakeNotes}
- DSM-categorie: ${context.dsmCategory}
- Severity: ${context.severity}
LEEFGEBIEDEN SCORES:
${context.lifeDomains.map(d =>
`- ${d.domain}: ${d.baseline}/5 (prioriteit: ${d.priority})`
).join('\n')}
${context.extraInstructions ? `EXTRA INSTRUCTIES:\n${context.extraInstructions}` : ''}
Genereer nu een behandelplan.
`;
}
```
### 7.3 Evidence-Based Mapping
```typescript
// lib/ai/intervention-mapping.ts
export const INTERVENTION_MAPPING: Record<string, InterventionSuggestion[]> = {
'angststoornissen': [
{ name: 'CGT', sessions: { laag: 8, middel: 10, hoog: 14 } },
{ name: 'Exposure therapie', sessions: { laag: 6, middel: 8, hoog: 12 } },
{ name: 'ACT', sessions: { laag: 8, middel: 10, hoog: 12 } },
],
'stemmingsklachten': [
{ name: 'CGT', sessions: { laag: 8, middel: 10, hoog: 14 } },
{ name: 'IPT', sessions: { laag: 8, middel: 12, hoog: 16 } },
{ name: 'Gedragsactivatie', sessions: { laag: 6, middel: 8, hoog: 10 } },
],
'trauma_ptss': [
{ name: 'EMDR', sessions: { laag: 6, middel: 10, hoog: 16 } },
{ name: 'Narratieve therapie', sessions: { laag: 8, middel: 12, hoog: 16 } },
],
'persoonlijkheid': [
{ name: 'Schematherapie', sessions: { laag: 16, middel: 24, hoog: 40 } },
{ name: 'MBT', sessions: { laag: 16, middel: 24, hoog: 40 } },
],
};
```
### 7.4 API Call Implementatie
```typescript
// app/api/behandelplan/generate/route.ts
export async function POST(request: NextRequest) {
// 1. Validate input
const body = await request.json();
const input = GenerateInputSchema.parse(body);
// 2. Load context from database
const context = await loadPlanContext(input);
// 3. Build prompt
const messages = [
{ role: 'system', content: BEHANDELPLAN_SYSTEM_PROMPT },
{ role: 'user', content: buildUserPrompt(context) },
];
// 4. Call Claude API
const response = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.ANTHROPIC_API_KEY!,
'anthropic-version': '2023-06-01',
},
body: JSON.stringify({
model: 'claude-3-5-sonnet-20240620',
max_tokens: 4096,
temperature: 0.3,
messages,
}),
});
// 5. Parse and validate response
const result = await response.json();
const plan = GeneratedPlanSchema.parse(
JSON.parse(result.content[0].text)
);
// 6. Log to ai_events
await logAIEvent('behandelplan_generate', input, plan);
return NextResponse.json(plan);
}
```
---
## 8. Performance & Scalability
### 8.1 Performance Targets
| Metric | Target | Huidige Baseline |
|--------|--------|------------------|
| Page load (FCP) | < 1.5s | ~1s (andere pagina's) |
| API response | < 500ms | ~300ms (intakes) |
| AI generation | < 8s | N/A (nieuw) |
| Auto-save | < 500ms | ~300ms (reports) |
### 8.2 Optimalisaties
**Frontend:**
- Server Components voor initial load (geen client JS voor data)
- Skeleton loaders tijdens AI generatie
- Optimistic updates voor status wijzigingen
**Backend:**
- Parallel database queries voor context loading
- Geen caching van AI responses (elke generatie uniek)
- Connection pooling via Supabase (bestaand)
**AI:**
- Max tokens: 4096 (voldoende voor plan JSON)
- Temperature: 0.3 (consistent maar niet robotisch)
- Retry logic: 2x met exponential backoff
---
## 9. Deployment & CI/CD
### 9.1 Omgevingen (bestaand)
| Omgeving | URL | Database |
|----------|-----|----------|
| Development | localhost:3000 | Local Supabase |
| Preview | Vercel preview | Supabase preview branch |
| Production | [main domain] | Supabase production |
### 9.2 Migratie Workflow (Cloud-only)
```bash
# Geen lokale Supabase instantie - direct naar cloud
# Optie 1: Via Supabase MCP tool
mcp__supabase__apply_migration(name, query)
# Optie 2: Via Supabase CLI
npx supabase db push --linked
# Types genereren na migratie
mcp__supabase__generate_typescript_types
```
**Let op:** Geen `supabase db reset` mogelijk - migraties zijn direct productie.
### 9.3 Deployment Checklist
- [ ] Environment variables in Vercel dashboard
- [ ] Database migraties toegepast
- [ ] TypeScript types gegenereerd (`supabase gen types typescript`)
- [ ] Build succesvol (`pnpm build`)
- [ ] Smoke test op preview environment
---
## 10. Monitoring & Logging
### 10.1 AI Event Logging (bestaand)
```sql
-- Bestaande ai_events tabel
ai_events (
id UUID,
kind TEXT, -- 'behandelplan_generate' | 'behandelplan_regenerate'
request JSONB, -- Input parameters
response JSONB, -- Generated plan
duration_ms INTEGER,
created_at TIMESTAMP
)
```
### 10.2 Metrics te Tracken
| Metric | Doel | Actie bij Overschrijding |
|--------|------|--------------------------|
| AI success rate | > 95% | Check prompts, input validation |
| AI response time p95 | < 8s | Optimize prompt size |
| Error rate | < 2% | Alert + investigate |
---
## 11. Risico's & Technische Mitigatie
| Risico | Impact | Kans | Mitigatie |
|--------|--------|------|-----------|
| AI genereert invalide JSON | Hoog | Middel | Zod validation, retry logic, fallback |
| AI API down/rate limited | Hoog | Laag | Error message, manual mode optie |
| Grote intake teksten (token limit) | Middel | Middel | Truncate/summarize intake eerst |
| Inconsistente B1-taal kwaliteit | Middel | Middel | Post-processing, behandelaar review |
| Performance bij grote plannen | Laag | Laag | Pagination, lazy loading |
---
## 12. Implementatie Volgorde
### Stap 1: Types & Database (2-3 uur)
**Bestanden:**
```
lib/types/
├── behandelplan.ts # Nieuwe types + Zod schemas
└── leefgebieden.ts # Life domain types
supabase/migrations/
└── xxx_add_behandelplan_fields.sql
```
### Stap 2: Leefgebieden Componenten (3-4 uur)
**Bestanden:**
```
components/behandelplan/
├── leefgebieden-form.tsx # Intake formulier (7 sliders)
├── leefgebieden-scores.tsx # Progress bar weergave
└── leefgebieden-badge.tsx # Domain tag/badge
```
### Stap 3: AI Generatie (3-4 uur)
**Bestanden:**
```
lib/ai/
├── behandelplan-prompt.ts # System + user prompts
└── intervention-mapping.ts # Evidence-based mapping
app/api/behandelplan/
├── generate/route.ts # POST endpoint
└── regenerate-section/route.ts # Micro-regeneratie
```
### Stap 4: Behandelplan UI (6-8 uur)
**Bestanden:**
```
app/epd/patients/[id]/behandelplan/
├── page.tsx # Server component (vervang placeholder)
├── actions.ts # Server actions (CRUD)
└── components/
├── behandelplan-view.tsx
├── goals-section.tsx
├── goal-card.tsx
├── interventions-section.tsx
└── generate-button.tsx
```
---
## 13. Bijlagen & Referenties
### Projectdocumenten
- [PRD Behandelplan v2.0](./prd-behandelplan-v2-final.md)
- [FO Behandelplan v1.0](./fo-behandelplan-v1.md)
- [UX Stylesheet](../ux-stylesheet.md)
### Tech Documentatie
- Next.js: https://nextjs.org/docs
- Supabase: https://supabase.com/docs
- Anthropic Claude: https://docs.anthropic.com/claude/reference
### Bestaande Code Referenties
- API pattern: `/app/api/reports/classify/route.ts`
- Server actions: `/app/epd/patients/[id]/intakes/[intakeId]/actions.ts`
- Types pattern: `/lib/types/report.ts`
- AI integration: `/app/api/docs/chat/route.ts`
---
**Document Status:** v1.0 Draft
**Volgende Review:** Na implementatie Stap 1-2
**Eigenaar:** Colin van Zeeland

View File

@@ -9,7 +9,7 @@ Afhankelijk van de **complexiteit van je software** bepaal je zelf hoe gedetaill
**Projectnaam:** _[vul in]_
**Versie:** _v1.0_
**Datum:** _[dd-mm-jjjj]_
**Auteur:** _[naam]_
**Auteur:** _[Colin Lit]_
---
@@ -155,6 +155,8 @@ export const loadData = async () => {
| E3 | AI-integratie | AI endpoints en prompt engineering | ⏳ To Do | 3 | Test met Gemini model |
| E4 | Testing & Deploy | QA, demo prep en deployment | ⏳ To Do | 3 | |
**Belangrijk:** Voer niet in 1x het volledige plan uit. Bouw per epic en per story.
---
## 4. Epics & Stories (Uitwerking)

View File

@@ -3,7 +3,7 @@
**Projectnaam:** _[vul in]_
**Versie:** _v1.0_
**Datum:** _[dd-mm-jjjj]_
**Auteur:** _[naam]_
**Auteur:** Colin Lit
---

View File

@@ -3,7 +3,7 @@
**Projectnaam:** _[vul in]_
**Versie:** _v1.0_
**Datum:** _[dd-mm-jjjj]_
**Auteur:** _[naam]_
**Auteur:** Colin Lit
---