From 88927ed1141f89c139703ca8ffcc6bc06a38b356 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 10 Mar 2026 10:25:07 +0100 Subject: [PATCH 01/71] Set publication 'first' to false Update publication-request.json to mark this publication as not the initial release by changing "first" from true to false. Reflects that the IKNL PZP Advance Care Planning 1.0.0 release candidate is not the first publication. --- publication-request.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publication-request.json b/publication-request.json index f3ce21f..944620b 100644 --- a/publication-request.json +++ b/publication-request.json @@ -6,7 +6,7 @@ "status" : "trial-use", "sequence" : "Release 1", "desc" : "1.0.0 release candidate of the IKNL PZP information standard.", - "first" : true, + "first" : false, "title" : "Advance Care Planning (PZP)", "ci-build" : "https://build.fhir.org/ig/IKNL/PZP-FHIR-R4/branches/develop/", "category" : "Care Management", From 8957c23b24be271bade6a04d5c4c4043f7ec4087 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 10 Mar 2026 10:25:20 +0100 Subject: [PATCH 02/71] Support extra resources dir and shared bundle Add support for scanning an additional resources directory and creating a shared Bundle for resources not linked to any Patient. Introduce --extra-resources-dir CLI flag (default: input/resources) and update discover_patients_and_resources() and generate_patient_bundles() to accept the extra directory. Collect JSON files from the main resources dir and the extra dir, group instance resources by Patient references found anywhere in each resource, and produce one transaction Bundle per patient. Add create_shared_bundle() to build and write SharedResourcesBundle.json containing ungrouped resources (Practitioner, Organization, etc.) and report resource counts. Minor logging/format tweaks, add Questionnaire to SKIP_RESOURCE_TYPES, and improve printed paths and status messages. Backwards compatible: pass an empty string to disable the extra directory. --- util/patient_bundle_generator.py | 151 ++++++++++++++++++++++++++----- 1 file changed, 129 insertions(+), 22 deletions(-) diff --git a/util/patient_bundle_generator.py b/util/patient_bundle_generator.py index 7242d77..730f7c3 100644 --- a/util/patient_bundle_generator.py +++ b/util/patient_bundle_generator.py @@ -9,13 +9,18 @@ Workflow: 1. Scans the fsh-generated/resources folder for FHIR JSON files. - 2. Groups instance resources by patient using the `-PatN` suffix that - appears in both resource IDs and Patient references. - 3. Creates one Bundle (type "transaction") per patient group containing + 2. Also scans the extra-resources-dir (default: input/resources) for + additional instance resources, e.g. QuestionnaireResponses. + 3. Groups instance resources by patient using Patient references found + anywhere in each resource. + 4. Creates one Bundle (type "transaction") per patient group containing all associated resources, with PUT requests for each entry. + 5. Creates one shared Bundle for resources not linked to any patient + (e.g. Practitioner, PractitionerRole, Organization). Usage: python util/patient_bundle_generator.py [--resources-dir DIR] + [--extra-resources-dir DIR] [--output-dir DIR] Examples: @@ -25,6 +30,7 @@ # Custom paths python util/patient_bundle_generator.py \\ --resources-dir fsh-generated/resources \\ + --extra-resources-dir input/resources \\ --output-dir util/patient-bundles """ @@ -42,11 +48,15 @@ # Directory containing the compiled FHIR JSON resources (output of SUSHI). DEFAULT_RESOURCES_DIR = "fsh-generated/resources" -# Output directory where the generated patient Bundle files are written. +# Additional directory scanned for instance resources (e.g. QuestionnaireResponses +# authored outside the FSH build, stored as plain JSON). +DEFAULT_EXTRA_RESOURCES_DIR = "input/resources" + +# Output directory where the generated Bundle files are written. DEFAULT_OUTPUT_DIR = "util/patient-bundles" # FHIR resource types that should be skipped (definition / infrastructure -# resources that are not relevant for patient bundles). +# resources that are not relevant for patient or shared bundles). SKIP_RESOURCE_TYPES = { 'StructureDefinition', 'ValueSet', @@ -55,6 +65,7 @@ 'ActorDefinition', 'SearchParameter', 'CapabilityStatement', + 'Questionnaire', } # Base URL used for Bundle identifiers and tags. @@ -179,9 +190,13 @@ def create_patient_bundle(patient_id, patient_resource, associated_resources): } -def discover_patients_and_resources(resources_dir): +def discover_patients_and_resources(resources_dir, extra_resources_dir=None): """Load all FHIR instance resources and discover Patient resources. + Scans *resources_dir* first, then optionally *extra_resources_dir* for + additional instance resources (e.g. QuestionnaireResponses stored as plain + JSON outside the FSH build). + Returns: patients: dict mapping Patient resource ID → Patient resource dict instances: list of (filename, resource) tuples for non-Patient, @@ -197,12 +212,24 @@ def discover_patients_and_resources(resources_dir): skipped_count = 0 error_count = 0 - json_files = sorted(resources_path.glob("*.json")) - print(f"Scanning {len(json_files)} files...\n") + # Collect all JSON files: primary dir first, then extra dir (if provided). + all_json_files = sorted(resources_path.glob("*.json")) + if extra_resources_dir: + extra_path = Path(extra_resources_dir) + if extra_path.exists(): + extra_files = sorted(extra_path.glob("*.json")) + print(f"Scanning {len(all_json_files)} file(s) in '{resources_dir}' " + f"+ {len(extra_files)} file(s) in '{extra_resources_dir}'...\n") + all_json_files = all_json_files + extra_files + else: + print(f"Warning: Extra resources directory not found: {extra_resources_dir}") + print(f"Scanning {len(all_json_files)} file(s) in '{resources_dir}'...\n") + else: + print(f"Scanning {len(all_json_files)} files...\n") # --- Pass 1: discover all Patient resources --- - print("Pass 1 — discovering Patient resources...") - for json_file in json_files: + print("Pass 1 - discovering Patient resources...") + for json_file in all_json_files: resource = load_fhir_resource(json_file) if not resource: error_count += 1 @@ -231,6 +258,57 @@ def discover_patients_and_resources(resources_dir): return patients, instances +def create_shared_bundle(ungrouped_resources): + """Create a Bundle resource containing all non-patient-linked resources. + + These are resources such as Practitioner, PractitionerRole, and + Organization that are referenced by patient-linked resources but do not + themselves carry a direct Patient reference. + """ + bundle = { + "resourceType": "Bundle", + "id": "SharedResourcesBundle", + "meta": { + "profile": [ + "http://hl7.org/fhir/StructureDefinition/Bundle" + ], + "lastUpdated": datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ"), + "tag": [ + { + "system": f"{BUNDLE_SYSTEM_BASE}/CodeSystem/bundle-type", + "code": "shared-data", + "display": "Shared Resources Bundle" + } + ] + }, + "identifier": { + "system": f"{BUNDLE_SYSTEM_BASE}/NamingSystem/shared-bundle", + "value": "SharedResourcesBundle" + }, + "type": "transaction", + "timestamp": datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ"), + "entry": [] + } + + resource_types = {} + sorted_resources = sorted( + ungrouped_resources, + key=lambda r: (r.get('resourceType', ''), r.get('id', '')) + ) + + for resource in sorted_resources: + entry = create_bundle_entry(resource) + if entry: + bundle["entry"].append(entry) + res_type = resource.get('resourceType', 'Unknown') + resource_types[res_type] = resource_types.get(res_type, 0) + 1 + + return bundle, { + 'total_resources': len(sorted_resources), + 'resource_types': resource_types + } + + def group_resources_by_patient(patients, instances): """Group instance resources by the Patient(s) they reference. @@ -246,7 +324,7 @@ def group_resources_by_patient(patients, instances): groups = {pid: [] for pid in known_patient_ids} ungrouped = [] - print("\nPass 2 — grouping resources by Patient reference...") + print("\nPass 2 - grouping resources by Patient reference...") for filename, resource in instances: referenced_ids = find_patient_references(resource) & known_patient_ids @@ -254,25 +332,27 @@ def group_resources_by_patient(patients, instances): for pid in referenced_ids: groups[pid].append(resource) ref_list = ', '.join(sorted(referenced_ids)) - print(f" {filename} → {ref_list}") + print(f" {filename} -> {ref_list}") else: ungrouped.append((filename, resource)) - print(f" {filename} → (no patient reference)") + print(f" {filename} -> (no patient reference)") return groups, ungrouped -def generate_patient_bundles(resources_dir, output_dir): - """Generate Bundle resources for each patient.""" +def generate_patient_bundles(resources_dir, output_dir, extra_resources_dir=None): + """Generate Bundle resources for each patient and one shared resources bundle.""" print("IKNL PZP FHIR R4 Patient Bundle Generator") print("=" * 50) - print(f"Resources directory: {resources_dir}") - print(f"Output directory: {output_dir}") + print(f"Resources directory: {resources_dir}") + if extra_resources_dir: + print(f"Extra resources directory: {extra_resources_dir}") + print(f"Output directory: {output_dir}") print() # Discover patients and load all instance resources - patients, instances = discover_patients_and_resources(resources_dir) + patients, instances = discover_patients_and_resources(resources_dir, extra_resources_dir) if not patients: print("\nNo Patient resources found — nothing to bundle.") @@ -282,7 +362,8 @@ def generate_patient_bundles(resources_dir, output_dir): groups, ungrouped = group_resources_by_patient(patients, instances) if ungrouped: - print(f"\n{len(ungrouped)} resource(s) not associated with any patient:") + print(f"\n{len(ungrouped)} resource(s) not associated with any patient " + f"(will go into shared bundle):") for filename, resource in ungrouped: print(f" {filename} ({resource.get('resourceType', 'Unknown')})") @@ -320,7 +401,27 @@ def generate_patient_bundles(resources_dir, output_dir): else: print(f" Failed to create bundle for {patient_id}") - print(f"\n{bundles_created} patient bundle(s) created successfully!") + # Generate shared resources bundle for ungrouped resources + if ungrouped: + ungrouped_resources = [resource for _, resource in ungrouped] + print(f"\nGenerating shared resources bundle ({len(ungrouped_resources)} resource(s))...") + bundle, metadata = create_shared_bundle(ungrouped_resources) + bundle_filename = "SharedResourcesBundle.json" + bundle_path = output_path / bundle_filename + + try: + with open(bundle_path, 'w', encoding='utf-8') as f: + json.dump(bundle, f, indent=2, ensure_ascii=False) + + print(f" Created: {bundle_filename}") + print(f" Total resources in bundle: {metadata['total_resources']}") + print(f" Resource types: {', '.join(f'{k}({v})' for k, v in sorted(metadata['resource_types'].items()))}") + bundles_created += 1 + + except IOError as e: + print(f" Error writing shared bundle: {e}") + + print(f"\n{bundles_created} bundle(s) created successfully!") return bundles_created > 0 @@ -334,9 +435,14 @@ def main(): '--resources-dir', default=DEFAULT_RESOURCES_DIR, help=f"Directory containing compiled FHIR JSON resources.\n(default: '{DEFAULT_RESOURCES_DIR}')" ) + parser.add_argument( + '--extra-resources-dir', default=DEFAULT_EXTRA_RESOURCES_DIR, + help=f"Additional directory with instance resources (e.g. QuestionnaireResponses).\n" + f"Pass an empty string to disable.\n(default: '{DEFAULT_EXTRA_RESOURCES_DIR}')" + ) parser.add_argument( '--output-dir', default=DEFAULT_OUTPUT_DIR, - help=f"Output directory for the generated patient Bundle files.\n(default: '{DEFAULT_OUTPUT_DIR}')" + help=f"Output directory for the generated Bundle files.\n(default: '{DEFAULT_OUTPUT_DIR}')" ) args = parser.parse_args() @@ -345,8 +451,9 @@ def main(): project_root = script_dir.parent resources_dir = project_root / args.resources_dir output_dir = project_root / args.output_dir + extra_resources_dir = (project_root / args.extra_resources_dir) if args.extra_resources_dir else None - success = generate_patient_bundles(resources_dir, output_dir) + success = generate_patient_bundles(resources_dir, output_dir, extra_resources_dir) return 0 if success else 1 From ca824634a8eb1a53ac0174ebcea503fe75fab7cb Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 10 Mar 2026 10:26:50 +0100 Subject: [PATCH 03/71] Update Firely.Terminal action to v0.8.1 Bump FirelyTeam/firely-terminal-pipeline from v0.7.32-alpha2 to v0.8.1 in two workflows (r4_firely_terminal.yaml and r4_firely_terminal_nts.yaml) to pick up the latest pipeline fixes/updates. No other changes to inputs or paths were made. --- .github/workflows/r4_firely_terminal.yaml | 2 +- .github/workflows/r4_firely_terminal_nts.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/r4_firely_terminal.yaml b/.github/workflows/r4_firely_terminal.yaml index 88adae2..089a151 100644 --- a/.github/workflows/r4_firely_terminal.yaml +++ b/.github/workflows/r4_firely_terminal.yaml @@ -30,7 +30,7 @@ jobs: java-version: '21' - name: Firely.Terminal (GitHub Actions) - uses: FirelyTeam/firely-terminal-pipeline@v0.7.32-alpha2 + uses: FirelyTeam/firely-terminal-pipeline@v0.8.1 with: PATH_TO_CONFORMANCE_RESOURCES: fsh-generated/resources PATH_TO_EXAMPLES: fsh-generated/resources diff --git a/.github/workflows/r4_firely_terminal_nts.yaml b/.github/workflows/r4_firely_terminal_nts.yaml index 83c897e..057fdbd 100644 --- a/.github/workflows/r4_firely_terminal_nts.yaml +++ b/.github/workflows/r4_firely_terminal_nts.yaml @@ -65,7 +65,7 @@ jobs: echo "JAVA_TOOL_OPTIONS=-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=8080 -Dhttp.nonProxyHosts=" >> $GITHUB_ENV - name: Firely.Terminal (GitHub Actions) - uses: FirelyTeam/firely-terminal-pipeline@v0.7.32-alpha2 + uses: FirelyTeam/firely-terminal-pipeline@v0.8.1 with: PATH_TO_CONFORMANCE_RESOURCES: fsh-generated/resources PATH_TO_EXAMPLES: fsh-generated/resources From 9b1507c1e75cd653b800c0c04bd49a54eb1687d5 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 10 Mar 2026 10:29:51 +0100 Subject: [PATCH 04/71] Add subject to QuestionnaireResponse resources Add a 'subject' object (patient reference and display) to three QuestionnaireResponse JSON files: HendrikHartman (20201001 and 20221108) and SamiraVanDerSluijs (20251117). Also normalize the author block placement/formatting in the Samira file and ensure the source reference/display remains consistent; minor formatting fixes (whitespace/newline) applied. --- ...nnaireResponse-HendrikHartman-20201001.json | 4 ++++ ...nnaireResponse-HendrikHartman-20221108.json | 4 ++++ ...reResponse-SamiraVanDerSluijs-20251117.json | 18 ++++++++++-------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index bf7847c..43e5192 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -11,6 +11,10 @@ "status": "completed", "authored": "2025-08-25T19:14:50.150Z", "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc2", + "subject": { + "reference": "Patient/ACP-Patient-HendrikHartman-Pat1", + "display": "Patient, Hendrik Hartman" + }, "author": { "reference": "PractitionerRole/ACP-HealthProfessional-PractitionerRole-DrVanHuissen-Pat1", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index 2c231a6..b9269ab 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -11,6 +11,10 @@ "status": "completed", "authored": "2025-08-25T19:18:32.253Z", "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc2", + "subject": { + "reference": "Patient/ACP-Patient-HendrikHartman-Pat1", + "display": "Patient, Hendrik Hartman" + }, "author": { "reference": "PractitionerRole/ACP-HealthProfessional-PractitionerRole-DrVanHuissen-Pat1", diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 1526d23..00a34f5 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -11,14 +11,16 @@ "status": "completed", "authored": "2025-11-27T16:15:00.733Z", "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc2", - "author": - { - "reference": "PractitionerRole/ACP-HealthProfessional-PractitionerRole-DesireeWolters-Pat2", - "display": "Healthcare professional (role), Desiree Wolters" - } - , + "subject": { + "reference": "Patient/ACP-Patient-SamiraVanDerSluijs-Pat2", + "display": "Patient, Samira van der Sluijs" + }, + "author": { + "reference": "PractitionerRole/ACP-HealthProfessional-PractitionerRole-DesireeWolters-Pat2", + "display": "Healthcare professional (role), Desiree Wolters" + }, "source": { - "reference": "Patient/ACP-Patient-SamiraVanDerSluijs-Pat2", + "reference": "Patient/ACP-Patient-SamiraVanDerSluijs-Pat2", "display": "Patient, Samira van der Sluijs" }, "item": [ @@ -1092,4 +1094,4 @@ ] } ] -} +} \ No newline at end of file From e5ec6ea46cc95dffc71ddd813072b9c668fc5cd4 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Thu, 12 Mar 2026 16:47:11 +0100 Subject: [PATCH 05/71] #129 Add roleAdditional slice to ACP ContactPerson intro Update the StructureDefinition-ACP-ContactPerson intro: replace the prior note that `.relationship:role` is mandatory with documentation of a new slice `.relationship:roleAdditional`. The new slice is bound to ACPContactPersonRoleVS to accommodate ACP dataset role codes not present in the RolCodelijst (for example SNOMED CT code 310141000146103). --- .../pagecontent/StructureDefinition-ACP-ContactPerson-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md index 7ed1d5d..c834cfa 100644 --- a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md +++ b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md @@ -2,4 +2,4 @@ This profile adds ACP-specific mappings to the ART-DECOR dataset and obligation extensions for Provider and Consulter actors. Profile references are constrained to ACP profiles where available. The following change affects implementation beyond the base nl-core profile: -* `.relationship:role` is mandatory. \ No newline at end of file +* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACPContactPersonRoleVS.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_). \ No newline at end of file From f4062e0e9cd947159cb3a40bd16adb7fb5aadc40 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Thu, 12 Mar 2026 16:56:21 +0100 Subject: [PATCH 06/71] Clarify provenance of .relationship:roleAdditional Update the ACP ContactPerson StructureDefinition intro to note that the additional slice `.relationship:roleAdditional` includes role codes pre-adopted from the RolCodelijst in zib Contactpersoon v4.1 (2024), adding a reference link. This documents the provenance of codes (e.g. SNOMED CT 310141000146103) and clarifies why the extra slice is present in the profile. --- .../pagecontent/StructureDefinition-ACP-ContactPerson-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md index c834cfa..50da018 100644 --- a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md +++ b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md @@ -2,4 +2,4 @@ This profile adds ACP-specific mappings to the ART-DECOR dataset and obligation extensions for Provider and Consulter actors. Profile references are constrained to ACP profiles where available. The following change affects implementation beyond the base nl-core profile: -* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACPContactPersonRoleVS.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_). \ No newline at end of file +* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACPContactPersonRoleVS.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_, pre-adopted from the [RolCodelijst in zib Contactpersoon v4.1 (2024)](https://zibs.nl/wiki/Contactpersoon-v4.1(2024NL)#RolCodelijst)). \ No newline at end of file From 9872fe49c0ebd69ad7027ee0e3a0c367024ceb9d Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 18 Mar 2026 17:11:30 +0100 Subject: [PATCH 07/71] #134 Switch to CommunicationRequest; update SNOMED code Update CapabilityStatement FSH to use type CommunicationRequest (was Communication) for the ACP-InformRelativesRequest profile. Also update the example mermaid sequence diagram to use SNOMED code 223449006 for the CommunicationRequest category, ensuring the diagram and capability statement align with the correct resource type and category code. --- input/fsh/CapabilityStatement.fsh | 2 +- .../fhir-data-exchange-individual-resources-mermaid-diagram.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/input/fsh/CapabilityStatement.fsh b/input/fsh/CapabilityStatement.fsh index e0c85b7..686faec 100644 --- a/input/fsh/CapabilityStatement.fsh +++ b/input/fsh/CapabilityStatement.fsh @@ -567,7 +567,7 @@ Usage: #definition * extension * url = $CapExpectation * valueCode = #SHALL - * type = #Communication + * type = #CommunicationRequest * supportedProfile[0] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-InformRelativesRequest" * extension * url = $CapExpectation diff --git a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md index e8dc327..5ada1ef 100644 --- a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md +++ b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md @@ -47,7 +47,7 @@ sequenceDiagram deactivate S and %% 7. CommunicationRequests - C->>S: GET /CommunicationRequest?patient=Patient/[id]
&category=http://snomed.info/sct|713603004 + C->>S: GET /CommunicationRequest?patient=Patient/[id]
&category=http://snomed.info/sct|223449006 activate S S-->>C: 200 OK: Bundle (CommunicationRequest) deactivate S From 70aaae04f0104578de049cb9bd2d3cd622e00fbf Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Fri, 3 Apr 2026 15:50:05 +0200 Subject: [PATCH 08/71] First work for adding legally capable observation Added profile, mapping and two instances. Not double-checked on correctness. --- input/fsh/Observation.fsh | 68 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index ba4bf2f..5861623 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -347,4 +347,70 @@ Usage: #example * status = #final * code = $snomed#247751003 "gevoel van zingeving" * valueString = "Mevrouw is gek op haar kleinzoon, dus brengt graag veel tijd met hem door." -* effectiveDateTime = "2025-08-07" \ No newline at end of file +* effectiveDateTime = "2025-08-07" + + +Profile: ACPLegallyCapable +Parent: Observation +Id: ACP-LegallyCapable +Title: "ACP Legally Capable" +Description: "Indicator of capability of patient to make informed decisions about their healthcare. Based on Observation resource." +* insert MetaRules +* encounter only Reference(ACPEncounter) +* subject only Reference(ACPPatient) +* code = $snomed#304686002 +* value[x] only Boolean + +* insert ObligationRules(encounter) +* insert ObligationRules(subject) +* insert ObligationRules(code) +* insert ObligationRules(valueBoolean) +* insert ObligationRules(dataAbsentReason) +* insert ObligationRules(effective[x]) +* insert ObligationRules(note.text) +* insert ObligationRules(performer) + +Mapping: MapACPLegallyCapable +Id: pall-izppz-zib2020v2026-02-24 +Title: "ACP dataset" +Source: ACPLegallyCapable +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +* -> "761" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" +// * code -> "667" "Gewenste plek van overlijden ([Meting])" +* valueBoolean -> "762" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" +* dataAbsentReason -> "668" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" +//* effective[x] -> "672" "[MeetDatumBeginTijd]" +* note.text -> "763" "[Toelichting]" + + +Instance: ACP-LegallyCapable-Pat1 +InstanceOf: ACPLegallyCapable +Title: "ACP Legally Capable - Pat 1" +Usage: #example +* identifier.type = $v2-0203#RI "Resource identifier" +* identifier.system = "https://acme.com/fhir/NamingSystem/resource-business-identifier" +* identifier.value = "928e493b-3265-46ad-a155-b46d3d31b821" +* encounter = Reference(ACP-Encounter-Pat1) "Encounter, 2020-10-01" +* subject = Reference(ACP-Patient-HendrikHartman-Pat1) "Patient, Hendrik Hartman" +* performer = Reference(ACP-HealthProfessional-PractitionerRole-DrVanHuissen-Pat1) "Healthcare professional (role), van Huissen" +* status = #final +* code = $snomed#304686002 "Ability to make considered choices" +* valueBoolean = true +* effectiveDateTime = "2020-10-01" + + +Instance: ACP-LegallyCapable-Pat2 +InstanceOf: ACPLegallyCapable +Title: "ACP Legally Capable - Pat 2" +Usage: #example +* identifier.type = $v2-0203#RI "Resource identifier" +* identifier.system = "https://acme.com/fhir/NamingSystem/resource-business-identifier" +* identifier.value = "337d9e4a-08a3-486f-9f24-d6c60c6f342a" +* encounter = Reference(ACP-Encounter-1-Pat2) "Encounter, 2025-08-07" +* subject = Reference(ACP-Patient-SamiraVanDerSluijs-Pat2) "Patient, Samira van der Sluijs" +* performer = Reference(ACP-HealthProfessional-PractitionerRole-DesireeWolters-Pat2) "Healthcare professional (role), Desiree Wolters" +* status = #final +* code = $snomed#304686002 "Ability to make considered choices" +* valueBoolean = true +* effectiveDateTime = "2025-08-07" +* note.text = "Patiënt is wilsbekwaam. Bij verandering van de situatie wordt haar partner haar wettelijk vertegenwoordiger." \ No newline at end of file From 4c2e96653fe45979ddf7d5696f7a22121f635800 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 9 Apr 2026 11:09:41 +0200 Subject: [PATCH 09/71] Add to sushi-config and fix value type --- input/fsh/Observation.fsh | 2 +- sushi-config.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index 5861623..7345b74 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -359,7 +359,7 @@ Description: "Indicator of capability of patient to make informed decisions abou * encounter only Reference(ACPEncounter) * subject only Reference(ACPPatient) * code = $snomed#304686002 -* value[x] only Boolean +* value[x] only boolean * insert ObligationRules(encounter) * insert ObligationRules(subject) diff --git a/sushi-config.yaml b/sushi-config.yaml index eb583e1..5142b6a 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -207,6 +207,7 @@ groups: name: "Structures: Resource Profiles" description: These are ACP profiles based on FHIR core resources. resources: + - StructureDefinition/ACP-LegallyCapable - StructureDefinition/ACP-InformRelativesRequest - StructureDefinition/ACP-MedicalPolicyGoal - StructureDefinition/ACP-OrganDonationChoiceRegistration From 7316c39535e035512354ab3a1c1d0b942eb20a10 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 9 Apr 2026 11:51:32 +0200 Subject: [PATCH 10/71] Include new profile in CapabilityStatement --- input/fsh/CapabilityStatement.fsh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/input/fsh/CapabilityStatement.fsh b/input/fsh/CapabilityStatement.fsh index 686faec..b742239 100644 --- a/input/fsh/CapabilityStatement.fsh +++ b/input/fsh/CapabilityStatement.fsh @@ -139,7 +139,11 @@ Usage: #definition * valueCode = #SHOULD * type = #Observation // Supported profiles for Observation resource are set to SHOULD because not all Observation have to be implemented. - * supportedProfile[0] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-OrganDonationChoiceRegistration" + * supportedProfile[0] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-LegallyCapable" + * extension + * url = $CapExpectation + * valueCode = #SHOULD + * supportedProfile[+] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-OrganDonationChoiceRegistration" * extension * url = $CapExpectation * valueCode = #SHOULD @@ -483,7 +487,11 @@ Usage: #definition * valueCode = #SHALL * type = #Observation // Supported profiles for Observation resource are set to SHOULD because not all Observation have to be implemented. - * supportedProfile[0] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-OrganDonationChoiceRegistration" + * supportedProfile[0] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-LegallyCapable" + * extension + * url = $CapExpectation + * valueCode = #SHOULD + * supportedProfile[+] = "https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ACP-OrganDonationChoiceRegistration" * extension * url = $CapExpectation * valueCode = #SHOULD From 0a497eb6aee5a476c6ebdfb1cc5fa0dc9bd6f386 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 13 Apr 2026 11:27:15 +0200 Subject: [PATCH 11/71] Add temporary observation code for legally capable to query This could be the way to go, but we should consider dedicating a separate query to this piece of information. --- input/pagecontent/data-exchange.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index 708d2b1..b5e963d 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -46,7 +46,7 @@ The below listed search requests show how all the ACP agreements, procedural inf 4 GET [base]/Goal?patient=Patient/[id]&category=http://snomed.info/sct|713603004 -5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|153851000146100,395091006,340171000146104,247751003,570801000146104 +5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|304686002,153851000146100,395091006,340171000146104,247751003,570801000146104 6 GET [base]/DeviceUseStatement?patient=Patient/[id]&device.type=http://snomed.info/sct|72506001,465460004,468542000,704707009,1263462004,1236894001&_include=DeviceUseStatement:device From 2c174a11abfe6891e8776ccc682d2b521d3c5236 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 16 Apr 2026 07:54:19 +0200 Subject: [PATCH 12/71] Change type choice to boolean for 1406, 984 and 1200 in questionnaire and responses Also changed enableWhen behavior accordingly. --- .../resources/Questionnaire-ACP-zib2020.json | 72 +++---------------- ...naireResponse-HendrikHartman-20201001.json | 15 +--- ...naireResponse-HendrikHartman-20221108.json | 15 +--- ...eResponse-SamiraVanDerSluijs-20251117.json | 15 +--- 4 files changed, 18 insertions(+), 99 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 17be0c7..e8657f4 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -153,23 +153,9 @@ { "linkId": "1406", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?", - "type": "choice", + "type": "boolean", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ], "item": [ { "linkId": "1407", @@ -531,23 +517,9 @@ "linkId": "984", "prefix": "d)", "text": "Is de wettelijk vertegenwoordiger ook de eerste contactpersoon?", - "type": "choice", + "type": "boolean", "required": false, - "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ] + "repeats": false }, { "linkId": "53", @@ -558,11 +530,8 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" + "answerBoolean": true } - } ], "enableBehavior": "any", "repeats": false, @@ -599,10 +568,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": true } ], "enableBehavior": "any", @@ -745,10 +711,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": true } ], "enableBehavior": "any", @@ -775,10 +738,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": true } ], "enableBehavior": "any", @@ -2345,23 +2305,9 @@ "linkId": "1200", "prefix": "a)", "text": "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?", - "type": "choice", + "type": "boolean", "required": false, - "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ] + "repeats": false }, { "linkId": "1201", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index 43e5192..0263425 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -118,10 +118,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1406", @@ -205,10 +202,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "984", @@ -808,10 +802,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1200", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index b9269ab..f459957 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -118,10 +118,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1406", @@ -205,10 +202,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "984", @@ -832,10 +826,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1200", diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 00a34f5..69d226e 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -125,10 +125,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - }, + "valueBoolean": true, "item": [ { "answer": [ @@ -286,10 +283,7 @@ { "answer": [ { - "valueCoding": { - "code": "0", - "display": "Nee" - } + "valueBoolean": false } ], "linkId": "984", @@ -1069,10 +1063,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1200", From 0b753713b032c7763c3ca39c09f248ef600929ec Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 27 Apr 2026 16:15:56 +0200 Subject: [PATCH 13/71] Add specialty valueset --- input/fsh/ValueSet.fsh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index 3faba5d..5a7ccea 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -217,4 +217,14 @@ Description: "ValueSet representing 'Yes, No, Unknown' answers." * $snomed#373067005 ^designation[=].value = "ontkenning" * $snomed#373067005 ^designation[+].language = #nl-NL * $snomed#373067005 ^designation[=].use = $snomed#900000000000013009 "Synonym" -* $snomed#373067005 ^designation[=].value = "neen" \ No newline at end of file +* $snomed#373067005 ^designation[=].value = "neen" + + +ValueSet: ACPHealthProfessionalSpecialtyVS +Id: ACP-HealthProfessionalSpecialty +Title: "ACP Health Professional Specialty" +Description: "ValueSet for specialty of the health professional, to be used in the questionnaire. This ValueSet allows codes from both the UZI role coding and the AGB specialty list. The ValueSet is derived from the zib Healthcare Professional (zib2020) Specialty, representing the specialty of the healthcare professional using UZI and AGB codes." +* insert MetaRules +* compose.include[0].system = "http://fhir.nl/fhir/NamingSystem/uzi-rolcode" +* compose.include[1].system = "urn:oid:2.16.840.1.113883.2.4.6.7" + From 286a8efd9905712d5ae7b085fad25a1452a0017b Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 27 Apr 2026 16:32:58 +0200 Subject: [PATCH 14/71] Use specialty valueset in questionnaire and change type to codeableconcept in responses --- .../resources/Questionnaire-ACP-zib2020.json | 45 +------------------ ...naireResponse-HendrikHartman-20201001.json | 12 +++-- ...naireResponse-HendrikHartman-20221108.json | 12 +++-- ...eResponse-SamiraVanDerSluijs-20251117.json | 12 +++-- 4 files changed, 25 insertions(+), 56 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 17be0c7..3c7dd96 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -96,50 +96,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.000", - "display": "Arts" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.047", - "display": "Specialist ouderengeneeskunde" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "30.000", - "display": "Verpleegkundige" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "81.000", - "display": "Physician assistant" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "99.000", - "display": "Zorgverlener andere zorg" - } - } - ] + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-HealthProfessionalSpecialty" } ] }, diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index 43e5192..0dd2820 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -99,10 +99,14 @@ { "answer": [ { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" + "valueCodeableConcept": { + "coding": [ + { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } + ] } } ], diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index b9269ab..ed29426 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -99,10 +99,14 @@ { "answer": [ { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" + "valueCodeableConcept": { + "coding": [ + { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } + ] } } ], diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 00a34f5..e6417a0 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -106,10 +106,14 @@ { "answer": [ { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" + "valueCodeableConcept": { + "coding": [ + { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } + ] } } ], From 83fe2be60fbe30ab6fb2b3557e874086e618ae42 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 27 Apr 2026 17:58:35 +0200 Subject: [PATCH 15/71] Replace 'compose.include' by 'include codes from' Previous approach gave error which could not be fixed (Assignment rules must include at least one space both before and after the '=' sign voor: * compose.include[0].system = "http://fhir.nl/fhir/NamingSystem/uzi-rolcode") --- input/fsh/ValueSet.fsh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index 5a7ccea..5ad3f8d 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -225,6 +225,7 @@ Id: ACP-HealthProfessionalSpecialty Title: "ACP Health Professional Specialty" Description: "ValueSet for specialty of the health professional, to be used in the questionnaire. This ValueSet allows codes from both the UZI role coding and the AGB specialty list. The ValueSet is derived from the zib Healthcare Professional (zib2020) Specialty, representing the specialty of the healthcare professional using UZI and AGB codes." * insert MetaRules -* compose.include[0].system = "http://fhir.nl/fhir/NamingSystem/uzi-rolcode" -* compose.include[1].system = "urn:oid:2.16.840.1.113883.2.4.6.7" +* include codes from system http://fhir.nl/fhir/NamingSystem/uzi-rolcode +* include codes from system urn:oid:2.16.840.1.113883.2.4.6.7 + From 9b6b39eaf9cc7920d1ccbf6353daaff813c1a6f9 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 28 Apr 2026 16:39:25 +0200 Subject: [PATCH 16/71] Change codeableconcept to coding again CodeableConcept resulted in 'null!' --- ...tionnaireResponse-HendrikHartman-20201001.json | 15 ++++++--------- ...tionnaireResponse-HendrikHartman-20221108.json | 15 ++++++--------- ...naireResponse-SamiraVanDerSluijs-20251117.json | 15 ++++++--------- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index 0dd2820..76eb0fd 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -99,15 +99,12 @@ { "answer": [ { - "valueCodeableConcept": { - "coding": [ - { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } - ] - } + + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } } ], "linkId": "1405", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index ed29426..92a2167 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -99,15 +99,12 @@ { "answer": [ { - "valueCodeableConcept": { - "coding": [ - { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } - ] - } + + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } } ], "linkId": "1405", diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index e6417a0..3118b6e 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -106,15 +106,12 @@ { "answer": [ { - "valueCodeableConcept": { - "coding": [ - { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } - ] - } + + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } } ], "linkId": "1405", From d83112d272fdf7d7f30d47967e5c9a2ba0881de7 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Wed, 29 Apr 2026 09:39:25 +0200 Subject: [PATCH 17/71] Add comment in valueset stating that oid is for AGB specialty list --- input/fsh/ValueSet.fsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index 5ad3f8d..e40ba23 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -226,6 +226,6 @@ Title: "ACP Health Professional Specialty" Description: "ValueSet for specialty of the health professional, to be used in the questionnaire. This ValueSet allows codes from both the UZI role coding and the AGB specialty list. The ValueSet is derived from the zib Healthcare Professional (zib2020) Specialty, representing the specialty of the healthcare professional using UZI and AGB codes." * insert MetaRules * include codes from system http://fhir.nl/fhir/NamingSystem/uzi-rolcode -* include codes from system urn:oid:2.16.840.1.113883.2.4.6.7 +* include codes from system urn:oid:2.16.840.1.113883.2.4.6.7 //OID for AGB specialty list From 90fcfe9394a65ce2d7356f18b2ab78c3e35c5a0f Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 30 Apr 2026 16:17:06 +0200 Subject: [PATCH 18/71] Revert "Issue #138 Change type choice to boolean for three questionnaire items" --- .../resources/Questionnaire-ACP-zib2020.json | 72 ++++++++++++++++--- ...naireResponse-HendrikHartman-20201001.json | 15 +++- ...naireResponse-HendrikHartman-20221108.json | 15 +++- ...eResponse-SamiraVanDerSluijs-20251117.json | 15 +++- 4 files changed, 99 insertions(+), 18 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index e8657f4..17be0c7 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -153,9 +153,23 @@ { "linkId": "1406", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?", - "type": "boolean", + "type": "choice", "required": false, "repeats": false, + "answerOption": [ + { + "valueCoding": { + "code": "1", + "display": "Ja" + } + }, + { + "valueCoding": { + "code": "0", + "display": "Nee" + } + } + ], "item": [ { "linkId": "1407", @@ -517,9 +531,23 @@ "linkId": "984", "prefix": "d)", "text": "Is de wettelijk vertegenwoordiger ook de eerste contactpersoon?", - "type": "boolean", + "type": "choice", "required": false, - "repeats": false + "repeats": false, + "answerOption": [ + { + "valueCoding": { + "code": "1", + "display": "Ja" + } + }, + { + "valueCoding": { + "code": "0", + "display": "Nee" + } + } + ] }, { "linkId": "53", @@ -530,8 +558,11 @@ { "question": "984", "operator": "=", - "answerBoolean": true + "answerCoding": { + "code": "0", + "display": "Nee" } + } ], "enableBehavior": "any", "repeats": false, @@ -568,7 +599,10 @@ { "question": "984", "operator": "=", - "answerBoolean": true + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -711,7 +745,10 @@ { "question": "984", "operator": "=", - "answerBoolean": true + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -738,7 +775,10 @@ { "question": "984", "operator": "=", - "answerBoolean": true + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -2305,9 +2345,23 @@ "linkId": "1200", "prefix": "a)", "text": "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?", - "type": "boolean", + "type": "choice", "required": false, - "repeats": false + "repeats": false, + "answerOption": [ + { + "valueCoding": { + "code": "1", + "display": "Ja" + } + }, + { + "valueCoding": { + "code": "0", + "display": "Nee" + } + } + ] }, { "linkId": "1201", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index 0263425..43e5192 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -118,7 +118,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "1406", @@ -202,7 +205,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "984", @@ -802,7 +808,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "1200", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index f459957..b9269ab 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -118,7 +118,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "1406", @@ -202,7 +205,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "984", @@ -826,7 +832,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "1200", diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 69d226e..00a34f5 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -125,7 +125,10 @@ { "answer": [ { - "valueBoolean": true, + "valueCoding": { + "code": "1", + "display": "Ja" + }, "item": [ { "answer": [ @@ -283,7 +286,10 @@ { "answer": [ { - "valueBoolean": false + "valueCoding": { + "code": "0", + "display": "Nee" + } } ], "linkId": "984", @@ -1063,7 +1069,10 @@ { "answer": [ { - "valueBoolean": true + "valueCoding": { + "code": "1", + "display": "Ja" + } } ], "linkId": "1200", From c165d48388aaf0bfef6a106cf2016fc65c7d269b Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 30 Apr 2026 17:14:36 +0200 Subject: [PATCH 19/71] Change type choice to boolean for 1406, 984 and 1200 in questionnaire and responses Includes fixed enableWhen behaviour --- .../resources/Questionnaire-ACP-zib2020.json | 72 +++---------------- ...naireResponse-HendrikHartman-20201001.json | 15 +--- ...naireResponse-HendrikHartman-20221108.json | 15 +--- ...eResponse-SamiraVanDerSluijs-20251117.json | 15 +--- 4 files changed, 18 insertions(+), 99 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 17be0c7..af32add 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -153,23 +153,9 @@ { "linkId": "1406", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?", - "type": "choice", + "type": "boolean", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ], "item": [ { "linkId": "1407", @@ -531,23 +517,9 @@ "linkId": "984", "prefix": "d)", "text": "Is de wettelijk vertegenwoordiger ook de eerste contactpersoon?", - "type": "choice", + "type": "boolean", "required": false, - "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ] + "repeats": false }, { "linkId": "53", @@ -558,10 +530,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -599,10 +568,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -745,10 +711,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -775,10 +738,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -2345,23 +2305,9 @@ "linkId": "1200", "prefix": "a)", "text": "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?", - "type": "choice", + "type": "boolean", "required": false, - "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ] + "repeats": false }, { "linkId": "1201", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index 43e5192..0263425 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -118,10 +118,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1406", @@ -205,10 +202,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "984", @@ -808,10 +802,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1200", diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index b9269ab..f459957 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -118,10 +118,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1406", @@ -205,10 +202,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "984", @@ -832,10 +826,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1200", diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 00a34f5..69d226e 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -125,10 +125,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - }, + "valueBoolean": true, "item": [ { "answer": [ @@ -286,10 +283,7 @@ { "answer": [ { - "valueCoding": { - "code": "0", - "display": "Nee" - } + "valueBoolean": false } ], "linkId": "984", @@ -1069,10 +1063,7 @@ { "answer": [ { - "valueCoding": { - "code": "1", - "display": "Ja" - } + "valueBoolean": true } ], "linkId": "1200", From 5ae673850f1e41726e5024e6b88115ddeff3f177 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 7 May 2026 12:58:16 +0200 Subject: [PATCH 20/71] Change placeholder code to actual code for Legal competence to make decisions regarding medical treatment --- input/fsh/Observation.fsh | 6 +++--- input/pagecontent/data-exchange.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index 7345b74..f4c3a7d 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -358,7 +358,7 @@ Description: "Indicator of capability of patient to make informed decisions abou * insert MetaRules * encounter only Reference(ACPEncounter) * subject only Reference(ACPPatient) -* code = $snomed#304686002 +* code = $snomed#665631000146103 * value[x] only boolean * insert ObligationRules(encounter) @@ -394,7 +394,7 @@ Usage: #example * subject = Reference(ACP-Patient-HendrikHartman-Pat1) "Patient, Hendrik Hartman" * performer = Reference(ACP-HealthProfessional-PractitionerRole-DrVanHuissen-Pat1) "Healthcare professional (role), van Huissen" * status = #final -* code = $snomed#304686002 "Ability to make considered choices" +* code = $snomed#665631000146103 "juridisch vermogen om beslissingen te nemen over medische behandelingen" * valueBoolean = true * effectiveDateTime = "2020-10-01" @@ -410,7 +410,7 @@ Usage: #example * subject = Reference(ACP-Patient-SamiraVanDerSluijs-Pat2) "Patient, Samira van der Sluijs" * performer = Reference(ACP-HealthProfessional-PractitionerRole-DesireeWolters-Pat2) "Healthcare professional (role), Desiree Wolters" * status = #final -* code = $snomed#304686002 "Ability to make considered choices" +* code = $snomed#665631000146103 "juridisch vermogen om beslissingen te nemen over medische behandelingen" * valueBoolean = true * effectiveDateTime = "2025-08-07" * note.text = "Patiënt is wilsbekwaam. Bij verandering van de situatie wordt haar partner haar wettelijk vertegenwoordiger." \ No newline at end of file diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index b5e963d..155e9e3 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -46,7 +46,7 @@ The below listed search requests show how all the ACP agreements, procedural inf 4 GET [base]/Goal?patient=Patient/[id]&category=http://snomed.info/sct|713603004 -5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|304686002,153851000146100,395091006,340171000146104,247751003,570801000146104 +5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|665631000146103,153851000146100,395091006,340171000146104,247751003,570801000146104 6 GET [base]/DeviceUseStatement?patient=Patient/[id]&device.type=http://snomed.info/sct|72506001,465460004,468542000,704707009,1263462004,1236894001&_include=DeviceUseStatement:device From ed7508cf788fbb2a784bbafe8217eefb9270bc25 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 11 May 2026 16:58:13 +0200 Subject: [PATCH 21/71] Replace observable entity code with finding code Booleans are not allowed to be used with observable entities, therefore we should use a finding code. --- input/fsh/Observation.fsh | 6 +++--- input/pagecontent/data-exchange.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index f4c3a7d..ae75f96 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -358,7 +358,7 @@ Description: "Indicator of capability of patient to make informed decisions abou * insert MetaRules * encounter only Reference(ACPEncounter) * subject only Reference(ACPPatient) -* code = $snomed#665631000146103 +* code = $snomed#665671000146101 * value[x] only boolean * insert ObligationRules(encounter) @@ -394,7 +394,7 @@ Usage: #example * subject = Reference(ACP-Patient-HendrikHartman-Pat1) "Patient, Hendrik Hartman" * performer = Reference(ACP-HealthProfessional-PractitionerRole-DrVanHuissen-Pat1) "Healthcare professional (role), van Huissen" * status = #final -* code = $snomed#665631000146103 "juridisch vermogen om beslissingen te nemen over medische behandelingen" +* code = $snomed#665671000146101 "juridisch in staat om beslissingen te nemen over medische behandelingen" * valueBoolean = true * effectiveDateTime = "2020-10-01" @@ -410,7 +410,7 @@ Usage: #example * subject = Reference(ACP-Patient-SamiraVanDerSluijs-Pat2) "Patient, Samira van der Sluijs" * performer = Reference(ACP-HealthProfessional-PractitionerRole-DesireeWolters-Pat2) "Healthcare professional (role), Desiree Wolters" * status = #final -* code = $snomed#665631000146103 "juridisch vermogen om beslissingen te nemen over medische behandelingen" +* code = $snomed#665671000146101 "juridisch in staat om beslissingen te nemen over medische behandelingen" * valueBoolean = true * effectiveDateTime = "2025-08-07" * note.text = "Patiënt is wilsbekwaam. Bij verandering van de situatie wordt haar partner haar wettelijk vertegenwoordiger." \ No newline at end of file diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index 155e9e3..d445503 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -46,7 +46,7 @@ The below listed search requests show how all the ACP agreements, procedural inf 4 GET [base]/Goal?patient=Patient/[id]&category=http://snomed.info/sct|713603004 -5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|665631000146103,153851000146100,395091006,340171000146104,247751003,570801000146104 +5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|665671000146101,153851000146100,395091006,340171000146104,247751003,570801000146104 6 GET [base]/DeviceUseStatement?patient=Patient/[id]&device.type=http://snomed.info/sct|72506001,465460004,468542000,704707009,1263462004,1236894001&_include=DeviceUseStatement:device From 3538d3684ac61c1e23fcbb5804b97db2b56658cf Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 12 May 2026 17:29:47 +0200 Subject: [PATCH 22/71] Add and couple ValueSet for procedure codes and update query ValueSet for Procedure.code is made with snomed, CBV and NZa code. DHD VT code is not included as it is stated that this set should not be used for exchange: "SNOMED CT - SNOMED CT: ^41000147108 | DHD Verrichtingenthesaurus-referentieset (was: DHD Verrichtingenthesaurus - Alle waarden met OID 2.16.840.1.113883.2.4.3.120.5.2. Deze set is echter niet direct bedoeld voor uitwisseling. Zie onder andere [ZIB-1233](https://bits.nictiz.nl/browse/ZIB-1233))" Search query is updated accordingly, and to test new modelling, the examples are changed. This can be undone after review. --- input/fsh/Alias.fsh | 2 ++ input/fsh/Procedure.fsh | 6 ++--- input/fsh/ValueSet.fsh | 35 +++++++++++++++++++++++++++++- input/pagecontent/data-exchange.md | 2 +- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/input/fsh/Alias.fsh b/input/fsh/Alias.fsh index b108956..39b4199 100644 --- a/input/fsh/Alias.fsh +++ b/input/fsh/Alias.fsh @@ -1,5 +1,7 @@ Alias: $snomed = http://snomed.info/sct Alias: $v3-NullFlavor = http://terminology.hl7.org/CodeSystem/v3-NullFlavor +Alias: $DHD-CBV = urn:oid:2.16.840.1.113883.2.4.3.120.5.3 +Alias: $NZa = urn:oid:2.16.840.1.113883.2.4.3.27.15.5 Alias: $DataAbsentReason = http://terminology.hl7.org/CodeSystem/data-absent-reason Alias: $v2-0203 = http://terminology.hl7.org/CodeSystem/v2-0203 Alias: $v3-RoleCode = http://terminology.hl7.org/CodeSystem/v3-RoleCode diff --git a/input/fsh/Procedure.fsh b/input/fsh/Procedure.fsh index f8b7822..7ad4001 100644 --- a/input/fsh/Procedure.fsh +++ b/input/fsh/Procedure.fsh @@ -6,8 +6,8 @@ Description: "Advance Care Planning procedure. Based on nl-core-Procedure-event * insert MetaRules * subject only Reference(ACPPatient) * encounter only Reference(ACPEncounter) +* code from ACPProcedureTypeVS (required) * code 1..1 -* code = $snomed#713603004 * insert ObligationRules(subject) * insert ObligationRules(encounter) @@ -60,7 +60,7 @@ Usage: #example * performer[=].actor.type = "Patient" * performedPeriod.start = "2025-08-07" * performedPeriod.end = "2025-08-07" -* code = $snomed#713603004 "advance care planning" +* code = $DHD-CBV#411600B "PROACTIEVE ZORGPLANNING-OPSTEL. INDIV.ZORGPL.PALLIAT.FASE" Instance: ACP-Procedure-2-Pat2 InstanceOf: ACPProcedure @@ -79,4 +79,4 @@ Usage: #example * performer[=].actor.type = "Patient" * performedPeriod.start = "2024-07-28" * performedPeriod.end = "2024-07-28" -* code = $snomed#713603004 "advance care planning" +* code = $NZa#190099 "Proactieve zorgplanning" diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index 3faba5d..c88340d 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -217,4 +217,37 @@ Description: "ValueSet representing 'Yes, No, Unknown' answers." * $snomed#373067005 ^designation[=].value = "ontkenning" * $snomed#373067005 ^designation[+].language = #nl-NL * $snomed#373067005 ^designation[=].use = $snomed#900000000000013009 "Synonym" -* $snomed#373067005 ^designation[=].value = "neen" \ No newline at end of file +* $snomed#373067005 ^designation[=].value = "neen" + + +ValueSet: ACPProcedureTypeVS +Id: ACP-ProcedureType +Title: "ACP ProcedureType" +Description: "ValueSet for ProcedureType, representing allowed codes for the ACP conversation. The DHD Verrichtingenthesaurus code `0000106562` (proactieve zorgplanning in palliatieve fase) is not included in this ValueSet, as this set is not meant to be used for exchange (see [ZIB-1233](https://nictiz.atlassian.net/browse/ZIB-1233))" +* insert MetaRules +* ^copyright = "This artefact includes content from SNOMED Clinical Terms® (SNOMED CT®) which is copyright of the International Health Terminology Standards Development Organisation (IHTSDO). Implementers of these artefacts must have the appropriate SNOMED CT Affiliate license - for more information contact http://www.snomed.org/snomed-ct/getsnomed-ct or info@snomed.org." +* $snomed#713603004 "advance care planning" +* $snomed#713603004 ^designation[0].language = #en-US +* $snomed#713603004 ^designation[=].use.system = "http://snomed.info/sct" +* $snomed#713603004 ^designation[=].use = $snomed#900000000000013009 "Synonym" +* $snomed#713603004 ^designation[=].use.display = "Synonym" +* $snomed#713603004 ^designation[=].value = "Advance care planning (procedure)" +* $snomed#713603004 ^designation[+].language = #en-US +* $snomed#713603004 ^designation[=].use.system = "http://snomed.info/sct" +* $snomed#713603004 ^designation[=].use = $snomed#900000000000013009 "Synonym" +* $snomed#713603004 ^designation[=].use.display = "Synonym" +* $snomed#713603004 ^designation[=].value = "Advance care planning" +* $snomed#713603004 ^designation[+].language = #nl-NL +* $snomed#713603004 ^designation[=].use = $snomed#900000000000013009 "Synonym" +* $snomed#713603004 ^designation[=].use.display = "Synonym" +* $snomed#713603004 ^designation[=].value = "advance care planning (verrichting)" +* $snomed#713603004 ^designation[+].language = #nl-NL +* $snomed#713603004 ^designation[=].use = $snomed#900000000000013009 "Synonym" +* $snomed#713603004 ^designation[=].use.display = "Synonym" +* $snomed#713603004 ^designation[=].value = "bespreken van wensen en behoeften voor toekomstige zorg" +* $snomed#713603004 ^designation[+].language = #nl-NL +* $snomed#713603004 ^designation[=].use = $snomed#900000000000013009 "Synonym" +* $snomed#713603004 ^designation[=].use.display = "Synonym" +* $snomed#713603004 ^designation[=].value = "advance care planning" +* $DHD-CBV#411600B "PROACTIEVE ZORGPLANNING-OPSTEL. INDIV.ZORGPL.PALLIAT.FASE" +* $NZa#190099 "Proactieve zorgplanning" diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index 708d2b1..0fcd96f 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -36,7 +36,7 @@ This approach is useful for applications that need to query specific parts of a The below listed search requests show how all the ACP agreements, procedural information and relevant clinical context can be retrieved. Information on individuals involved in the ACP process are referenced from these resources and can be retrieved using the `_include` statement as defined below, or by resolving the references. Standard FHIR rules apply on the search syntax. The Provider CapabilityStatement and Consulter CapabilityStatement resources may provide a more structured overview of the below requirements. ``` -1a GET [base]/Procedure?patient=Patient/[id]&code=http://snomed.info/sct|713603004&_include=Procedure:encounter +1a GET [base]/Procedure?patient=Patient/[id]&code=http://snomed.info/sct|713603004,urn:oid:2.16.840.1.113883.2.4.3.120.5.3|411600B,urn:oid:2.16.840.1.113883.2.4.3.27.15.5|190099&_include=Procedure:encounter 1b GET [base]/Encounter?patient=Patient/[id]&reason-reference:Procedure.code=http://snomed.info/sct|713603004&_include=Encounter:reason-reference From 547e58cfe819fceee5f1ec952898c89bc5b7e62b Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 13 May 2026 08:42:08 +0200 Subject: [PATCH 23/71] Update Observation description and mappings Clarify the ACP Legally Capable profile description and adjust element-to-dataset mappings. The profile Description was reworded for clarity. Removed/commented obsolete mapping lines, remapped dataAbsentReason from code 668 to 762, and added note.text -> 763. These changes correct mapping targets and improve the profile documentation. --- input/fsh/Observation.fsh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index ae75f96..8cfe8f0 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -354,7 +354,7 @@ Profile: ACPLegallyCapable Parent: Observation Id: ACP-LegallyCapable Title: "ACP Legally Capable" -Description: "Indicator of capability of patient to make informed decisions about their healthcare. Based on Observation resource." +Description: "Indicates whether the patient is currently assessed as having the capacity to understand and oversee the consequences of medical treatment decisions. Based on Observation resource." * insert MetaRules * encounter only Reference(ACPEncounter) * subject only Reference(ACPPatient) @@ -376,10 +376,8 @@ Title: "ACP dataset" Source: ACPLegallyCapable Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" * -> "761" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" -// * code -> "667" "Gewenste plek van overlijden ([Meting])" * valueBoolean -> "762" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" -* dataAbsentReason -> "668" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" -//* effective[x] -> "672" "[MeetDatumBeginTijd]" +* dataAbsentReason -> "762" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" * note.text -> "763" "[Toelichting]" From 764e5c5f3b24b898ed2f751941f7bc9ee9b10a95 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 13 May 2026 08:46:32 +0200 Subject: [PATCH 24/71] Include codes in Procedure/Encounter queries Replace the single short SNOMED code with a comma-separated list of explicit code/system identifiers (http://snomed.info/sct|713603004 plus two urn:oid entries) in FHIR search examples. Updated the mermaid diagram include and the data-exchange example so Procedure and Encounter queries use the full set of codes (ensuring matches for SNOMED and OID-coded representations). Files changed: input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md and input/pagecontent/data-exchange.md. --- .../fhir-data-exchange-individual-resources-mermaid-diagram.md | 2 +- input/pagecontent/data-exchange.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md index 5ada1ef..9b59356 100644 --- a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md +++ b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md @@ -11,7 +11,7 @@ sequenceDiagram par %% 1. Procedures - C->>S: GET /Procedure?patient=Patient/[id]
&code=sct|713603004
&_include=Procedure:encounter + C->>S: GET /Procedure?patient=Patient/[id]
&code=http://snomed.info/sct|713603004,
urn:oid:2.16.840.1.113883.2.4.3.120.5.3|411600B,
urn:oid:2.16.840.1.113883.2.4.3.27.15.5|190099
&_include=Procedure:encounter activate S S-->>C: 200 OK: Bundle (Procedure + Encounter) deactivate S diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index 0fcd96f..64d4832 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -38,7 +38,7 @@ The below listed search requests show how all the ACP agreements, procedural inf ``` 1a GET [base]/Procedure?patient=Patient/[id]&code=http://snomed.info/sct|713603004,urn:oid:2.16.840.1.113883.2.4.3.120.5.3|411600B,urn:oid:2.16.840.1.113883.2.4.3.27.15.5|190099&_include=Procedure:encounter -1b GET [base]/Encounter?patient=Patient/[id]&reason-reference:Procedure.code=http://snomed.info/sct|713603004&_include=Encounter:reason-reference +1b GET [base]/Encounter?patient=Patient/[id]&reason-reference:Procedure.code=http://snomed.info/sct|713603004,urn:oid:2.16.840.1.113883.2.4.3.120.5.3|411600B,urn:oid:2.16.840.1.113883.2.4.3.27.15.5|190099&_include=Encounter:reason-reference 2 GET [base]/Consent?patient=Patient/[id]&scope=http://terminology.hl7.org/CodeSystem/consentscope|treatment&category=http://snomed.info/sct|129125009&_include=Consent:actor From fc5842ca8f658adbb93717f1f6e75092b406c404 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 13 May 2026 09:36:14 +0200 Subject: [PATCH 25/71] Removed extension from Patient, updated mappings and diagrams --- input/fsh/Observation.fsh | 2 +- input/fsh/Patient.fsh | 22 +------------------ ...ge-individual-resources-mermaid-diagram.md | 2 +- .../fhir-data-model-mermaid-diagram.md | 2 ++ input/includes/mappings.md | 7 +++--- 5 files changed, 9 insertions(+), 26 deletions(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index 8cfe8f0..e8f00ce 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -354,7 +354,7 @@ Profile: ACPLegallyCapable Parent: Observation Id: ACP-LegallyCapable Title: "ACP Legally Capable" -Description: "Indicates whether the patient is currently assessed as having the capacity to understand and oversee the consequences of medical treatment decisions. Based on Observation resource." +Description: "Indicates whether the patient is currently assessed as having the capacity to understand and oversee the consequences of medical treatment decisions. If the patient is not legally capable, there should be a legal representative captured in a RelatedPerson resource. Based on Observation resource." * insert MetaRules * encounter only Reference(ACPEncounter) * subject only Reference(ACPPatient) diff --git a/input/fsh/Patient.fsh b/input/fsh/Patient.fsh index a661f87..a03ee9e 100644 --- a/input/fsh/Patient.fsh +++ b/input/fsh/Patient.fsh @@ -4,18 +4,11 @@ Id: ACP-Patient Title: "ACP Patient" Description: "A person who receives medical, psychological, paramedical, or nursing care. Based on nl-core-Patient and HCIM Patient." * insert MetaRules -* obeys ACP-Patient-1 -* extension contains - ExtPatientLegallyCapableMedicalTreatmentDecisions named legallyCapableMedicalTreatmentDecisions 0..1 -* extension[legallyCapableMedicalTreatmentDecisions] ^condition = "ACP-Patient-1" * name 1..* -* contact ^condition = "ACP-Patient-1" -* contact.extension[relatedPerson] ^condition = "ACP-Patient-1" * contact.extension[relatedPerson] ^comment = "All information regarding the patient's contact persons should preferably be stored in the RelatedPerson resource, and optionally in `Patient.contact`. The http://hl7.org/fhir/StructureDefinition/patient-relatedPerson extension is used to link the contact person to the Patient and to emphasize that the related person is also a contact person of the patient." * contact.extension[relatedPerson].valueReference only Reference(ACPContactPerson) -* contact.relationship ^condition = "ACP-Patient-1" -* insert ObligationRules(extension[legallyCapableMedicalTreatmentDecisions]) + * insert ObligationRules(contact.extension[relatedPerson]) * insert ObligationRules(identifier) * insert ObligationRules(name[nameInformation].given) @@ -48,13 +41,6 @@ Description: "A person who receives medical, psychological, paramedical, or nurs * insert ObligationRules(address.use) * insert ObligationRules(address.type) - -Invariant: ACP-Patient-1 -Description: "If the patient is not legally capable, there should be a legal representative." -* severity = #warning -* expression = "extension.where(url='https://api.iknl.nl/docs/pzp/r4/StructureDefinition/ext-LegallyCapable-MedicalTreatmentDecisions').extension.where(url='legallyCapable').value = false implies (contact.where(relationship.coding.code = '24').exists() or contact.extension.where(url='http://hl7.org/fhir/StructureDefinition/patient-relatedPerson').exists())" - - Mapping: MapACPPatient Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" @@ -63,9 +49,6 @@ Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3. * -> "351" "Patient" * -> "613" "Patient" * -> "648" "Patient" -* extension[legallyCapableMedicalTreatmentDecisions] -> "761" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" -* extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapable] -> "762" "Wilsbekwaamheid m.b.t. medische behandelbeslissingen" -* extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapableComment] -> "763" "Toelichting" * identifier -> "385" "Identificatienummer" * name -> "352" "Naamgegevens" * name[nameInformation].given -> "353" "Voornamen" @@ -123,7 +106,6 @@ Instance: ACP-Patient-HendrikHartman-Pat1 InstanceOf: ACPPatient Title: "ACP Patient - Hendrik Hartman - Pat 1" Usage: #example -* extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapable].valueBoolean = true * identifier.system = "http://fhir.nl/fhir/NamingSystem/bsn" * identifier.value = "999911120" * name[nameInformation].extension.url = "http://hl7.org/fhir/StructureDefinition/humanname-assembly-order" @@ -162,8 +144,6 @@ Instance: ACP-Patient-SamiraVanDerSluijs-Pat2 InstanceOf: ACPPatient Title: "ACP Patient - Samira van der Sluijs - Pat 2" Usage: #example -* extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapable].valueBoolean = true -* extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapableComment].valueString = "Patiënt is wilsbekwaam. Bij verandering van de situatie wordt haar partner haar wettelijk vertegenwoordiger." * identifier.system = "http://fhir.nl/fhir/NamingSystem/bsn" * identifier.value = "999998298" * name[0].use = #official diff --git a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md index 5ada1ef..2f32fbc 100644 --- a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md +++ b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md @@ -35,7 +35,7 @@ sequenceDiagram deactivate S and %% 5. Observations - C->>S: GET /Observation?patient=Patient/[id]
&code=http://snomed.info/sct|153851000146100,395091006,340171000146104,247751003 + C->>S: GET /Observation?patient=Patient/[id]
&code=http://snomed.info/sct|665671000146101,153851000146100,395091006,340171000146104,247751003,570801000146104 activate S S-->>C: 200 OK: Bundle (Observation) deactivate S diff --git a/input/includes/fhir-data-model-mermaid-diagram.md b/input/includes/fhir-data-model-mermaid-diagram.md index d7072c7..1c3478a 100644 --- a/input/includes/fhir-data-model-mermaid-diagram.md +++ b/input/includes/fhir-data-model-mermaid-diagram.md @@ -56,6 +56,7 @@ flowchart TB end subgraph "Observation" + ACPLegallyCapable ACPOrganDonationChoiceRegistration ACPPositionRegardingEuthanasia ACPPreferredPlaceOfDeath @@ -76,6 +77,7 @@ flowchart TB class ACPPositionRegardingEuthanasia C0 class ACPOrganDonationChoiceRegistration C0 class ACPSenseOfPurpose C0 + class ACPLegallyCapable C0 class ACPPatient C1 class ACPHealthProfessionalPractitioner C1 class ACPHealthProfessionalPractitionerRole C1 diff --git a/input/includes/mappings.md b/input/includes/mappings.md index 694738c..cf10e57 100644 --- a/input/includes/mappings.md +++ b/input/includes/mappings.md @@ -62,9 +62,10 @@ This table provides an overview of all dataset elements that are mapped to FHIR | 399 |    Voorvoegsels | Practitioner (ACPHealthProfessionalPractitioner) | `name[nameInformation].family.extension[prefix]` | | 400 |    Achternaam | Practitioner (ACPHealthProfessionalPractitioner) | `name[nameInformation].family.extension[lastName]` | | 405 |  Functie (Specialisme) | PractitionerRole (ACPHealthProfessionalPractitionerRole) | `specialty[specialty]` | -| 761 | Wilsbekwaamheid m.b.t. medische behandelbeslissingen | Patient (ACPPatient) | `extension[legallyCapableMedicalTreatmentDecisions]` | -| 762 |  Wilsbekwaamheid m.b.t. medische behandelbeslissingen | Patient (ACPPatient) | `extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapable]` | -| 763 |  Toelichting | Patient (ACPPatient) | `extension[legallyCapableMedicalTreatmentDecisions].extension[legallyCapableComment]` | +| 761 | Wilsbekwaamheid m.b.t. medische behandelbeslissingen | Observation (ACPLegallyCapable) | `` | +| 762 |  Wilsbekwaamheid m.b.t. medische behandelbeslissingen | Observation (ACPLegallyCapable) | `valueBoolean` | +| 762 |  Wilsbekwaamheid m.b.t. medische behandelbeslissingen | Observation (ACPLegallyCapable) | `dataAbsentReason` | +| 763 |  Toelichting | Observation (ACPLegallyCapable) | `note.text` | | 441 | Wettelijk vertegenwoordiger (Contactpersoon) | RelatedPerson (ACPContactPerson) | `` | | 442 |  Naamgegevens | RelatedPerson (ACPContactPerson) | `name` | | 443 |   Voornamen | RelatedPerson (ACPContactPerson) | `name[nameInformation].given` | From d30b9640b7ce9a7042f09a6b1db0f53409e17fcd Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 13 May 2026 09:42:47 +0200 Subject: [PATCH 26/71] Include legal capacity in Observation scope Update data-exchange documentation to state that Observation resources cover specific wishes, plans, and whether the patient is legally capable, clarifying the scope of profiles referenced in the Implementation Guide. --- input/pagecontent/data-exchange.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index d445503..30f24cb 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -59,7 +59,7 @@ The below listed search requests show how all the ACP agreements, procedural inf 2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (Patient, ContactPersons, and HealthProfessionals). 3. Retrieves `Consent` resources for Advance Directives and includes the representatives (ContactPersons). 4. Retrieves `Goal` resources related to advance care planning. -5. Retrieves `Observation` resources related to specific wishes and plans, as defined by the profiles in the Implementation Guide. +5. Retrieves `Observation` resources related to specific wishes, plans and whether the patient is legally capable, as defined by the profiles in the Implementation Guide. 6. Retrieves `DeviceUseStatement` resources for devices representing an ICD, and includes the corresponding `Device` resource. 7. Retrieves `CommunicationRequest` resources representing all communication requests related to the ACP procedure. From 1fa5330032ec53a4e4058b4bcea55e3a6335779b Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 13 May 2026 10:01:14 +0200 Subject: [PATCH 27/71] Replaced ValueSet with Nictiz ValueSet #131 --- input/fsh/ValueSet.fsh | 10 ---------- input/resources/Questionnaire-ACP-zib2020.json | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index e40ba23..3f52afc 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -219,13 +219,3 @@ Description: "ValueSet representing 'Yes, No, Unknown' answers." * $snomed#373067005 ^designation[=].use = $snomed#900000000000013009 "Synonym" * $snomed#373067005 ^designation[=].value = "neen" - -ValueSet: ACPHealthProfessionalSpecialtyVS -Id: ACP-HealthProfessionalSpecialty -Title: "ACP Health Professional Specialty" -Description: "ValueSet for specialty of the health professional, to be used in the questionnaire. This ValueSet allows codes from both the UZI role coding and the AGB specialty list. The ValueSet is derived from the zib Healthcare Professional (zib2020) Specialty, representing the specialty of the healthcare professional using UZI and AGB codes." -* insert MetaRules -* include codes from system http://fhir.nl/fhir/NamingSystem/uzi-rolcode -* include codes from system urn:oid:2.16.840.1.113883.2.4.6.7 //OID for AGB specialty list - - diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 3c7dd96..0857243 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -96,7 +96,7 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-HealthProfessionalSpecialty" + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.121.11.22--20200901000000" } ] }, From be4b76267aca2b46526e4cb93249abfccfda25df Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Wed, 13 May 2026 14:22:57 +0200 Subject: [PATCH 28/71] Change display preferred place of death to Dutch term --- input/fsh/Observation.fsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index ba4bf2f..4c10421 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -121,7 +121,7 @@ Usage: #example * subject = Reference(ACP-Patient-HendrikHartman-Pat1) "Patient, Hendrik Hartman" * performer = Reference(ACP-HealthProfessional-PractitionerRole-DrVanHuissen-Pat1) "Healthcare professional (role), van Huissen" * status = #final -* code = $snomed#395091006 "Preferred place of death" +* code = $snomed#395091006 "gewenste plek van overlijden" // * valueCodeableConcept = $v3-NullFlavor#UNK -- Cannot have a value[x] if you have data absent reason * dataAbsentReason = $DataAbsentReason#asked-unknown * effectiveDateTime = "2020-10-01" @@ -139,7 +139,7 @@ Usage: #example * subject = Reference(ACP-Patient-SamiraVanDerSluijs-Pat2) "Patient, Samira van der Sluijs" * performer = Reference(ACP-HealthProfessional-PractitionerRole-DesireeWolters-Pat2) "Healthcare professional (role), Desiree Wolters" * status = #final -* code = $snomed#395091006 "Preferred place of death" +* code = $snomed#395091006 "gewenste plek van overlijden" * effectiveDateTime = "2025-08-07" * valueCodeableConcept = $snomed#264362003 "thuis" * note.text = "Het liefst rustig thuis" From a22d541e252763a5949db94f7d63c030be4688ed Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Fri, 15 May 2026 15:13:24 +0200 Subject: [PATCH 29/71] Edit ValueSet definition --- input/fsh/ValueSet.fsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index c88340d..68176b4 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -223,7 +223,7 @@ Description: "ValueSet representing 'Yes, No, Unknown' answers." ValueSet: ACPProcedureTypeVS Id: ACP-ProcedureType Title: "ACP ProcedureType" -Description: "ValueSet for ProcedureType, representing allowed codes for the ACP conversation. The DHD Verrichtingenthesaurus code `0000106562` (proactieve zorgplanning in palliatieve fase) is not included in this ValueSet, as this set is not meant to be used for exchange (see [ZIB-1233](https://nictiz.atlassian.net/browse/ZIB-1233))" +Description: "ValueSet for ProcedureType, representing allowed codes for the ACP conversation. The DHD Verrichtingenthesaurus code `0000106562` (proactieve zorgplanning in palliatieve fase) is not included in this ValueSet, as this set is not meant to be used for exchange (see [ZIB-1233](https://nictiz.atlassian.net/browse/ZIB-1233)). The included SNOMED code is part of the referentieset of the DHD Verrichtingenthesaurus." * insert MetaRules * ^copyright = "This artefact includes content from SNOMED Clinical Terms® (SNOMED CT®) which is copyright of the International Health Terminology Standards Development Organisation (IHTSDO). Implementers of these artefacts must have the appropriate SNOMED CT Affiliate license - for more information contact http://www.snomed.org/snomed-ct/getsnomed-ct or info@snomed.org." * $snomed#713603004 "advance care planning" From 0a059abf9c7f6dbd4363a386bd84b9c48301a08e Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Thu, 21 May 2026 09:16:57 +0200 Subject: [PATCH 30/71] #151 fix search urls --- ...fhir-data-exchange-individual-resources-mermaid-diagram.md | 3 ++- input/pagecontent/data-exchange.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md index 5ada1ef..e874b74 100644 --- a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md +++ b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md @@ -35,13 +35,14 @@ sequenceDiagram deactivate S and %% 5. Observations - C->>S: GET /Observation?patient=Patient/[id]
&code=http://snomed.info/sct|153851000146100,395091006,340171000146104,247751003 + C->>S: GET /Observation?patient=Patient/[id]
&code=http://snomed.info/sct|153851000146100,http://snomed.info/sct|395091006,http://snomed.info/sct|340171000146104,http://snomed.info/sct|247751003 activate S S-->>C: 200 OK: Bundle (Observation) deactivate S and %% 6. Devices C->>S: GET /DeviceUseStatement?patient=Patient/[id]
&device.type=http://snomed.info/sct|72506001,465460004,468542000,704707009,1263462004,1236894001
&_include=DeviceUseStatement:device + C->>S: GET /DeviceUseStatement?patient=Patient/[id]
&device.type=http://snomed.info/sct|72506001,http://snomed.info/sct|465460004,http://snomed.info/sct|468542000,http://snomed.info/sct|704707009,http://snomed.info/sct|1263462004,http://snomed.info/sct|1236894001
&_include=DeviceUseStatement:device activate S S-->>C: 200 OK: Bundle (DeviceUseStatement + Device) deactivate S diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index 708d2b1..1811b67 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -46,9 +46,9 @@ The below listed search requests show how all the ACP agreements, procedural inf 4 GET [base]/Goal?patient=Patient/[id]&category=http://snomed.info/sct|713603004 -5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|153851000146100,395091006,340171000146104,247751003,570801000146104 +5 GET [base]/Observation?patient=Patient/[id]&code=http://snomed.info/sct|153851000146100,http://snomed.info/sct|395091006,http://snomed.info/sct|340171000146104,http://snomed.info/sct|247751003,http://snomed.info/sct|570801000146104 -6 GET [base]/DeviceUseStatement?patient=Patient/[id]&device.type=http://snomed.info/sct|72506001,465460004,468542000,704707009,1263462004,1236894001&_include=DeviceUseStatement:device +6 GET [base]/DeviceUseStatement?patient=Patient/[id]&device.type=http://snomed.info/sct|72506001,http://snomed.info/sct|465460004,http://snomed.info/sct|468542000,http://snomed.info/sct|704707009,http://snomed.info/sct|1263462004,http://snomed.info/sct|1236894001&_include=DeviceUseStatement:device 7 GET [base]/CommunicationRequest?patient=[id]&category=http://snomed.info/sct|223449006 ``` From 43174779cbcac9809f389a4efbe1834f773a410c Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Thu, 21 May 2026 09:18:02 +0200 Subject: [PATCH 31/71] #151 not checked in deletion row --- .../fhir-data-exchange-individual-resources-mermaid-diagram.md | 1 - 1 file changed, 1 deletion(-) diff --git a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md index e874b74..699a897 100644 --- a/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md +++ b/input/includes/fhir-data-exchange-individual-resources-mermaid-diagram.md @@ -41,7 +41,6 @@ sequenceDiagram deactivate S and %% 6. Devices - C->>S: GET /DeviceUseStatement?patient=Patient/[id]
&device.type=http://snomed.info/sct|72506001,465460004,468542000,704707009,1263462004,1236894001
&_include=DeviceUseStatement:device C->>S: GET /DeviceUseStatement?patient=Patient/[id]
&device.type=http://snomed.info/sct|72506001,http://snomed.info/sct|465460004,http://snomed.info/sct|468542000,http://snomed.info/sct|704707009,http://snomed.info/sct|1263462004,http://snomed.info/sct|1236894001
&_include=DeviceUseStatement:device activate S S-->>C: 200 OK: Bundle (DeviceUseStatement + Device) From 3b538ee6ad4df7777e9c6e6e778460d3f8090921 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 27 May 2026 10:29:51 +0200 Subject: [PATCH 32/71] Update package to use fhir2.base.template Change local-template/package/package.json to reference fhir2.base.template instead of fhir.base.template for both the "base" field and the dependency. This switches the sample template to the FHIR2 base template. --- local-template/package/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/local-template/package/package.json b/local-template/package/package.json index 64cf87d..244cfe8 100644 --- a/local-template/package/package.json +++ b/local-template/package/package.json @@ -6,8 +6,8 @@ "description": "Sample Template - not intended for real use", "author": "http://hl7.org/fhir", "canonical": "http://github.com/HL7/ig-template-sample", - "base": "fhir.base.template", + "base": "fhir2.base.template", "dependencies": { - "fhir.base.template": "current" + "fhir2.base.template": "current" } } \ No newline at end of file From 6b29ad235abc8308b919202d3e8e2211ac9e15b9 Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Thu, 28 May 2026 12:44:01 +0200 Subject: [PATCH 33/71] textual improvements data exchange --- input/pagecontent/data-exchange.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index 708d2b1..fb20e7d 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -56,13 +56,15 @@ The below listed search requests show how all the ACP agreements, procedural inf 1. Both requests are designed to retrieve the same information, but with different approaches: * A) Retrieves `Procedure` resources representing ACP procedures and includes the associated `Encounter` resource where the procedure took place. * B) Retrieves `Encounter` resources that list an ACP procedure as their reason, and includes the referenced resources in the result. Request A is generally preferred because `Encounter.patient` may not always be present; if absent, it indicates the patient was not involved in the Encounter. Using request A ensures these cases are included as well. -2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (Patient, ContactPersons, and HealthProfessionals). -3. Retrieves `Consent` resources for Advance Directives and includes the representatives (ContactPersons). +2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (`Patient`, `ContactPersons`, and `HealthProfessionals`). +3. Retrieves `Consent` resources for Advance Directives and includes the representatives (`ContactPersons`). 4. Retrieves `Goal` resources related to advance care planning. 5. Retrieves `Observation` resources related to specific wishes and plans, as defined by the profiles in the Implementation Guide. 6. Retrieves `DeviceUseStatement` resources for devices representing an ICD, and includes the corresponding `Device` resource. 7. Retrieves `CommunicationRequest` resources representing all communication requests related to the ACP procedure. +For `ContactPersons` and `HealthProfesionals` there is no specific query as according to the model there are references made to these persons. If there is a legal representative we expect that to be present in `patient.contact`. For related persons attending the encounter a reference is expected to be made in `encounter.participant`. + #### Advanced Search Parameters Supported The queries above use several search parameter types and modifiers: * `_include`: Returns referenced resources in the same `Bundle`, reducing the need for additional API calls. From 86fcd563191212c42028df037146d23a8f20ed11 Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Fri, 29 May 2026 10:59:38 +0200 Subject: [PATCH 34/71] Update text to distinghuish zib and resources --- input/pagecontent/data-exchange.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index fb20e7d..bc0cf61 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -56,14 +56,14 @@ The below listed search requests show how all the ACP agreements, procedural inf 1. Both requests are designed to retrieve the same information, but with different approaches: * A) Retrieves `Procedure` resources representing ACP procedures and includes the associated `Encounter` resource where the procedure took place. * B) Retrieves `Encounter` resources that list an ACP procedure as their reason, and includes the referenced resources in the result. Request A is generally preferred because `Encounter.patient` may not always be present; if absent, it indicates the patient was not involved in the Encounter. Using request A ensures these cases are included as well. -2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (`Patient`, `ContactPersons`, and `HealthProfessionals`). -3. Retrieves `Consent` resources for Advance Directives and includes the representatives (`ContactPersons`). +2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (patient, ContactPersons, and HealthProfessionals). +3. Retrieves `Consent` resources for Advance Directives and includes the representatives (ContactPersons). 4. Retrieves `Goal` resources related to advance care planning. 5. Retrieves `Observation` resources related to specific wishes and plans, as defined by the profiles in the Implementation Guide. 6. Retrieves `DeviceUseStatement` resources for devices representing an ICD, and includes the corresponding `Device` resource. 7. Retrieves `CommunicationRequest` resources representing all communication requests related to the ACP procedure. -For `ContactPersons` and `HealthProfesionals` there is no specific query as according to the model there are references made to these persons. If there is a legal representative we expect that to be present in `patient.contact`. For related persons attending the encounter a reference is expected to be made in `encounter.participant`. +For `RelatedPerson` and `Practitioner` there is no specific query as according to the model there are references made to these resources. If there is a legal representative we expect that to be present in `Patient.contact`. For related persons attending the encounter a reference is expected to be made in `Encounter.participant`. #### Advanced Search Parameters Supported The queries above use several search parameter types and modifiers: From 58c8eeb8d1579de5a870589bb6fe6c6021a45a77 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 14:13:29 +0200 Subject: [PATCH 35/71] #126 updated questionnaire with latest changes --- .../resources/Questionnaire-ACP-zib2020.json | 212 +++++++++++++++--- 1 file changed, 183 insertions(+), 29 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index f5619e1..eb55ca0 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -2,15 +2,15 @@ "resourceType": "Questionnaire", "id": "ACP-zib2020", "url": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020", - "version": "1.0.0-rc2", + "version": "1.0.0-rc3", "name": "ACPzib2020", - "title": "Uniform vastleggen proactieve zorgpanning (PZP) o.b.v. zibs2020 - ReleaseCandidate2 03-03-2026", + "title": "Uniform vastleggen proactieve zorgpanning (PZP) o.b.v. zibs2020 - ReleaseCandidate3 02-06-2026", "status": "draft", - "experimental": false, - "publisher": "Published by PZNL & executed by IKNL", - "copyright": "This form is subject to copyright, user rights and a disclaimer, as specified for all IKNL information standards. For details, see the paragraph on Gebruikersrechten en disclaimer at https://iknl.nl/onderzoek/eenheid-van-taal.", - "purpose": "This form was developed to clearly document agreements resulting from the advance care planning (ACP) process.", - "description": "This form was developed to clearly document agreements resulting from the advance care planning (ACP) process. It is NOT a checklist. It can only be completed by a healthcare provider after a professional and nuanced conversation. For advice on conducting these conversations, please refer to the guideline for advance care planning in the palliative phase and Palliaweb, see https://palliaweb.nl/zorgpraktijk/proactieve-zorgplanning. \nEnter 'unknown' if a topic is not discussed or if the patient does not (yet) have an opinion.When transferring to a long-term care setting, consider adding conversation records about advance care planning (ACP) to the transfer documents.", + "experimental": true, + "publisher": "Gepubliceerd door PZNL & uitgevoerd door IKNL | Published by PZNL & executed by IKNL", + "description": "Dit formulier is ontwikkeld om afspraken voortkomend uit het proces van proactieve zorgplanning (PZP) eenduidig vast te leggen. Het is GEEN afvinklijst. Het kan alleen na deskundig en genuanceerd gesprek door een zorgverlener worden ingevuld. Voor adviezen over het voeren van deze gesprekken word verwezen naar de richtlijn proactieve zorgplanning in de palliatieve fase en Palliaweb, zie https://palliaweb.nl/zorgpraktijk/proactieve-zorgplanning. \nVul 'nog onbekend' in als een onderwerp niet is besproken of als de patiënt (nog) geen mening heeft. Overweeg bij overplaatsing naar een langdurige zorgsetting gespreksverslagen over proactieve zorgplanning aan de overdracht toe te voegen. | \nThis form was developed to clearly document agreements resulting from the advance care planning (ACP) process. It is NOT a checklist. It can only be completed by a healthcare provider after a professional and nuanced conversation. For advice on conducting these conversations, please refer to the guideline for proactive care planning in the palliative phase and Palliaweb, see https://palliaweb.nl/zorgpraktijk/proactieve-zorgplanning. \nEnter 'unknown' if a topic is not discussed or if the patient does not (yet) have an opinion.When transferring to a long-term care setting, consider adding conversation records about advance care planning (ACP) to the transfer documents.", + "purpose": "Dit formulier is ontwikkeld om afspraken voortkomend uit het proces van proactieve zorgplanning (PZP) eenduidig vast te leggen. | \nThis form was developed to clearly document agreements resulting from the advance care planning (ACP) process.", + "copyright": "Op dit formulier is copyright, gebruikersrechten en een disclaimer van toepassing, zoals die gespecificeerd zijn voor alle informatiestandaarden van IKNL, zie voor de details het onderdeel Gebruikersrechten en disclaimer op https://iknl.nl/onderzoek/eenheid-van-taal. | \nThis form is subject to copyright, user rights and a disclaimer, as specified for all IKNL information standards. For details, see the paragraph on Gebruikersrechten en disclaimer at https://iknl.nl/onderzoek/eenheid-van-taal.", "item": [ { "linkId": "963", @@ -51,7 +51,7 @@ { "linkId": "967", "text": "Geboortedatum patiënt", - "type": "date", + "type": "dateTime", "required": false, "repeats": false }, @@ -96,23 +96,80 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.121.11.22--20200901000000" + "answerOption": [ + { + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.000", + "display": "Arts" + } + }, + { + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } + }, + { + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.047", + "display": "Specialist ouderengeneeskunde" + } + }, + { + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "30.000", + "display": "Verpleegkundige" + } + }, + { + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "81.000", + "display": "Physician assistant" + } + }, + { + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "99.000", + "display": "Zorgverlener andere zorg" + } + } + ] } ] }, { "linkId": "26", - "prefix": "1", + "prefix": "1.", "text": "Wilsbekwaamheid & Wettelijke vertegenwoordiging", "type": "group", "repeats": false, "item": [ { - "linkId": "1406", + "linkId": "1651", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?", - "type": "boolean", + "type": "choice", "required": false, "repeats": false, + "answerOption": [ + { + "valueCoding": { + "code": "1", + "display": "Ja" + } + }, + { + "valueCoding": { + "code": "0", + "display": "Nee" + } + } + ], "item": [ { "linkId": "1407", @@ -474,9 +531,23 @@ "linkId": "984", "prefix": "d)", "text": "Is de wettelijk vertegenwoordiger ook de eerste contactpersoon?", - "type": "boolean", + "type": "choice", "required": false, - "repeats": false + "repeats": false, + "answerOption": [ + { + "valueCoding": { + "code": "1", + "display": "Ja" + } + }, + { + "valueCoding": { + "code": "0", + "display": "Nee" + } + } + ] }, { "linkId": "53", @@ -487,7 +558,10 @@ { "question": "984", "operator": "=", - "answerBoolean": false + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -525,7 +599,10 @@ { "question": "984", "operator": "=", - "answerBoolean": false + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -668,7 +745,10 @@ { "question": "984", "operator": "=", - "answerBoolean": false + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -695,7 +775,10 @@ { "question": "984", "operator": "=", - "answerBoolean": false + "answerCoding": { + "code": "0", + "display": "Nee" + } } ], "enableBehavior": "any", @@ -971,7 +1054,7 @@ }, { "linkId": "586", - "prefix": "3", + "prefix": "3.", "text": "Belangrijkste overeengekomen doel van medisch beleid", "type": "group", "repeats": false, @@ -1035,7 +1118,7 @@ }, { "linkId": "83", - "prefix": "4", + "prefix": "4.", "text": "Behandelgrenzen", "type": "group", "repeats": false, @@ -1611,10 +1694,31 @@ "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", "code": "OTH", - "display": "Other" + "display": "Anders" }, "initialSelected": true } + ], + "item": [ + { + "linkId": "1645", + "text": "Anders, namelijk:", + "type": "string", + "enableWhen": [ + { + "question": "1422", + "operator": "=", + "answerCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "OTH", + "display": "Anders" + } + } + ], + "enableBehavior": "any", + "required": false, + "repeats": false + } ] }, { @@ -1867,7 +1971,7 @@ }, { "linkId": "107", - "prefix": "5", + "prefix": "5.", "text": "Behandelwensen", "type": "group", "repeats": false, @@ -1903,6 +2007,24 @@ "type": "string", "required": false, "repeats": false + }, + { + "linkId": "1648", + "text": "Vaststellen wens en verwachting patiënt ([MeetMethode])", + "type": "choice", + "required": false, + "repeats": false, + "readOnly": true, + "answerOption": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "370819000", + "display": "Vaststellen van persoonlijke waarden en wensen met betrekking tot zorg" + }, + "initialSelected": true + } + ] } ] }, @@ -1914,7 +2036,7 @@ "repeats": false, "item": [ { - "linkId": "1430", + "linkId": "1649", "text": "Gewenste plek van overlijden ([MetingNaam])", "type": "choice", "required": false, @@ -1925,7 +2047,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "395091006", - "display": "Gewenste plek van overlijden" + "display": "Voorkeur voor plaats van overlijden (waarneembare entiteit)" }, "initialSelected": true } @@ -2120,6 +2242,24 @@ } } ] + }, + { + "linkId": "1650", + "text": "Keuze orgaandonatie vastgelegd in donorregister? ([MeetMethode])", + "type": "choice", + "required": false, + "repeats": false, + "readOnly": true, + "answerOption": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "1156040003", + "display": "Self reported (qualifier value)" + }, + "initialSelected": true + } + ] } ] } @@ -2127,7 +2267,7 @@ }, { "linkId": "598", - "prefix": "6", + "prefix": "6.", "text": "Wat verder nog belangrijk is", "type": "group", "repeats": false, @@ -2161,7 +2301,7 @@ }, { "linkId": "115", - "prefix": "7", + "prefix": "7.", "text": "Eerder vastgelegde behandelwensen", "type": "group", "repeats": false, @@ -2253,7 +2393,7 @@ }, { "linkId": "119", - "prefix": "8", + "prefix": "8.", "text": "Informatie delen", "type": "group", "repeats": false, @@ -2262,9 +2402,23 @@ "linkId": "1200", "prefix": "a)", "text": "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?", - "type": "boolean", + "type": "choice", "required": false, - "repeats": false + "repeats": false, + "answerOption": [ + { + "valueCoding": { + "code": "1", + "display": "Ja" + } + }, + { + "valueCoding": { + "code": "0", + "display": "Nee" + } + } + ] }, { "linkId": "1201", From c38a5f891d492c107cd1471a0002b81b66e275f6 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 14:28:00 +0200 Subject: [PATCH 36/71] Revert change --- .../resources/Questionnaire-ACP-zib2020.json | 45 +------------------ 1 file changed, 1 insertion(+), 44 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index eb55ca0..c803872 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -96,50 +96,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.000", - "display": "Arts" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.047", - "display": "Specialist ouderengeneeskunde" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "30.000", - "display": "Verpleegkundige" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "81.000", - "display": "Physician assistant" - } - }, - { - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "99.000", - "display": "Zorgverlener andere zorg" - } - } - ] + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.121.11.22--20200901000000" } ] }, From f39f3606c588c36ba9589f3c603cca9f73ef3cb9 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 15:52:13 +0200 Subject: [PATCH 37/71] Replace inline answerOption with answerValueSet Remove large inline answerOption arrays from Questionnaire-ACP-zib2020.json and replace them with answerValueSet references to canonical ValueSets. Add util/questionnaire_item_anwserOption_expander.py: a resolver/expander tool that materialises answerValueSet references back into answerOption lists (writes -expanded copies) for tooling (e.g. NLM LHC-Forms) that cannot resolve ValueSet URLs. The script resolves ValueSets from local fsh-generated resources and the FHIR package cache, fills missing displays (preferring nl-NL), supports pre-computed expansions and compose/include logic, and contains a small hardcoded map for unavailable code systems. --- .../resources/Questionnaire-ACP-zib2020.json | 612 +----------------- ...uestionnaire_item_anwserOption_expander.py | 516 +++++++++++++++ 2 files changed, 531 insertions(+), 597 deletions(-) create mode 100644 util/questionnaire_item_anwserOption_expander.py diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index c803872..5173576 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -390,78 +390,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "DOMPART", - "display": "Partner" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "HUSB", - "display": "Echtgenoot" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "WIFE", - "display": "Echtgenote" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "FTH", - "display": "Vader" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "MTH", - "display": "Moeder" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SONC", - "display": "Zoon" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "DAUC", - "display": "Dochter" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "BRO", - "display": "Broer" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SIS", - "display": "Zuster" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "OTH", - "display": "Anders" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", "item": [ { "linkId": "408", @@ -584,36 +513,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", - "code": "LL", - "display": "Land Line" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", - "code": "FAX", - "display": "Fax" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "MC", - "display": "Mobiel telefoonnummer" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "PG", - "display": "Pieper" - } - } - ] + "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersSystem" }, { "linkId": "990", @@ -741,78 +641,7 @@ "enableBehavior": "any", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "DOMPART", - "display": "Partner" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "HUSB", - "display": "Echtgenoot" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "WIFE", - "display": "Echtgenote" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "FTH", - "display": "Vader" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "MTH", - "display": "Moeder" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SONC", - "display": "Zoon" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "DAUC", - "display": "Dochter" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "BRO", - "display": "Broer" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SIS", - "display": "Zuster" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "OTH", - "display": "Anders" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", "item": [ { "linkId": "412", @@ -913,78 +742,7 @@ "type": "choice", "required": false, "repeats": true, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "DOMPART", - "display": "Partner" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "HUSB", - "display": "Echtgenoot" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "WIFE", - "display": "Echtgenote" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "FTH", - "display": "Vader" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "MTH", - "display": "Moeder" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SONC", - "display": "Zoon" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "DAUC", - "display": "Dochter" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "BRO", - "display": "Broer" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SIS", - "display": "Zuster" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "OTH", - "display": "Anders" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", "item": [ { "linkId": "413", @@ -1040,36 +798,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "385987000", - "display": "Curatief / actief ziektebeleid" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "1351964001", - "display": "Palliatief met als doel levensverlenging én symptoomverlichting" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "225353007", - "display": "Palliatief met als doel symptoomverlichting, waarbij levensverlenging niet gewenst is" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ] + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoal" } ] }, @@ -1111,36 +840,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "1", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1001", @@ -1203,36 +903,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "1", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1388", @@ -1295,36 +966,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "1", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1391", @@ -1387,36 +1029,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "1", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1394", @@ -1479,36 +1092,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "1", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1397", @@ -1571,36 +1155,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "1", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1400", @@ -1684,29 +1239,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "0", - "display": "Wel uitvoeren" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", - "code": "2", - "display": "Niet uitvoeren" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Onbekend" - } - } - ], + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", "item": [ { "linkId": "1404", @@ -1768,50 +1301,7 @@ "enableBehavior": "any", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "72506001", - "display": "implanteerbare cardioverter-defibrillator" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "465460004", - "display": "univentriculaire implanteerbare cardioverter-defibrillator" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "468542000", - "display": "implanteerbare tweekamercardioverter-defibrillator" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "704707009", - "display": "implanteerbare biventriculaire cardioverter-defibrillator" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "1263462004", - "display": "pulsgenerator van defibrillator voor cardiale resynchronisatietherapie" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "1236894001", - "display": "subcutane implanteerbare cardioverter-defibrillator" - } - } - ] + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalDeviceProductType-ICD" }, { "linkId": "1009", @@ -2016,50 +1506,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "264362003", - "display": "Thuis" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "22232009", - "display": "Ziekenhuis" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "108344006", - "display": "Verpleeghuis" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "284546000", - "display": "Hospice" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "OTH", - "display": "Anders" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ], + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-PreferredPlaceOfDeath", "item": [ { "linkId": "1192", @@ -2103,36 +1550,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "340181000146102", - "display": "Heeft euthanasieverklaring" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "340201000146103", - "display": "Wenst geen euthanasie" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "340191000146100", - "display": "Geen euthanasieverklaring, zou wel verzoek kunnen doen in bepaalde situaties" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ], + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-PositionRegardingEuthanasia", "item": [ { "linkId": "1194", diff --git a/util/questionnaire_item_anwserOption_expander.py b/util/questionnaire_item_anwserOption_expander.py new file mode 100644 index 0000000..ca6c481 --- /dev/null +++ b/util/questionnaire_item_anwserOption_expander.py @@ -0,0 +1,516 @@ +#!/usr/bin/env python3 +"""Expand Questionnaire ``answerValueSet`` references into inline ``answerOption`` lists. + +Why this exists +--------------- +The NLM LHC-Forms tool (https://lhcforms.nlm.nih.gov/) cannot resolve ``answerValueSet`` +references against a terminology server. To preview/use the ACP Questionnaire there, every +question that points at a ValueSet needs the matching codes materialised as ``answerOption``. + +What the script does +-------------------- +For every ``Questionnaire`` resource found in ``input/resources`` it walks the item tree and, +for each item that has an ``answerValueSet``, it: + + 1. Resolves the ValueSet, looking first in the local ``fsh-generated/resources`` folder and + then in the FHIR package cache (``~/.fhir/packages``). The packages to scan are taken + from the ``dependencies:`` block of ``sushi-config.yaml``; if that is missing, the + resolved dependency list in ``fhirpkg.lock.json`` is used instead. As a last resort the + whole package cache is searched. + 2. Expands it: + * a pre-computed ``expansion.contains`` is used as-is when present; + * otherwise ``compose.include`` is processed - explicit ``concept`` lists are used + directly, ``valueSet`` imports are resolved recursively, and a bare ``system`` + (whole code system) is enumerated from the resolved CodeSystem; + * ``compose.exclude`` entries are removed; + * the CodeSystem is consulted to fill in a missing ``display``. + 3. Replaces the item's ``answerValueSet`` with the resulting ``answerOption`` array. + +Because the form is Dutch, the Dutch (``nl-NL``) designation is preferred for the display, +falling back to the concept's base ``display`` and finally the code. + +Some ValueSets reference a CodeSystem we have no access to (e.g. the UZI based +``SpecialismeCodelijst``). For those a fixed answer list is supplied via ``HARDCODED_ANSWER_OPTIONS``. + +The original files are left untouched; a copy suffixed with ``-expanded`` is written next to +each source Questionnaire. + +Usage +----- + python util/questionnaire_item_anwserOption_expander.py + python util/questionnaire_item_anwserOption_expander.py --input-dir input/resources +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path + +# -------------------------------------------------------------------------------------- +# Configuration +# -------------------------------------------------------------------------------------- + +# Repository root (this file lives in /util/). +ROOT = Path(__file__).resolve().parent.parent + +# Where the source Questionnaires live and where expanded copies are written. +DEFAULT_INPUT_DIR = ROOT / "input" / "resources" + +# Locally generated conformance resources (ValueSets / CodeSystems produced by SUSHI). +FSH_GENERATED_DIR = ROOT / "fsh-generated" / "resources" + +# Resolved dependency list (authoritative); fall back to sushi-config.yaml if absent. +LOCK_FILE = ROOT / "fhirpkg.lock.json" +SUSHI_CONFIG = ROOT / "sushi-config.yaml" + +# FHIR package cache. Honour the standard override, otherwise ~/.fhir/packages. +import os + +FHIR_PACKAGE_CACHE = Path( + os.environ.get("FHIR_PACKAGE_CACHE", Path.home() / ".fhir" / "packages") +) + +# Suffix added to the expanded copy (before the .json extension). +OUTPUT_SUFFIX = "-expanded" + +# Preferred display language (the form is Dutch). +PREFERRED_LANGUAGE = "nl-NL" + +# ValueSets that cannot be resolved from the packages (their CodeSystem is not available). +# Map the ValueSet canonical URL to a fixed list of FHIR answerOption entries. +HARDCODED_ANSWER_OPTIONS = { + # Functie (Specialisme) - SpecialismeCodelijst. Imports UZI based code lists that are + # not distributed in the package cache, so a representative subset is hardcoded. + "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.121.11.22--20200901000000": [ + {"valueCoding": {"system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", "code": "01.000", "display": "Arts"}}, + {"valueCoding": {"system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", "code": "01.015", "display": "Huisarts"}}, + {"valueCoding": {"system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", "code": "01.047", "display": "Specialist ouderengeneeskunde"}}, + {"valueCoding": {"system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", "code": "30.000", "display": "Verpleegkundige"}}, + {"valueCoding": {"system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", "code": "81.000", "display": "Physician assistant"}}, + {"valueCoding": {"system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", "code": "99.000", "display": "Zorgverlener andere zorg"}}, + ], +} + + +# -------------------------------------------------------------------------------------- +# Resource resolver: maps canonical URL -> file path for ValueSets and CodeSystems. +# -------------------------------------------------------------------------------------- + + +class ResourceResolver: + """Locate ValueSet / CodeSystem resources locally and in the FHIR package cache.""" + + def __init__(self) -> None: + # url -> Path. Local (fsh-generated) entries take precedence over package entries. + self._valuesets: dict[str, Path] = {} + self._codesystems: dict[str, Path] = {} + # Cache of loaded JSON resources keyed by path. + self._loaded: dict[Path, dict] = {} + self._scanned_full_cache = False + + self._index_local() + self._index_declared_packages() + + # -- index building ----------------------------------------------------------------- + + def _register(self, url: str | None, resource_type: str | None, path: Path) -> None: + if not url or not resource_type: + return + target = self._valuesets if resource_type == "ValueSet" else ( + self._codesystems if resource_type == "CodeSystem" else None + ) + if target is None: + return + # First registration wins (local before packages, declared deps before fallback). + target.setdefault(url, path) + + def _index_local(self) -> None: + """Index ValueSets / CodeSystems generated locally by SUSHI.""" + if not FSH_GENERATED_DIR.is_dir(): + return + for path in FSH_GENERATED_DIR.glob("*.json"): + try: + data = json.loads(path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + continue + if isinstance(data, dict): + self._register(data.get("url"), data.get("resourceType"), path) + # Cache it - we already paid the read cost. + self._loaded[path] = data + + def _package_dirs_from_dependencies(self) -> list[Path]: + """Determine which package directories to index from the project dependencies.""" + deps: dict[str, str] = {} + + # Primary source: the dependencies declared in sushi-config.yaml. + if SUSHI_CONFIG.is_file(): + deps.update(_parse_sushi_dependencies(SUSHI_CONFIG)) + + # Fallback: the resolved dependency list in fhirpkg.lock.json. + if not deps and LOCK_FILE.is_file(): + try: + lock = json.loads(LOCK_FILE.read_text(encoding="utf-8")) + deps.update(lock.get("dependencies", {})) + except (json.JSONDecodeError, OSError): + pass + + # hl7.fhir.r4.core is always needed for base FHIR code systems. + deps.setdefault("hl7.fhir.r4.core", "4.0.1") + + dirs: list[Path] = [] + for pkg_id, version in deps.items(): + candidate = FHIR_PACKAGE_CACHE / f"{pkg_id}#{version}" + if candidate.is_dir(): + dirs.append(candidate) + else: + print(f" ! dependency package not found in cache: {pkg_id}#{version}", + file=sys.stderr) + return dirs + + def _index_package_dir(self, pkg_dir: Path) -> None: + index_file = pkg_dir / "package" / ".index.json" + if not index_file.is_file(): + return + try: + index = json.loads(index_file.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + return + for entry in index.get("files", []): + rtype = entry.get("resourceType") + if rtype not in ("ValueSet", "CodeSystem"): + continue + filename = entry.get("filename") + if not filename: + continue + self._register(entry.get("url"), rtype, pkg_dir / "package" / filename) + + def _index_declared_packages(self) -> None: + for pkg_dir in self._package_dirs_from_dependencies(): + self._index_package_dir(pkg_dir) + + def _index_full_cache(self) -> None: + """Fallback: index every package in the cache (used only when a URL is missing).""" + if self._scanned_full_cache or not FHIR_PACKAGE_CACHE.is_dir(): + return + self._scanned_full_cache = True + for pkg_dir in FHIR_PACKAGE_CACHE.iterdir(): + if pkg_dir.is_dir(): + self._index_package_dir(pkg_dir) + + # -- loading ------------------------------------------------------------------------ + + def _load(self, path: Path) -> dict | None: + if path in self._loaded: + return self._loaded[path] + try: + data = json.loads(path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + return None + self._loaded[path] = data + return data + + def get_valueset(self, url: str) -> dict | None: + url = _strip_version(url) + if url not in self._valuesets: + self._index_full_cache() + path = self._valuesets.get(url) + return self._load(path) if path else None + + def get_codesystem(self, url: str) -> dict | None: + url = _strip_version(url) + if url not in self._codesystems: + self._index_full_cache() + path = self._codesystems.get(url) + return self._load(path) if path else None + + +def _strip_version(url: str) -> str: + """Drop a trailing ``|version`` from a canonical reference.""" + return url.split("|", 1)[0] if url else url + + +def _parse_sushi_dependencies(config_path: Path) -> dict[str, str]: + """Minimal parser for the ``dependencies:`` block of sushi-config.yaml. + + Avoids a hard dependency on PyYAML. Only handles the simple ``id: version`` form, + which is what this project uses. + """ + deps: dict[str, str] = {} + try: + lines = config_path.read_text(encoding="utf-8").splitlines() + except OSError: + return deps + + in_block = False + dep_re = re.compile(r"^(\s*)([A-Za-z0-9._-]+)\s*:\s*([^\s#]+)") + for line in lines: + stripped = line.strip() + if not in_block: + if stripped.startswith("dependencies:"): + in_block = True + continue + # Stop when a new top-level (non-indented, non-comment) key starts. + if stripped and not line[0].isspace() and not stripped.startswith("#"): + break + if not stripped or stripped.startswith("#"): + continue + m = dep_re.match(line) + if m: + deps[m.group(2)] = m.group(3) + return deps + + +# -------------------------------------------------------------------------------------- +# ValueSet expansion +# -------------------------------------------------------------------------------------- + + +def _dutch_display(concept: dict) -> str | None: + """Return the preferred display for a concept, favouring the Dutch designation.""" + for designation in concept.get("designation", []): + if designation.get("language") == PREFERRED_LANGUAGE and designation.get("value"): + return designation["value"] + return concept.get("display") + + +def _codesystem_display_map(codesystem: dict) -> dict[str, str]: + """Flatten a (possibly hierarchical) CodeSystem into code -> display.""" + result: dict[str, str] = {} + + def walk(concepts: list) -> None: + for concept in concepts: + code = concept.get("code") + if code is not None: + result[code] = _dutch_display(concept) or concept.get("display") or code + if concept.get("concept"): + walk(concept["concept"]) + + walk(codesystem.get("concept", [])) + return result + + +class ValueSetExpander: + def __init__(self, resolver: ResourceResolver) -> None: + self.resolver = resolver + + def expand(self, url: str) -> list[dict]: + """Expand a ValueSet URL into a list of FHIR ``answerOption`` entries.""" + if url in HARDCODED_ANSWER_OPTIONS: + return [dict(opt) for opt in HARDCODED_ANSWER_OPTIONS[url]] + + codings = self._expand_to_codings(url, seen=set()) + return [{"valueCoding": coding} for coding in codings] + + def _expand_to_codings(self, url: str, seen: set[str]) -> list[dict]: + url = _strip_version(url) + if url in seen: + return [] # guard against circular imports + seen.add(url) + + valueset = self.resolver.get_valueset(url) + if valueset is None: + raise LookupError(f"ValueSet not found: {url}") + + codings: list[dict] = [] + + # 1. Pre-computed expansion wins. + expansion = valueset.get("expansion", {}) + for contains in expansion.get("contains", []): + self._collect_contains(contains, codings) + if codings: + return _dedupe(codings) + + compose = valueset.get("compose", {}) + + # 2. Includes. + for include in compose.get("include", []): + codings.extend(self._expand_include(include, seen)) + + # 3. Excludes - drop matching (system, code) pairs. + excluded = set() + for exclude in compose.get("exclude", []): + for coding in self._expand_include(exclude, seen): + excluded.add((coding.get("system"), coding.get("code"))) + if excluded: + codings = [c for c in codings if (c.get("system"), c.get("code")) not in excluded] + + return _dedupe(codings) + + def _collect_contains(self, contains: dict, out: list[dict]) -> None: + if not contains.get("abstract") and contains.get("code") is not None: + coding = {} + if contains.get("system"): + coding["system"] = contains["system"] + coding["code"] = contains["code"] + display = _dutch_display(contains) + if display: + coding["display"] = display + out.append(coding) + for child in contains.get("contains", []): + self._collect_contains(child, out) + + def _expand_include(self, include: dict, seen: set[str]) -> list[dict]: + codings: list[dict] = [] + + # Imported ValueSets. + for imported_url in include.get("valueSet", []): + try: + codings.extend(self._expand_to_codings(imported_url, seen)) + except LookupError as exc: + print(f" ! could not resolve imported ValueSet: {exc}", file=sys.stderr) + + system = include.get("system") + + if "concept" in include and system: + # Explicit concept list; fill in missing displays from the CodeSystem. + cs_map: dict[str, str] | None = None + for concept in include["concept"]: + display = _dutch_display(concept) + if not display: + if cs_map is None: + codesystem = self.resolver.get_codesystem(system) + cs_map = _codesystem_display_map(codesystem) if codesystem else {} + display = cs_map.get(concept.get("code")) + coding = {"system": system, "code": concept.get("code")} + if display: + coding["display"] = display + codings.append(coding) + elif system and "filter" not in include: + # Whole code system - enumerate it from the resolved CodeSystem. + codesystem = self.resolver.get_codesystem(system) + if codesystem is None: + print(f" ! cannot enumerate system (CodeSystem not found): {system}", + file=sys.stderr) + else: + for code, display in _codesystem_display_map(codesystem).items(): + coding = {"system": system, "code": code} + if display: + coding["display"] = display + codings.append(coding) + elif system and "filter" in include: + print(f" ! filter-based include not supported for system: {system}", + file=sys.stderr) + + return codings + + +def _dedupe(codings: list[dict]) -> list[dict]: + """Remove duplicate (system, code) codings, preserving order.""" + seen: set[tuple] = set() + result: list[dict] = [] + for coding in codings: + key = (coding.get("system"), coding.get("code")) + if key not in seen: + seen.add(key) + result.append(coding) + return result + + +# -------------------------------------------------------------------------------------- +# Questionnaire processing +# -------------------------------------------------------------------------------------- + + +def process_items(items: list[dict], expander: ValueSetExpander, stats: dict) -> None: + """Recursively expand answerValueSet references on a list of Questionnaire items.""" + for item in items: + value_set_url = item.get("answerValueSet") + if value_set_url: + stats["found"] += 1 + try: + options = expander.expand(value_set_url) + except LookupError as exc: + stats["failed"] += 1 + print(f" ! {exc} (linkId={item.get('linkId')})", file=sys.stderr) + options = None + if options: + # Merge with any existing answerOption, then drop the reference so LHC + # uses the inline options instead of trying to resolve the ValueSet. + existing = item.get("answerOption", []) + item["answerOption"] = _merge_options(existing, options) + del item["answerValueSet"] + stats["expanded"] += 1 + print(f" + linkId={item.get('linkId')}: {len(options)} options " + f"from {value_set_url}") + elif options is not None: + print(f" ! linkId={item.get('linkId')}: 0 options from {value_set_url}", + file=sys.stderr) + + if item.get("item"): + process_items(item["item"], expander, stats) + + +def _merge_options(existing: list[dict], expanded: list[dict]) -> list[dict]: + """Append expanded options to any pre-existing ones, de-duplicating by coding.""" + seen: set[tuple] = set() + merged: list[dict] = [] + for opt in list(existing) + list(expanded): + coding = opt.get("valueCoding", {}) + key = (coding.get("system"), coding.get("code")) + if key not in seen: + seen.add(key) + merged.append(opt) + return merged + + +def process_questionnaire(path: Path, expander: ValueSetExpander) -> bool: + """Expand one Questionnaire file. Returns True if an expanded copy was written.""" + try: + data = json.loads(path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError) as exc: + print(f"! skipping {path.name}: {exc}", file=sys.stderr) + return False + + if not isinstance(data, dict) or data.get("resourceType") != "Questionnaire": + return False + + print(f"\nProcessing {path.name} ...") + stats = {"found": 0, "expanded": 0, "failed": 0} + process_items(data.get("item", []), expander, stats) + + if stats["found"] == 0: + print(" (no answerValueSet references found)") + return False + + out_path = path.with_name(f"{path.stem}{OUTPUT_SUFFIX}{path.suffix}") + out_path.write_text( + json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + print(f" -> wrote {out_path.relative_to(ROOT)} " + f"(found {stats['found']}, expanded {stats['expanded']}, failed {stats['failed']})") + return True + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--input-dir", type=Path, default=DEFAULT_INPUT_DIR, + help=f"directory to scan for Questionnaires (default: {DEFAULT_INPUT_DIR})") + args = parser.parse_args() + + input_dir: Path = args.input_dir + if not input_dir.is_dir(): + print(f"Input directory does not exist: {input_dir}", file=sys.stderr) + return 1 + + print(f"FHIR package cache: {FHIR_PACKAGE_CACHE}") + resolver = ResourceResolver() + expander = ValueSetExpander(resolver) + + written = 0 + for path in sorted(input_dir.glob("*.json")): + # Skip the expanded copies themselves. + if path.stem.endswith(OUTPUT_SUFFIX): + continue + if process_questionnaire(path, expander): + written += 1 + + print(f"\nDone. Expanded copies written: {written}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From c5a6eb8beee0475098ac9056a096dff0cb6fd747 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 15:53:04 +0200 Subject: [PATCH 38/71] Questionable replace of anwserValueSet because of moving from zib values to FHIR values --- .../resources/Questionnaire-ACP-zib2020.json | 114 +----------------- 1 file changed, 6 insertions(+), 108 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 5173576..30a9eea 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -199,36 +199,8 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", - "code": "LL", - "display": "Land Line" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", - "code": "FAX", - "display": "Fax" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "PG", - "display": "Pieper" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "MC", - "display": "Mobiel telefoonnummer" - } - } - ] + "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersSystem" + }, { "linkId": "978", @@ -236,29 +208,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Telefoonnummer thuis" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "TMP", - "display": "Tijdelijk telefoonnummer" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "WP", - "display": "Zakelijk telefoonnummer" - } - } - ] + "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersUse" }, { "linkId": "979", @@ -288,22 +238,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Privé e-mailadres" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "WP", - "display": "Zakelijk e-mailadres" - } - } - ] + "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-EmailAddressesUse" } ] } @@ -521,29 +456,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Telefoonnummer thuis" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "TMP", - "display": "Tijdelijk telefoonnummer" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "WP", - "display": "Zakelijk telefoonnummer" - } - } - ] + "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersUse" }, { "linkId": "991", @@ -573,22 +486,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Privé e-mailadres" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "WP", - "display": "Zakelijk e-mailadres" - } - } - ] + "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-EmailAddressesUse" } ] } From bc5b8a297752b232f779f647d88358c248ae6d05 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 16:16:52 +0200 Subject: [PATCH 39/71] Use ACP-YesNoUnknown ValueSet and normalize labels Replace multiple inline answerOption arrays with a single reference to the shared ACP-YesNoUnknown ValueSet (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-YesNoUnknownVS) in the Questionnaire resource to centralize the Yes/No/Unknown options. Also normalize several answerCoding.display values from "Ja" to "ja" for consistency. Affects input/resources/Questionnaire-ACP-zib2020.json. --- .../resources/Questionnaire-ACP-zib2020.json | 106 ++---------------- 1 file changed, 9 insertions(+), 97 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 30a9eea..8b94a46 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -1157,29 +1157,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373066001", - "display": "Ja" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373067005", - "display": "Nee" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ], + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-YesNoUnknownVS", "item": [ { "linkId": "1008", @@ -1192,7 +1170,7 @@ "answerCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], @@ -1212,7 +1190,7 @@ "answerCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], @@ -1234,7 +1212,7 @@ "answerCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], @@ -1270,7 +1248,7 @@ "answerCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], @@ -1492,29 +1470,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373066001", - "display": "Ja" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373067005", - "display": "Nee" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ] + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-YesNoUnknownVS" }, { "linkId": "1650", @@ -1586,29 +1542,7 @@ "type": "choice", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373066001", - "display": "Ja" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373067005", - "display": "Nee" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ], + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-YesNoUnknownVS", "item": [ { "linkId": "1198", @@ -1631,36 +1565,14 @@ "answerCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], "enableBehavior": "any", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373066001", - "display": "Ja" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "373067005", - "display": "Nee" - } - }, - { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "UNK", - "display": "Nog onbekend" - } - } - ] + "answerValueSet": "https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-YesNoUnknownVS" } ] }, From a614f707ac425bc34a61dcfb27fc9a898ef3cd6b Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 16:20:03 +0200 Subject: [PATCH 40/71] Strip SNOMED semantic tags from displays Handle SNOMED semantic tags and prefer parenthesis-free Dutch designations when building display labels. Add SNOMED_SYSTEM constant and a regex-based _clean_display to remove trailing semantic tags (e.g. "ja (kwalificatiewaarde)" -> "ja"). Update _dutch_display to prefer Dutch designations without parenthetical parts and to call _clean_display; propagate an optional system parameter through _dutch_display and _codesystem_display_map and update callers so CodeSystem lookups can apply SNOMED-specific cleaning. This yields cleaner answerOption/display values for SNOMED concepts. --- ...uestionnaire_item_anwserOption_expander.py | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/util/questionnaire_item_anwserOption_expander.py b/util/questionnaire_item_anwserOption_expander.py index ca6c481..f12c90e 100644 --- a/util/questionnaire_item_anwserOption_expander.py +++ b/util/questionnaire_item_anwserOption_expander.py @@ -79,6 +79,10 @@ # Preferred display language (the form is Dutch). PREFERRED_LANGUAGE = "nl-NL" +# SNOMED CT system URL. SNOMED designations often carry a trailing semantic tag in +# parentheses (e.g. "ja (kwalificatiewaarde)"); that tag is stripped from the display. +SNOMED_SYSTEM = "http://snomed.info/sct" + # ValueSets that cannot be resolved from the packages (their CodeSystem is not available). # Map the ValueSet canonical URL to a fixed list of FHIR answerOption entries. HARDCODED_ANSWER_OPTIONS = { @@ -268,15 +272,38 @@ def _parse_sushi_dependencies(config_path: Path) -> dict[str, str]: # -------------------------------------------------------------------------------------- -def _dutch_display(concept: dict) -> str | None: - """Return the preferred display for a concept, favouring the Dutch designation.""" - for designation in concept.get("designation", []): - if designation.get("language") == PREFERRED_LANGUAGE and designation.get("value"): - return designation["value"] - return concept.get("display") +_SNOMED_SEMANTIC_TAG = re.compile(r"\s*\([^()]*\)\s*$") + + +def _clean_display(display: str | None, system: str | None) -> str | None: + """Strip the trailing SNOMED semantic tag (e.g. " (kwalificatiewaarde)") from a display.""" + if display and system == SNOMED_SYSTEM: + stripped = _SNOMED_SEMANTIC_TAG.sub("", display).strip() + if stripped: + return stripped + return display -def _codesystem_display_map(codesystem: dict) -> dict[str, str]: +def _dutch_display(concept: dict, system: str | None = None) -> str | None: + """Return the preferred display for a concept, favouring the Dutch designation. + + For SNOMED concepts a parenthesis-free designation is preferred, and any remaining + trailing semantic tag is stripped (so "ja (kwalificatiewaarde)" becomes "ja"). + """ + nl_values = [ + d["value"] for d in concept.get("designation", []) + if d.get("language") == PREFERRED_LANGUAGE and d.get("value") + ] + display = None + if nl_values: + # Prefer a Dutch designation without a parenthetical part, if one exists. + display = next((v for v in nl_values if "(" not in v), nl_values[0]) + else: + display = concept.get("display") + return _clean_display(display, system) + + +def _codesystem_display_map(codesystem: dict, system: str | None = None) -> dict[str, str]: """Flatten a (possibly hierarchical) CodeSystem into code -> display.""" result: dict[str, str] = {} @@ -284,7 +311,7 @@ def walk(concepts: list) -> None: for concept in concepts: code = concept.get("code") if code is not None: - result[code] = _dutch_display(concept) or concept.get("display") or code + result[code] = _dutch_display(concept, system) or concept.get("display") or code if concept.get("concept"): walk(concept["concept"]) @@ -345,7 +372,7 @@ def _collect_contains(self, contains: dict, out: list[dict]) -> None: if contains.get("system"): coding["system"] = contains["system"] coding["code"] = contains["code"] - display = _dutch_display(contains) + display = _dutch_display(contains, contains.get("system")) if display: coding["display"] = display out.append(coding) @@ -368,11 +395,11 @@ def _expand_include(self, include: dict, seen: set[str]) -> list[dict]: # Explicit concept list; fill in missing displays from the CodeSystem. cs_map: dict[str, str] | None = None for concept in include["concept"]: - display = _dutch_display(concept) + display = _dutch_display(concept, system) if not display: if cs_map is None: codesystem = self.resolver.get_codesystem(system) - cs_map = _codesystem_display_map(codesystem) if codesystem else {} + cs_map = _codesystem_display_map(codesystem, system) if codesystem else {} display = cs_map.get(concept.get("code")) coding = {"system": system, "code": concept.get("code")} if display: @@ -385,7 +412,7 @@ def _expand_include(self, include: dict, seen: set[str]) -> list[dict]: print(f" ! cannot enumerate system (CodeSystem not found): {system}", file=sys.stderr) else: - for code, display in _codesystem_display_map(codesystem).items(): + for code, display in _codesystem_display_map(codesystem, system).items(): coding = {"system": system, "code": code} if display: coding["display"] = display From e1b41142dca4590d0e5e8f2d56e1bf1e5dcb03b3 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Thu, 30 Apr 2026 17:14:36 +0200 Subject: [PATCH 41/71] Change type choice to boolean for 1406, 984 and 1200 in questionnaire and responses Includes fixed enableWhen behaviour --- .../resources/Questionnaire-ACP-zib2020.json | 72 +++---------------- 1 file changed, 9 insertions(+), 63 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 8b94a46..cf11804 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -110,23 +110,9 @@ { "linkId": "1651", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?", - "type": "choice", + "type": "boolean", "required": false, "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ], "item": [ { "linkId": "1407", @@ -352,23 +338,9 @@ "linkId": "984", "prefix": "d)", "text": "Is de wettelijk vertegenwoordiger ook de eerste contactpersoon?", - "type": "choice", + "type": "boolean", "required": false, - "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ] + "repeats": false }, { "linkId": "53", @@ -379,10 +351,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -420,10 +389,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -500,10 +466,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -530,10 +493,7 @@ { "question": "984", "operator": "=", - "answerCoding": { - "code": "0", - "display": "Nee" - } + "answerBoolean": false } ], "enableBehavior": "any", @@ -1587,23 +1547,9 @@ "linkId": "1200", "prefix": "a)", "text": "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?", - "type": "choice", + "type": "boolean", "required": false, - "repeats": false, - "answerOption": [ - { - "valueCoding": { - "code": "1", - "display": "Ja" - } - }, - { - "valueCoding": { - "code": "0", - "display": "Nee" - } - } - ] + "repeats": false }, { "linkId": "1201", From 357ff4c694d6728a716ec2658557888621bfe762 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 16:56:13 +0200 Subject: [PATCH 42/71] added new version of QR --- ...naireResponse-HendrikHartman-20201001.json | 74 +++++++++++----- ...naireResponse-HendrikHartman-20221108.json | 84 ++++++++++++++----- 2 files changed, 113 insertions(+), 45 deletions(-) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index be80735..b8cd68e 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -4,13 +4,13 @@ "meta": { "tag": [ { - "code": "lformsVersion: 38.2.0" + "code": "lformsVersion: 42.2.0" } ] }, "status": "completed", "authored": "2025-08-25T19:14:50.150Z", - "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc2", + "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc3", "subject": { "reference": "Patient/ACP-Patient-HendrikHartman-Pat1", "display": "Patient, Hendrik Hartman" @@ -99,12 +99,11 @@ { "answer": [ { - - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } } ], "linkId": "1405", @@ -122,7 +121,7 @@ "valueBoolean": true } ], - "linkId": "1406", + "linkId": "1651", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?" }, { @@ -174,9 +173,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Privé e-mailadres" + "system": "http://hl7.org/fhir/contact-point-use", + "code": "home", + "display": "Home" } } ], @@ -187,6 +186,19 @@ } ] }, + { + "linkId": "982", + "text": "Relatie tot patiënt (1)", + "answer": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", + "code": "24", + "display": "Wettelijke vertegenwoordiger" + } + } + ] + }, { "answer": [ { @@ -267,7 +279,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "1351964001", - "display": "Palliatief met als doel levensverlenging én symptoomverlichting" + "display": "levensverlengende behandeling" } } ], @@ -482,7 +494,7 @@ "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", "code": "OTH", - "display": "Other" + "display": "Anders" } } ], @@ -521,7 +533,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" }, "item": [ { @@ -622,10 +634,15 @@ "answer": [ { "valueString": "Hendrik wil er alles aan doen om zo lang mogelijk in goede gezondheid te kunnen leven. Hij probeert regelmatig te sporten en zou graag willen blijven hardlopen. Broer Michiel woont om de hoek en is erg betrokken bij het proces van Hendrik" + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "370819000", + "display": "Vaststellen van persoonlijke waarden en wensen met betrekking tot zorg" + } } ], - "linkId": "1190", - "text": "Wens en verwachting patient ([MetingWaarde])" + "linkId": "1648", + "text": "Vaststellen wens en verwachting patiënt ([MeetMethode])" } ] }, @@ -639,11 +656,11 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "395091006", - "display": "Gewenste plek van overlijden" + "display": "Voorkeur voor plaats van overlijden (waarneembare entiteit)" } } ], - "linkId": "1430", + "linkId": "1649", "text": "Gewenste plek van overlijden ([MetingNaam])" }, { @@ -695,7 +712,7 @@ "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", "code": "UNK", - "display": "Nog onbekend" + "display": "onbekend" }, "item": [ { @@ -738,12 +755,25 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], "linkId": "1435", "text": "Keuze orgaandonatie in donorregister ([MetingWaarde])" + }, + { + "answer": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "1156040003", + "display": "Self reported (qualifier value)" + } + } + ], + "linkId": "1650", + "text": "Keuze orgaandonatie vastgelegd in donorregister? ([MeetMethode])" } ] } @@ -787,7 +817,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373067005", - "display": "Nee" + "display": "nee" } } ], diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index 2e7e672..713a0f4 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -4,13 +4,13 @@ "meta": { "tag": [ { - "code": "lformsVersion: 38.2.0" + "code": "lformsVersion: 42.2.0" } ] }, "status": "completed", "authored": "2025-08-25T19:18:32.253Z", - "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc2", + "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc3", "subject": { "reference": "Patient/ACP-Patient-HendrikHartman-Pat1", "display": "Patient, Hendrik Hartman" @@ -99,12 +99,11 @@ { "answer": [ { - - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } } ], "linkId": "1405", @@ -122,7 +121,7 @@ "valueBoolean": true } ], - "linkId": "1406", + "linkId": "1651", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?" }, { @@ -174,9 +173,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Privé e-mailadres" + "system": "http://hl7.org/fhir/contact-point-use", + "code": "home", + "display": "Home" } } ], @@ -187,6 +186,19 @@ } ] }, + { + "linkId": "982", + "text": "Relatie tot patiënt (1)", + "answer": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", + "code": "24", + "display": "Wettelijke vertegenwoordiger" + } + } + ] + }, { "answer": [ { @@ -266,8 +278,8 @@ { "valueCoding": { "system": "http://snomed.info/sct", - "code": "225353007", - "display": "Palliatief met als doel symptoomverlichting, waarbij levensverlenging niet gewenst is" + "code": "713148004", + "display": "voorkomen en behandelen van symptomen" } } ], @@ -515,7 +527,7 @@ "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", "code": "OTH", - "display": "Other" + "display": "Anders" } } ], @@ -543,7 +555,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" }, "item": [ { @@ -637,6 +649,19 @@ ], "linkId": "1190", "text": "Wens en verwachting patient ([MetingWaarde])" + }, + { + "answer": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "370819000", + "display": "Vaststellen van persoonlijke waarden en wensen met betrekking tot zorg" + } + } + ], + "linkId": "1648", + "text": "Vaststellen wens en verwachting patiënt ([MeetMethode])" } ] }, @@ -650,11 +675,11 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "395091006", - "display": "Gewenste plek van overlijden" + "display": "Voorkeur voor plaats van overlijden (waarneembare entiteit)" } } ], - "linkId": "1430", + "linkId": "1649", "text": "Gewenste plek van overlijden ([MetingNaam])" }, { @@ -663,7 +688,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "264362003", - "display": "Thuis" + "display": "thuis" }, "item": [ { @@ -706,7 +731,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "340201000146103", - "display": "Wenst geen euthanasie" + "display": "wil geen euthanasie" } } ], @@ -738,12 +763,25 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], "linkId": "1435", "text": "Keuze orgaandonatie in donorregister ([MetingWaarde])" + }, + { + "answer": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "1156040003", + "display": "Self reported (qualifier value)" + } + } + ], + "linkId": "1650", + "text": "Keuze orgaandonatie vastgelegd in donorregister? ([MeetMethode])" } ] } @@ -787,7 +825,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" }, "item": [ { @@ -811,7 +849,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], From 51badc47239e75adf2065f111ebbe991849f6778 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 17:03:15 +0200 Subject: [PATCH 43/71] Fixed last QR --- ...eResponse-SamiraVanDerSluijs-20251117.json | 109 +++++++++++------- 1 file changed, 67 insertions(+), 42 deletions(-) diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index f000f54..7d34ccd 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -106,12 +106,11 @@ { "answer": [ { - - "valueCoding": { - "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", - "code": "01.015", - "display": "Huisarts" - } + "valueCoding": { + "system": "http://fhir.nl/fhir/NamingSystem/uzi-rolcode", + "code": "01.015", + "display": "Huisarts" + } } ], "linkId": "1405", @@ -131,7 +130,7 @@ { "answer": [ { - "valueString": "Patiënt is wilsbekwaam. Bij verandering van de situatie wordt haar partner haar wettelijk vertegenwoordiger." + "valueString": "Patiënt is wilsbekwaam. Bij verandering van de situatie wordt haar partner haar wettelijk vertegenwoordiger." } ], "linkId": "1407", @@ -140,7 +139,7 @@ ] } ], - "linkId": "1406", + "linkId": "1651", "text": "Is de patiënt op dit moment wilsbekwaam m.b.t. medische behandelbeslissingen?" }, { @@ -201,9 +200,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "MC", - "display": "Mobiel telefoonnummer" + "system": "http://hl7.org/fhir/contact-point-system", + "code": "phone", + "display": "Phone" } } ], @@ -214,9 +213,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Telefoonnummer thuis" + "system": "http://hl7.org/fhir/contact-point-use", + "code": "home", + "display": "Home" } } ], @@ -242,9 +241,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Privé e-mailadres" + "system": "http://hl7.org/fhir/contact-point-use", + "code": "home", + "display": "Home" } } ], @@ -344,9 +343,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "MC", - "display": "Mobiel telefoonnummer" + "system": "http://hl7.org/fhir/contact-point-system", + "code": "phone", + "display": "Phone" } } ], @@ -357,9 +356,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Telefoonnummer thuis" + "system": "http://hl7.org/fhir/contact-point-use", + "code": "home", + "display": "Home" } } ], @@ -385,9 +384,9 @@ "answer": [ { "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", - "code": "HP", - "display": "Privé e-mailadres" + "system": "http://hl7.org/fhir/contact-point-use", + "code": "home", + "display": "Home" } } ], @@ -451,8 +450,8 @@ { "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "SIS", - "display": "Zuster" + "code": "BRO", + "display": "Broer" } } ] @@ -481,8 +480,8 @@ { "valueCoding": { "system": "http://snomed.info/sct", - "code": "225353007", - "display": "Palliatief met als doel symptoomverlichting, waarbij levensverlenging niet gewenst is" + "code": "713148004", + "display": "voorkomen en behandelen van symptomen" } } ], @@ -642,7 +641,7 @@ { "answer": [ { - "valueString": "Alleen als de patiënt een kans heeft om weer uit het ziekenhuis te komen, anders hoeft het niet meer voor mevrouw" + "valueString": "Alleen als de patiënt een kans heeft om weer uit het ziekenhuis te komen, anders hoeft het niet meer voor mevrouw" } ], "linkId": "1394", @@ -730,7 +729,7 @@ "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", "code": "OTH", - "display": "Other" + "display": "Anders" } } ], @@ -769,7 +768,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" }, "item": [ { @@ -869,11 +868,24 @@ { "answer": [ { - "valueString": "De kleinzoon van mevrouw van der Sluijs is geboren en mevrouw is dolgelukkig dat ze hem heeft kunnen zien. Ze merkt dat ze fysiek erg achteruit gaat. Mevrouw heeft daar nu vrede mee, in tegenstelling tot eerdere gesprekken." + "valueString": "De kleinzoon van mevrouw van der Sluijs is geboren en mevrouw is dolgelukkig dat ze hem heeft kunnen zien. Ze merkt dat ze fysiek erg achteruit gaat. Mevrouw heeft daar nu vrede mee, in tegenstelling tot eerdere gesprekken." } ], "linkId": "1190", "text": "Wens en verwachting patient ([MetingWaarde])" + }, + { + "answer": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "370819000", + "display": "Vaststellen van persoonlijke waarden en wensen met betrekking tot zorg" + } + } + ], + "linkId": "1648", + "text": "Vaststellen wens en verwachting patiënt ([MeetMethode])" } ] }, @@ -887,11 +899,11 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "395091006", - "display": "Gewenste plek van overlijden" + "display": "Voorkeur voor plaats van overlijden (waarneembare entiteit)" } } ], - "linkId": "1430", + "linkId": "1649", "text": "Gewenste plek van overlijden ([MetingNaam])" }, { @@ -900,7 +912,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "264362003", - "display": "Thuis" + "display": "thuis" }, "item": [ { @@ -943,7 +955,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "340201000146103", - "display": "Wenst geen euthanasie" + "display": "wil geen euthanasie" } } ], @@ -975,12 +987,25 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], "linkId": "1435", "text": "Keuze orgaandonatie in donorregister ([MetingWaarde])" + }, + { + "answer": [ + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "1156040003", + "display": "Self reported (qualifier value)" + } + } + ], + "linkId": "1650", + "text": "Keuze orgaandonatie vastgelegd in donorregister? ([MeetMethode])" } ] } @@ -1006,7 +1031,7 @@ { "answer": [ { - "valueString": "Mevrouw is gek op haar kleinzoon, dus brengt graag veel tijd met hem door. Verder is ze gek op muziek en luistert ze dat graag als ze alleen is." + "valueString": "Mevrouw is gek op haar kleinzoon, dus brengt graag veel tijd met hem door. Verder is ze gek op muziek en luistert ze dat graag als ze alleen is." } ], "linkId": "1196", @@ -1024,7 +1049,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" }, "item": [ { @@ -1048,7 +1073,7 @@ "valueCoding": { "system": "http://snomed.info/sct", "code": "373066001", - "display": "Ja" + "display": "ja" } } ], From f0a0efd19ce56b10ef77e4a472b6d99062faeddb Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 17:05:34 +0200 Subject: [PATCH 44/71] Update questionnaire README steps and scripts Revise input/resources/README.md to reorganize and clarify the questionnaire preparation steps. Replaces the old conditional-expression/FHIRPath instructions with a new Step 4 instructing replacement of answerOption arrays by answerValueSet references; removes the NLM Form Builder fix walkthrough and example JSON. Adds a Step 0 to run util/questionnaire_item_anwserOption_expander.py to expand answer options and a Step 5 to run util/questionnaire_item_prefix_populator.py to populate item prefixes; retains the code-removal script step (renumbered). Updates the export/replace and LHC Forms loading guidance to reference the expanded questionnaire and adjusts step numbering and registration notes for the IG. --- input/resources/README.md | 79 ++++++--------------------------------- 1 file changed, 12 insertions(+), 67 deletions(-) diff --git a/input/resources/README.md b/input/resources/README.md index c680afb..3f4b5aa 100644 --- a/input/resources/README.md +++ b/input/resources/README.md @@ -68,80 +68,22 @@ Transform the exported metadata to follow IG standards. Use English for all meta ### Step 3: Save to Repository Save the adjusted Questionnaire as `Questionnaire-[id].json` in `input/resources/` -### Step 4: Fix Conditional Expressions +### Step 4: Replace all anwserOption with a answerValueSet reference +To ensure better maintainability and consistency, replace all `answerOption` arrays in the questionnaire items with a reference to an `answerValueSet`. Use a diff to identify all `answerValueSet` references and replace the corresponding `answerOption` arrays with the appropriate `ValueSet` reference. -Use [NLM Form Builder](https://formbuilder.nlm.nih.gov/) to correct invalid FHIRPath expressions: - -1. Select **"Start with existing form"** → **"Import from local file"** -2. Import your adjusted Questionnaire JSON -3. Review warnings for invalid FHIRPath conditions -4. Fix conditional displays (especially boolean comparisons) - - **Example fix needed:** - - Item: "Naam eerste contactpersoon" should display when: - - Question `984` ("Is de wettelijk vertegenwoordiger ook de eerste contactpersoon?") = `Nee (0)` - -### Step 5: Set Read-Only Treatment/Measurement Codes - -For sections **4. Behandelgrenzen** and **5. Behandelwensen**, configure treatment codes and measurement names as: -- **Read only**: Yes -- **Value method**: Pick initial value - -This simplifies QuestionnaireResponse creation. Example result: - -```json -"item": [ - { - "type": "choice", - "linkId": "1408", - "text": "Belangrijkste doel van behandeling ([MetingNaam])", - "required": false, - "repeats": false, - "readOnly": true, - "answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "180771000146100", - "display": "Focus van behandeling (waarneembare entiteit)" - }, - "initialSelected": true - } - ] - }, -] -``` - -### Step 6: Export and Replace +### Step 5: Export and Replace 1. In Form Builder, select top-right menu → **"Export"** → **"Export to file in FHIR R4 format"** 2. Save and replace the file in `input/resources/` -### Step 7: Expand ICD valueset -In the question concerning the 'ProductType van IC' (linkID 1008), replace the ICD code and display by the valueset values, including the system, the code and the display. Illustrated for first two answer options: -```json -"answerOption": [ - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "72506001", - "display": "implanteerbare cardioverter-defibrillator" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "465460004", - "display": "univentriculaire implanteerbare cardioverter-defibrillator" - } - }, -] -``` -### Step 8: Remove 'code' keys from questionnaire items with Python script +### Step 6: Populate item prefix with Python script +Run the Questionnaire Item Prefix Populator script (`/util\questionnaire_item_prefix_populator.py/`) that populates the `prefix` field for all questionnaire items based on their `linkId` values, following the pattern "Q[linkId]". This ensures consistent and clear identification of questionnaire items in the IG. + +### Step 7: Remove 'code' keys from questionnaire items with Python script Run the Questionnaire Item Code Remover script (`/util\questionnaire_item_code_remover.py/`) that removes 'code' keys from all questionnaire items, including incorrect 'code' properties. -### Step 9: Register in Configuration for better presentation in IG +### Step 8: Register in Configuration for better presentation in IG Add the Questionnaire to `sushi-config.yaml`: @@ -166,8 +108,11 @@ groups: ## QuestionnaireResponse Creation Process +### Step 0: Prepare Questionnaire +Run `util\questionnaire_item_anwserOption_expander.py` to expand answer options with proper display values, ensuring that the questionnaire is fully functional for data entry. + ### Step 1: Load Questionnaire -Use [LHC Forms](https://lhcforms.nlm.nih.gov/lhcforms/) to create example responses: +Use [LHC Forms](https://lhcforms.nlm.nih.gov/lhcforms/) to create example responses - use the expanded version of the questionnaire (output step 0): 1. Select **"Load From File"** 2. Choose the adjusted Questionnaire from `input/resources/` From eeed36fd43ae7ae8970e9738a4b7b4ee09a11fea Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Fri, 29 May 2026 17:32:01 +0200 Subject: [PATCH 45/71] Fix incorrect QR --- .../QuestionnaireResponse-HendrikHartman-20201001.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index b8cd68e..0466ec2 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -634,6 +634,14 @@ "answer": [ { "valueString": "Hendrik wil er alles aan doen om zo lang mogelijk in goede gezondheid te kunnen leven. Hij probeert regelmatig te sporten en zou graag willen blijven hardlopen. Broer Michiel woont om de hoek en is erg betrokken bij het proces van Hendrik" + } + ], + "linkId": "1190", + "text": "Wens en verwachting patient ([MetingWaarde])" + }, + { + "answer": [ + { "valueCoding": { "system": "http://snomed.info/sct", "code": "370819000", From ec71902ba90013b2c2108a03836ad0b94aa22517 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 1 Jun 2026 17:10:12 +0200 Subject: [PATCH 46/71] Added group for contactperson in question 2 Changed in questionnaire and one QR, still needs to be done for remaining two QRs --- .../resources/Questionnaire-ACP-zib2020.json | 145 ++++++++++-------- ...naireResponse-HendrikHartman-20201001.json | 22 ++- 2 files changed, 97 insertions(+), 70 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index cf11804..2f75d4b 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -549,77 +549,98 @@ ] }, { - "linkId": "997", - "text": "Rol", - "type": "choice", - "required": false, - "repeats": true, - "answerOption": [ - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", - "code": "03", - "display": "Curator (juridisch)" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", - "code": "15", - "display": "Mentor" - } - }, - { - "valueCoding": { - "system": "http://snomed.info/sct", - "code": "310141000146103", - "display": "Schriftelijk gemachtigde" - } - }, - { - "valueCoding": { - "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", - "code": "09", - "display": "Anders" - } - } - ], + "linkId": "1652", + "text": "Contactperso(o)n(en)", + "type": "group", + "repeats": false, "item": [ { - "linkId": "414", - "text": "Anders, namelijk:", - "type": "string", + "linkId": "997", + "text": "Rol", + "type": "choice", "required": false, - "repeats": false - } - ] - }, - { - "linkId": "998", - "text": "Relatie tot patiënt", - "type": "choice", - "required": false, - "repeats": true, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", - "item": [ - { - "linkId": "413", - "text": "Anders, namelijk:", - "type": "string", - "enableWhen": [ + "repeats": true, + "answerOption": [ { - "question": "998", - "operator": "=", - "answerCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "OTH", + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", + "code": "03", + "display": "Curator (juridisch)" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", + "code": "15", + "display": "Mentor" + } + }, + { + "valueCoding": { + "system": "http://snomed.info/sct", + "code": "310141000146103", + "display": "Schriftelijk gemachtigde" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", + "code": "09", "display": "Anders" } } ], - "enableBehavior": "any", + "item": [ + { + "linkId": "414", + "text": "Anders, namelijk:", + "type": "string", + "enableWhen": [ + { + "question": "997", + "operator": "=", + "answerCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.22.472", + "code": "09", + "display": "Anders" + } + } + ], + "enableBehavior": "any", + "required": false, + "repeats": false + + } + ] + }, + { + "linkId": "998", + "text": "Relatie tot patiënt", + "type": "choice", "required": false, - "repeats": false + "repeats": true, + "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", + "item": [ + { + "linkId": "413", + "text": "Anders, namelijk:", + "type": "string", + "enableWhen": [ + { + "question": "998", + "operator": "=", + "answerCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "OTH", + "display": "Anders" + } + } + ], + "enableBehavior": "any", + "required": false, + "repeats": false + } + ] } ] } diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index 0466ec2..f1c39b5 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -242,15 +242,21 @@ "text": "Patiënt" }, { - "linkId": "998", - "text": "Relatie tot patiënt", - "answer": [ + "linkId": "1652", + "text": "Contactperso(o)n(en)", + "item": [ { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "BRO", - "display": "Broer" - } + "linkId": "998", + "text": "Relatie tot patiënt", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "BRO", + "display": "Broer" + } + } + ] } ] } From 2cb20d9182d465725249a15f881522649343ac4e Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Mon, 1 Jun 2026 19:06:11 +0200 Subject: [PATCH 47/71] Added group for contactperson question 2 in QRs The group level was added to the remaining two questionnaire responses for the question 'Gesprek gevoerd in bijzijn van'. Additionally, answer in QR for Samira was changed to SIS. --- ...naireResponse-HendrikHartman-20221108.json | 22 ++++++++++++------- ...eResponse-SamiraVanDerSluijs-20251117.json | 22 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index 713a0f4..3c2e052 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -242,15 +242,21 @@ "text": "Patiënt" }, { - "linkId": "998", - "text": "Relatie tot patiënt", - "answer": [ + "linkId": "1652", + "text": "Contactperso(o)n(en)", + "item": [ { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "BRO", - "display": "Broer" - } + "linkId": "998", + "text": "Relatie tot patiënt", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "BRO", + "display": "Broer" + } + } + ] } ] } diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 7d34ccd..d33bbbe 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -444,15 +444,21 @@ "text": "Patiënt" }, { - "linkId": "998", - "text": "Relatie tot patiënt", - "answer": [ + "linkId": "1652", + "text": "Contactperso(o)n(en)", + "item": [ { - "valueCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", - "code": "BRO", - "display": "Broer" - } + "linkId": "998", + "text": "Relatie tot patiënt", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SIS", + "display": "Zuster" + } + } + ] } ] } From fae60a22cb01f3add15b3a685e7d7745b28ddd0f Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 2 Jun 2026 10:13:25 +0200 Subject: [PATCH 48/71] Suppress warning legally capable code #156 --- input/ignoreWarnings.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index 7643192..82d0112 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -21,6 +21,9 @@ %Geen van de gevonden codings bestaan in waardelijst 'ACP Primary Agreed-upon Goal of Medical Policy' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoal|1.0.0-rc2) en een coding uit deze waardelijst is verplicht (codes = http://snomed.info/sct#1351964001)% %None of the codings provided are in the value set 'ACP Primary Agreed-upon Goal of Medical Policy' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoal|1.0.0-rc2), and a coding from this value set is required) (codes = http://snomed.info/sct#1351964001)% +# Manual check in latest version of SNOMED does find the code '665671000146101'. The error might be due to a older version of SNOMED available in tx.fhir.org/r4 +%Unknown code '665671000146101' in the CodeSystem 'http://snomed.info/sct' version 'http://snomed.info/sct/11000146104/version/20240930' (Netherlands Edition)% + # This is a proposed fixed value in the Nictiz Consent profiles as there is no better alternative. %URL-waarde 'https://wetten.overheid.nl/' komt nergens uit% %No definition could be found for URL value 'https://wetten.overheid.nl/'% From 50c40cec4323a80b5aa012698a4a70f6df7edbe3 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 2 Jun 2026 10:59:52 +0200 Subject: [PATCH 49/71] Change valueset naming #156 Added 'Codes' to ValueSet names (that did not contain something like 'type' or 'role' yet) to make sure the names are different from profile names. Also added 'VS' to ValueSet IDs. This is also updated in the suppressed warning. The ValueSet references in the questionnaire must still be updated, but this can't be done here as the valuesets are not used yet. --- input/fsh/ValueSet.fsh | 20 ++++++++++---------- input/ignoreWarnings.txt | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/input/fsh/ValueSet.fsh b/input/fsh/ValueSet.fsh index 68176b4..6542703 100644 --- a/input/fsh/ValueSet.fsh +++ b/input/fsh/ValueSet.fsh @@ -1,6 +1,6 @@ ValueSet: ACPPreferredPlaceOfDeathVS -Id: ACP-PreferredPlaceOfDeath -Title: "ACP Preferred Place of Death" +Id: ACP-PreferredPlaceOfDeathVS +Title: "ACP Preferred Place of Death Codes" Description: "ValueSet for Preferred Place of Death, representing the place where the patient prefers to die, if possible." * insert MetaRules * ^copyright = "This artefact includes content from SNOMED Clinical Terms® (SNOMED CT®) which is copyright of the International Health Terminology Standards Development Organisation (IHTSDO). Implementers of these artefacts must have the appropriate SNOMED CT Affiliate license - for more information contact http://www.snomed.org/snomed-ct/getsnomed-ct or info@snomed.org." @@ -94,8 +94,8 @@ Description: "ValueSet for Preferred Place of Death, representing the place wher ValueSet: ACPPositionRegardingEuthanasiaVS -Id: ACP-PositionRegardingEuthanasia -Title: "ACP Position Regarding Euthanasia" +Id: ACP-PositionRegardingEuthanasiaVS +Title: "ACP Position Regarding Euthanasia Codes" Description: "ValueSet for Position Regarding Euthanasia, representing the the patient's position regarding euthanasia and information on the presence of a euthanasia statement." * insert MetaRules * ^copyright = "This artefact includes content from SNOMED Clinical Terms® (SNOMED CT®) which is copyright of the International Health Terminology Standards Development Organisation (IHTSDO). Implementers of these artefacts must have the appropriate SNOMED CT Affiliate license - for more information contact http://www.snomed.org/snomed-ct/getsnomed-ct or info@snomed.org." @@ -109,8 +109,8 @@ Description: "ValueSet for Position Regarding Euthanasia, representing the the p ValueSet: ACPMedicalPolicyGoalVS -Id: ACP-MedicalPolicyGoal -Title: "ACP Primary Agreed-upon Goal of Medical Policy" +Id: ACP-MedicalPolicyGoalVS +Title: "ACP Primary Agreed-upon Goal of Medical Policy Codes" Description: "ValueSet for Medical Policy Goal, representing the primary agreed-upon goal of a patient's medical treatment policy." * insert MetaRules * ^copyright = "This artefact includes content from SNOMED Clinical Terms® (SNOMED CT®) which is copyright of the International Health Terminology Standards Development Organisation (IHTSDO). Implementers of these artefacts must have the appropriate SNOMED CT Affiliate license - for more information contact http://www.snomed.org/snomed-ct/getsnomed-ct or info@snomed.org." @@ -121,7 +121,7 @@ Description: "ValueSet for Medical Policy Goal, representing the primary agreed- ValueSet: ACPMedicalDeviceProductTypeICDVS -Id: ACP-MedicalDeviceProductType-ICD +Id: ACP-MedicalDeviceProductType-ICDVS Title: "ACP MedicalDevice ProductType ICD" Description: "ICD product code for MedicalDevice ProductType. This ValueSet is conceptually based on SNOMED CT codes that are descendants of `72506001` (implanteerbare cardioverter-defibrillator), i.e. an `is-a` filter. However, the codes are explicitly enumerated rather than using an intensional `is-a` filter to make the ValueSet easier to understand and implement for consumers." * insert MetaRules @@ -134,7 +134,7 @@ Description: "ICD product code for MedicalDevice ProductType. This ValueSet is c * $snomed#1236894001 "subcutane implanteerbare cardioverter-defibrillator" ValueSet: ACPContactPersonRoleVS -Id: ACP-ContactPersonRole +Id: ACP-ContactPersonRoleVS Title: "ACP ContactPerson Role zib2024 backport" Description: "ValueSet containing additional codes to the ContactPerson's [RolCodelijst](http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.2--20200901000000). These codes are applied from the zib2024 release onwards. Currently, the ValueSet contains only SNOMED CT code `310141000146103` (Schriftelijk gemachtigde zorg en behandeling / Holder of medical power of attorney) from the zib2024 release. The ValueSet is bound to a slice in `RelatedPerson.relationship." * insert MetaRules @@ -144,7 +144,7 @@ Description: "ValueSet containing additional codes to the ContactPerson's [RolCo ValueSet: ACPYesNoUnknownVS Id: ACP-YesNoUnknownVS -Title: "ACP Yes, No, Unknown valueSet" +Title: "ACP Yes, No, Unknown Codes" Description: "ValueSet representing 'Yes, No, Unknown' answers." * insert MetaRules * ^copyright = "This artefact includes content from SNOMED Clinical Terms® (SNOMED CT®) which is copyright of the International Health Terminology Standards Development Organisation (IHTSDO). Implementers of these artefacts must have the appropriate SNOMED CT Affiliate license - for more information contact http://www.snomed.org/snomed-ct/getsnomed-ct or info@snomed.org." @@ -221,7 +221,7 @@ Description: "ValueSet representing 'Yes, No, Unknown' answers." ValueSet: ACPProcedureTypeVS -Id: ACP-ProcedureType +Id: ACP-ProcedureTypeVS Title: "ACP ProcedureType" Description: "ValueSet for ProcedureType, representing allowed codes for the ACP conversation. The DHD Verrichtingenthesaurus code `0000106562` (proactieve zorgplanning in palliatieve fase) is not included in this ValueSet, as this set is not meant to be used for exchange (see [ZIB-1233](https://nictiz.atlassian.net/browse/ZIB-1233)). The included SNOMED code is part of the referentieset of the DHD Verrichtingenthesaurus." * insert MetaRules diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index 82d0112..4d3cfd0 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -18,8 +18,8 @@ # Manual check in latest version of SNOMED does find the code '1351964001'. The error might be due to a older version of SNOMED available in tx.fhir.org/r4 %Unknown code '1351964001' in the CodeSystem 'http://snomed.info/sct' version 'http://snomed.info/sct/11000146104/version/20240930'% -%Geen van de gevonden codings bestaan in waardelijst 'ACP Primary Agreed-upon Goal of Medical Policy' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoal|1.0.0-rc2) en een coding uit deze waardelijst is verplicht (codes = http://snomed.info/sct#1351964001)% -%None of the codings provided are in the value set 'ACP Primary Agreed-upon Goal of Medical Policy' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoal|1.0.0-rc2), and a coding from this value set is required) (codes = http://snomed.info/sct#1351964001)% +%Geen van de gevonden codings bestaan in waardelijst 'ACP Primary Agreed-upon Goal of Medical Policy Codes' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoalVS|1.0.0-rc2) en een coding uit deze waardelijst is verplicht (codes = http://snomed.info/sct#1351964001)% +%None of the codings provided are in the value set 'ACP Primary Agreed-upon Goal of Medical Policy Codes' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoalVS|1.0.0-rc2), and a coding from this value set is required) (codes = http://snomed.info/sct#1351964001)% # Manual check in latest version of SNOMED does find the code '665671000146101'. The error might be due to a older version of SNOMED available in tx.fhir.org/r4 %Unknown code '665671000146101' in the CodeSystem 'http://snomed.info/sct' version 'http://snomed.info/sct/11000146104/version/20240930' (Netherlands Edition)% From 58ebe9185d794071c9bc2a10089b88aff71aae53 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:18:06 +0200 Subject: [PATCH 50/71] Process PR Feedback --- .../resources/Questionnaire-ACP-zib2020.json | 375 +++++++++++++++++- 1 file changed, 359 insertions(+), 16 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index 2f75d4b..ddf1077 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -6,11 +6,11 @@ "name": "ACPzib2020", "title": "Uniform vastleggen proactieve zorgpanning (PZP) o.b.v. zibs2020 - ReleaseCandidate3 02-06-2026", "status": "draft", - "experimental": true, - "publisher": "Gepubliceerd door PZNL & uitgevoerd door IKNL | Published by PZNL & executed by IKNL", - "description": "Dit formulier is ontwikkeld om afspraken voortkomend uit het proces van proactieve zorgplanning (PZP) eenduidig vast te leggen. Het is GEEN afvinklijst. Het kan alleen na deskundig en genuanceerd gesprek door een zorgverlener worden ingevuld. Voor adviezen over het voeren van deze gesprekken word verwezen naar de richtlijn proactieve zorgplanning in de palliatieve fase en Palliaweb, zie https://palliaweb.nl/zorgpraktijk/proactieve-zorgplanning. \nVul 'nog onbekend' in als een onderwerp niet is besproken of als de patiënt (nog) geen mening heeft. Overweeg bij overplaatsing naar een langdurige zorgsetting gespreksverslagen over proactieve zorgplanning aan de overdracht toe te voegen. | \nThis form was developed to clearly document agreements resulting from the advance care planning (ACP) process. It is NOT a checklist. It can only be completed by a healthcare provider after a professional and nuanced conversation. For advice on conducting these conversations, please refer to the guideline for proactive care planning in the palliative phase and Palliaweb, see https://palliaweb.nl/zorgpraktijk/proactieve-zorgplanning. \nEnter 'unknown' if a topic is not discussed or if the patient does not (yet) have an opinion.When transferring to a long-term care setting, consider adding conversation records about advance care planning (ACP) to the transfer documents.", - "purpose": "Dit formulier is ontwikkeld om afspraken voortkomend uit het proces van proactieve zorgplanning (PZP) eenduidig vast te leggen. | \nThis form was developed to clearly document agreements resulting from the advance care planning (ACP) process.", - "copyright": "Op dit formulier is copyright, gebruikersrechten en een disclaimer van toepassing, zoals die gespecificeerd zijn voor alle informatiestandaarden van IKNL, zie voor de details het onderdeel Gebruikersrechten en disclaimer op https://iknl.nl/onderzoek/eenheid-van-taal. | \nThis form is subject to copyright, user rights and a disclaimer, as specified for all IKNL information standards. For details, see the paragraph on Gebruikersrechten en disclaimer at https://iknl.nl/onderzoek/eenheid-van-taal.", + "experimental": false, + "publisher": "Published by PZNL & executed by IKNL", + "description": "This form was developed to clearly document agreements resulting from the advance care planning (ACP) process. It is NOT a checklist. It can only be completed by a healthcare provider after a professional and nuanced conversation. For advice on conducting these conversations, please refer to the guideline for proactive care planning in the palliative phase and Palliaweb, see https://palliaweb.nl/zorgpraktijk/proactieve-zorgplanning. \nEnter 'unknown' if a topic is not discussed or if the patient does not (yet) have an opinion.When transferring to a long-term care setting, consider adding conversation records about advance care planning (ACP) to the transfer documents.", + "purpose": "This form was developed to clearly document agreements resulting from the advance care planning (ACP) process.", + "copyright": "This form is subject to copyright, user rights and a disclaimer, as specified for all IKNL information standards. For details, see the paragraph on Gebruikersrechten en disclaimer at https://iknl.nl/onderzoek/eenheid-van-taal.", "item": [ { "linkId": "963", @@ -185,8 +185,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersSystem" - + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", + "code": "LL", + "display": "Land Line" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", + "code": "FAX", + "display": "Fax" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "PG", + "display": "Pieper" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "MC", + "display": "Mobiel telefoonnummer" + } + } + ] }, { "linkId": "978", @@ -194,7 +222,29 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersUse" + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Telefoonnummer thuis" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "TMP", + "display": "Tijdelijk telefoonnummer" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "WP", + "display": "Zakelijk telefoonnummer" + } + } + ] }, { "linkId": "979", @@ -224,7 +274,22 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-EmailAddressesUse" + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Privé e-mailadres" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "WP", + "display": "Zakelijk e-mailadres" + } + } + ] } ] } @@ -311,7 +376,78 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "DOMPART", + "display": "Partner" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "HUSB", + "display": "Echtgenoot" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "WIFE", + "display": "Echtgenote" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "FTH", + "display": "Vader" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "MTH", + "display": "Moeder" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SONC", + "display": "Zoon" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "DAUC", + "display": "Dochter" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "BRO", + "display": "Broer" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SIS", + "display": "Zuster" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "OTH", + "display": "Anders" + } + } + ], "item": [ { "linkId": "408", @@ -414,7 +550,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersSystem" + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", + "code": "LL", + "display": "Land Line" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.22.1", + "code": "FAX", + "display": "Fax" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "PG", + "display": "Pieper" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "MC", + "display": "Mobiel telefoonnummer" + } + } + ] }, { "linkId": "990", @@ -422,7 +587,29 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-TelephoneNumbersUse" + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Telefoonnummer thuis" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "TMP", + "display": "Tijdelijk telefoonnummer" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "WP", + "display": "Zakelijk telefoonnummer" + } + } + ] }, { "linkId": "991", @@ -452,7 +639,22 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://nictiz.nl/fhir/ValueSet/ContactInformation-EmailAddressesUse" + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Privé e-mailadres" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "WP", + "display": "Zakelijk e-mailadres" + } + } + ] } ] } @@ -499,7 +701,78 @@ "enableBehavior": "any", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "DOMPART", + "display": "Partner" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "HUSB", + "display": "Echtgenoot" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "WIFE", + "display": "Echtgenote" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "FTH", + "display": "Vader" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "MTH", + "display": "Moeder" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SONC", + "display": "Zoon" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "DAUC", + "display": "Dochter" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "BRO", + "display": "Broer" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SIS", + "display": "Zuster" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "OTH", + "display": "Anders" + } + } + ], "item": [ { "linkId": "412", @@ -609,7 +882,6 @@ "enableBehavior": "any", "required": false, "repeats": false - } ] }, @@ -619,7 +891,78 @@ "type": "choice", "required": false, "repeats": true, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.3.1.1--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "DOMPART", + "display": "Partner" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "HUSB", + "display": "Echtgenoot" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "WIFE", + "display": "Echtgenote" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "FTH", + "display": "Vader" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "MTH", + "display": "Moeder" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SONC", + "display": "Zoon" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "DAUC", + "display": "Dochter" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "BRO", + "display": "Broer" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", + "code": "SIS", + "display": "Zuster" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "OTH", + "display": "Anders" + } + } + ], "item": [ { "linkId": "413", From 1eabe48f34a14d5a027c6ad4b673078b9e740fd2 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:22:32 +0200 Subject: [PATCH 51/71] Process PR feedback --- .../resources/Questionnaire-ACP-zib2020.json | 210 +++++++++++++++++- 1 file changed, 203 insertions(+), 7 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index ddf1077..dbfc161 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -1062,7 +1062,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "1", + "display": "Anders" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1001", @@ -1125,7 +1154,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "1", + "display": "Anders" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1388", @@ -1188,7 +1246,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "1", + "display": "Anders" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1391", @@ -1251,7 +1338,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "1", + "display": "Anders" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1394", @@ -1314,7 +1430,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "1", + "display": "Anders" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1397", @@ -1377,7 +1522,36 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "1", + "display": "Anders" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1400", @@ -1461,7 +1635,29 @@ "type": "choice", "required": false, "repeats": false, - "answerValueSet": "http://decor.nictiz.nl/fhir/ValueSet/2.16.840.1.113883.2.4.3.11.60.40.2.2.2.2--20200901000000", + "answerOption": [ + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "0", + "display": "Wel uitvoeren" + } + }, + { + "valueCoding": { + "system": "urn:oid:2.16.840.1.113883.2.4.3.11.60.40.4.25.1", + "code": "2", + "display": "Niet uitvoeren" + } + }, + { + "valueCoding": { + "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", + "code": "UNK", + "display": "Onbekend" + } + } + ], "item": [ { "linkId": "1404", From f379c31b94e8fa4093e30f1a3696efe74eb3674a Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:31:21 +0200 Subject: [PATCH 52/71] Remove dots in prefix --- input/resources/Questionnaire-ACP-zib2020.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index dbfc161..db769f3 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -102,7 +102,7 @@ }, { "linkId": "26", - "prefix": "1.", + "prefix": "1", "text": "Wilsbekwaamheid & Wettelijke vertegenwoordiging", "type": "group", "repeats": false, @@ -991,7 +991,7 @@ }, { "linkId": "586", - "prefix": "3.", + "prefix": "3", "text": "Belangrijkste overeengekomen doel van medisch beleid", "type": "group", "repeats": false, @@ -1026,7 +1026,7 @@ }, { "linkId": "83", - "prefix": "4.", + "prefix": "4", "text": "Behandelgrenzen", "type": "group", "repeats": false, @@ -1814,7 +1814,7 @@ }, { "linkId": "107", - "prefix": "5.", + "prefix": "5", "text": "Behandelwensen", "type": "group", "repeats": false, @@ -2016,7 +2016,7 @@ }, { "linkId": "598", - "prefix": "6.", + "prefix": "6", "text": "Wat verder nog belangrijk is", "type": "group", "repeats": false, @@ -2050,7 +2050,7 @@ }, { "linkId": "115", - "prefix": "7.", + "prefix": "7", "text": "Eerder vastgelegde behandelwensen", "type": "group", "repeats": false, @@ -2098,7 +2098,7 @@ }, { "linkId": "119", - "prefix": "8.", + "prefix": "8", "text": "Informatie delen", "type": "group", "repeats": false, @@ -2138,4 +2138,4 @@ ] } ] -} \ No newline at end of file +} From 9975628eaafe4ce2069873a56a315781e3acf300 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:35:39 +0200 Subject: [PATCH 53/71] Remove unneeded enableWhen --- input/resources/Questionnaire-ACP-zib2020.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index db769f3..ac50f65 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -1612,18 +1612,6 @@ "linkId": "1645", "text": "Anders, namelijk:", "type": "string", - "enableWhen": [ - { - "question": "1422", - "operator": "=", - "answerCoding": { - "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", - "code": "OTH", - "display": "Anders" - } - } - ], - "enableBehavior": "any", "required": false, "repeats": false } From 124359694b1c5184fbb69d439fc97688bc8c9497 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:44:38 +0200 Subject: [PATCH 54/71] Updated Questionanire item prefix populator plus adjusted readme --- input/resources/README.md | 3 +++ util/questionnaire_item_prefix_populator.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/input/resources/README.md b/input/resources/README.md index 3f4b5aa..606085b 100644 --- a/input/resources/README.md +++ b/input/resources/README.md @@ -65,6 +65,9 @@ Transform the exported metadata to follow IG standards. Use English for all meta - **`publisher`**: Use simplified form `"PZNL & IKNL"` +### Step: 2a +Question for 967 - Geboortedatum patient needs to be a date instead of dateTime. + ### Step 3: Save to Repository Save the adjusted Questionnaire as `Questionnaire-[id].json` in `input/resources/` diff --git a/util/questionnaire_item_prefix_populator.py b/util/questionnaire_item_prefix_populator.py index 3d0e188..9bf6e49 100644 --- a/util/questionnaire_item_prefix_populator.py +++ b/util/questionnaire_item_prefix_populator.py @@ -65,7 +65,9 @@ def extract_prefix_from_text(text: str) -> Tuple[Optional[str], str]: return match.group(1), match.group(2) # Pattern for number followed by . - e.g., "1.", "2.", "3." - number_dot_pattern = re.compile(r'^(\d+\.)\s*(.*)$') + # The trailing dot is dropped from the prefix (e.g. "1." -> "1"), while + # other separators like ")" are preserved by the patterns below. + number_dot_pattern = re.compile(r'^(\d+)\.\s*(.*)$') match = number_dot_pattern.match(text) if match: return match.group(1), match.group(2) From 21815acb8a637280217729e8545595ea3aa794dc Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:55:08 +0200 Subject: [PATCH 55/71] Fix display --- .../QuestionnaireResponse-HendrikHartman-20201001.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index f1c39b5..8f20b38 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -726,7 +726,7 @@ "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/v3-NullFlavor", "code": "UNK", - "display": "onbekend" + "display": "nog onbekend" }, "item": [ { From 0f2428d3176511b8b4b7664b94c1c825bb008f49 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 11:57:17 +0200 Subject: [PATCH 56/71] Use date type for patient birthdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the 'Geboortedatum patiënt' question (linkId 967) from type "dateTime" to "date" in input/resources/Questionnaire-ACP-zib2020.json so only the date (no time) is recorded for patient birthdates. --- input/resources/Questionnaire-ACP-zib2020.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/resources/Questionnaire-ACP-zib2020.json b/input/resources/Questionnaire-ACP-zib2020.json index ac50f65..6f8bc7f 100644 --- a/input/resources/Questionnaire-ACP-zib2020.json +++ b/input/resources/Questionnaire-ACP-zib2020.json @@ -51,7 +51,7 @@ { "linkId": "967", "text": "Geboortedatum patiënt", - "type": "dateTime", + "type": "date", "required": false, "repeats": false }, From 6d8fb9fdd7cde5de05dbd89cdc688f96ed445f64 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 2 Jun 2026 12:09:11 +0200 Subject: [PATCH 57/71] Fix use of contact values in QRs --- ...naireResponse-HendrikHartman-20201001.json | 6 ++-- ...naireResponse-HendrikHartman-20221108.json | 6 ++-- ...eResponse-SamiraVanDerSluijs-20251117.json | 36 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json index f1c39b5..ff4b1cf 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20201001.json @@ -173,9 +173,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-use", - "code": "home", - "display": "Home" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Privé e-mailadres" } } ], diff --git a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json index 3c2e052..c6f9a12 100644 --- a/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json +++ b/input/resources/QuestionnaireResponse-HendrikHartman-20221108.json @@ -173,9 +173,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-use", - "code": "home", - "display": "Home" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Privé e-mailadres" } } ], diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index d33bbbe..3eda159 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -200,9 +200,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-system", - "code": "phone", - "display": "Phone" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "MC", + "display": "Mobiel telefoonnummer" } } ], @@ -213,9 +213,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-use", - "code": "home", - "display": "Home" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Telefoonnummer thuis" } } ], @@ -241,9 +241,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-use", - "code": "home", - "display": "Home" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Privé e-mailadres" } } ], @@ -343,9 +343,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-system", - "code": "phone", - "display": "Phone" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "MC", + "display": "Mobiel telefoonnummer" } } ], @@ -356,9 +356,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-use", - "code": "home", - "display": "Home" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Telefoonnummer thuis" } } ], @@ -384,9 +384,9 @@ "answer": [ { "valueCoding": { - "system": "http://hl7.org/fhir/contact-point-use", - "code": "home", - "display": "Home" + "system": "http://terminology.hl7.org/CodeSystem/v3-AddressUse", + "code": "HP", + "display": "Privé e-mailadres" } } ], From 18ac2f30a90e8f5872cab7dfe3884b731e2da6a6 Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 2 Jun 2026 12:21:16 +0200 Subject: [PATCH 58/71] Fix unresolvable link to ContactPersonRole VS --- .../pagecontent/StructureDefinition-ACP-ContactPerson-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md index 50da018..bac6ee2 100644 --- a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md +++ b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md @@ -2,4 +2,4 @@ This profile adds ACP-specific mappings to the ART-DECOR dataset and obligation extensions for Provider and Consulter actors. Profile references are constrained to ACP profiles where available. The following change affects implementation beyond the base nl-core profile: -* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACPContactPersonRoleVS.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_, pre-adopted from the [RolCodelijst in zib Contactpersoon v4.1 (2024)](https://zibs.nl/wiki/Contactpersoon-v4.1(2024NL)#RolCodelijst)). \ No newline at end of file +* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACP-ContactPersonRole.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_, pre-adopted from the [RolCodelijst in zib Contactpersoon v4.1 (2024)](https://zibs.nl/wiki/Contactpersoon-v4.1(2024NL)#RolCodelijst)). \ No newline at end of file From 4e47396c67ba1b620c9a94bfa72428f0f212be8c Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Tue, 2 Jun 2026 13:22:46 +0200 Subject: [PATCH 59/71] start changelog --- input/pagecontent/changelog.md | 11 +++++++++++ input/pagecontent/data-exchange.md | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/input/pagecontent/changelog.md b/input/pagecontent/changelog.md index db4eaf9..db65a2a 100644 --- a/input/pagecontent/changelog.md +++ b/input/pagecontent/changelog.md @@ -1,3 +1,14 @@ +### 1.0.0-rc3 +| Issue | Short Description | +|-------|-------------------| +| [#137](https://github.com/IKNL/PZP-FHIR-R4/issues/137) | Replaced legally capable extension on Patient with an Observation to better support representation of legal capacity. | +||| +| [#151](https://github.com/IKNL/PZP-FHIR-R4/issues/151) | Corrected search URLs by fixing code parameter syntax to ensure proper OR behavior. | +| [#138](https://github.com/IKNL/PZP-FHIR-R4/issues/138) | Updated yes/no questions in the questionnaire to use `boolean` instead of `choice`. | +| [#133](https://github.com/IKNL/PZP-FHIR-R4/issues/133) | Aligned API documentation by correcting CommunicationRequest category code in sequence diagram and updating CapabilityStatement to use CommunicationRequest. | +| [#129](https://github.com/IKNL/PZP-FHIR-R4/issues/129) | Clarified ContactPerson artifact documentation for `.relationship:roleAdditional` slice. | +| [#127](https://github.com/IKNL/PZP-FHIR-R4/issues/127) | Added missing `subject` references to QuestionnaireResponse examples and improved consistency of author/source formatting. | + ### 1.0.0-rc2 | Issue | Short Description | diff --git a/input/pagecontent/data-exchange.md b/input/pagecontent/data-exchange.md index bc0cf61..ae4fdf7 100644 --- a/input/pagecontent/data-exchange.md +++ b/input/pagecontent/data-exchange.md @@ -56,7 +56,7 @@ The below listed search requests show how all the ACP agreements, procedural inf 1. Both requests are designed to retrieve the same information, but with different approaches: * A) Retrieves `Procedure` resources representing ACP procedures and includes the associated `Encounter` resource where the procedure took place. * B) Retrieves `Encounter` resources that list an ACP procedure as their reason, and includes the referenced resources in the result. Request A is generally preferred because `Encounter.patient` may not always be present; if absent, it indicates the patient was not involved in the Encounter. Using request A ensures these cases are included as well. -2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (patient, ContactPersons, and HealthProfessionals). +2. Retrieves `Consent` resources for Treatment Directives and includes the agreement parties (Patient, ContactPersons, and HealthProfessionals). 3. Retrieves `Consent` resources for Advance Directives and includes the representatives (ContactPersons). 4. Retrieves `Goal` resources related to advance care planning. 5. Retrieves `Observation` resources related to specific wishes and plans, as defined by the profiles in the Implementation Guide. From a265825a8ec04e2fcaf419cc0962cd5e3186c999 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 14:25:20 +0200 Subject: [PATCH 60/71] Fix ValueSet link in ContactPerson intro Update the ValueSet reference in StructureDefinition-ACP-ContactPerson-intro.md to point to ValueSet-ACP-ContactPersonRoleVS.html (was ValueSet-ACP-ContactPersonRole.html). This is a documentation/link fix only. --- .../pagecontent/StructureDefinition-ACP-ContactPerson-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md index bac6ee2..1d55d42 100644 --- a/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md +++ b/input/pagecontent/StructureDefinition-ACP-ContactPerson-intro.md @@ -2,4 +2,4 @@ This profile adds ACP-specific mappings to the ART-DECOR dataset and obligation extensions for Provider and Consulter actors. Profile references are constrained to ACP profiles where available. The following change affects implementation beyond the base nl-core profile: -* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACP-ContactPersonRole.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_, pre-adopted from the [RolCodelijst in zib Contactpersoon v4.1 (2024)](https://zibs.nl/wiki/Contactpersoon-v4.1(2024NL)#RolCodelijst)). \ No newline at end of file +* An additional slice `.relationship:roleAdditional` has been added, bound to [ACPContactPersonRoleVS](ValueSet-ACP-ContactPersonRoleVS.html). This slice accommodates role codes required by the ACP dataset that are not included in the `RolCodelijst` bound to `.relationship:role` (e.g. SNOMED CT code `310141000146103` _Schriftelijk gemachtigde zorg en behandeling_, pre-adopted from the [RolCodelijst in zib Contactpersoon v4.1 (2024)](https://zibs.nl/wiki/Contactpersoon-v4.1(2024NL)#RolCodelijst)). \ No newline at end of file From 6df0024b89b952f463686da73bbc3abc57c5ae16 Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Tue, 2 Jun 2026 14:44:30 +0200 Subject: [PATCH 61/71] set cardinalities and invariant for CR --- input/fsh/CommunicationRequest.fsh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/input/fsh/CommunicationRequest.fsh b/input/fsh/CommunicationRequest.fsh index 2113c5c..4a81c5a 100644 --- a/input/fsh/CommunicationRequest.fsh +++ b/input/fsh/CommunicationRequest.fsh @@ -7,13 +7,17 @@ Description: "A CommunicationRequest representing the advice or instruction give * category 1..* * category = $snomed#223449006 * category ^comment = "The `category.text` element may be used to provide additional context for human readers next to the pattern category coding, for example: 'Request for patient to inform relatives about treatment agreements'." +* subject 1..1 * subject only Reference(ACPPatient) * encounter only Reference(ACPEncounter) +* requester 1..1 * requester only Reference(ACPHealthProfessionalPractitionerRole or ACPHealthProfessionalPractitioner) +* sender 1..1 * sender only Reference(ACPPatient) * recipient only Reference(ACPContactPerson) * reasonCode 1..* * reasonCode = $snomed#713603004 // "advance care planning" +* obeys cr-date-required * insert ObligationRules(category) // already 1..1 so may not be needed place under obligation but added for consistency * insert ObligationRules(subject) @@ -25,6 +29,12 @@ Description: "A CommunicationRequest representing the advice or instruction give * insert ObligationRules(reasonCode) // already 1..1 so may not be needed place under obligation but added for consistency +Invariant: cr-date-required +Description: "We want to have the date of the CommunicationRequest either in the resource itself or in the Encounter in which the CommunicationRequest originated." +Severity: #error +Expression: "authoredOn.exists() or encounter.exists()" + + Mapping: MapACPInformRelativesRequest Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" From 763f20e36e1a6891322d573fca827be116f1377d Mon Sep 17 00:00:00 2001 From: MariekeMassa Date: Tue, 2 Jun 2026 15:06:34 +0200 Subject: [PATCH 62/71] Change description of cr-date invariant --- input/fsh/CommunicationRequest.fsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/fsh/CommunicationRequest.fsh b/input/fsh/CommunicationRequest.fsh index 4a81c5a..4db93e9 100644 --- a/input/fsh/CommunicationRequest.fsh +++ b/input/fsh/CommunicationRequest.fsh @@ -30,7 +30,7 @@ Description: "A CommunicationRequest representing the advice or instruction give Invariant: cr-date-required -Description: "We want to have the date of the CommunicationRequest either in the resource itself or in the Encounter in which the CommunicationRequest originated." +Description: "The date of the CommunicationRequest is expected to be captured either in the resource itself or in the Encounter in which the CommunicationRequest originated." Severity: #error Expression: "authoredOn.exists() or encounter.exists()" From b350031135b54f54836f77bcfaef5c446cc28a98 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 15:29:47 +0200 Subject: [PATCH 63/71] Remove Patient legal-capacity extension FSH Delete input/fsh/Extension.fsh which defined the ext-Patient.LegallyCapableMedicalTreatmentDecisions FSH extension. The file described a Patient-level extension with two slices: legallyCapable (0..1, boolean) and legallyCapableComment (0..1, string), and referenced the FreedomRestrictingIntervention.LegallyCapable extension as the basis for its purpose. --- input/fsh/Extension.fsh | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 input/fsh/Extension.fsh diff --git a/input/fsh/Extension.fsh b/input/fsh/Extension.fsh deleted file mode 100644 index 2a7de77..0000000 --- a/input/fsh/Extension.fsh +++ /dev/null @@ -1,22 +0,0 @@ -Extension: ExtPatientLegallyCapableMedicalTreatmentDecisions -Id: ext-Patient.LegallyCapableMedicalTreatmentDecisions -Title: "ext Patient.LegallyCapableMedicalTreatmentDecisions" -Description: "An extension to indicate the patient's legal capability regarding medical treatment decisions, and to provide a comment on this capability." -Context: Patient -* ^purpose = "This extension is based on the [extension FreedomRestrictingIntervention.LegallyCapable](http://nictiz.nl/fhir/StructureDefinition/ext-FreedomRestrictingIntervention.LegallyCapable), but is adapted for the ACP context by allowing its use on the Patient resource and specifying its application to treatment decisions." -* insert MetaRules -* extension ^slicing.discriminator.type = #value -* extension ^slicing.discriminator.path = "url" -* extension ^slicing.rules = #open -* extension ^min = 0 -* extension contains - legallyCapable 0..1 and - legallyCapableComment 0..1 -* extension[legallyCapable].value[x] only boolean -* extension[legallyCapable].value[x] ^short = "LegallyCapable" -* extension[legallyCapable].value[x] ^definition = "Indicates the patient's legal capacity (LegallyCapable) regarding medical treatment decisions." -* extension[legallyCapable].value[x] ^alias = "Wilsbekwaam" -* extension[legallyCapableComment].value[x] only string -* extension[legallyCapableComment].value[x] ^short = "LegallyCapableComment" -* extension[legallyCapableComment].value[x] ^definition = "A comment regarding the patient's legal capacity regarding medical treatment decisions." -* extension[legallyCapableComment].value[x] ^alias = "WilsbekwaamToelichting" \ No newline at end of file From 1ea68ed157014e9f6f835074d88355f1e1874e53 Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Tue, 2 Jun 2026 16:40:46 +0200 Subject: [PATCH 64/71] Updated changelog --- input/pagecontent/changelog.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/input/pagecontent/changelog.md b/input/pagecontent/changelog.md index db65a2a..0eb470e 100644 --- a/input/pagecontent/changelog.md +++ b/input/pagecontent/changelog.md @@ -2,12 +2,19 @@ | Issue | Short Description | |-------|-------------------| | [#137](https://github.com/IKNL/PZP-FHIR-R4/issues/137) | Replaced legally capable extension on Patient with an Observation to better support representation of legal capacity. | -||| +| [#132](https://github.com/IKNL/PZP-FHIR-R4/issues/132) | Updated Procedure.code to support multiple ACP procedure codes and ensure compliance with zib/nl-core terminology requirements. | +| [#157](https://github.com/IKNL/PZP-FHIR-R4/issues/157) | Updated CommunicationRequest cardinalities by requiring subject, requester and sender, and adding invariant to ensure request date is present. | | [#151](https://github.com/IKNL/PZP-FHIR-R4/issues/151) | Corrected search URLs by fixing code parameter syntax to ensure proper OR behavior. | +| [#136](https://github.com/IKNL/PZP-FHIR-R4/issues/136) | Improved search query documentation by clarifying how to retrieve specific data items such as ContactPerson (e.g. legal representative). | +| [#135](https://github.com/IKNL/PZP-FHIR-R4/issues/135) | Updated questionnaire answer options to use answerValueSet references where possible and improve alignment with terminology, resolving validation issues. | +| [#138](https://github.com/IKNL/PZP-FHIR-R4/issues/138) | Updated a couple questionnaire items from `choice` to `boolean` to resolve validation issues and align with the dataset. | +| [#126](https://github.com/IKNL/PZP-FHIR-R4/issues/126) | Updated questionnaire to align with latest dataset changes, including support for 'other' treatment directives and addition of missing MeetMethode elements. | +| [#131](https://github.com/IKNL/PZP-FHIR-R4/issues/131) | Replaced fixed questionnaire answer options for 'Functie (specialisme)' with AGB and UZI value sets. | | [#138](https://github.com/IKNL/PZP-FHIR-R4/issues/138) | Updated yes/no questions in the questionnaire to use `boolean` instead of `choice`. | | [#133](https://github.com/IKNL/PZP-FHIR-R4/issues/133) | Aligned API documentation by correcting CommunicationRequest category code in sequence diagram and updating CapabilityStatement to use CommunicationRequest. | | [#129](https://github.com/IKNL/PZP-FHIR-R4/issues/129) | Clarified ContactPerson artifact documentation for `.relationship:roleAdditional` slice. | | [#127](https://github.com/IKNL/PZP-FHIR-R4/issues/127) | Added missing `subject` references to QuestionnaireResponse examples and improved consistency of author/source formatting. | +| [#156](https://github.com/IKNL/PZP-FHIR-R4/issues/156) | Applied QA fixes including ValueSet renaming to avoid duplicate titles. | ### 1.0.0-rc2 From 733a5be729f0b267ce3f4b43c13d55d39e5b443a Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Tue, 2 Jun 2026 16:46:39 +0200 Subject: [PATCH 65/71] missing enter for rendering --- input/pagecontent/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/input/pagecontent/changelog.md b/input/pagecontent/changelog.md index 0eb470e..1792f7a 100644 --- a/input/pagecontent/changelog.md +++ b/input/pagecontent/changelog.md @@ -1,4 +1,5 @@ ### 1.0.0-rc3 + | Issue | Short Description | |-------|-------------------| | [#137](https://github.com/IKNL/PZP-FHIR-R4/issues/137) | Replaced legally capable extension on Patient with an Observation to better support representation of legal capacity. | From 50ec7fa5c7f411b194aef5bf34f3d2b80f2e4295 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 17:00:08 +0200 Subject: [PATCH 66/71] Minor formatting improvements --- input/pagecontent/changelog.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/input/pagecontent/changelog.md b/input/pagecontent/changelog.md index 0eb470e..3f4205b 100644 --- a/input/pagecontent/changelog.md +++ b/input/pagecontent/changelog.md @@ -2,13 +2,13 @@ | Issue | Short Description | |-------|-------------------| | [#137](https://github.com/IKNL/PZP-FHIR-R4/issues/137) | Replaced legally capable extension on Patient with an Observation to better support representation of legal capacity. | -| [#132](https://github.com/IKNL/PZP-FHIR-R4/issues/132) | Updated Procedure.code to support multiple ACP procedure codes and ensure compliance with zib/nl-core terminology requirements. | -| [#157](https://github.com/IKNL/PZP-FHIR-R4/issues/157) | Updated CommunicationRequest cardinalities by requiring subject, requester and sender, and adding invariant to ensure request date is present. | +| [#132](https://github.com/IKNL/PZP-FHIR-R4/issues/132) | Updated `Procedure.code` to support multiple ACP procedure codes and ensure compliance with zib/nl-core terminology requirements. | +| [#157](https://github.com/IKNL/PZP-FHIR-R4/issues/157) | Updated CommunicationRequest cardinalities by requiring `subject`, `requester` and `sender`, and adding an invariant to ensure either `authoredOn` or a reference to Encounter. | | [#151](https://github.com/IKNL/PZP-FHIR-R4/issues/151) | Corrected search URLs by fixing code parameter syntax to ensure proper OR behavior. | | [#136](https://github.com/IKNL/PZP-FHIR-R4/issues/136) | Improved search query documentation by clarifying how to retrieve specific data items such as ContactPerson (e.g. legal representative). | -| [#135](https://github.com/IKNL/PZP-FHIR-R4/issues/135) | Updated questionnaire answer options to use answerValueSet references where possible and improve alignment with terminology, resolving validation issues. | +| [#135](https://github.com/IKNL/PZP-FHIR-R4/issues/135) | Updated questionnaire answer options to use `answerValueSet` references where possible and improve alignment with terminology, resolving validation issues. | | [#138](https://github.com/IKNL/PZP-FHIR-R4/issues/138) | Updated a couple questionnaire items from `choice` to `boolean` to resolve validation issues and align with the dataset. | -| [#126](https://github.com/IKNL/PZP-FHIR-R4/issues/126) | Updated questionnaire to align with latest dataset changes, including support for 'other' treatment directives and addition of missing MeetMethode elements. | +| [#126](https://github.com/IKNL/PZP-FHIR-R4/issues/126) | Updated questionnaire to align with latest dataset changes, including support for 'other' treatment directives and addition of missing 'MeetMethode' elements. | | [#131](https://github.com/IKNL/PZP-FHIR-R4/issues/131) | Replaced fixed questionnaire answer options for 'Functie (specialisme)' with AGB and UZI value sets. | | [#138](https://github.com/IKNL/PZP-FHIR-R4/issues/138) | Updated yes/no questions in the questionnaire to use `boolean` instead of `choice`. | | [#133](https://github.com/IKNL/PZP-FHIR-R4/issues/133) | Aligned API documentation by correcting CommunicationRequest category code in sequence diagram and updating CapabilityStatement to use CommunicationRequest. | From 01093d2014784f04855933aebae6228ed7e0fbd9 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 17:17:39 +0200 Subject: [PATCH 67/71] preparing for 1.0.0-rc3 release - updating version and mapping urls --- input/fsh/CommunicationRequest.fsh | 2 +- input/fsh/Consent.fsh | 4 ++-- input/fsh/Device.fsh | 2 +- input/fsh/DeviceUseStatement.fsh | 2 +- input/fsh/Encounter.fsh | 2 +- input/fsh/Goal.fsh | 2 +- input/fsh/Observation.fsh | 10 +++++----- input/fsh/Patient.fsh | 2 +- input/fsh/Practitioner.fsh | 2 +- input/fsh/PractitionerRole.fsh | 2 +- input/fsh/Procedure.fsh | 2 +- input/fsh/RelatedPerson.fsh | 2 +- input/fsh/RuleSet.fsh | 4 ++-- ...stionnaireResponse-SamiraVanDerSluijs-20251117.json | 2 +- publication-request.json | 4 ++-- sushi-config.yaml | 2 +- 16 files changed, 23 insertions(+), 23 deletions(-) diff --git a/input/fsh/CommunicationRequest.fsh b/input/fsh/CommunicationRequest.fsh index 4db93e9..6ca2790 100644 --- a/input/fsh/CommunicationRequest.fsh +++ b/input/fsh/CommunicationRequest.fsh @@ -39,7 +39,7 @@ Mapping: MapACPInformRelativesRequest Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPInformRelativesRequest -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "734" "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?" diff --git a/input/fsh/Consent.fsh b/input/fsh/Consent.fsh index 9307277..2d00b89 100644 --- a/input/fsh/Consent.fsh +++ b/input/fsh/Consent.fsh @@ -23,7 +23,7 @@ Mapping: MapACPAdvanceDirective Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPAdvanceDirective -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "690" "Euthanasieverklaring (Wilsverklaring)" * -> "700" "Keuze orgaandonatie vastgelegd (Wilsverklaring)" * -> "721" "Eerder vastgelegde behandelafspraken (Wilsverklaring)" @@ -126,7 +126,7 @@ Mapping: MapACPTreatmentDirective Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPTreatmentDirective -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "602" "Behandelgrens (BehandelAanwijzing)" * -> "637" "Afspraak uitzetten ICD (BehandelAanwijzing)" * modifierExtension[specificationOther] -> "605" "SpecificatieAnders" diff --git a/input/fsh/Device.fsh b/input/fsh/Device.fsh index 9314de9..e05c8aa 100644 --- a/input/fsh/Device.fsh +++ b/input/fsh/Device.fsh @@ -18,7 +18,7 @@ Mapping: MapACPMedicalDeviceProductICD Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPMedicalDeviceProductICD -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "621" "Product" * identifier[gs1ProductID] -> "622" "ProductID" * identifier[hibcProductID] -> "622" "ProductID" diff --git a/input/fsh/DeviceUseStatement.fsh b/input/fsh/DeviceUseStatement.fsh index 1a56a5e..c55159f 100644 --- a/input/fsh/DeviceUseStatement.fsh +++ b/input/fsh/DeviceUseStatement.fsh @@ -22,7 +22,7 @@ Mapping: MapACPMedicalDevice Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPMedicalDevice -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "619" "Heeft de patient een ICD?" * -> "620" "ICD (MedischHulpmiddel)" * extension[healthProfessional] -> "635" "Zorgverlener" diff --git a/input/fsh/Encounter.fsh b/input/fsh/Encounter.fsh index c1470f6..8f3d95b 100644 --- a/input/fsh/Encounter.fsh +++ b/input/fsh/Encounter.fsh @@ -28,7 +28,7 @@ Mapping: MapACPEncounter Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPEncounter -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "808" "Contact" * class -> "809" "ContactType" * subject -> "514" "Gesprek gevoerd in bijzijn van (Patient)" // In R5 patient is added to .participant.individual. For now, if present at .subject, we assume the patient was present. Also clear from the definition of the subject element: "The patient or group present at the encounter" diff --git a/input/fsh/Goal.fsh b/input/fsh/Goal.fsh index b24018e..7642523 100644 --- a/input/fsh/Goal.fsh +++ b/input/fsh/Goal.fsh @@ -19,7 +19,7 @@ Mapping: MapACPMedicalPolicyGoal Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPMedicalPolicyGoal -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "590" "Belangrijkste doel van behandeling ([Meting])" * -> "591" "Belangrijkste doel van behandeling ([MetingNaam])" * description -> "592" "Doel ([MetingWaarde])" diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index 3b58fb0..f43227a 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -28,7 +28,7 @@ Mapping: MapACPSpecificCareWishes Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPSpecificCareWishes -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "654" "Specifieke wensen ([Meting])" * code -> "655" "Wens en verwachting patient ([MetingNaam])" * valueString -> "656" "Wens en verwachting patient ([MetingWaarde])" @@ -101,7 +101,7 @@ Mapping: MapACPSPreferredPlaceOfDeath Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPPreferredPlaceOfDeath -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "666" "Gewenste plek van overlijden ([Meting]))" * code -> "667" "Gewenste plek van overlijden ([Meting])" * valueCodeableConcept -> "668" "Voorkeursplek ([MetingWaarde])" @@ -173,7 +173,7 @@ Mapping: MapACPPositionRegardingEuthanasia Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPPositionRegardingEuthanasia -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "678" "Euthanasie standpunt ([Meting])" * code -> "679" "Euthanasie standpunt ([MetingNaam])" * valueCodeableConcept -> "680" "Euthanasie standpunt ([MetingWaarde])" @@ -243,7 +243,7 @@ Mapping: MapACPOrganDonationChoiceRegistration Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPOrganDonationChoiceRegistration -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "746" "Keuze orgaandonatie vastgelegd in donorregister? ([Meting])" * code -> "747" "Keuze orgaandonatie vastgelegd in donorregister? ([MetingNaam])" * valueCodeableConcept -> "748" "Keuze orgaandonatie in donorregister ([MetingWaarde])" @@ -310,7 +310,7 @@ Mapping: MapACPSenseOfPurpose Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPSenseOfPurpose -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "709" "Wat verder nog belangrijk is ([Meting])" * code -> "710" "Wat verder nog belangrijk is ([MetingNaam])" * valueString -> "711" "Wat verder nog belangrijk is ([MetingWaarde])" diff --git a/input/fsh/Patient.fsh b/input/fsh/Patient.fsh index a03ee9e..0247802 100644 --- a/input/fsh/Patient.fsh +++ b/input/fsh/Patient.fsh @@ -45,7 +45,7 @@ Mapping: MapACPPatient Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPPatient -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "351" "Patient" * -> "613" "Patient" * -> "648" "Patient" diff --git a/input/fsh/Practitioner.fsh b/input/fsh/Practitioner.fsh index 5f36db9..27cc7a4 100644 --- a/input/fsh/Practitioner.fsh +++ b/input/fsh/Practitioner.fsh @@ -15,7 +15,7 @@ Mapping: MapACPHealthProfessionalPractitioner Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPHealthProfessionalPractitioner -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "391" "Gesprek gevoerd door (Zorgverlener)" * identifier -> "392" "ZorgverlenerIdentificatienummer" * name -> "393" "Naamgegevens" diff --git a/input/fsh/PractitionerRole.fsh b/input/fsh/PractitionerRole.fsh index 33c950a..3094811 100644 --- a/input/fsh/PractitionerRole.fsh +++ b/input/fsh/PractitionerRole.fsh @@ -13,7 +13,7 @@ Mapping: MapACPHealthProfessionalPractitionerRole Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPHealthProfessionalPractitionerRole -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "391" "Gesprek gevoerd door (Zorgverlener)" * -> "617" "Zorgverlener" * -> "636" "Zorgverlener" diff --git a/input/fsh/Procedure.fsh b/input/fsh/Procedure.fsh index 7ad4001..07ab621 100644 --- a/input/fsh/Procedure.fsh +++ b/input/fsh/Procedure.fsh @@ -17,7 +17,7 @@ Mapping: MapACPProcedure Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPProcedure -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "820" "Verrichting" * code -> "827" "PZP gesprek (VerrichtingType)" diff --git a/input/fsh/RelatedPerson.fsh b/input/fsh/RelatedPerson.fsh index 3908c41..73dad38 100644 --- a/input/fsh/RelatedPerson.fsh +++ b/input/fsh/RelatedPerson.fsh @@ -52,7 +52,7 @@ Mapping: MapACPContactPerson Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPContactPerson -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" * -> "441" "Wettelijk vertegenwoordiger (Contactpersoon)" * -> "478" "Eerste contactpersoon (Contactpersoon)" * -> "615" "Contactpersoon" diff --git a/input/fsh/RuleSet.fsh b/input/fsh/RuleSet.fsh index d1f2a2f..ecdbb5b 100644 --- a/input/fsh/RuleSet.fsh +++ b/input/fsh/RuleSet.fsh @@ -1,5 +1,5 @@ RuleSet: MetaRules -* ^version = "1.0.0-rc2" +* ^version = "1.0.0-rc3" * ^status = #draft * ^experimental = false * ^publisher = "IKNL" @@ -10,7 +10,7 @@ RuleSet: MetaRules * ^copyright = "Copyright and related rights waived via CC0, https://creativecommons.org/publicdomain/zero/1.0/. This does not apply to information from third parties, for example a medical terminology system. The implementer alone is responsible for identifying and obtaining any necessary licenses or authorizations to utilize third party IP in connection with the specification or otherwise." RuleSet: MetaRulesDefinitionalArtifact -* version = "1.0.0-rc2" +* version = "1.0.0-rc3" * date = "2026-03-03" * status = #active * experimental = false diff --git a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json index 3eda159..82099ce 100644 --- a/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json +++ b/input/resources/QuestionnaireResponse-SamiraVanDerSluijs-20251117.json @@ -10,7 +10,7 @@ }, "status": "completed", "authored": "2025-11-27T16:15:00.733Z", - "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc2", + "questionnaire": "https://api.iknl.nl/docs/pzp/r4/Questionnaire/ACP-zib2020|1.0.0-rc3", "subject": { "reference": "Patient/ACP-Patient-SamiraVanDerSluijs-Pat2", "display": "Patient, Samira van der Sluijs" diff --git a/publication-request.json b/publication-request.json index 944620b..4431e13 100644 --- a/publication-request.json +++ b/publication-request.json @@ -1,7 +1,7 @@ { "package-id" : "iknl.fhir.r4.pzp", - "version" : "1.0.0-rc2", - "path" : "https://api.iknl.nl/docs/pzp/r4/1.0.0-rc2", + "version" : "1.0.0-rc3", + "path" : "https://api.iknl.nl/docs/pzp/r4/1.0.0-rc3", "mode" : "working", "status" : "trial-use", "sequence" : "Release 1", diff --git a/sushi-config.yaml b/sushi-config.yaml index 5142b6a..06c4be8 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -9,7 +9,7 @@ name: PZP title: Advance Care Planning (PZP) description: Advance Care Planning (PZP) IG for FHIR R4 based on zib release 2020 status: active # draft | active | retired | unknown -version: 1.0.0-rc2 +version: 1.0.0-rc3 fhirVersion: 4.0.1 # https://www.hl7.org/fhir/valueset-FHIR-version.html copyrightYear: 2026+ releaseLabel: trial-use From 22c47922b385d4a49a69e8fbf021727d19edef3f Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Tue, 2 Jun 2026 17:36:24 +0200 Subject: [PATCH 68/71] Updated missed version --- input/ignoreWarnings.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index 4d3cfd0..6aae3bc 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -18,8 +18,8 @@ # Manual check in latest version of SNOMED does find the code '1351964001'. The error might be due to a older version of SNOMED available in tx.fhir.org/r4 %Unknown code '1351964001' in the CodeSystem 'http://snomed.info/sct' version 'http://snomed.info/sct/11000146104/version/20240930'% -%Geen van de gevonden codings bestaan in waardelijst 'ACP Primary Agreed-upon Goal of Medical Policy Codes' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoalVS|1.0.0-rc2) en een coding uit deze waardelijst is verplicht (codes = http://snomed.info/sct#1351964001)% -%None of the codings provided are in the value set 'ACP Primary Agreed-upon Goal of Medical Policy Codes' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoalVS|1.0.0-rc2), and a coding from this value set is required) (codes = http://snomed.info/sct#1351964001)% +%Geen van de gevonden codings bestaan in waardelijst 'ACP Primary Agreed-upon Goal of Medical Policy Codes' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoalVS|1.0.0-rc3) en een coding uit deze waardelijst is verplicht (codes = http://snomed.info/sct#1351964001)% +%None of the codings provided are in the value set 'ACP Primary Agreed-upon Goal of Medical Policy Codes' (https://api.iknl.nl/docs/pzp/r4/ValueSet/ACP-MedicalPolicyGoalVS|1.0.0-rc3), and a coding from this value set is required) (codes = http://snomed.info/sct#1351964001)% # Manual check in latest version of SNOMED does find the code '665671000146101'. The error might be due to a older version of SNOMED available in tx.fhir.org/r4 %Unknown code '665671000146101' in the CodeSystem 'http://snomed.info/sct' version 'http://snomed.info/sct/11000146104/version/20240930' (Netherlands Edition)% From ea0c3955ad6b74dd5701a5fee1ccad81312a0bef Mon Sep 17 00:00:00 2001 From: Harmke Koning Date: Wed, 3 Jun 2026 10:32:17 +0200 Subject: [PATCH 69/71] repared links download page --- input/pagecontent/downloads.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/input/pagecontent/downloads.md b/input/pagecontent/downloads.md index 5e17392..284ae2d 100644 --- a/input/pagecontent/downloads.md +++ b/input/pagecontent/downloads.md @@ -1,23 +1,23 @@ ### Full IG -Download the entire implementation guide [here](full-ig.zip). +Download the entire implementation guide [here](../full-ig.zip). ### NPM Package and Definitions The following file contains all the value sets, profiles, extensions, list of pages and urls in the IG, etc. defined as part of this Implementation Guide: -- [NPM Package](package.tgz) +- [NPM Package](../package.tgz) In addition there are format specific definition files: -- [XML](definitions.xml.zip) -- [JSON](definitions.json.zip) -- [TTL](definitions.ttl.zip) +- [XML](../definitions.xml.zip) +- [JSON](../definitions.json.zip) +- [TTL](../definitions.ttl.zip) ### Examples All of the examples that are used in this Implementation Guide are available for download: -- [XML](examples.xml.zip) -- [JSON](examples.json.zip) -- [TTL](examples.ttl.zip) \ No newline at end of file +- [XML](../examples.xml.zip) +- [JSON](../examples.json.zip) +- [TTL](../examples.ttl.zip) \ No newline at end of file From 23df8de8405e7267fb3a43ecb5816f77caa3ed00 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 3 Jun 2026 14:51:19 +0200 Subject: [PATCH 70/71] Update mapping uri and internal mapping identity without version --- input/fsh/CommunicationRequest.fsh | 2 +- input/fsh/Consent.fsh | 4 ++-- input/fsh/Device.fsh | 2 +- input/fsh/DeviceUseStatement.fsh | 2 +- input/fsh/Encounter.fsh | 2 +- input/fsh/Goal.fsh | 2 +- input/fsh/Observation.fsh | 10 +++++----- input/fsh/Patient.fsh | 2 +- input/fsh/Practitioner.fsh | 2 +- input/fsh/PractitionerRole.fsh | 2 +- input/fsh/Procedure.fsh | 2 +- input/fsh/RelatedPerson.fsh | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/input/fsh/CommunicationRequest.fsh b/input/fsh/CommunicationRequest.fsh index 6ca2790..8896396 100644 --- a/input/fsh/CommunicationRequest.fsh +++ b/input/fsh/CommunicationRequest.fsh @@ -39,7 +39,7 @@ Mapping: MapACPInformRelativesRequest Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPInformRelativesRequest -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "734" "Heeft u patient geïnformeerd over eigen verantwoordelijkheid om deze behandelafspraken met naasten te bespreken?" diff --git a/input/fsh/Consent.fsh b/input/fsh/Consent.fsh index 2d00b89..9f07db5 100644 --- a/input/fsh/Consent.fsh +++ b/input/fsh/Consent.fsh @@ -23,7 +23,7 @@ Mapping: MapACPAdvanceDirective Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPAdvanceDirective -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "690" "Euthanasieverklaring (Wilsverklaring)" * -> "700" "Keuze orgaandonatie vastgelegd (Wilsverklaring)" * -> "721" "Eerder vastgelegde behandelafspraken (Wilsverklaring)" @@ -126,7 +126,7 @@ Mapping: MapACPTreatmentDirective Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPTreatmentDirective -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "602" "Behandelgrens (BehandelAanwijzing)" * -> "637" "Afspraak uitzetten ICD (BehandelAanwijzing)" * modifierExtension[specificationOther] -> "605" "SpecificatieAnders" diff --git a/input/fsh/Device.fsh b/input/fsh/Device.fsh index e05c8aa..62af244 100644 --- a/input/fsh/Device.fsh +++ b/input/fsh/Device.fsh @@ -18,7 +18,7 @@ Mapping: MapACPMedicalDeviceProductICD Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPMedicalDeviceProductICD -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "621" "Product" * identifier[gs1ProductID] -> "622" "ProductID" * identifier[hibcProductID] -> "622" "ProductID" diff --git a/input/fsh/DeviceUseStatement.fsh b/input/fsh/DeviceUseStatement.fsh index c55159f..50ffcc1 100644 --- a/input/fsh/DeviceUseStatement.fsh +++ b/input/fsh/DeviceUseStatement.fsh @@ -22,7 +22,7 @@ Mapping: MapACPMedicalDevice Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPMedicalDevice -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "619" "Heeft de patient een ICD?" * -> "620" "ICD (MedischHulpmiddel)" * extension[healthProfessional] -> "635" "Zorgverlener" diff --git a/input/fsh/Encounter.fsh b/input/fsh/Encounter.fsh index 8f3d95b..d068634 100644 --- a/input/fsh/Encounter.fsh +++ b/input/fsh/Encounter.fsh @@ -28,7 +28,7 @@ Mapping: MapACPEncounter Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPEncounter -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "808" "Contact" * class -> "809" "ContactType" * subject -> "514" "Gesprek gevoerd in bijzijn van (Patient)" // In R5 patient is added to .participant.individual. For now, if present at .subject, we assume the patient was present. Also clear from the definition of the subject element: "The patient or group present at the encounter" diff --git a/input/fsh/Goal.fsh b/input/fsh/Goal.fsh index 7642523..6898df3 100644 --- a/input/fsh/Goal.fsh +++ b/input/fsh/Goal.fsh @@ -19,7 +19,7 @@ Mapping: MapACPMedicalPolicyGoal Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPMedicalPolicyGoal -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "590" "Belangrijkste doel van behandeling ([Meting])" * -> "591" "Belangrijkste doel van behandeling ([MetingNaam])" * description -> "592" "Doel ([MetingWaarde])" diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index f43227a..ec5c939 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -28,7 +28,7 @@ Mapping: MapACPSpecificCareWishes Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPSpecificCareWishes -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "654" "Specifieke wensen ([Meting])" * code -> "655" "Wens en verwachting patient ([MetingNaam])" * valueString -> "656" "Wens en verwachting patient ([MetingWaarde])" @@ -101,7 +101,7 @@ Mapping: MapACPSPreferredPlaceOfDeath Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPPreferredPlaceOfDeath -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "666" "Gewenste plek van overlijden ([Meting]))" * code -> "667" "Gewenste plek van overlijden ([Meting])" * valueCodeableConcept -> "668" "Voorkeursplek ([MetingWaarde])" @@ -173,7 +173,7 @@ Mapping: MapACPPositionRegardingEuthanasia Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPPositionRegardingEuthanasia -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "678" "Euthanasie standpunt ([Meting])" * code -> "679" "Euthanasie standpunt ([MetingNaam])" * valueCodeableConcept -> "680" "Euthanasie standpunt ([MetingWaarde])" @@ -243,7 +243,7 @@ Mapping: MapACPOrganDonationChoiceRegistration Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPOrganDonationChoiceRegistration -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "746" "Keuze orgaandonatie vastgelegd in donorregister? ([Meting])" * code -> "747" "Keuze orgaandonatie vastgelegd in donorregister? ([MetingNaam])" * valueCodeableConcept -> "748" "Keuze orgaandonatie in donorregister ([MetingWaarde])" @@ -310,7 +310,7 @@ Mapping: MapACPSenseOfPurpose Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPSenseOfPurpose -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "709" "Wat verder nog belangrijk is ([Meting])" * code -> "710" "Wat verder nog belangrijk is ([MetingNaam])" * valueString -> "711" "Wat verder nog belangrijk is ([MetingWaarde])" diff --git a/input/fsh/Patient.fsh b/input/fsh/Patient.fsh index 0247802..80ab490 100644 --- a/input/fsh/Patient.fsh +++ b/input/fsh/Patient.fsh @@ -45,7 +45,7 @@ Mapping: MapACPPatient Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPPatient -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "351" "Patient" * -> "613" "Patient" * -> "648" "Patient" diff --git a/input/fsh/Practitioner.fsh b/input/fsh/Practitioner.fsh index 27cc7a4..6699edc 100644 --- a/input/fsh/Practitioner.fsh +++ b/input/fsh/Practitioner.fsh @@ -15,7 +15,7 @@ Mapping: MapACPHealthProfessionalPractitioner Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPHealthProfessionalPractitioner -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "391" "Gesprek gevoerd door (Zorgverlener)" * identifier -> "392" "ZorgverlenerIdentificatienummer" * name -> "393" "Naamgegevens" diff --git a/input/fsh/PractitionerRole.fsh b/input/fsh/PractitionerRole.fsh index 3094811..76eea05 100644 --- a/input/fsh/PractitionerRole.fsh +++ b/input/fsh/PractitionerRole.fsh @@ -13,7 +13,7 @@ Mapping: MapACPHealthProfessionalPractitionerRole Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPHealthProfessionalPractitionerRole -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "391" "Gesprek gevoerd door (Zorgverlener)" * -> "617" "Zorgverlener" * -> "636" "Zorgverlener" diff --git a/input/fsh/Procedure.fsh b/input/fsh/Procedure.fsh index 07ab621..27f93c6 100644 --- a/input/fsh/Procedure.fsh +++ b/input/fsh/Procedure.fsh @@ -17,7 +17,7 @@ Mapping: MapACPProcedure Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPProcedure -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "820" "Verrichting" * code -> "827" "PZP gesprek (VerrichtingType)" diff --git a/input/fsh/RelatedPerson.fsh b/input/fsh/RelatedPerson.fsh index 73dad38..b4a7b69 100644 --- a/input/fsh/RelatedPerson.fsh +++ b/input/fsh/RelatedPerson.fsh @@ -52,7 +52,7 @@ Mapping: MapACPContactPerson Id: pall-izppz-zib2020v2026-02-24 Title: "ACP dataset" Source: ACPContactPerson -Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07:58:08" +Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" * -> "441" "Wettelijk vertegenwoordiger (Contactpersoon)" * -> "478" "Eerste contactpersoon (Contactpersoon)" * -> "615" "Contactpersoon" From 1946d2fe5ff6be63bb272224e999952b26044a08 Mon Sep 17 00:00:00 2001 From: Ardon Toonstra Date: Wed, 3 Jun 2026 14:59:30 +0200 Subject: [PATCH 71/71] Remove version in internal mapping identity --- input/fsh/CommunicationRequest.fsh | 2 +- input/fsh/Consent.fsh | 4 ++-- input/fsh/Device.fsh | 2 +- input/fsh/DeviceUseStatement.fsh | 2 +- input/fsh/Encounter.fsh | 2 +- input/fsh/Goal.fsh | 2 +- input/fsh/Observation.fsh | 12 ++++++------ input/fsh/Patient.fsh | 2 +- input/fsh/Practitioner.fsh | 2 +- input/fsh/PractitionerRole.fsh | 2 +- input/fsh/Procedure.fsh | 2 +- input/fsh/RelatedPerson.fsh | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/input/fsh/CommunicationRequest.fsh b/input/fsh/CommunicationRequest.fsh index 8896396..6a6479c 100644 --- a/input/fsh/CommunicationRequest.fsh +++ b/input/fsh/CommunicationRequest.fsh @@ -36,7 +36,7 @@ Expression: "authoredOn.exists() or encounter.exists()" Mapping: MapACPInformRelativesRequest -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPInformRelativesRequest Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Consent.fsh b/input/fsh/Consent.fsh index 9f07db5..cecda6f 100644 --- a/input/fsh/Consent.fsh +++ b/input/fsh/Consent.fsh @@ -20,7 +20,7 @@ Description: "A verbal or written description of the patient’s wishes with reg Mapping: MapACPAdvanceDirective -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPAdvanceDirective Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" @@ -123,7 +123,7 @@ Description: "A joint decision between a health professional (for example a gene Mapping: MapACPTreatmentDirective -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPTreatmentDirective Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Device.fsh b/input/fsh/Device.fsh index 62af244..2d83d6d 100644 --- a/input/fsh/Device.fsh +++ b/input/fsh/Device.fsh @@ -15,7 +15,7 @@ Description: "The medical device (internally or externally). In the context of A Mapping: MapACPMedicalDeviceProductICD -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPMedicalDeviceProductICD Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/DeviceUseStatement.fsh b/input/fsh/DeviceUseStatement.fsh index 50ffcc1..dabf531 100644 --- a/input/fsh/DeviceUseStatement.fsh +++ b/input/fsh/DeviceUseStatement.fsh @@ -19,7 +19,7 @@ Description: "Any internally implanted and external devices and/or aids used by * insert ObligationRules(note.text) Mapping: MapACPMedicalDevice -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPMedicalDevice Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Encounter.fsh b/input/fsh/Encounter.fsh index d068634..41e03ac 100644 --- a/input/fsh/Encounter.fsh +++ b/input/fsh/Encounter.fsh @@ -25,7 +25,7 @@ Description: "Any interaction, regardless of the situation, between a patient an Mapping: MapACPEncounter -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPEncounter Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Goal.fsh b/input/fsh/Goal.fsh index 6898df3..deb2431 100644 --- a/input/fsh/Goal.fsh +++ b/input/fsh/Goal.fsh @@ -16,7 +16,7 @@ Description: "The primary, agreed-upon goal of a patient's medical treatment pol * insert ObligationRules(note.text) Mapping: MapACPMedicalPolicyGoal -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPMedicalPolicyGoal Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Observation.fsh b/input/fsh/Observation.fsh index ec5c939..49abac6 100644 --- a/input/fsh/Observation.fsh +++ b/input/fsh/Observation.fsh @@ -25,7 +25,7 @@ Description: "The patient's wishes and expectations concerning their treatment, * insert ObligationRules(performer) Mapping: MapACPSpecificCareWishes -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPSpecificCareWishes Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" @@ -98,7 +98,7 @@ Description: "The preferred place of death. This is the place where the patient * insert ObligationRules(performer) Mapping: MapACPSPreferredPlaceOfDeath -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPPreferredPlaceOfDeath Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" @@ -170,7 +170,7 @@ Description: "The patient's position regarding euthanasia. Based on Observation Mapping: MapACPPositionRegardingEuthanasia -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPPositionRegardingEuthanasia Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" @@ -240,7 +240,7 @@ Description: "Observation capturing whether the patient's organ donation choice * insert ObligationRules(performer) Mapping: MapACPOrganDonationChoiceRegistration -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPOrganDonationChoiceRegistration Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" @@ -307,7 +307,7 @@ Description: "Observation capturing the patient's sense of purpose and other imp Mapping: MapACPSenseOfPurpose -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPSenseOfPurpose Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" @@ -371,7 +371,7 @@ Description: "Indicates whether the patient is currently assessed as having the * insert ObligationRules(performer) Mapping: MapACPLegallyCapable -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPLegallyCapable Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-02-24T09:29:59" diff --git a/input/fsh/Patient.fsh b/input/fsh/Patient.fsh index 80ab490..29ba6a0 100644 --- a/input/fsh/Patient.fsh +++ b/input/fsh/Patient.fsh @@ -42,7 +42,7 @@ Description: "A person who receives medical, psychological, paramedical, or nurs * insert ObligationRules(address.type) Mapping: MapACPPatient -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPPatient Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Practitioner.fsh b/input/fsh/Practitioner.fsh index 6699edc..b09a71c 100644 --- a/input/fsh/Practitioner.fsh +++ b/input/fsh/Practitioner.fsh @@ -12,7 +12,7 @@ Description: "A person who is authorized to perform actions in the field of indi Mapping: MapACPHealthProfessionalPractitioner -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPHealthProfessionalPractitioner Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/PractitionerRole.fsh b/input/fsh/PractitionerRole.fsh index 76eea05..24b8cb5 100644 --- a/input/fsh/PractitionerRole.fsh +++ b/input/fsh/PractitionerRole.fsh @@ -10,7 +10,7 @@ Description: "The specialty of a person who is authorized to perform actions in * insert ObligationRules(specialty[specialty]) Mapping: MapACPHealthProfessionalPractitionerRole -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPHealthProfessionalPractitionerRole Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/Procedure.fsh b/input/fsh/Procedure.fsh index 27f93c6..f37af33 100644 --- a/input/fsh/Procedure.fsh +++ b/input/fsh/Procedure.fsh @@ -14,7 +14,7 @@ Description: "Advance Care Planning procedure. Based on nl-core-Procedure-event * insert ObligationRules(code) Mapping: MapACPProcedure -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPProcedure Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08" diff --git a/input/fsh/RelatedPerson.fsh b/input/fsh/RelatedPerson.fsh index b4a7b69..4d21037 100644 --- a/input/fsh/RelatedPerson.fsh +++ b/input/fsh/RelatedPerson.fsh @@ -49,7 +49,7 @@ For the ACP use case, additional codes beyond those in the existing ContactPerso Mapping: MapACPContactPerson -Id: pall-izppz-zib2020v2026-02-24 +Id: pall-izppz-zib2020 Title: "ACP dataset" Source: ACPContactPerson Target: "https://decor.nictiz.nl/exist/apps/api/dataset/2.16.840.1.113883.2.4.3.11.60.117.1.1/2020-07-29T10%3A37%3A48/$view?language=nl-NL&ui=nl-NL&format=html&hidecolumns=3456gh&release=2026-05-12T07%3A58%3A08"