-- WARNING: This schema is for context only and is not meant to be run. -- Table order and constraints may not be valid for execution. CREATE TABLE public.ai_events ( id uuid NOT NULL DEFAULT gen_random_uuid(), kind text NOT NULL CHECK (kind = ANY (ARRAY['summarize'::text, 'readability'::text, 'extract'::text, 'plan'::text])), client_id uuid, note_id uuid, request jsonb NOT NULL DEFAULT '{}'::jsonb, response jsonb NOT NULL DEFAULT '{}'::jsonb, duration_ms integer NOT NULL DEFAULT 0 CHECK (duration_ms >= 0), created_at timestamp with time zone NOT NULL DEFAULT now(), CONSTRAINT ai_events_pkey PRIMARY KEY (id), CONSTRAINT ai_events_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.clients(id), CONSTRAINT ai_events_note_id_fkey FOREIGN KEY (note_id) REFERENCES public.intake_notes(id) ); CREATE TABLE public.care_plans ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier text DEFAULT (gen_random_uuid())::text UNIQUE, status USER-DEFINED NOT NULL DEFAULT 'draft'::careplan_status, intent text NOT NULL DEFAULT 'plan'::text, category_code text DEFAULT 'ggz-behandelplan'::text, category_display text DEFAULT 'GGZ Behandelplan'::text, title text NOT NULL, description text, patient_id uuid NOT NULL, encounter_id uuid, period_start date, period_end date, created_date timestamp with time zone DEFAULT now(), author_id uuid, contributor_ids ARRAY, care_team_ids ARRAY, addresses_condition_ids ARRAY, goals jsonb DEFAULT '[]'::jsonb, activities jsonb DEFAULT '[]'::jsonb, note text, created_at timestamp with time zone DEFAULT now(), updated_at timestamp with time zone DEFAULT now(), CONSTRAINT care_plans_pkey PRIMARY KEY (id), CONSTRAINT care_plans_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id), CONSTRAINT care_plans_encounter_id_fkey FOREIGN KEY (encounter_id) REFERENCES public.encounters(id), CONSTRAINT care_plans_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.practitioners(id) ); CREATE TABLE public.clients ( id uuid NOT NULL DEFAULT gen_random_uuid(), first_name text NOT NULL, last_name text NOT NULL, birth_date date NOT NULL, created_at timestamp with time zone NOT NULL DEFAULT now(), updated_at timestamp with time zone NOT NULL DEFAULT now(), CONSTRAINT clients_pkey PRIMARY KEY (id) ); CREATE TABLE public.conditions ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier text DEFAULT (gen_random_uuid())::text UNIQUE, clinical_status USER-DEFINED NOT NULL DEFAULT 'active'::condition_clinical_status, verification_status USER-DEFINED NOT NULL DEFAULT 'provisional'::condition_verification_status, category text NOT NULL DEFAULT 'encounter-diagnosis'::text, severity_code text, severity_display text, code_system text NOT NULL DEFAULT 'http://hl7.org/fhir/sid/icd-10'::text, code_code text NOT NULL, code_display text NOT NULL, body_site_code text, body_site_display text, patient_id uuid NOT NULL, encounter_id uuid, onset_datetime timestamp with time zone, onset_age integer, abatement_datetime timestamp with time zone, abatement_age integer, recorded_date timestamp with time zone NOT NULL DEFAULT now(), recorder_id uuid, asserter_id uuid, note text, created_at timestamp with time zone DEFAULT now(), updated_at timestamp with time zone DEFAULT now(), CONSTRAINT conditions_pkey PRIMARY KEY (id), CONSTRAINT conditions_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id), CONSTRAINT conditions_encounter_id_fkey FOREIGN KEY (encounter_id) REFERENCES public.encounters(id), CONSTRAINT conditions_recorder_id_fkey FOREIGN KEY (recorder_id) REFERENCES public.practitioners(id), CONSTRAINT conditions_asserter_id_fkey FOREIGN KEY (asserter_id) REFERENCES public.practitioners(id) ); CREATE TABLE public.demo_users ( id uuid NOT NULL DEFAULT gen_random_uuid(), user_id uuid UNIQUE, access_level text NOT NULL DEFAULT 'read_only'::text CHECK (access_level = ANY (ARRAY['read_only'::text, 'interactive'::text, 'presenter'::text])), expires_at timestamp with time zone DEFAULT (now() + '90 days'::interval), usage_count integer DEFAULT 0, last_login_at timestamp with time zone, created_at timestamp with time zone NOT NULL DEFAULT now(), updated_at timestamp with time zone NOT NULL DEFAULT now(), notes text, CONSTRAINT demo_users_pkey PRIMARY KEY (id), CONSTRAINT demo_users_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ); CREATE TABLE public.encounters ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier text DEFAULT (gen_random_uuid())::text UNIQUE, status USER-DEFINED NOT NULL DEFAULT 'planned'::encounter_status, class_code text NOT NULL, class_display text NOT NULL, type_code text NOT NULL, type_display text NOT NULL, priority_code text, priority_display text, patient_id uuid NOT NULL, practitioner_id uuid, organization_id uuid, period_start timestamp with time zone NOT NULL, period_end timestamp with time zone, reason_code ARRAY, reason_display ARRAY, admission_source text, discharge_disposition text, notes text, intake_note_id uuid, created_at timestamp with time zone DEFAULT now(), updated_at timestamp with time zone DEFAULT now(), CONSTRAINT encounters_pkey PRIMARY KEY (id), CONSTRAINT encounters_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id), CONSTRAINT encounters_practitioner_id_fkey FOREIGN KEY (practitioner_id) REFERENCES public.practitioners(id), CONSTRAINT encounters_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES public.organizations(id), CONSTRAINT encounters_intake_note_id_fkey FOREIGN KEY (intake_note_id) REFERENCES public.intake_notes(id) ); CREATE TABLE public.intake_notes ( id uuid NOT NULL DEFAULT gen_random_uuid(), client_id uuid NOT NULL, title text, tag text CHECK (tag = ANY (ARRAY['Intake'::text, 'Evaluatie'::text, 'Plan'::text])), content_json jsonb NOT NULL DEFAULT '{}'::jsonb CHECK (content_json IS NOT NULL), content_text text, author uuid, created_at timestamp with time zone NOT NULL DEFAULT now(), updated_at timestamp with time zone NOT NULL DEFAULT now(), CONSTRAINT intake_notes_pkey PRIMARY KEY (id), CONSTRAINT intake_notes_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.clients(id) ); CREATE TABLE public.observations ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier text DEFAULT (gen_random_uuid())::text UNIQUE, status USER-DEFINED NOT NULL DEFAULT 'final'::observation_status, category text NOT NULL, code_system text NOT NULL, code_code text NOT NULL, code_display text NOT NULL, patient_id uuid NOT NULL, encounter_id uuid, effective_datetime timestamp with time zone NOT NULL, issued timestamp with time zone DEFAULT now(), performer_id uuid, value_type text NOT NULL, value_quantity_value numeric, value_quantity_unit text, value_quantity_comparator text, value_string text, value_boolean boolean, value_codeable_concept jsonb, interpretation_code text, interpretation_display text, note text, body_site text, method_code text, method_display text, reference_range_low numeric, reference_range_high numeric, reference_range_text text, created_at timestamp with time zone DEFAULT now(), CONSTRAINT observations_pkey PRIMARY KEY (id), CONSTRAINT observations_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id), CONSTRAINT observations_encounter_id_fkey FOREIGN KEY (encounter_id) REFERENCES public.encounters(id), CONSTRAINT observations_performer_id_fkey FOREIGN KEY (performer_id) REFERENCES public.practitioners(id) ); CREATE TABLE public.organizations ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier_agb text UNIQUE, identifier_kvk text, name text NOT NULL, alias ARRAY, type_code text DEFAULT 'prov'::text, type_display text DEFAULT 'Healthcare Provider'::text, telecom_phone text, telecom_email text, telecom_website text, address_line ARRAY, address_city text, address_postal_code text, address_country text DEFAULT 'NL'::text, active boolean DEFAULT true, created_at timestamp with time zone DEFAULT now(), updated_at timestamp with time zone DEFAULT now(), CONSTRAINT organizations_pkey PRIMARY KEY (id) ); CREATE TABLE public.patients ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier_bsn text DEFAULT '999999990'::text, identifier_client_number text, name_family text NOT NULL, name_given ARRAY NOT NULL, name_prefix text, name_use text DEFAULT 'official'::text, birth_date date NOT NULL, gender USER-DEFINED NOT NULL, telecom_phone text, telecom_email text, address_line ARRAY, address_city text, address_postal_code text, address_country text DEFAULT 'NL'::text, insurance_company text, insurance_number text, emergency_contact_name text, emergency_contact_relationship text, emergency_contact_phone text, active boolean DEFAULT true, general_practitioner_name text, general_practitioner_agb text, created_at timestamp with time zone DEFAULT now(), updated_at timestamp with time zone DEFAULT now(), CONSTRAINT patients_pkey PRIMARY KEY (id) ); CREATE TABLE public.practitioners ( id uuid NOT NULL DEFAULT gen_random_uuid(), identifier_big text UNIQUE, identifier_agb text, name_prefix text, name_given ARRAY NOT NULL, name_family text NOT NULL, name_suffix text, qualification ARRAY, telecom_phone text, telecom_email text, active boolean DEFAULT true, user_id uuid, created_at timestamp with time zone DEFAULT now(), updated_at timestamp with time zone DEFAULT now(), CONSTRAINT practitioners_pkey PRIMARY KEY (id), CONSTRAINT practitioners_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ); CREATE TABLE public.problem_profiles ( id uuid NOT NULL DEFAULT gen_random_uuid(), client_id uuid NOT NULL, category text NOT NULL CHECK (category = ANY (ARRAY['stemming_depressie'::text, 'angst'::text, 'gedrag_impuls'::text, 'middelen_gebruik'::text, 'cognitief'::text, 'context_psychosociaal'::text])), severity text NOT NULL CHECK (severity = ANY (ARRAY['laag'::text, 'middel'::text, 'hoog'::text])), remarks text, source_note_id uuid, created_at timestamp with time zone NOT NULL DEFAULT now(), updated_at timestamp with time zone NOT NULL DEFAULT now(), CONSTRAINT problem_profiles_pkey PRIMARY KEY (id), CONSTRAINT problem_profiles_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.clients(id), CONSTRAINT problem_profiles_source_note_id_fkey FOREIGN KEY (source_note_id) REFERENCES public.intake_notes(id) ); CREATE TABLE public.treatment_plans ( id uuid NOT NULL DEFAULT gen_random_uuid(), client_id uuid NOT NULL, version integer NOT NULL DEFAULT 1 CHECK (version > 0), status text NOT NULL DEFAULT 'concept'::text CHECK (status = ANY (ARRAY['concept'::text, 'gepubliceerd'::text])), plan jsonb NOT NULL DEFAULT '{"doelen": [], "frequentie": "", "interventies": [], "meetmomenten": []}'::jsonb CHECK (plan ? 'doelen'::text AND plan ? 'interventies'::text AND plan ? 'frequentie'::text AND plan ? 'meetmomenten'::text), created_by uuid, created_at timestamp with time zone NOT NULL DEFAULT now(), published_at timestamp with time zone, updated_at timestamp with time zone NOT NULL DEFAULT now(), CONSTRAINT treatment_plans_pkey PRIMARY KEY (id), CONSTRAINT treatment_plans_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.clients(id) );