chore(strip): verwijder behandelplan-module

AI-generatie negeerde de geregistreerde diagnose en ernst — elk plan was
generiek (reviewbevinding). Module komt terug bij de rebuild, gekoppeld
aan het nieuwe datamodel.

- app/epd/patients/[id]/behandelplan/ en /api/behandelplan/ verwijderd
- components/behandelplan/ (view, list, forms) verwijderd
- lib/ai/behandelplan-prompt.ts, lib/ai/intervention-mapping.ts,
  lib/types/behandelplan.ts verwijderd
- behandelplan-sectie uit patientdashboard, dashboard-API en
  Cortex patient-dashboard-block
- 'Doorzetten naar behandelplan' uit behandeladvies-formulier

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
colinislit
2026-07-14 22:47:58 +02:00
parent a8b02c1ef3
commit 96848ecc81
27 changed files with 3 additions and 6407 deletions

View File

@@ -1,221 +0,0 @@
/**
* Behandelplan AI Prompts
*
* System prompt en user prompt templates voor AI-generatie van behandelplannen
*/
import { type LifeDomainScore, LIFE_DOMAIN_META } from '@/lib/types/leefgebieden';
import { type Severity, getInterventionsForCategory, getRecommendedSessionCount, getRecommendedFrequency, getRecommendedFormat } from './intervention-mapping';
/**
* Context voor behandelplan generatie
*/
export interface PlanContext {
patientId: string;
intakeNotes: string;
dsmCategory: string;
severity: Severity;
lifeDomains: LifeDomainScore[];
extraInstructions?: string;
}
/**
* System prompt voor Claude
* Instructies voor het genereren van een behandelplan
*/
export const BEHANDELPLAN_SYSTEM_PROMPT = `Je bent een ervaren GGZ-behandelaar die behandelplannen opstelt voor cliënten in de ambulante GGZ.
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 zoals "beter voelen")
5. Genereer voor elk doel een B1-taal versie (cliënt-vriendelijk, simpele woorden)
6. Kies evidence-based interventies passend bij de DSM-categorie
7. Plan sessies gebaseerd op severity niveau
8. Voeg een veiligheidsplan toe ALLEEN bij severity "hoog"
SMART CRITERIA:
- Specifiek: Wat precies wil de cliënt bereiken?
- Meetbaar: Hoe meten we vooruitgang? (bijv. "3x per week", "score van 3 naar 4")
- Acceptabel: Past bij wensen en mogelijkheden cliënt
- Realistisch: Haalbaar binnen de behandelperiode
- Tijdgebonden: Binnen hoeveel weken?
B1-TAAL RICHTLIJNEN (cliënt-versie):
- Korte zinnen (max 15 woorden)
- Alledaagse woorden (geen jargon)
- Actieve zinnen ("Ik ga..." niet "Er zal worden...")
- Directe aanspreking ("jij" of "je")
OUTPUT FORMAT:
Retourneer ALLEEN valide JSON volgens dit exacte schema (geen extra tekst):
{
"behandelstructuur": {
"duur": "string (bijv. '8 weken')",
"frequentie": "string (bijv. 'Wekelijks')",
"aantalSessies": number,
"vorm": "string (bijv. 'Individueel')"
},
"doelen": [
{
"id": "string (uuid)",
"title": "string (max 200 tekens, korte beschrijving)",
"description": "string (SMART uitwerking, 2-3 zinnen)",
"clientVersion": "string (B1-taal versie voor cliënt)",
"lifeDomain": "dlv|wonen|werk|sociaal|vrijetijd|financien|gezondheid",
"priority": "hoog|middel|laag",
"measurability": "string (hoe meten we vooruitgang?)",
"timelineWeeks": number,
"status": "niet_gestart",
"progress": 0
}
],
"interventies": [
{
"id": "string (uuid)",
"name": "string (bijv. 'CGT', 'EMDR')",
"description": "string (uitleg interventie)",
"rationale": "string (waarom past dit bij deze cliënt?)",
"linkedGoalIds": ["string (id van gekoppeld doel)"]
}
],
"sessiePlanning": [
{
"id": "string (uuid)",
"nummer": number,
"focus": "string (waar gaat de sessie over?)",
"status": "gepland",
"gekoppeldeDoelIds": ["string"]
}
],
"evaluatiemomenten": [
{
"id": "string (uuid)",
"type": "tussentijds|eind",
"weekNumber": number,
"plannedDate": "string (ISO date, mag leeg)",
"status": "gepland"
}
],
"veiligheidsplan": null of {
"waarschuwingssignalen": ["string (3-5 items)"],
"copingStrategieen": ["string (3-5 items)"],
"contacten": [
{
"naam": "string",
"rol": "string",
"telefoon": "string"
}
],
"restricties": ["string (optioneel)"]
}
}`;
/**
* Bouw user prompt met context
*/
export function buildUserPrompt(context: PlanContext): string {
// Get high priority domains
const highPriorityDomains = context.lifeDomains.filter(d => d.priority === 'hoog');
const lowScoreDomains = context.lifeDomains.filter(d => d.baseline <= 2);
// Get intervention suggestions
const suggestedInterventions = getInterventionsForCategory(context.dsmCategory, context.severity);
const recommendedSessions = getRecommendedSessionCount(context.dsmCategory, context.severity);
const recommendedFrequency = getRecommendedFrequency(context.severity);
const recommendedFormat = getRecommendedFormat(context.severity);
// Build life domains section
const lifeDomainLines = context.lifeDomains.map(d => {
const meta = LIFE_DOMAIN_META[d.domain];
const priorityMarker = d.priority === 'hoog' ? ' [PRIORITEIT]' : '';
const lowScoreMarker = d.baseline <= 2 ? ' [LAAG]' : '';
return `- ${meta.label} (${d.domain}): ${d.baseline}/5 → doel ${d.target}/5${priorityMarker}${lowScoreMarker}${d.notes ? ` (${d.notes})` : ''}`;
}).join('\n');
// Build intervention suggestions
const interventionLines = suggestedInterventions.slice(0, 3).map(i =>
`- ${i.name}: ${i.description} (~${i.recommendedSessions} sessies)`
).join('\n');
return `CLIËNT CONTEXT:
=================
Intake notities:
${context.intakeNotes}
DSM-categorie: ${context.dsmCategory}
Severity: ${context.severity}
LEEFGEBIEDEN ASSESSMENT:
========================
${lifeDomainLines}
${highPriorityDomains.length > 0 ? `
FOCUS GEBIEDEN (hoge prioriteit):
${highPriorityDomains.map(d => `- ${LIFE_DOMAIN_META[d.domain].label}`).join('\n')}
` : ''}
${lowScoreDomains.length > 0 ? `
AANDACHTSPUNTEN (lage scores):
${lowScoreDomains.map(d => `- ${LIFE_DOMAIN_META[d.domain].label} (score: ${d.baseline}/5)`).join('\n')}
` : ''}
AANBEVOLEN INTERVENTIES (evidence-based):
=========================================
${interventionLines}
AANBEVOLEN BEHANDELSTRUCTUUR:
=============================
- Aantal sessies: ~${recommendedSessions}
- Frequentie: ${recommendedFrequency}
- Vorm: ${recommendedFormat}
${context.extraInstructions ? `
EXTRA INSTRUCTIES VAN BEHANDELAAR:
==================================
${context.extraInstructions}
` : ''}
Genereer nu een compleet behandelplan in JSON formaat.
Zorg dat elk doel:
1. Gekoppeld is aan een leefgebied met hoge prioriteit of lage score
2. Een meetbare indicator heeft
3. Een B1-taal versie heeft voor de cliënt
4. Realistisch is voor de behandelperiode
${context.severity === 'hoog' ? 'BELANGRIJK: Voeg ook een veiligheidsplan toe met waarschuwingssignalen, copingstrategieën en contactpersonen.' : ''}`;
}
/**
* Valideer of de context voldoende informatie bevat
*/
export function validatePlanContext(context: PlanContext): { valid: boolean; errors: string[] } {
const errors: string[] = [];
if (!context.intakeNotes || context.intakeNotes.length < 50) {
errors.push('Intake notities zijn te kort (minimaal 50 tekens)');
}
if (!context.dsmCategory) {
errors.push('DSM-categorie ontbreekt');
}
if (!context.severity) {
errors.push('Severity niveau ontbreekt');
}
if (!context.lifeDomains || context.lifeDomains.length !== 7) {
errors.push('Leefgebieden assessment is incompleet (7 domeinen vereist)');
}
const hasHighPriority = context.lifeDomains?.some(d => d.priority === 'hoog');
if (!hasHighPriority) {
errors.push('Minimaal 1 leefgebied moet prioriteit "hoog" hebben');
}
return {
valid: errors.length === 0,
errors,
};
}

