From a8b02c1ef37f8ad7e188a5ccc475939ae82d2582 Mon Sep 17 00:00:00 2001 From: colinislit Date: Tue, 14 Jul 2026 22:44:09 +0200 Subject: [PATCH] chore(strip): verwijder kapotte intake-tabs anamnese, onderzoeken en ROM Opslaan faalde altijd door label/code-mismatch met de database-constraints (reviewbevinding). Tabs komen terug bij de rebuild op het nieuwe datamodel. - tab-mappen anamnese/, examination/, rom/ verwijderd - tabs uit intake-tabs.tsx, server actions uit actions.ts - intake-status API telt de secties niet meer mee (voortgangsring klopt) - Cortex-navigatiedoelen (regex, entity-mapping, prompt) bijgewerkt zodat 'ga naar anamnese' geen 404 meer geeft Co-Authored-By: Claude Fable 5 --- app/api/cortex/chat/route.ts | 4 +- app/api/cortex/intake/status/route.ts | 32 +--- .../[id]/intakes/[intakeId]/actions.ts | 110 ------------ .../anamnese/components/anamnese-manager.tsx | 143 --------------- .../[id]/intakes/[intakeId]/anamnese/page.tsx | 23 --- .../[intakeId]/components/intake-tabs.tsx | 3 - .../components/examination-manager.tsx | 167 ------------------ .../intakes/[intakeId]/examination/page.tsx | 23 --- .../[id]/intakes/[intakeId]/rom/page.tsx | 28 --- .../cortex/command-center/command-center.tsx | 5 +- lib/cortex/entity-extractor.ts | 15 -- lib/cortex/intent-classifier.ts | 6 +- lib/cortex/reflex-classifier.ts | 7 +- lib/cortex/types.ts | 2 +- 14 files changed, 9 insertions(+), 559 deletions(-) delete mode 100644 app/epd/patients/[id]/intakes/[intakeId]/anamnese/components/anamnese-manager.tsx delete mode 100644 app/epd/patients/[id]/intakes/[intakeId]/anamnese/page.tsx delete mode 100644 app/epd/patients/[id]/intakes/[intakeId]/examination/components/examination-manager.tsx delete mode 100644 app/epd/patients/[id]/intakes/[intakeId]/examination/page.tsx delete mode 100644 app/epd/patients/[id]/intakes/[intakeId]/rom/page.tsx diff --git a/app/api/cortex/chat/route.ts b/app/api/cortex/chat/route.ts index 8e2138e..b3cb192 100644 --- a/app/api/cortex/chat/route.ts +++ b/app/api/cortex/chat/route.ts @@ -207,8 +207,8 @@ Je herkent de volgende gebruikersintenties en voert acties uit: - Actie: Toon DiagnoseBlock met ICD-10 codes - **intake_navigeer** — Navigeer naar intake sectie - - Triggers: "ga naar risico", "ga naar diagnose", "ga naar kindcheck", "ga naar anamnese", "open risicotaxatie", "naar behandeladvies" - - Entities: navigationTarget (risk/diagnosis/kindcheck/anamnese/contacts/examination/rom/behandeladvies) + - Triggers: "ga naar risico", "ga naar diagnose", "ga naar kindcheck", "open risicotaxatie", "naar behandeladvies" + - Entities: navigationTarget (risk/diagnosis/kindcheck/contacts/behandeladvies) - Required: navigationTarget, actieve patient - Actie: Navigeer naar de intake sectie in het EPD diff --git a/app/api/cortex/intake/status/route.ts b/app/api/cortex/intake/status/route.ts index 1f12e7c..165e260 100644 --- a/app/api/cortex/intake/status/route.ts +++ b/app/api/cortex/intake/status/route.ts @@ -26,11 +26,8 @@ interface IntakeSection { const INTAKE_SECTIONS: IntakeSection[] = [ { id: 'contacts', label: 'Contactmomenten', required: false }, - { id: 'anamnese', label: 'Anamnese', required: true }, { id: 'risk', label: 'Risicotaxatie', required: true }, { id: 'kindcheck', label: 'Kindcheck', required: true }, - { id: 'examination', label: 'Onderzoek', required: false }, - { id: 'rom', label: 'Meetinstrumenten (ROM)', required: false }, { id: 'diagnosis', label: 'Diagnose', required: true }, { id: 'behandeladvies', label: 'Behandeladvies', required: true }, ]; @@ -139,41 +136,17 @@ export async function GET(request: NextRequest) { } // Fetch counts for each section in parallel - const [ - contactsResult, - anamneseResult, - riskResult, - examinationResult, - romResult, - diagnosisResult, - ] = await Promise.all([ + const [contactsResult, riskResult, diagnosisResult] = await Promise.all([ // Contacts (encounters) supabase .from('encounters') .select('id', { count: 'exact', head: true }) .eq('intake_id', targetIntakeId), - // Anamnese - supabase - .from('anamneses') - .select('id', { count: 'exact', head: true }) - .eq('intake_id', targetIntakeId), // Risk assessments supabase .from('risk_assessments') .select('id', { count: 'exact', head: true }) .eq('intake_id', targetIntakeId), - // Examinations (non-ROM) - supabase - .from('examinations') - .select('id', { count: 'exact', head: true }) - .eq('intake_id', targetIntakeId) - .neq('examination_type', 'ROM'), - // ROM examinations - supabase - .from('examinations') - .select('id', { count: 'exact', head: true }) - .eq('intake_id', targetIntakeId) - .eq('examination_type', 'ROM'), // Diagnoses (conditions linked to intake via encounter_id) supabase .from('conditions') @@ -184,11 +157,8 @@ export async function GET(request: NextRequest) { // Build section status const sectionCounts: Record = { contacts: contactsResult.count || 0, - anamnese: anamneseResult.count || 0, risk: riskResult.count || 0, kindcheck: intake.kindcheck_data && Object.keys(intake.kindcheck_data as object).length > 0 ? 1 : 0, - examination: examinationResult.count || 0, - rom: romResult.count || 0, diagnosis: diagnosisResult.count || 0, behandeladvies: intake.treatment_advice && Object.keys(intake.treatment_advice as object).length > 0 ? 1 : 0, }; diff --git a/app/epd/patients/[id]/intakes/[intakeId]/actions.ts b/app/epd/patients/[id]/intakes/[intakeId]/actions.ts index 4af5c47..32a6810 100644 --- a/app/epd/patients/[id]/intakes/[intakeId]/actions.ts +++ b/app/epd/patients/[id]/intakes/[intakeId]/actions.ts @@ -186,116 +186,6 @@ export async function deleteRiskAssessment(patientId: string, intakeId: string, revalidatePath(buildPath(patientId, intakeId)); } -// ---------------- Anamneses ---------------- -export async function getAnamneses(intakeId: string) { - const supabase = await getSupabase(); - const { data, error } = await supabase - .from('anamneses') - .select('*') - .eq('intake_id', intakeId) - .order('anamnese_date', { ascending: false }); - if (error) { - console.error('getAnamneses error', error); - throw new Error('Kon anamneses niet ophalen'); - } - return data || []; -} - -export interface AnamnesePayload { - patientId: string; - intakeId: string; - date: string; - type: string; - content: string; - notes?: string; -} - -export async function createAnamnese(payload: AnamnesePayload) { - const supabase = await getSupabase(); - const { error } = await supabase.from('anamneses').insert({ - intake_id: payload.intakeId, - anamnese_date: payload.date, - anamnese_type: payload.type, - content: payload.content, - notes: payload.notes, - }); - if (error) { - console.error('createAnamnese error', error); - throw new Error(error.message); - } - revalidatePath(buildPath(payload.patientId, payload.intakeId, 'anamnese')); - revalidatePath(buildPath(payload.patientId, payload.intakeId)); -} - -export async function deleteAnamnese(patientId: string, intakeId: string, anamneseId: string) { - const supabase = await getSupabase(); - const { error } = await supabase.from('anamneses').delete().eq('id', anamneseId); - if (error) { - console.error('deleteAnamnese error', error); - throw new Error(error.message); - } - revalidatePath(buildPath(patientId, intakeId, 'anamnese')); - revalidatePath(buildPath(patientId, intakeId)); -} - -// ---------------- Examinations (including ROM) ---------------- -export async function getExaminations(intakeId: string) { - const supabase = await getSupabase(); - const { data, error } = await supabase - .from('examinations') - .select('*') - .eq('intake_id', intakeId) - .order('examination_date', { ascending: false }); - if (error) { - console.error('getExaminations error', error); - throw new Error('Kon onderzoeken niet ophalen'); - } - return data || []; -} - -export interface ExaminationPayload { - patientId: string; - intakeId: string; - date: string; - type: string; - findings: string; - performer?: string; - reason?: string; - notes?: string; - isRom?: boolean; -} - -export async function createExamination(payload: ExaminationPayload) { - const supabase = await getSupabase(); - const { error } = await supabase.from('examinations').insert({ - intake_id: payload.intakeId, - examination_date: payload.date, - examination_type: payload.isRom ? 'ROM' : payload.type, - findings: payload.findings, - performed_by: payload.performer, - reason: payload.reason, - notes: payload.notes, - }); - if (error) { - console.error('createExamination error', error); - throw new Error(error.message); - } - const tab = payload.isRom ? 'rom' : 'examination'; - revalidatePath(buildPath(payload.patientId, payload.intakeId, tab)); - revalidatePath(buildPath(payload.patientId, payload.intakeId)); -} - -export async function deleteExamination(patientId: string, intakeId: string, examinationId: string) { - const supabase = await getSupabase(); - const { error } = await supabase.from('examinations').delete().eq('id', examinationId); - if (error) { - console.error('deleteExamination error', error); - throw new Error(error.message); - } - revalidatePath(buildPath(patientId, intakeId, 'examination')); - revalidatePath(buildPath(patientId, intakeId, 'rom')); - revalidatePath(buildPath(patientId, intakeId)); -} // ---------------- Diagnoses ---------------- export async function getDiagnoses(intakeId: string) { diff --git a/app/epd/patients/[id]/intakes/[intakeId]/anamnese/components/anamnese-manager.tsx b/app/epd/patients/[id]/intakes/[intakeId]/anamnese/components/anamnese-manager.tsx deleted file mode 100644 index 9878525..0000000 --- a/app/epd/patients/[id]/intakes/[intakeId]/anamnese/components/anamnese-manager.tsx +++ /dev/null @@ -1,143 +0,0 @@ -'use client'; - -import { useState, useTransition } from 'react'; -import { createAnamnese, deleteAnamnese, type Anamnese } from '../../actions'; -import { Loader2, Trash2 } from 'lucide-react'; -import { format } from 'date-fns'; -import { nl } from 'date-fns/locale'; - -const types = [ - 'Psychiatrische anamnese', - 'Sociale anamnese', - 'Medische anamnese', - 'Familieanamnese', - 'Ontwikkelingsanamnese', - 'Overig', -]; - -interface AnamneseManagerProps { - patientId: string; - intakeId: string; - anamneses: Anamnese[]; -} - -export function AnamneseManager({ patientId, intakeId, anamneses }: AnamneseManagerProps) { - const [form, setForm] = useState({ - date: '', - type: types[0], - content: '', - notes: '', - }); - const [error, setError] = useState(null); - const [isPending, startTransition] = useTransition(); - const [deletingId, setDeletingId] = useState(null); - - const handleSubmit = () => { - if (!form.date || !form.content) { - setError('Datum en inhoud zijn verplicht.'); - return; - } - setError(null); - startTransition(async () => { - try { - await createAnamnese({ - patientId, - intakeId, - date: form.date, - type: form.type, - content: form.content, - notes: form.notes, - }); - setForm({ ...form, content: '', notes: '' }); - } catch (err) { - setError(err instanceof Error ? err.message : 'Opslaan mislukt'); - } - }); - }; - - const handleDelete = (id: string) => { - setDeletingId(id); - startTransition(async () => { - try { - await deleteAnamnese(patientId, intakeId, id); - } catch (err) { - setError(err instanceof Error ? err.message : 'Verwijderen mislukt'); - } finally { - setDeletingId(null); - } - }); - }; - - return ( -
-
- {anamneses.length === 0 &&

Nog geen anamneses.

} - {anamneses.map((item) => ( -
-
-
-

{item.anamnese_type}

-

- {format(new Date(item.anamnese_date), 'd MMM yyyy', { locale: nl })} -

-
- -
-

{item.content}

- {item.notes &&

Notities: {item.notes}

} -
- ))} -
- -
-

Nieuwe anamnese

- setForm((prev) => ({ ...prev, date: e.target.value }))} - className="h-10 rounded-md border border-slate-300 px-3 text-sm" - /> - -