979 lines
35 KiB
Markdown
979 lines
35 KiB
Markdown
# 🚀 Mission Control — Bouwplan Mini-EPD Prototype
|
|
|
|
**Projectnaam:** Mini-EPD Prototype
|
|
**Versie:** v1.0
|
|
**Datum:** 10-11-2025
|
|
**Auteur:** Development Team PinkRoccade GGZ
|
|
|
|
---
|
|
|
|
## 1. Doel en context
|
|
|
|
🎯 **Doel:** Een werkend mini-EPD prototype bouwen dat tijdens de AI-inspiratiesessie bij PinkRoccade GGZ de kernprocessen uit de GGZ demonstreert: **intake → probleemclassificatie → behandelplan**.
|
|
|
|
📘 **Toelichting:** Dit project focust op het zichtbaar maken van AI-waarde (samenvatten, structureren, plan genereren) in een herkenbare GGZ-workflow. De demo duurt maximaal 10 minuten en toont hoe AI zorgmedewerkers kan ondersteunen bij administratieve taken. Het systeem wordt gebouwd met fictieve data voor demonstratiedoeleinden.
|
|
|
|
**Belangrijkste doelen:**
|
|
- Demonstreren van AI-toegevoegde waarde in ECD-processen
|
|
- Herkenbare workflow voor GGZ-professionals
|
|
- Inspiratie bieden voor AI-integratie in bestaande systemen
|
|
- Direct bruikbare output (samenvattingen, behandelplannen) genereren
|
|
|
|
---
|
|
|
|
## 2. Uitgangspunten
|
|
|
|
### 2.1 Technische Stack
|
|
|
|
🎯 **Doel:** Complete technologie stack voor het mini-EPD prototype.
|
|
|
|
**Frontend:**
|
|
- **Framework:** Next.js 14+ (App Router)
|
|
- **Styling:** Tailwind CSS v3.4 (fallback vanaf v4 bij problemen)
|
|
- **UI Componenten:** shadcn/ui of eigen headless componenten
|
|
- **Rich Text Editor:** TipTap (ProseMirror basis)
|
|
- **Iconen:** lucide-react
|
|
- **State Management:** Zustand + React Context API
|
|
|
|
**Backend:**
|
|
- **API:** Next.js Route Handlers (server-side)
|
|
- **Database:** Supabase (PostgreSQL)
|
|
- **Auth:** Supabase Auth
|
|
- **Storage:** Supabase Storage
|
|
- **AI Integration:** Claude API (Anthropic)
|
|
|
|
**DevOps & Tooling:**
|
|
- **Hosting:** Vercel (EU region)
|
|
- **Version Control:** Git/GitHub
|
|
- **Type Safety:** TypeScript
|
|
- **Validation:** Zod
|
|
- **Testing:** Vitest (unit) + Playwright (E2E)
|
|
- **PDF Export (stretch):** Chromium via Playwright/Puppeteer
|
|
|
|
### 2.2 Projectkaders
|
|
|
|
🎯 **Doel:** Vaste kaders waarbinnen het project wordt ontwikkeld.
|
|
|
|
- **Tijd:** 3 weken totale bouwtijd voor MVP
|
|
- **Demo deadline:** Augustus 2025 (AI-inspiratiesessie)
|
|
- **Budget:** Beperkt voor externe API calls (Claude AI)
|
|
- **Team:** 1-2 developers + 1 consultant/product owner
|
|
- **Data:** Uitsluitend fictieve demo-data (geen productiegegevens)
|
|
- **Scope:** MVP features voor 10-minuten demo
|
|
- **Gebruikers:** Demo-users met volledige toegang (simplified auth)
|
|
- **Compliance:** Geen medische certificering vereist (demo only)
|
|
|
|
### 2.3 Programmeer Uitgangspunten
|
|
|
|
🎯 **Doel:** Code-kwaliteit principes en development best practices.
|
|
|
|
**Core Principles:**
|
|
|
|
- **DRY (Don't Repeat Yourself)**
|
|
- Herbruikbare React componenten in `/src/components/ui/`
|
|
- Shared utility functions in `/src/lib/utils/`
|
|
- Centrale API client voor Supabase queries
|
|
- Gedeelde prompt templates voor AI calls
|
|
|
|
- **SOC (Separation of Concerns)**
|
|
- UI componenten gescheiden van business logic
|
|
- Database queries in dedicated service layers (`/src/lib/services/`)
|
|
- AI prompts in `/src/lib/ai/prompts/`
|
|
- Styling via Tailwind classes, geen inline styles
|
|
- Route handlers voor server-side operaties
|
|
|
|
- **KISS (Keep It Simple, Stupid)**
|
|
- Directe Supabase queries zonder ORM overhead
|
|
- Eenvoudige state management met Zustand
|
|
- Minimale abstractie voor MVP scope
|
|
- Clear component naming (e.g., `ClientList`, `IntakeEditor`)
|
|
|
|
- **YAGNI (You Aren't Gonna Need It)**
|
|
- Geen multi-tenant setup voor demo
|
|
- Basis auth zonder rollenbeheer
|
|
- Skip complex caching voor MVP
|
|
- Geen realtime features voor eerste versie
|
|
|
|
- **Security**
|
|
- API keys alleen server-side (`ANTHROPIC_API_KEY`, `SUPABASE_SERVICE_ROLE_KEY`)
|
|
- Input sanitization met Zod schemas
|
|
- Row Level Security (RLS) policies in Supabase
|
|
- CORS configuratie voor API endpoints
|
|
- XSS protection via React's default escaping
|
|
|
|
---
|
|
|
|
## 3. Epics & Stories Overzicht
|
|
|
|
🎯 **Doel:** Complete overzicht van alle development epics met technische details.
|
|
|
|
| Epic ID | Epic Naam | Stories | Points | Status | Priority | Dependencies |
|
|
|---------|-----------|---------|--------|--------|----------|--------------|
|
|
| EP00 | Project Setup & Configuration | 5 | 13 | Done | Critical | - |
|
|
| EP01 | Database & Data Model | 4 | 21 | Not Started | Critical | EP00 |
|
|
| EP02 | Authentication & Authorization | 3 | 8 | Not Started | High | EP00, EP01 |
|
|
| EP03 | Client Management | 5 | 21 | Not Started | High | EP01, EP02 |
|
|
| EP04 | Intake Module | 6 | 34 | Not Started | Critical | EP03 |
|
|
| EP05 | Problem Profile (DSM-light) | 4 | 21 | Not Started | High | EP04 |
|
|
| EP06 | Treatment Plan Module | 5 | 34 | Not Started | High | EP05 |
|
|
| EP07 | AI Integration | 5 | 34 | Not Started | Critical | EP04 |
|
|
| EP08 | Dashboard & Navigation | 4 | 13 | Not Started | Medium | EP03 |
|
|
| EP09 | UI Components & Styling | 5 | 21 | Not Started | Medium | EP00 |
|
|
| EP10 | Testing & Quality Assurance | 4 | 13 | Not Started | High | All |
|
|
| EP11 | Deployment & Demo Prep | 4 | 13 | Not Started | Critical | All |
|
|
| EP12 | Stretch Features | 3 | 21 | Not Started | Low | EP06 |
|
|
|
|
**Totaal:** 57 stories | 257 story points
|
|
|
|
---
|
|
|
|
## 4. Epics & Stories (Uitwerking)
|
|
|
|
### Epic EP00 — Project Setup & Configuration
|
|
**Epic Doel:** Complete development omgeving met alle tools en dependencies geconfigureerd.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP00-ST01 | Next.js project opzetten | 3 | Done | - |
|
|
| EP00-ST02 | Tailwind CSS en UI libraries installeren | 3 | Done | EP00-ST01 |
|
|
| EP00-ST03 | Supabase project aanmaken | 3 | Done | EP00-ST01 |
|
|
| EP00-ST04 | Environment variables configureren | 2 | Done | EP00-ST03 |
|
|
| EP00-ST05 | Git repository opzetten | 2 | Done | EP00-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP00-ST01:** Als developer wil ik een Next.js project opzetten zodat ik kan beginnen met development
|
|
- ✅ Next.js 14+ met App Router
|
|
- ✅ TypeScript configuratie
|
|
- ✅ Folder structuur volgens conventions
|
|
- ✅ Development server draait op localhost:3000
|
|
|
|
**EP00-ST02:** Als developer wil ik Tailwind CSS en UI libraries installeren zodat ik consistent kan stylen
|
|
- ✅ Tailwind CSS v3.4 werkend
|
|
- ✅ tailwind.config.ts met custom theme
|
|
- ✅ lucide-react icons beschikbaar
|
|
- ✅ shadcn/ui setup (components.json, utils.ts)
|
|
|
|
**EP00-ST03:** Als developer wil ik Supabase project aanmaken zodat ik database en auth kan gebruiken
|
|
- ✅ Supabase project in EU region (dqugbrpwtisgyxscpefg)
|
|
- ✅ Connection string in .env.local
|
|
- ✅ Supabase client configured (lib/supabase/client.ts + server.ts)
|
|
- ✅ TypeScript types generation script (pnpm run types:generate)
|
|
|
|
**EP00-ST04:** Als developer wil ik environment variables configureren zodat services veilig verbonden zijn
|
|
- ✅ .env.local met alle keys (SUPABASE_URL, ANON_KEY, SERVICE_ROLE_KEY)
|
|
- ✅ .env.example voor team
|
|
- ⏳ Vercel environment variables (bij deployment EP11)
|
|
- ✅ Validation bij startup (throws error if missing)
|
|
|
|
**EP00-ST05:** Als developer wil ik Git repository opzetten zodat code versiebeheerd is
|
|
- ✅ GitHub repository
|
|
- ✅ .gitignore configuratie
|
|
- ⏳ Branch protection rules
|
|
- ✅ Initial commit met setup
|
|
|
|
**Technische implementatie details:**
|
|
- **Database:** Gebruik Supabase EU-region (Frankfurt/London)
|
|
- **Environment variables:**
|
|
```
|
|
NEXT_PUBLIC_SUPABASE_URL
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY
|
|
SUPABASE_SERVICE_ROLE_KEY
|
|
ANTHROPIC_API_KEY
|
|
```
|
|
- **Folder structuur:**
|
|
```
|
|
/src
|
|
/app (routes)
|
|
/components
|
|
/lib (utilities, services)
|
|
/types
|
|
```
|
|
|
|
---
|
|
|
|
### Epic EP01 — Database & Data Model
|
|
**Epic Doel:** Complete database schema met alle tabellen en relaties volgens TO specificatie.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP01-ST01 | Database tabellen creëren | 8 | Not Started | EP00-ST03 |
|
|
| EP01-ST02 | Row Level Security policies implementeren | 5 | Not Started | EP01-ST01 |
|
|
| EP01-ST03 | Database migrations opzetten | 3 | Not Started | EP01-ST01 |
|
|
| EP01-ST04 | Demo data seeden | 5 | Not Started | EP01-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP01-ST01:** Als developer wil ik database tabellen creëren zodat data opgeslagen kan worden
|
|
- ⏳ Tables: clients, intake_notes, problem_profiles, treatment_plans, ai_events
|
|
- ⏳ Correct data types (UUID, JSONB, etc.)
|
|
- ⏳ Foreign key constraints
|
|
- ⏳ Timestamps (created_at, updated_at)
|
|
|
|
**EP01-ST02:** Als developer wil ik Row Level Security policies implementeren zodat data veilig is
|
|
- ⏳ RLS enabled op alle tables
|
|
- ⏳ Policies voor authenticated users
|
|
- ⏳ Test queries werken correct
|
|
- ⏳ Service role bypass werkt
|
|
|
|
**EP01-ST03:** Als developer wil ik database migrations opzetten zodat schema versiebeheerd is
|
|
- ⏳ Supabase migrations folder
|
|
- ⏳ Initial migration script
|
|
- ⏳ Rollback mogelijk
|
|
- ⏳ Documentation
|
|
|
|
**EP01-ST04:** Als developer wil ik demo data seeden zodat er test content beschikbaar is
|
|
- ⏳ 3+ test cliënten
|
|
- ⏳ Intake notes per cliënt
|
|
- ⏳ Minimaal 1 compleet dossier
|
|
- ⏳ Seed script: `npm run seed`
|
|
|
|
**Technische implementatie details:**
|
|
- **Database Schema (zie TO §2.3):**
|
|
- `clients`: id (UUID), first_name, last_name, birth_date, created_at, updated_at
|
|
- `intake_notes`: id, client_id (FK), title, tag (CHECK), content_json (JSONB), content_text
|
|
- `problem_profiles`: id, client_id (FK), category (CHECK), severity (CHECK), remarks
|
|
- `treatment_plans`: id, client_id (FK), version, status (CHECK), plan (JSONB)
|
|
- `ai_events`: id, kind, client_id, request, response, duration_ms
|
|
|
|
- **RLS Policies (zie TO §2.4):**
|
|
```sql
|
|
CREATE POLICY "Allow all for authenticated users" ON [table]
|
|
FOR ALL USING (auth.uid() IS NOT NULL);
|
|
```
|
|
|
|
---
|
|
|
|
### Epic EP02 — Authentication & Authorization
|
|
**Epic Doel:** Werkende authenticatie met Supabase Auth voor demo gebruikers.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP02-ST01 | Login implementeren | 3 | Not Started | EP00-ST03, EP01-ST02 |
|
|
| EP02-ST02 | Protected routes implementeren | 3 | Not Started | EP02-ST01 |
|
|
| EP02-ST03 | Logout functionaliteit | 2 | Not Started | EP02-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP02-ST01:** Als gebruiker wil ik kunnen inloggen zodat ik toegang krijg tot het systeem
|
|
- ⏳ Login pagina op /auth/login
|
|
- ⏳ Email/password of magic link
|
|
- ⏳ Session management
|
|
- ⏳ Redirect naar dashboard
|
|
|
|
**EP02-ST02:** Als developer wil ik protected routes implementeren zodat alleen ingelogde users toegang hebben
|
|
- ⏳ Middleware voor auth check
|
|
- ⏳ Redirect naar login indien nodig
|
|
- ⏳ Loading states tijdens auth
|
|
- ⏳ Session refresh
|
|
|
|
**EP02-ST03:** Als gebruiker wil ik kunnen uitloggen zodat mijn sessie beëindigd wordt
|
|
- ⏳ Logout button in header
|
|
- ⏳ Session cleanup
|
|
- ⏳ Redirect naar login
|
|
- ⏳ Clear local state
|
|
|
|
**Technische implementatie details:**
|
|
- **Auth flow:** Email/password voor demo (magic link als backup)
|
|
- **Middleware:** Check auth in `middleware.ts`
|
|
- **Protected routes:** Alles behalve `/auth/*`
|
|
- **Session:** Supabase JWT tokens
|
|
|
|
---
|
|
|
|
### Epic EP03 — Client Management
|
|
**Epic Doel:** Complete CRUD functionaliteit voor cliëntbeheer.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP03-ST01 | Cliëntenlijst tonen | 5 | Not Started | EP01-ST01, EP02-ST02 |
|
|
| EP03-ST02 | Nieuwe cliënt aanmaken | 5 | Not Started | EP03-ST01 |
|
|
| EP03-ST03 | Cliëntgegevens bekijken | 5 | Not Started | EP03-ST01 |
|
|
| EP03-ST04 | Cliëntgegevens bewerken | 3 | Not Started | EP03-ST03 |
|
|
| EP03-ST05 | Zustand store voor client state | 3 | Not Started | EP00-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP03-ST01:** Als behandelaar wil ik een cliëntenlijst zien zodat ik overzicht heb
|
|
- ⏳ Tabel met: ClientID, Naam, Geboortedatum, Laatste update
|
|
- ⏳ Zoekbalk voor naam/ID
|
|
- ⏳ Pagination bij >20 items
|
|
- ⏳ Loading skeleton
|
|
|
|
**EP03-ST02:** Als behandelaar wil ik een nieuwe cliënt aanmaken zodat ik kan starten met intake
|
|
- ⏳ Modal/drawer met formulier
|
|
- ⏳ Velden: Voornaam, Achternaam, Geboortedatum
|
|
- ⏳ Auto-generated UUID
|
|
- ⏳ Validatie met Zod
|
|
- ⏳ Success toast
|
|
|
|
**EP03-ST03:** Als behandelaar wil ik cliëntgegevens bekijken zodat ik het dossier kan inzien
|
|
- ⏳ Route: /clients/[id]
|
|
- ⏳ Breadcrumb navigatie
|
|
- ⏳ Tabs: Overzicht, Intakes, Profiel, Plan
|
|
- ⏳ 404 handling
|
|
|
|
**EP03-ST04:** Als behandelaar wil ik cliëntgegevens bewerken zodat ik updates kan maken
|
|
- ⏳ Edit mode in detail view
|
|
- ⏳ Form validation
|
|
- ⏳ Optimistic updates
|
|
- ⏳ Error handling
|
|
|
|
**EP03-ST05:** Als developer wil ik Zustand store voor client state zodat data consistent blijft
|
|
- ⏳ clientStore.ts setup
|
|
- ⏳ Actions: setSelectedClient, updateClient
|
|
- ⏳ Persistent state waar nodig
|
|
- ⏳ TypeScript types
|
|
|
|
**Technische implementatie details:**
|
|
- **API endpoints:**
|
|
- `POST /api/clients` - Create
|
|
- `GET /api/clients` - List with search
|
|
- `GET /api/clients/[id]` - Get single
|
|
- `PATCH /api/clients/[id]` - Update
|
|
- **Zustand store:** Central state voor selected client
|
|
- **Validatie:** Zod schemas voor alle forms
|
|
|
|
---
|
|
|
|
### Epic EP04 — Intake Module
|
|
**Epic Doel:** Rich text editor voor intake verslagen met TipTap integratie.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP04-ST01 | TipTap editor implementeren | 8 | Not Started | EP03-ST03 |
|
|
| EP04-ST02 | Intake verslagen opslaan | 5 | Not Started | EP04-ST01 |
|
|
| EP04-ST03 | Tags toevoegen aan verslagen | 3 | Not Started | EP04-ST02 |
|
|
| EP04-ST04 | Oude intakes bekijken | 5 | Not Started | EP04-ST02 |
|
|
| EP04-ST05 | Tekst extractie voor search | 5 | Not Started | EP04-ST02 |
|
|
| EP04-ST06 | AI-rail implementeren | 8 | Not Started | EP04-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP04-ST01:** Als behandelaar wil ik TipTap editor gebruiken zodat ik rijk opgemaakte notities kan maken
|
|
- ⏳ TipTap met StarterKit
|
|
- ⏳ Toolbar: Bold, Italic, Lists, etc.
|
|
- ⏳ Placeholder text
|
|
- ⏳ Content als ProseMirror JSON
|
|
|
|
**EP04-ST02:** Als behandelaar wil ik intake verslagen opslaan zodat ze bewaard blijven
|
|
- ⏳ Save button + Ctrl/Cmd+S
|
|
- ⏳ Store in intake_notes table
|
|
- ⏳ Auto-save indicator
|
|
- ⏳ Success/error toasts
|
|
|
|
**EP04-ST03:** Als behandelaar wil ik tags toevoegen aan verslagen zodat ik ze kan categoriseren
|
|
- ⏳ Tag dropdown: Intake/Evaluatie/Plan
|
|
- ⏳ Tag badge in lijst
|
|
- ⏳ Filter op tag mogelijk
|
|
- ⏳ Validation
|
|
|
|
**EP04-ST04:** Als behandelaar wil ik oude intakes bekijken zodat ik historie kan inzien
|
|
- ⏳ Lijst van intakes per cliënt
|
|
- ⏳ Sorteer op datum
|
|
- ⏳ Click to view/edit
|
|
- ⏳ Read-only mode optie
|
|
|
|
**EP04-ST05:** Als developer wil ik tekst extractie implementeren voor search
|
|
- ⏳ Extract plain text van ProseMirror
|
|
- ⏳ Store in content_text field
|
|
- ⏳ Full-text search mogelijk
|
|
- ⏳ Performance optimization
|
|
|
|
**EP04-ST06:** Als behandelaar wil ik de AI-rail zien zodat AI-resultaten preview kan bekijken
|
|
- ⏳ Rechter paneel (40% breedte)
|
|
- ⏳ Collapsible/expandable
|
|
- ⏳ Preview area voor AI output
|
|
- ⏳ Action buttons: Invoegen/Annuleren
|
|
|
|
**Technische implementatie details:**
|
|
- **TipTap setup:**
|
|
```typescript
|
|
import StarterKit from '@tiptap/starter-kit'
|
|
const editor = useEditor({
|
|
extensions: [StarterKit],
|
|
content: prosemirrorJSON
|
|
})
|
|
```
|
|
- **Storage:** content_json (JSONB) + content_text (TEXT)
|
|
- **API:** `/api/intakes` endpoints
|
|
|
|
---
|
|
|
|
### Epic EP05 — Problem Profile (DSM-light)
|
|
**Epic Doel:** DSM-light categorisatie systeem met severity bepaling.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP05-ST01 | Probleem categorie selecteren | 5 | Not Started | EP04-ST02 |
|
|
| EP05-ST02 | Severity aangeven | 3 | Not Started | EP05-ST01 |
|
|
| EP05-ST03 | Opmerkingen toevoegen | 3 | Not Started | EP05-ST01 |
|
|
| EP05-ST04 | AI-suggestie paneel | 10 | Not Started | EP04-ST02, EP07-ST03 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP05-ST01:** Als behandelaar wil ik een probleem categorie selecteren zodat ik kan classificeren
|
|
- ⏳ Dropdown met 6 categorieën (zie FO §4.4)
|
|
- ⏳ Beschrijving per categorie
|
|
- ⏳ Validation required field
|
|
- ⏳ Store in problem_profiles
|
|
|
|
**EP05-ST02:** Als behandelaar wil ik severity aangeven zodat ernst duidelijk is
|
|
- ⏳ Button group: Laag/Middel/Hoog
|
|
- ⏳ Kleur-coded badges
|
|
- ⏳ Hover tooltips met uitleg
|
|
- ⏳ Required validation
|
|
|
|
**EP05-ST03:** Als behandelaar wil ik opmerkingen toevoegen zodat ik context kan geven
|
|
- ⏳ Textarea voor vrije tekst
|
|
- ⏳ Character limit (500)
|
|
- ⏳ Optional field
|
|
- ⏳ Markdown support
|
|
|
|
**EP05-ST04:** Als behandelaar wil ik AI-suggestie paneel gebruiken zodat classificatie sneller gaat
|
|
- ⏳ Knop "AI > Analyseer intake"
|
|
- ⏳ Suggestie paneel rechts
|
|
- ⏳ Shows: categorie, severity, rationale
|
|
- ⏳ Accepteer/Negeer buttons
|
|
- ⏳ Source highlighting in intake (zie TO §5.4)
|
|
|
|
**Technische implementatie details:**
|
|
- **Categorieën (enum):**
|
|
- stemming_depressie
|
|
- angst
|
|
- gedrag_impuls
|
|
- middelen_gebruik
|
|
- cognitief
|
|
- context_psychosociaal
|
|
- **Severity badges:** Tailwind classes volgens UX stylesheet
|
|
- **AI highlighting:** TipTap Decorations API
|
|
|
|
---
|
|
|
|
### Epic EP06 — Treatment Plan Module
|
|
**Epic Doel:** Genereren en beheren van gestructureerde behandelplannen.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP06-ST01 | Behandelplan genereren | 10 | Not Started | EP05-ST01, EP07-ST04 |
|
|
| EP06-ST02 | Doelen bewerken | 8 | Not Started | EP06-ST01 |
|
|
| EP06-ST03 | Interventies specificeren | 5 | Not Started | EP06-ST01 |
|
|
| EP06-ST04 | Meetmomenten plannen | 5 | Not Started | EP06-ST01 |
|
|
| EP06-ST05 | Plan publiceren | 6 | Not Started | EP06-ST02 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP06-ST01:** Als behandelaar wil ik een behandelplan genereren zodat ik snel een opzet heb
|
|
- ⏳ Knop "AI > Genereer behandelplan"
|
|
- ⏳ Uses intake + profile als context
|
|
- ⏳ Genereert 4 secties
|
|
- ⏳ Loading state tijdens generatie
|
|
|
|
**EP06-ST02:** Als behandelaar wil ik doelen bewerken zodat ze SMART geformuleerd zijn
|
|
- ⏳ Lijst van doelen (bullets)
|
|
- ⏳ Inline editing mogelijk
|
|
- ⏳ Add/remove doelen
|
|
- ⏳ Regenerate per doel optie
|
|
|
|
**EP06-ST03:** Als behandelaar wil ik interventies specificeren zodat behandeling duidelijk is
|
|
- ⏳ Interventie lijst
|
|
- ⏳ Type + frequentie + duur
|
|
- ⏳ Voorgestelde interventies
|
|
- ⏳ Custom toevoegen
|
|
|
|
**EP06-ST04:** Als behandelaar wil ik meetmomenten plannen zodat voortgang gemeten wordt
|
|
- ⏳ Timeline met meetmomenten
|
|
- ⏳ Na X sessies format
|
|
- ⏳ Evaluatie types
|
|
- ⏳ Calendar integration (stretch)
|
|
|
|
**EP06-ST05:** Als behandelaar wil ik plan publiceren zodat het definitief wordt
|
|
- ⏳ Concept vs Gepubliceerd status
|
|
- ⏳ Versioning (v1, v2, etc.)
|
|
- ⏳ Published timestamp
|
|
- ⏳ Read-only na publicatie
|
|
- ⏳ Nieuwe versie mogelijk
|
|
|
|
**Technische implementatie details:**
|
|
- **Plan structuur (JSONB):**
|
|
```typescript
|
|
{
|
|
doelen: string[],
|
|
interventies: string[],
|
|
frequentie: string,
|
|
meetmomenten: string[]
|
|
}
|
|
```
|
|
- **Status flow:** concept → gepubliceerd → nieuwe versie
|
|
- **API:** `/api/treatment-plan` endpoints
|
|
|
|
---
|
|
|
|
### Epic EP07 — AI Integration
|
|
**Epic Doel:** Claude AI integratie voor alle AI-powered features.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP07-ST01 | Claude API client configureren | 5 | Not Started | EP00-ST04 |
|
|
| EP07-ST02 | Intake samenvatten met AI | 8 | Not Started | EP07-ST01, EP04-ST06 |
|
|
| EP07-ST03 | Problemen extraheren met AI | 8 | Not Started | EP07-ST01 |
|
|
| EP07-ST04 | Behandelplan genereren met AI | 8 | Not Started | EP07-ST01 |
|
|
| EP07-ST05 | AI events loggen | 5 | Not Started | EP07-ST01, EP01-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP07-ST01:** Als developer wil ik Claude API client configureren zodat AI calls mogelijk zijn
|
|
- ⏳ Anthropic SDK setup
|
|
- ⏳ Server-side only implementation
|
|
- ⏳ Error handling
|
|
- ⏳ Rate limiting logic
|
|
|
|
**EP07-ST02:** Als behandelaar wil ik intake samenvatten met AI zodat ik snel overzicht heb
|
|
- ⏳ Endpoint: /api/ai/summarize
|
|
- ⏳ 5-8 bullet points output
|
|
- ⏳ Nederlands, klinisch neutraal
|
|
- ⏳ Max 5 sec response time
|
|
|
|
**EP07-ST03:** Als behandelaar wil ik problemen extraheren met AI zodat classificatie sneller gaat
|
|
- ⏳ Endpoint: /api/ai/extract
|
|
- ⏳ Returns: category, severity, rationale
|
|
- ⏳ Source sentences identificatie
|
|
- ⏳ Highlighting support
|
|
|
|
**EP07-ST04:** Als behandelaar wil ik behandelplan genereren met AI zodat ik een goede basis heb
|
|
- ⏳ Endpoint: /api/ai/generate-plan
|
|
- ⏳ SMART doelen formulering
|
|
- ⏳ Evidence-based interventies
|
|
- ⏳ Structured JSON output
|
|
|
|
**EP07-ST05:** Als developer wil ik AI events loggen zodat gebruik gemonitord wordt
|
|
- ⏳ Store in ai_events table
|
|
- ⏳ Track: prompt, response, duration
|
|
- ⏳ Cost calculation
|
|
- ⏳ Error logging
|
|
|
|
**Technische implementatie details:**
|
|
- **Claude model:** claude-3-5-sonnet-20241022
|
|
- **Prompt templates:** `/src/lib/ai/prompts/`
|
|
- **Temperature:** 0.3 (deterministic)
|
|
- **Max tokens:** Per endpoint verschillend
|
|
- **Security:** API key alleen server-side
|
|
|
|
---
|
|
|
|
### Epic EP08 — Dashboard & Navigation
|
|
**Epic Doel:** Configureerbaar dashboard met tegels en navigatie.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP08-ST01 | Dashboard met tegels | 5 | Not Started | EP03-ST03 |
|
|
| EP08-ST02 | Tegels configureren | 3 | Not Started | EP08-ST01 |
|
|
| EP08-ST03 | Breadcrumb navigatie | 2 | Not Started | EP03-ST03 |
|
|
| EP08-ST04 | Sidebar navigatie | 3 | Not Started | EP03-ST03 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP08-ST01:** Als behandelaar wil ik een dashboard zien zodat ik overzicht heb per cliënt
|
|
- ⏳ 5 tegels (zie FO §4.2)
|
|
- ⏳ Responsive grid layout
|
|
- ⏳ Data uit verschillende tables
|
|
- ⏳ Click naar detail
|
|
|
|
**EP08-ST02:** Als behandelaar wil ik tegels configureren zodat ik kan personaliseren
|
|
- ⏳ Settings icon → modal
|
|
- ⏳ Checkboxes per tegel
|
|
- ⏳ LocalStorage persistence
|
|
- ⏳ Instant preview
|
|
|
|
**EP08-ST03:** Als gebruiker wil ik breadcrumb navigatie zodat ik weet waar ik ben
|
|
- ⏳ Breadcrumb in header
|
|
- ⏳ Clickable segments
|
|
- ⏳ Current page highlight
|
|
- ⏳ Responsive truncation
|
|
|
|
**EP08-ST04:** Als gebruiker wil ik sidebar navigatie zodat ik tussen modules kan wisselen
|
|
- ⏳ Vertical navigation
|
|
- ⏳ Active state indicator
|
|
- ⏳ Icons + labels
|
|
- ⏳ Collapsible op mobile
|
|
|
|
**Technische implementatie details:**
|
|
- **Tegels:** Basisgegevens, Laatste Intake, Probleemprofiel, Behandelplan, Afspraken
|
|
- **Grid:** Tailwind Grid met responsive breakpoints
|
|
- **State:** Zustand voor tegel configuratie
|
|
|
|
---
|
|
|
|
### Epic EP09 — UI Components & Styling
|
|
**Epic Doel:** Consistente UI componenten volgens UX stylesheet.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP09-ST01 | Basis componenten bouwen | 5 | Not Started | EP00-ST02 |
|
|
| EP09-ST02 | Toast notificaties | 3 | Not Started | EP09-ST01 |
|
|
| EP09-ST03 | Loading states | 3 | Not Started | EP09-ST01 |
|
|
| EP09-ST04 | Formulier componenten | 5 | Not Started | EP09-ST01 |
|
|
| EP09-ST05 | Dark mode (stretch) | 5 | Not Started | EP09-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP09-ST01:** Als developer wil ik basis componenten bouwen zodat UI consistent is
|
|
- ⏳ Button, Card, Input, Select
|
|
- ⏳ Consistent met UX stylesheet
|
|
- ⏳ TypeScript props
|
|
- ⏳ Storybook (optional)
|
|
|
|
**EP09-ST02:** Als developer wil ik toast notificaties implementeren zodat feedback duidelijk is
|
|
- ⏳ Success/Error/Info/Warning
|
|
- ⏳ Auto-dismiss na 5 sec
|
|
- ⏳ Queue multiple toasts
|
|
- ⏳ Accessible (aria-live)
|
|
|
|
**EP09-ST03:** Als developer wil ik loading states implementeren zodat gebruiker weet dat er geladen wordt
|
|
- ⏳ Skeleton loaders
|
|
- ⏳ Spinners voor buttons
|
|
- ⏳ Progress bars voor AI
|
|
- ⏳ Consistent animation
|
|
|
|
**EP09-ST04:** Als developer wil ik formulier componenten maken zodat input consistent is
|
|
- ⏳ Form wrapper met validation
|
|
- ⏳ Error messages styling
|
|
- ⏳ Required field indicators
|
|
- ⏳ Help text support
|
|
|
|
**EP09-ST05:** Als developer wil ik dark mode ondersteunen (stretch) zodat gebruikers kunnen kiezen
|
|
- ⏳ Theme toggle button
|
|
- ⏳ System preference detect
|
|
- ⏳ Persist preference
|
|
- ⏳ All components support
|
|
|
|
**Technische implementatie details:**
|
|
- **Kleuren:** Zie UX stylesheet (§2-4)
|
|
- **Component library:** shadcn/ui of custom
|
|
- **Icons:** lucide-react consistent gebruik
|
|
|
|
---
|
|
|
|
### Epic EP10 — Testing & Quality Assurance
|
|
**Epic Doel:** Comprehensive testing voor stabiele demo.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP10-ST01 | Unit tests schrijven | 5 | Not Started | All features |
|
|
| EP10-ST02 | E2E tests schrijven | 5 | Not Started | All features |
|
|
| EP10-ST03 | Smoke tests uitvoeren | 2 | Not Started | All features |
|
|
| EP10-ST04 | Accessibility testen | 1 | Not Started | EP09 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP10-ST01:** Als developer wil ik unit tests schrijven zodat business logic getest is
|
|
- ⏳ Vitest setup
|
|
- ⏳ Utils & services tests
|
|
- ⏳ 80% coverage /lib folder
|
|
- ⏳ CI integration
|
|
|
|
**EP10-ST02:** Als developer wil ik E2E tests schrijven zodat kritieke flows werken
|
|
- ⏳ Playwright setup
|
|
- ⏳ Happy path: intake → profile → plan
|
|
- ⏳ Error scenarios
|
|
- ⏳ Cross-browser
|
|
|
|
**EP10-ST03:** Als team wil ik smoke tests uitvoeren zodat demo stabiel is
|
|
- ⏳ Manual test checklist
|
|
- ⏳ All features tested
|
|
- ⏳ Performance acceptable
|
|
- ⏳ No console errors
|
|
|
|
**EP10-ST04:** Als developer wil ik accessibility testen zodat app toegankelijk is
|
|
- ⏳ Keyboard navigation
|
|
- ⏳ Screen reader support
|
|
- ⏳ WCAG AA contrast
|
|
- ⏳ Focus management
|
|
|
|
**Technische implementatie details:**
|
|
- **Test scenarios:** Zie FO §9 demo-scenario
|
|
- **Performance:** <3s initial load, <5s AI responses
|
|
- **Browser support:** Chrome, Firefox, Safari latest
|
|
|
|
---
|
|
|
|
### Epic EP11 — Deployment & Demo Prep
|
|
**Epic Doel:** Production-ready deployment en demo voorbereiding.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP11-ST01 | Vercel deployment configureren | 3 | Not Started | All features |
|
|
| EP11-ST02 | Demo data prepareren | 5 | Not Started | EP01-ST04 |
|
|
| EP11-ST03 | Demo script schrijven | 3 | Not Started | All features |
|
|
| EP11-ST04 | Dry-run uitvoeren | 2 | Not Started | EP11-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP11-ST01:** Als developer wil ik Vercel deployment configureren zodat app live is
|
|
- ⏳ Vercel project setup
|
|
- ⏳ EU region (Amsterdam)
|
|
- ⏳ Environment variables
|
|
- ⏳ Custom domain (optional)
|
|
|
|
**EP11-ST02:** Als team wil ik demo data prepareren zodat presentatie smooth verloopt
|
|
- ⏳ 3 complete test cliënten
|
|
- ⏳ Realistic intake texts
|
|
- ⏳ Pre-generated AI responses
|
|
- ⏳ Backup data ready
|
|
|
|
**EP11-ST03:** Als presenter wil ik demo script hebben zodat presentatie gestructureerd is
|
|
- ⏳ 10-minute script
|
|
- ⏳ Key talking points
|
|
- ⏳ Backup scenarios
|
|
- ⏳ Q&A anticipatie
|
|
|
|
**EP11-ST04:** Als team wil ik dry-run doen zodat demo succesvol verloopt
|
|
- ⏳ Complete run-through
|
|
- ⏳ Timing verified (< 10 min)
|
|
- ⏳ Technical issues fixed
|
|
- ⏳ Feedback processed
|
|
|
|
**Technische implementatie details:**
|
|
- **Deployment checklist:**
|
|
- Environment variables set
|
|
- Database migrations run
|
|
- Seed data loaded
|
|
- SSL certificate active
|
|
- Monitoring enabled
|
|
|
|
---
|
|
|
|
### Epic EP12 — Stretch Features (Optional)
|
|
**Epic Doel:** Extra features indien tijd beschikbaar.
|
|
|
|
| Story ID | Story Title | Points | Status | Dependencies |
|
|
|----------|-------------|--------|--------|--------------|
|
|
| EP12-ST01 | Afspraken plannen | 8 | Not Started | EP08-ST01 |
|
|
| EP12-ST02 | PDF export | 8 | Not Started | EP06-ST05 |
|
|
| EP12-ST03 | Leesbaarheid verbeteren met AI | 5 | Not Started | EP07-ST01 |
|
|
|
|
**Story Details:**
|
|
|
|
**EP12-ST01:** Als behandelaar wil ik afspraken kunnen plannen zodat agenda gekoppeld is
|
|
- ⏳ Calendar view
|
|
- ⏳ Create/edit appointments
|
|
- ⏳ Link to client
|
|
- ⏳ Dashboard widget
|
|
|
|
**EP12-ST02:** Als behandelaar wil ik PDF export zodat ik rapporten kan delen
|
|
- ⏳ Export button
|
|
- ⏳ Professional layout
|
|
- ⏳ All sections included
|
|
- ⏳ Download trigger
|
|
|
|
**EP12-ST03:** Als behandelaar wil ik leesbaarheid verbeteren met AI zodat tekst B1-niveau wordt
|
|
- ⏳ Endpoint: /api/ai/readability
|
|
- ⏳ B1 niveau output
|
|
- ⏳ Preserve medical accuracy
|
|
- ⏳ Preview before apply
|
|
|
|
---
|
|
|
|
## 5. Kwaliteit & Testplan
|
|
|
|
🎯 **Doel:** Borging van kwaliteit voor stabiele demo.
|
|
|
|
### Test Types
|
|
| Test Type | Scope | Tools | Coverage Target |
|
|
|-----------|-------|-------|-----------------|
|
|
| Unit Tests | Services, utilities, validators | Vitest | 80% /lib folder |
|
|
| Integration Tests | API endpoints, database queries | Vitest + MSW | All critical endpoints |
|
|
| E2E Tests | Complete user flows | Playwright | 3 happy paths, 2 error paths |
|
|
| Performance Tests | Load time, API response | Lighthouse | LCP <2.5s, FID <100ms |
|
|
| Accessibility Tests | WCAG compliance | axe-core | AA compliance |
|
|
| Security Tests | Auth, XSS, SQL injection | Manual + automated | OWASP top 10 |
|
|
|
|
### Critical Test Scenarios
|
|
1. **New Client Flow**
|
|
- Create client → Add intake → Generate summary → Extract problems → Create plan
|
|
- Expected time: <2 minutes
|
|
- All data persisted correctly
|
|
|
|
2. **AI Integration Flow**
|
|
- Large intake text (2000+ words) → All AI features work
|
|
- Response time <5 seconds per call
|
|
- Graceful degradation if AI fails
|
|
|
|
3. **Error Handling**
|
|
- Network failure → Appropriate error messages
|
|
- Invalid input → Clear validation feedback
|
|
- AI timeout → Fallback behavior
|
|
|
|
### Demo Checklist
|
|
- [ ] Login with demo account works
|
|
- [ ] Create new client (auto-generated ID)
|
|
- [ ] Write intake with TipTap editor
|
|
- [ ] AI summarize returns Dutch bullets
|
|
- [ ] Problem extraction with highlighting
|
|
- [ ] Treatment plan generation (SMART goals)
|
|
- [ ] Publish plan (version 1)
|
|
- [ ] Dashboard shows all data correctly
|
|
- [ ] Navigation breadcrumbs work
|
|
- [ ] No console errors
|
|
- [ ] Performance acceptable (<3s loads)
|
|
- [ ] Mobile view responsive
|
|
|
|
---
|
|
|
|
## 6. Demo & Presentatieplan
|
|
|
|
🎯 **Doel:** Succesvolle 10-minuten demo tijdens AI-inspiratiesessie.
|
|
|
|
### Demo Timeline
|
|
| Time | Activity | Key Points | Backup Plan |
|
|
|------|----------|------------|-------------|
|
|
| 0:00-1:00 | **Intro** | Context mini-EPD, AI-toegevoegde waarde | Slides ready |
|
|
| 1:00-2:30 | **Nieuwe cliënt** | Quick entry, auto ClientID, immediate start | Pre-created client |
|
|
| 2:30-5:00 | **Intake + AI** | TipTap editor, AI summarize, source highlighting | Cached AI response |
|
|
| 5:00-7:00 | **Profile + Plan** | DSM categorization, AI-generated plan, SMART goals | Manual input ready |
|
|
| 7:00-8:30 | **Publiceren** | Version control, status change, dashboard update | Screenshots |
|
|
| 8:30-10:00 | **Q&A** | Interactive discussion, next steps | FAQ prepared |
|
|
|
|
### Technical Setup
|
|
- **Primary:** Live on Vercel (stable internet required)
|
|
- **Backup 1:** Local development server
|
|
- **Backup 2:** Recorded video demo
|
|
- **Backup 3:** Static screenshots
|
|
|
|
### Key Messages
|
|
1. AI vermindert administratieve last met 50%
|
|
2. Consistente kwaliteit van documentatie
|
|
3. Meer tijd voor cliëntcontact
|
|
4. Evidence-based suggesties
|
|
5. Privacy-first design (geen echte data)
|
|
|
|
---
|
|
|
|
## 7. Risico's & Mitigatie
|
|
|
|
🎯 **Doel:** Proactieve risico management voor succesvolle oplevering.
|
|
|
|
| Risico | Kans | Impact | Mitigatie | Owner |
|
|
|--------|------|--------|-----------|-------|
|
|
| **Claude API rate limits** | Hoog | Hoog | Response caching, queue implementation, fallback to OpenAI | Developer |
|
|
| **TipTap complexiteit** | Medium | Hoog | Start simple, incremental features, fallback to textarea | Developer |
|
|
| **Supabase RLS policies fout** | Medium | Hoog | Extensive testing, service role fallback, monitoring | Developer |
|
|
| **AI output inconsistent** | Hoog | Medium | Prompt versioning, temperature tuning, validation layer | Developer |
|
|
| **Demo internet uitval** | Laag | Hoog | Local setup ready, mobile hotspot backup, video recording | Presenter |
|
|
| **Tijd tekort voor features** | Medium | Medium | MoSCoW prioritization, MVP focus, stretch clearly marked | PM |
|
|
| **Browser compatibility** | Laag | Medium | Test on Chrome/Safari/Firefox, polyfills where needed | QA |
|
|
| **Performance issues** | Medium | Medium | Lazy loading, code splitting, CDN for assets | Developer |
|
|
| **Security vulnerability** | Laag | Hoog | Pen test, OWASP checklist, security headers | Developer |
|
|
|
|
---
|
|
|
|
## 8. Referenties
|
|
|
|
🎯 **Doel:** Koppeling naar alle relevante projectdocumentatie.
|
|
|
|
### Mission Control Documents
|
|
- **PRD** — [Product Requirements Document](./prd-mini-ecd.md) - Business requirements en scope
|
|
- **FO** — [Functioneel Ontwerp](./fo-mini-ecd.md) - User flows en functionele specificaties
|
|
- **TO** — [Technisch Ontwerp](./to-mini-ecd.md) - Architectuur en database design
|
|
- **UX/UI** — [Stylesheet](./ux-stylesheet.md) - Kleuren en design system
|
|
- **API** — [API Access Document](./api-acces-mini-ecd.md) - Endpoints en authenticatie
|
|
|
|
### External Resources
|
|
- **Repository:** `https://github.com/pinkroccade/mini-epd-prototype`
|
|
- **Deployment:** `https://mini-epd.vercel.app`
|
|
- **Supabase:** `https://app.supabase.com/project/[project-id]`
|
|
- **Claude AI:** `https://docs.anthropic.com/claude/reference`
|
|
- **TipTap Docs:** `https://tiptap.dev`
|
|
- **Next.js Docs:** `https://nextjs.org/docs`
|
|
|
|
### Development Resources
|
|
- **Component Library:** `https://ui.shadcn.com`
|
|
- **Icons:** `https://lucide.dev`
|
|
- **Tailwind:** `https://tailwindcss.com`
|
|
|
|
---
|
|
|
|
## 9. Technische Notities
|
|
|
|
### Database Queries Examples
|
|
```typescript
|
|
// Get client with full dossier
|
|
const { data: client } = await supabase
|
|
.from('clients')
|
|
.select(`
|
|
*,
|
|
intake_notes (*),
|
|
problem_profiles (*),
|
|
treatment_plans (*)
|
|
`)
|
|
.eq('id', clientId)
|
|
.single()
|
|
|
|
// Search clients
|
|
const { data: clients } = await supabase
|
|
.from('clients')
|
|
.select('*')
|
|
.ilike('last_name', `%${searchQuery}%`)
|
|
.order('updated_at', { ascending: false })
|
|
```
|
|
|
|
### AI Prompt Templates
|
|
```typescript
|
|
// Summarize prompt
|
|
const SUMMARIZE_PROMPT = `
|
|
Vat het onderstaande intake-verslag samen in 5-8 bullets.
|
|
Schrijf in Nederlands, klinisch neutraal, zonder persoonlijke informatie.
|
|
|
|
Intake verslag:
|
|
{intakeText}
|
|
`
|
|
|
|
// Extract problems prompt
|
|
const EXTRACT_PROMPT = `
|
|
Analyseer de intake en bepaal:
|
|
1. DSM-light categorie (kies uit: stemming_depressie, angst, gedrag_impuls, middelen_gebruik, cognitief, context_psychosociaal)
|
|
2. Severity (laag, middel, hoog)
|
|
3. Rationale (2-3 zinnen)
|
|
4. Bronzinnen uit de tekst
|
|
|
|
Intake:
|
|
{intakeText}
|
|
`
|
|
```
|
|
|
|
### Component Structure
|
|
```typescript
|
|
// Example component with proper typing
|
|
interface ClientCardProps {
|
|
client: Client
|
|
onClick?: (id: string) => void
|
|
isSelected?: boolean
|
|
}
|
|
|
|
export function ClientCard({ client, onClick, isSelected }: ClientCardProps) {
|
|
return (
|
|
<Card
|
|
className={cn(
|
|
"cursor-pointer transition-shadow",
|
|
isSelected && "ring-2 ring-primary"
|
|
)}
|
|
onClick={() => onClick?.(client.id)}
|
|
>
|
|
<CardHeader>
|
|
<CardTitle>{client.first_name} {client.last_name}</CardTitle>
|
|
<CardDescription>
|
|
{format(new Date(client.birth_date), 'dd-MM-yyyy')}
|
|
</CardDescription>
|
|
</CardHeader>
|
|
</Card>
|
|
)
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
**Versiehistorie:**
|
|
|
|
| Versie | Datum | Auteur | Wijziging |
|
|
|--------|-------|--------|-----------|
|
|
| v1.0 | 10-11-2025 | Development Team | Initiële versie met complete epic breakdown | |