View File

@@ -1,232 +0,0 @@
/**
* Evidence-Based Intervention Mapping
*
* Mapping van DSM-categorieën naar evidence-based interventies
* met sessie-aantallen per severity level
*/
export interface InterventionSuggestion {
name: string;
description: string;
sessions: {
laag: number;
middel: number;
hoog: number;
};
}
export type Severity = 'laag' | 'middel' | 'hoog';
/**
* DSM categorieën naar interventie mapping
* Gebaseerd op richtlijnen GGZ Standaarden
*/
export const INTERVENTION_MAPPING: Record<string, InterventionSuggestion[]> = {
angststoornissen: [
{
name: 'CGT',
description: 'Cognitieve Gedragstherapie gericht op angstreductie door blootstelling en cognitieve herstructurering',
sessions: { laag: 8, middel: 10, hoog: 14 },
},
{
name: 'Exposure therapie',
description: 'Systematische blootstelling aan angstopwekkende situaties met responspreventie',
sessions: { laag: 6, middel: 8, hoog: 12 },
},
{
name: 'ACT',
description: 'Acceptance and Commitment Therapy voor psychologische flexibiliteit',
sessions: { laag: 8, middel: 10, hoog: 12 },
},
],
stemmingsklachten: [
{
name: 'CGT',
description: 'Cognitieve Gedragstherapie gericht op negatieve denkpatronen en gedragsactivatie',
sessions: { laag: 8, middel: 10, hoog: 14 },
},
{
name: 'IPT',
description: 'Interpersoonlijke Therapie gericht op relationele patronen en sociale steun',
sessions: { laag: 8, middel: 12, hoog: 16 },
},
{
name: 'Gedragsactivatie',
description: 'Gestructureerde toename van plezierige en betekenisvolle activiteiten',
sessions: { laag: 6, middel: 8, hoog: 10 },
},
],
trauma_ptss: [
{
name: 'EMDR',
description: 'Eye Movement Desensitization and Reprocessing voor traumaverwerking',
sessions: { laag: 6, middel: 10, hoog: 16 },
},
{
name: 'Narratieve therapie',
description: 'Verwerking door het opbouwen van een coherent traumaverhaal',
sessions: { laag: 8, middel: 12, hoog: 16 },
},
{
name: 'CGT trauma-focus',
description: 'Trauma-gefocuste CGT met exposure en cognitieve verwerking',
sessions: { laag: 8, middel: 12, hoog: 16 },
},
],
persoonlijkheid: [
{
name: 'Schematherapie',
description: 'Langdurige therapie gericht op disfunctionele schemas en copingstijlen',
sessions: { laag: 16, middel: 24, hoog: 40 },
},
{
name: 'MBT',
description: 'Mentalization-Based Treatment voor emotieregulatie en relaties',
sessions: { laag: 16, middel: 24, hoog: 40 },
},
{
name: 'DGT',
description: 'Dialectische Gedragstherapie voor emotieregulatie en crisisvaardigheden',
sessions: { laag: 16, middel: 24, hoog: 40 },
},
],
verslaving: [
{
name: 'Motiverende gespreksvoering',
description: 'Versterken van intrinsieke motivatie voor gedragsverandering',
sessions: { laag: 4, middel: 6, hoog: 8 },
},
{
name: 'CGT verslaving',
description: 'Cognitieve Gedragstherapie gericht op craving en terugvalpreventie',
sessions: { laag: 8, middel: 12, hoog: 16 },
},
{
name: 'Terugvalpreventie',
description: 'Identificeren en managen van risicosituaties en triggers',
sessions: { laag: 6, middel: 8, hoog: 12 },
},
],
adhd: [
{
name: 'Psycho-educatie',
description: 'Educatie over ADHD en praktische copingstrategieën',
sessions: { laag: 4, middel: 6, hoog: 8 },
},
{
name: 'Coaching/planning',
description: 'Structuur en planningsvaardigheden ontwikkelen',
sessions: { laag: 6, middel: 8, hoog: 12 },
},
{
name: 'CGT ADHD',
description: 'Gedragstherapie gericht op impulscontrole en executieve functies',
sessions: { laag: 8, middel: 10, hoog: 14 },
},
],
autisme: [
{
name: 'Psycho-educatie',
description: 'Educatie over autisme en zelfacceptatie',
sessions: { laag: 4, middel: 6, hoog: 8 },
},
{
name: 'Sociale vaardigheden',
description: 'Training in sociale interactie en communicatie',
sessions: { laag: 8, middel: 12, hoog: 16 },
},
{
name: 'Stressmanagement',
description: 'Omgaan met prikkels en sensorische overbelasting',
sessions: { laag: 6, middel: 8, hoog: 12 },
},
],
overig: [
{
name: 'Ondersteunende gesprekken',
description: 'Steunende begeleiding en reflectie',
sessions: { laag: 4, middel: 6, hoog: 8 },
},
{
name: 'Psycho-educatie',
description: 'Educatie over klachten en copingstrategieën',
sessions: { laag: 4, middel: 6, hoog: 8 },
},
],
};
/**
* Haal interventies op voor een DSM categorie
*/
export function getInterventionsForCategory(
dsmCategory: string,
severity: Severity
): { name: string; description: string; recommendedSessions: number }[] {
// Normalize category
const normalizedCategory = dsmCategory
.toLowerCase()
.replace(/[^a-z]/g, '_')
.replace(/_+/g, '_');
// Find matching category
const interventions =
INTERVENTION_MAPPING[normalizedCategory] ||
INTERVENTION_MAPPING['overig'];
return interventions.map((intervention) => ({
name: intervention.name,
description: intervention.description,
recommendedSessions: intervention.sessions[severity],
}));
}
/**
* Bereken aanbevolen aantal sessies
*/
export function getRecommendedSessionCount(
dsmCategory: string,
severity: Severity
): number {
const interventions = getInterventionsForCategory(dsmCategory, severity);
if (interventions.length === 0) return 8;
// Neem gemiddelde van eerste 2 interventies
const topInterventions = interventions.slice(0, 2);
const avg =
topInterventions.reduce((sum, i) => sum + i.recommendedSessions, 0) /
topInterventions.length;
return Math.round(avg);
}
/**
* Bepaal behandelvorm op basis van severity
*/
export function getRecommendedFormat(severity: Severity): string {
switch (severity) {
case 'laag':
return 'Individueel';
case 'middel':
return 'Individueel';
case 'hoog':
return 'Individueel + groep (optioneel)';
default:
return 'Individueel';
}
}
/**
* Bepaal behandelfrequentie op basis van severity
*/
export function getRecommendedFrequency(severity: Severity): string {
switch (severity) {
case 'laag':
return 'Wekelijks tot tweewekelijks';
case 'middel':
return 'Wekelijks';
case 'hoog':
return 'Wekelijks tot 2x per week';
default:
return 'Wekelijks';
}
}