Vertaalt de FCO-IM-feitenrondes en logische modellen naar 37 nieuwe PostgreSQL-tabellen, verdeeld over vier migraties: - create_reference_data: één generieke value_list_item-tabel (spelregel 3.1 #1) i.p.v. ~30 losse waardelijst-tabellen, met alle startwaarden uit model-aanmelding.md/model-instroom.md/model-intake-behandeladvies.md. - create_person_client_domain: person, address, contact_detail, client, client_relation, referrer, practice_organization, client_general_practitioner, insurance, consent, client_portal_account (model-aanmelding.md §2.1-2.9, 2.14, 2.16). BSN als bsn_hash (SHA-256), conform de platform-privacyregel — geen raw BSN, geen reversibele encryptie. - create_referral_domain: 20 entiteiten uit model-instroom.md (referral_ request t/m episode_team_involvement), inclusief de vervangt-constraints als partial unique index (voorkomt vertakking) en de XOR-check op clinical_care_episode tussen acceptatiebesluit en Wvggz-mandaat. - create_intake_treatment_advice_domain: 5 entiteiten uit model-intake-behandeladvies.md. Scope: dit zijn nieuwe, additieve tabellen naast de bestaande prototype- tabellen (patients, screenings, intakes, patients.is_john_doe, intakes.kindcheck_data) — die tabellen zijn bewust niet aangeraakt. Wiring van de live app op dit schema, en migratie van prototype-data, is een aparte, nog te nemen beslissing. Migraties zijn nog niet toegepast op een database. decision_authority_id (care_acceptance_decision) is tijdelijk nullable zonder FK — het doeltabel volgt uit de bevoegdheidsronde (B16). Perifere waardelijst-kolommen zijn TEXT met een verwijzing naar de bedoelde lijst in een comment, geen harde FK naar value_list_item — applicatievalidatie (Zod) dekt die laag; business-kritieke uitkomsten (decision_outcome, treatment_advice_outcome, mandate_type) hebben wel een CHECK-constraint.
294 lines
15 KiB
SQL
294 lines
15 KiB
SQL
-- ============================================================================
|
|
-- REFERENCE DATA (WAARDELIJSTEN) — instroom / intake / behandeladvies
|
|
-- ============================================================================
|
|
-- Created: 2026-07-20
|
|
-- Purpose: shared reference-list table for the redesigned instroom/intake/
|
|
-- behandeladvies domain (docs/datamodel/deelmodellen/model-instroom.md,
|
|
-- model-intake-behandeladvies.md, model-aanmelding.md §4).
|
|
--
|
|
-- Design note: spelregel 3.1 #1 ("elke waardelijst is een referentietabel")
|
|
-- is honoured with ONE shared, generic table (list_name-discriminated)
|
|
-- instead of ~30 near-identical single-purpose tables. Each row still
|
|
-- carries code/label/external_code/code_system/geldig_van/geldig_tot/actief.
|
|
-- List-specific extra attributes (agb_verplicht, verwijsnudge_severity, ...)
|
|
-- live in `extra` (JSONB) rather than one-off columns.
|
|
--
|
|
-- Scope note: this migration and the ones that follow (create_person_client_
|
|
-- domain, create_referral_domain, create_intake_treatment_advice_domain)
|
|
-- implement the REDESIGNED target schema from the 19-20 juli 2026 FCO-IM
|
|
-- rounds. They are new, additive tables — the existing prototype tables
|
|
-- (patients, screenings, intakes, patients.is_john_doe, intakes.kindcheck_data)
|
|
-- are intentionally left untouched. Wiring the live app to this schema, and
|
|
-- migrating prototype data into it, is a separate follow-up decision.
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE value_list_item (
|
|
list_name TEXT NOT NULL,
|
|
code TEXT NOT NULL,
|
|
label TEXT NOT NULL,
|
|
external_code TEXT,
|
|
code_system TEXT,
|
|
extra JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
valid_from DATE,
|
|
valid_to DATE,
|
|
active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
|
|
PRIMARY KEY (list_name, code)
|
|
);
|
|
|
|
CREATE INDEX idx_value_list_item_list_active ON value_list_item(list_name, active);
|
|
|
|
COMMENT ON TABLE value_list_item IS 'Generieke waardelijst-tabel (spelregel 3.1 #1): één rij per (list_name, code). Startlijsten, geen definitieve besluiten (zie modeldocumenten).';
|
|
COMMENT ON COLUMN value_list_item.extra IS 'List-specifieke attributen, bv. agb_verplicht (verwijzertype), verwijsnudge_severity (wettelijk_kader).';
|
|
|
|
ALTER TABLE value_list_item ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY "Enable read for authenticated users" ON value_list_item
|
|
FOR SELECT USING (auth.role() = 'authenticated');
|
|
|
|
CREATE TRIGGER update_value_list_item_updated_at
|
|
BEFORE UPDATE ON value_list_item
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
-- ============================================================================
|
|
-- Seed data — startlijsten uit de modeldocumenten, geen definitieve besluiten
|
|
-- ============================================================================
|
|
|
|
INSERT INTO value_list_item (list_name, code, label, extra) VALUES
|
|
-- geslacht (model-aanmelding.md §4.1) — externe code: HL7 AdministrativeGender
|
|
('geslacht', 'man', 'Man', '{}'),
|
|
('geslacht', 'vrouw', 'Vrouw', '{}'),
|
|
('geslacht', 'anders', 'Anders', '{}'),
|
|
('geslacht', 'onbekend', 'Onbekend', '{}'),
|
|
|
|
-- genderidentiteit (zib Patient v4.3)
|
|
('genderidentiteit', 'man', 'Man', '{}'),
|
|
('genderidentiteit', 'vrouw', 'Vrouw', '{}'),
|
|
('genderidentiteit', 'non_binair', 'Non-binair', '{}'),
|
|
('genderidentiteit', 'anders', 'Anders', '{}'),
|
|
('genderidentiteit', 'zegt_het_niet', 'Zegt het niet', '{}'),
|
|
|
|
-- adrestype
|
|
('adrestype', 'woonadres', 'Woonadres', '{}'),
|
|
('adrestype', 'postadres', 'Postadres', '{}'),
|
|
('adrestype', 'tijdelijk_verblijf', 'Tijdelijk verblijf', '{}'),
|
|
|
|
-- contactgegeven_type
|
|
('contactgegeven_type', 'telefoon', 'Telefoon', '{}'),
|
|
('contactgegeven_type', 'email', 'E-mail', '{}'),
|
|
|
|
-- contactgegeven_soort
|
|
('contactgegeven_soort', 'mobiel_prive', 'Mobiel privé', '{}'),
|
|
('contactgegeven_soort', 'vast_prive', 'Vast privé', '{}'),
|
|
('contactgegeven_soort', 'werk', 'Werk', '{}'),
|
|
('contactgegeven_soort', 'overig', 'Overig', '{}'),
|
|
|
|
-- relatie
|
|
('relatie', 'partner', 'Partner', '{}'),
|
|
('relatie', 'ouder', 'Ouder', '{}'),
|
|
('relatie', 'kind', 'Kind', '{}'),
|
|
('relatie', 'broer_zus', 'Broer/zus', '{}'),
|
|
('relatie', 'familielid_overig', 'Familielid overig', '{}'),
|
|
('relatie', 'vriend_kennis', 'Vriend/kennis', '{}'),
|
|
('relatie', 'professional', 'Professional', '{}'),
|
|
('relatie', 'overig', 'Overig', '{}'),
|
|
|
|
-- relatierol (twee assen relatie x rol — zib Contactpersoon)
|
|
('relatierol', 'eerste_contactpersoon', 'Eerste contactpersoon', '{}'),
|
|
('relatierol', 'wettelijk_vertegenwoordiger', 'Wettelijk vertegenwoordiger', '{}'),
|
|
('relatierol', 'gezaghebbende_ouder', 'Gezaghebbende ouder', '{}'),
|
|
('relatierol', 'mantelzorger', 'Mantelzorger', '{}'),
|
|
('relatierol', 'naaste', 'Naaste', '{}'),
|
|
|
|
-- vertegenwoordigingsgrond (WGBO-volgorde)
|
|
('vertegenwoordigingsgrond', 'curator', 'Curator', '{}'),
|
|
('vertegenwoordigingsgrond', 'mentor', 'Mentor', '{}'),
|
|
('vertegenwoordigingsgrond', 'schriftelijk_gemachtigde', 'Schriftelijk gemachtigde', '{}'),
|
|
('vertegenwoordigingsgrond', 'ouder_voogd', 'Ouder/voogd', '{}'),
|
|
('vertegenwoordigingsgrond', 'partner_familie', 'Partner/familie', '{}'),
|
|
|
|
-- huisarts_situatie (voedt zpm_verwijstype 04/05)
|
|
('huisarts_situatie', 'bekend', 'Bekend', '{}'),
|
|
('huisarts_situatie', 'geen_huisarts', 'Geen huisarts', '{}'),
|
|
('huisarts_situatie', 'geen_toestemming_correspondentie', 'Geen toestemming correspondentie', '{}'),
|
|
('huisarts_situatie', 'onbekend', 'Onbekend', '{}'),
|
|
|
|
-- verwijzertype (extra.agb_verplicht — discovery §5.0 besluit 3)
|
|
('verwijzertype', 'huisarts', 'Huisarts', '{"agb_verplicht": true}'),
|
|
('verwijzertype', 'medisch_specialist', 'Medisch specialist', '{"agb_verplicht": true}'),
|
|
('verwijzertype', 'straatdokter', 'Straatdokter', '{"agb_verplicht": true}'),
|
|
('verwijzertype', 'bedrijfsarts', 'Bedrijfsarts', '{"agb_verplicht": true}'),
|
|
('verwijzertype', 'regiebehandelaar', 'Regiebehandelaar', '{"agb_verplicht": true}'),
|
|
('verwijzertype', 'ggz_instelling', 'GGZ-instelling', '{"agb_verplicht": true}'),
|
|
('verwijzertype', 'gemeente', 'Gemeente', '{"agb_verplicht": false}'),
|
|
('verwijzertype', 'zelfaanmelding', 'Zelfaanmelding', '{"agb_verplicht": false}'),
|
|
('verwijzertype', 'crisis', 'Crisis', '{"agb_verplicht": false}'),
|
|
|
|
-- praktijk_soort
|
|
('praktijk_soort', 'huisartsenpraktijk', 'Huisartsenpraktijk', '{}'),
|
|
('praktijk_soort', 'ziekenhuis', 'Ziekenhuis', '{}'),
|
|
('praktijk_soort', 'ggz_instelling', 'GGZ-instelling', '{}'),
|
|
('praktijk_soort', 'gemeente', 'Gemeente', '{}'),
|
|
('praktijk_soort', 'arbodienst', 'Arbodienst', '{}'),
|
|
('praktijk_soort', 'overig', 'Overig', '{}'),
|
|
|
|
-- wettelijk_kader (extra.verwijsnudge_severity — te bevestigen in de nudge-/declaratieronde; wvggz toegevoegd bij B27)
|
|
('wettelijk_kader', 'zvw', 'Zorgverzekeringswet', '{"verwijsnudge_severity": "blokkade"}'),
|
|
('wettelijk_kader', 'jeugdwet', 'Jeugdwet', '{"verwijsnudge_severity": "signaal"}'),
|
|
('wettelijk_kader', 'wmo', 'Wmo', '{"verwijsnudge_severity": "signaal"}'),
|
|
('wettelijk_kader', 'wlz', 'Wlz', '{"verwijsnudge_severity": "waarschuwing"}'),
|
|
('wettelijk_kader', 'forensisch', 'Forensisch', '{"verwijsnudge_severity": "waarschuwing"}'),
|
|
('wettelijk_kader', 'wvggz', 'Wvggz', '{"verwijsnudge_severity": null}'),
|
|
|
|
-- submission_channel (was aanmeldkanaal — model-instroom.md §4)
|
|
('submission_channel', 'zorgdomein', 'ZorgDomein', '{}'),
|
|
('submission_channel', 'e_mail', 'E-mail', '{}'),
|
|
('submission_channel', 'telefoon', 'Telefoon', '{}'),
|
|
('submission_channel', 'portaal', 'Cliëntportaal', '{}'),
|
|
('submission_channel', 'post', 'Post', '{}'),
|
|
('submission_channel', 'overig', 'Overig', '{}'),
|
|
|
|
-- document_type (model-instroom.md §4)
|
|
('document_type', 'verwijsbrief', 'Verwijsbrief', '{}'),
|
|
('document_type', 'diagnostische_aanvulling', 'Diagnostische aanvulling', '{}'),
|
|
('document_type', 'beschikking', 'Beschikking', '{}'),
|
|
('document_type', 'overig', 'Overig', '{}'),
|
|
|
|
-- screening_activity_type
|
|
('screening_activity_type', 'telefonisch_contact', 'Telefonisch contact', '{}'),
|
|
('screening_activity_type', 'dossieronderzoek', 'Dossieronderzoek', '{}'),
|
|
('screening_activity_type', 'vragenlijst', 'Vragenlijst', '{}'),
|
|
('screening_activity_type', 'overig', 'Overig', '{}'),
|
|
|
|
-- decision_outcome (B22)
|
|
('decision_outcome', 'geaccepteerd', 'Geaccepteerd', '{}'),
|
|
('decision_outcome', 'afgewezen', 'Afgewezen', '{}'),
|
|
|
|
-- follow_up_route
|
|
('follow_up_route', 'intake_direct', 'Intake direct plannen', '{}'),
|
|
('follow_up_route', 'intakewachtlijst', 'Intakewachtlijst', '{}'),
|
|
('follow_up_route', 'spoedroute', 'Spoedroute', '{}'),
|
|
('follow_up_route', 'doorverwijzen', 'Doorverwijzen', '{}'),
|
|
('follow_up_route', 'case_afsluiten', 'Case afsluiten', '{}'),
|
|
|
|
-- episode_end_reason (model-aanmelding.md §4.24 + B24-aanvullingen)
|
|
('episode_end_reason', 'ingetrokken_door_client', 'Ingetrokken door cliënt', '{}'),
|
|
('episode_end_reason', 'acceptatiebesluit_herzien', 'Acceptatiebesluit herzien', '{}'),
|
|
('episode_end_reason', 'behandeling_afgerond', 'Behandeling afgerond', '{}'),
|
|
('episode_end_reason', 'doorverwezen', 'Doorverwezen', '{}'),
|
|
('episode_end_reason', 'client_beeindigt', 'Cliënt beëindigt', '{}'),
|
|
('episode_end_reason', 'geen_contact', 'Geen contact meer', '{}'),
|
|
('episode_end_reason', 'overleden', 'Overleden', '{}'),
|
|
('episode_end_reason', 'overig', 'Overig', '{}'),
|
|
|
|
-- echelon
|
|
('echelon', 'gb_ggz', 'Generalistische basis-ggz', '{}'),
|
|
('echelon', 'g_ggz', 'Gespecialiseerde ggz', '{}'),
|
|
('echelon', 'onbekend', 'Onbekend', '{}'),
|
|
|
|
-- zpm_verwijstype (Vektis/ZPM-code als external_code)
|
|
('zpm_verwijstype', '01', 'Verwijzing aanwezig', '{}'),
|
|
('zpm_verwijstype', '02', 'Doorverwijzing regiebehandelaar', '{}'),
|
|
('zpm_verwijstype', '03', 'Geen verwijzing, verlate correspondentie', '{}'),
|
|
('zpm_verwijstype', '04', 'Geen verwijzing, correspondentie niet toegestaan', '{}'),
|
|
('zpm_verwijstype', '05', 'Geen verwijzing, niet declarabel', '{}'),
|
|
('zpm_verwijstype', '06', 'Geen verwijzing, andere grond fz', '{}'),
|
|
('zpm_verwijstype', '07', 'Verwijzing zonder AGB', '{}'),
|
|
|
|
-- municipal_legal_framework (B27)
|
|
('municipal_legal_framework', 'wmo', 'Wmo', '{}'),
|
|
('municipal_legal_framework', 'jeugdwet', 'Jeugdwet', '{}'),
|
|
|
|
-- municipal_product_category / municipal_product_unit — minimale startwaarden (declaratie-ronde volgt)
|
|
('municipal_product_category', 'overig', 'Overig (nader te bepalen)', '{}'),
|
|
('municipal_product_unit', 'overig', 'Overig (nader te bepalen)', '{}'),
|
|
|
|
-- mandate_type / mandate_decider_role (B27, Wvggz)
|
|
('mandate_type', 'crisismaatregel', 'Crisismaatregel', '{}'),
|
|
('mandate_type', 'zorgmachtiging', 'Zorgmachtiging', '{}'),
|
|
('mandate_decider_role', 'burgemeester', 'Burgemeester', '{}'),
|
|
('mandate_decider_role', 'rechter', 'Rechter', '{}'),
|
|
|
|
-- crisis_fact_type
|
|
('crisis_fact_type', 'medicatie_toegediend', 'Medicatie toegediend', '{}'),
|
|
('crisis_fact_type', 'risico_inschatting', 'Risico-inschatting', '{}'),
|
|
('crisis_fact_type', 'vitale_functie', 'Vitale functie', '{}'),
|
|
('crisis_fact_type', 'dwangmaatregel', 'Dwangmaatregel', '{}'),
|
|
('crisis_fact_type', 'overig', 'Overig', '{}'),
|
|
|
|
-- urgency_assessor_role / urgency_level
|
|
('urgency_assessor_role', 'screener', 'Screener', '{}'),
|
|
('urgency_assessor_role', 'triagist', 'Triagist', '{}'),
|
|
('urgency_assessor_role', 'intake_team', 'Intake-team', '{}'),
|
|
('urgency_assessor_role', 'mdo', 'MDO', '{}'),
|
|
('urgency_level', 'laag', 'Laag', '{}'),
|
|
('urgency_level', 'normaal', 'Normaal', '{}'),
|
|
('urgency_level', 'hoog', 'Hoog', '{}'),
|
|
('urgency_level', 'spoed', 'Spoed', '{}'),
|
|
|
|
-- initiator_type
|
|
('initiator_type', 'professional', 'Professional', '{}'),
|
|
('initiator_type', 'organisatie', 'Organisatie', '{}'),
|
|
('initiator_type', 'client', 'Cliënt', '{}'),
|
|
('initiator_type', 'vertegenwoordiger', 'Vertegenwoordiger', '{}'),
|
|
|
|
-- intake_initiation_reason
|
|
('intake_initiation_reason', 'regulier', 'Regulier', '{}'),
|
|
('intake_initiation_reason', 'intern', 'Intern', '{}'),
|
|
('intake_initiation_reason', 'crisis', 'Crisis', '{}'),
|
|
|
|
-- intake_status
|
|
('intake_status', 'gepland', 'Gepland', '{}'),
|
|
('intake_status', 'bezig', 'Bezig', '{}'),
|
|
('intake_status', 'afgerond', 'Afgerond', '{}'),
|
|
('intake_status', 'afgebroken', 'Afgebroken', '{}'),
|
|
|
|
-- intake_abort_reason
|
|
('intake_abort_reason', 'client_trekt_terug', 'Cliënt trekt zich terug', '{}'),
|
|
('intake_abort_reason', 'geen_contact_meer', 'Geen contact meer', '{}'),
|
|
('intake_abort_reason', 'overleden', 'Overleden', '{}'),
|
|
('intake_abort_reason', 'overig', 'Overig', '{}'),
|
|
|
|
-- intake_contact_type
|
|
('intake_contact_type', 'intakegesprek', 'Intakegesprek', '{}'),
|
|
('intake_contact_type', 'aanvullend_onderzoek', 'Aanvullend onderzoek', '{}'),
|
|
('intake_contact_type', 'telefonisch_contact', 'Telefonisch contact', '{}'),
|
|
('intake_contact_type', 'huisbezoek', 'Huisbezoek', '{}'),
|
|
('intake_contact_type', 'beeldcontact', 'Beeldcontact', '{}'),
|
|
('intake_contact_type', 'overig', 'Overig', '{}'),
|
|
|
|
-- treatment_advice_outcome (B33 — doorverwijzing/terugverwijzing volgtijdelijk, extra_diagnostiek praktijkgefundeerd)
|
|
('treatment_advice_outcome', 'in_zorg', 'In zorg', '{}'),
|
|
('treatment_advice_outcome', 'terugverwijzing', 'Terugverwijzing', '{"lks_genormeerd": true, "volgt_op": "doorverwijzing"}'),
|
|
('treatment_advice_outcome', 'doorverwijzing', 'Doorverwijzing', '{"lks_genormeerd": true}'),
|
|
('treatment_advice_outcome', 'extra_diagnostiek', 'Extra diagnostiek', '{"lks_genormeerd": false}'),
|
|
|
|
-- department / care_program — instellingsconfigureerbaar, minimale startwaarden
|
|
('department', 'volwassenen', 'Volwassenen', '{}'),
|
|
('department', 'jeugd', 'Jeugd', '{}'),
|
|
('department', 'ouderen', 'Ouderen', '{}'),
|
|
('department', 'forensisch', 'Forensisch', '{}'),
|
|
('department', 'overig', 'Overig', '{}'),
|
|
('care_program', 'algemeen_ggz', 'Algemeen GGZ', '{}'),
|
|
('care_program', 'stemming', 'Stemming', '{}'),
|
|
('care_program', 'trauma', 'Trauma', '{}'),
|
|
('care_program', 'verslaving', 'Verslaving', '{}'),
|
|
('care_program', 'overig', 'Overig', '{}'),
|
|
|
|
-- toestemming_type (extra.grondslag)
|
|
('toestemming_type', 'correspondentie_huisarts_verwijzer', 'Correspondentie huisarts/verwijzer', '{"grondslag": "WGBO/verwijsafspraken"}'),
|
|
('toestemming_type', 'dsm_hoofdgroep_op_factuur', 'DSM-hoofdgroep op factuur', '{"grondslag": "Stcrt. 2025-11955, opt-in"}'),
|
|
('toestemming_type', 'privacyverklaring_zorgvraagtypering', 'Privacyverklaring zorgvraagtypering', '{"grondslag": "NZa"}'),
|
|
('toestemming_type', 'gegevensdeling_derden', 'Gegevensdeling derden', '{"grondslag": "AVG"}'),
|
|
('toestemming_type', 'inzage_naasten', 'Inzage naasten', '{"grondslag": "WGBO"}'),
|
|
|
|
-- toestemming_status / toestemming_wijze
|
|
('toestemming_status', 'verleend', 'Verleend', '{}'),
|
|
('toestemming_status', 'geweigerd', 'Geweigerd', '{}'),
|
|
('toestemming_status', 'ingetrokken', 'Ingetrokken', '{}'),
|
|
('toestemming_wijze', 'mondeling', 'Mondeling', '{}'),
|
|
('toestemming_wijze', 'schriftelijk', 'Schriftelijk', '{}'),
|
|
('toestemming_wijze', 'portaal', 'Portaal', '{}');
|