FHIR IG analytics| Package | silfhirprofileig |
| Resource Type | StructureMap |
| Id | StructureMap-ExtractDeclineForm.json |
| FHIR Version | R5 |
| Source | https://build.fhir.org/ig/savannahghi/sil_fhir_profile_ig/StructureMap-ExtractDeclineForm.html |
| URL | https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDeclineForm |
| Version | 0.1.0 |
| Status | active |
| Date | 2026-09-11T12:18:36+00:00 |
| Name | ExtractDeclineForm |
| Title | Decline Form Extraction |
| Description | The refusal out as a Consent with `decision = 'deny'` -- the only deny decision in this whole set -- with one provision per thing actually being refused, so a patient refusing a single procedure is not recorded as having refused all care. An Observation records whether they understood the explanation and in which language, because that is what makes the refusal informed and it is the fact a later dispute turns on. |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
Generated Narrative: StructureMap ExtractDeclineForm
/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDeclineForm' /// name = 'ExtractDeclineForm' /// title = 'Decline Form Extraction' /// status = 'active' /// description = 'The refusal out as a Consent with `decision = \'deny\'` -- the only deny decision in this whole set -- with one provision per thing actually being refused, so a patient refusing a single procedure is not recorded as having refused all care. An Observation records whether they understood the explanation and in which language, because that is what makes the refusal informed and it is the fact a later dispute turns on.' uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QR as source uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target uses "http://hl7.org/fhir/StructureDefinition/Consent" alias Consent as target uses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as target group ExtractDeclineForm(source qr : QR, target bundle : Bundle) { qr -> bundle.type = 'transaction' "setBundleType"; // Guarded on the person having actually signed. A refusal built from a // half-filled form asserts that somebody declined care when they may not have. qr where (item.where(linkId = 'signatures').item.where(linkId = 'signatures/person-signed').answer.value = true) -> bundle.entry as entry, entry.resource = create('Consent') as consent then { qr -> consent, entry then BuildConsentBase(qr, consent, entry) "base"; qr -> consent.status = 'active' "status"; // `deny`, not `permit`. This is the one form in the set that records a // refusal, and the whole resource turns on this single code. qr -> consent.decision = 'deny' "decision"; qr -> consent.category as cat then { qr -> cat.coding as cg then { qr -> cg.system = 'http://terminology.hl7.org/CodeSystem/consentcategorycodes' "sys"; qr -> cg.code = 'acd' "cd"; qr -> cg.display = 'Advance Directive' "dsp"; } "coding"; qr -> cat.text = 'Decline of care, procedure or assessment' "categoryText"; } "category"; qr.item as sg where (linkId = 'signatures') then { sg.item as it where ((linkId = 'signatures/signed-on') and answer.value.exists()) then { it.answer first as a then { a.value as d -> consent.date = d "signedDate"; }; } "signedOnRule"; // The witness verifies the refusal. On this form that matters more than on // a consent: the hospital is recording that somebody left against advice. sg.item as it where ((linkId = 'signatures/witness-signed') and (answer.value = true)) -> consent.verification as ver then { it -> ver.verified = true "verified"; sg.item as wn where ((linkId = 'signatures/witness-name') and answer.value.exists()) then { wn.answer first as wa then { wa.value as txt -> ver.verifiedBy = create('Reference') as ref, ref.display = txt "witnessDisplay"; }; } "witnessNameRule"; } "witnessVerification"; } "signaturesGroup"; qr.item as pg where (linkId = 'person-declining') then { pg.item as it where ((linkId = 'person-declining/name') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> consent.grantor = create('Reference') as ref, ref.display = txt "grantorDisplay"; }; } "nameRule"; pg.item as it where ((linkId = 'person-declining/relationship') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> consent.grantor = create('Reference') as ref, ref.display = txt "relationshipDisplay"; }; } "relationshipRule"; } "personGroup"; qr.item as eg where (linkId = 'what-was-explained') then { eg.item as it where ((linkId = 'what-was-explained/doctor') and answer.value.exists()) then { it.answer first as a then { a.value as ref -> consent.manager = ref "manager"; }; } "doctorRule"; } "explainedGroup"; // ── One provision per thing refused ───────────────────────────────────── // The sheet prints "care/procedure/assessment" as one slashed phrase. A // single provision saying all three would record a patient who declined one // investigation as having refused every kind of care, which is both wrong // and the sort of wrong that ends up in a coroner's court. qr.item as it where (linkId = 'declining') then { it.answer as a -> consent.provision as prov then { a.value as cv -> prov.code as pc then { cv -> pc.coding = cv "coding"; cv.display as d -> pc.text = d "text"; } "declineCode"; } "declineProvision"; } "decliningGroup"; qr.item as it where ((linkId = 'procedure-declined') and answer.value.exists()) -> consent.provision as prov then { it.answer first as a then { a.value as txt -> prov.code as pc, pc.text = txt "procedureText"; }; } "procedureDeclinedProvision"; // Where the patient is going. Recorded on the Consent because it is part of // the refusal -- a patient transferring to another hospital and one going // home carry different follow-up obligations. qr.item as it where ((linkId = 'destination') and answer.value.exists()) -> consent.provision as prov then { it.answer first as a then { a.value as cv -> prov.code as pc then { cv -> pc.coding = cv "coding"; cv.display as d -> pc.text = append('Opting to go to: ', d) "text"; } "destinationCode"; }; } "destinationProvision"; } "createDeclineConsent"; // ── Was the refusal informed? ─────────────────────────────────────────── // Its own Observation. Not a provision -- it is not a thing being refused -- // but it is the fact that makes the refusal defensible, and it carries the // language the discussion was held in. The paper form is bilingual and the // language was previously only implied by which half of the sheet was signed. qr.item as g where (linkId = 'what-was-explained') then { g.item as it where ((linkId = 'what-was-explained/understood') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('Observation') as obs then { qr -> obs, entry then BuildObsBase(qr, obs, entry) "base"; qr -> obs then SetSurveyCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem' "sys"; it -> cg.code = 'capacity-to-consent' "cd"; it -> cg.display = 'Capacity to consent' "dsp"; } "coding"; it -> cc.text = 'Understood the explanation of the condition and the risks of declining' "codeText"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as vc then { cv -> vc.coding = cv "valueCoding"; cv.display as d -> vc.text = d "valueText"; } "codedValue"; }; it.answer first as a then { a.value as cv where (code = 'N') -> obs.interpretation as interp then { cv -> interp.coding as icg then { cv -> icg.system = 'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation' "sys"; cv -> icg.code = 'A' "cd"; cv -> icg.display = 'Abnormal' "dsp"; } "coding"; } "notUnderstoodInterp"; } "understoodInterpretation"; g.item as it where (linkId = 'what-was-explained/language') then { it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "note"; g.item as it where (linkId = 'what-was-explained/condition-and-risks') then { it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "note2"; } "understoodObservation"; } "explainedGroup"; } // ───────────────────────────────────────────────────────────────────────────── // Shared scaffolding. Repeated in each map rather than imported: the transform // engine resolves `imports` against whatever StructureMaps happen to be on the // server, and a form that stops extracting because a shared map was not // uploaded is a worse failure than a duplicated group. // Two notes on what the publisher's StructureMap validator says about this file. // Source parameters below are left untyped on purpose. Writing `: Element` makes // the validator compare QuestionnaireResponse.item against the literal 'Element' // and report them as incompatible with each other, which is noise, not a finding. // `evaluate(context, expression)` is flagged as "takes 1 parameter but 2 were // found". Leave it. The FML parser in the same jar refuses the one-argument form // outright -- it wants a parameter, a comma, then the FHIRPath -- so the // publisher is objecting to what its own compiler emits. Two arguments is the // only form that compiles, and it is what the R5 transform engine executes. // ───────────────────────────────────────────────────────────────────────────── group BuildObsBase(source qr : QR, target obs : Observation, target entry) { qr -> obs then SetResponseProvenance(qr, obs) "responseProvenance"; qr -> obs.id = uuid() then SetObservationFullUrl(obs, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Observation' "requestUrl"; } "entryRequest"; qr -> obs.status = 'final' "status"; qr.subject as s -> obs.subject = s; qr.encounter as e -> obs.encounter = e; qr.authored as t -> obs.effective = t "effective"; qr.source as src -> obs.performer = src "performerFromSource"; qr where (source.exists().not()) then { qr.author as a -> obs.performer = a "performerFromAuthor"; } "performerFallback"; // A stored response's id already reads "QuestionnaireResponse/<id>", so it is // a relative reference as it stands. The hasValue() guard is what stops an // unsaved response -- one posted straight to $extract rather than saved first // -- from writing "QuestionnaireResponse/null" into the record. qr.id as qid where ($this.hasValue()) -> obs.derivedFrom = create('Reference') as ref, ref.reference = qid "linkQuestionnaireResponse"; } group SetObservationFullUrl(source obs : Observation, target entry) { obs.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Observation/', id) "assignFullUrl"; } // The two answer shapes a component can carry. Both read the answer through the // untyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its // typed property name fails at transform time on HAPI R5 with "Attempt to read // invalid property ... on QuestionnaireResponse.item.answer". group SetComponentCodedValue(source it, target comp) { it.answer first as a then { a.value as cv -> comp.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; } "componentAnswer"; } group SetComponentValue(source it, target comp) { it.answer first as a then { a.value as v -> comp.value = v "plainValue"; } "componentAnswer"; } group SetSurveyCategory(source qr : QR, target obs : Observation) { qr -> obs.category as cat then { qr -> cat.coding as coding then { qr -> coding.system = 'http://terminology.hl7.org/CodeSystem/observation-category' "categorySystem"; qr -> coding.code = 'survey' "categoryCode"; qr -> coding.display = 'Survey' "categoryDisplay"; } "categoryCoding"; } "category"; } group BuildConsentBase(source qr : QR, target r : Consent, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetConsentFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Consent' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetConsentFullUrl(source r : Consent, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Consent/', id) "assignFullUrl"; } // ── Provenance and tenancy ─────────────────────────────────────────────────── // Two tags on everything this map creates. The first says which questionnaire // produced it, so a form that reopens mid-admission recalls its own earlier // entries and not another form's. The second copies the tenant tags off the // response, because nothing else on the path puts them there. // The code is the form's document type, not the questionnaire's id: every // environment mints its own ids, and there is only one set of maps, so an id // here would tie the tag to whichever environment stamped it. // ── Provenance and tenancy ─────────────────────────────────────────────────── group SetResponseProvenance(source qr : QR, target r) { qr -> r.meta as m then { qr -> m.tag as t then { qr -> t.system = 'http://slade360edi.com/questionnaire-provenance' "provenanceSystem"; qr -> t.code = 'decline-form' "provenanceCode"; qr -> t.display = 'Decline form' "provenanceDisplay"; } "provenanceTag"; } "provenanceMeta"; // Every tag the response carries, onto the resource. `meta` is 0..1, so this // lands on the same meta the rule above created rather than a second one. qr.meta as qm then { qm.tag as qt -> r.meta as m, m.tag = qt "copyTag"; } "tenantTags"; }
{
"resourceType": "StructureMap",
"id": "ExtractDeclineForm",
"text": {
"status": "generated",
"div": "<!-- snip (see above) -->"
},
"url": "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDeclineForm",
"version": "0.1.0",
"name": "ExtractDeclineForm",
"title": "Decline Form Extraction",
"status": "active",
"date": "2026-09-11T12:18:36+00:00",
"publisher": "Kathurima Kimathi",
"contact": [
{
"name": "Kathurima Kimathi",
"telecom": [
{
"system": "url",
"value": "https://www.linkedin.com/in/kathurima-kimathi/"
},
{
"system": "email",
"value": "kathurimakimathi415@gmail.com"
}
]
},
{
"name": "Oscar John",
"telecom": [
{
"system": "email",
"value": "oscarjohnotieno@gmail.com",
"use": "work"
}
]
},
{
"name": "Kennedy Omondi",
"telecom": [
{
"system": "email",
"value": "kennankole@gmail.com",
"use": "work"
}
]
}
],
"description": "The refusal out as a Consent with `decision = 'deny'` -- the only deny decision in this whole set -- with one provision per thing actually being refused, so a patient refusing a single procedure is not recorded as having refused all care. An Observation records whether they understood the explanation and in which language, because that is what makes the refusal informed and it is the fact a later dispute turns on.",
"structure": [
{
"url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
"mode": "source",
"alias": "QR"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Bundle",
"mode": "target",
"alias": "Bundle"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Consent",
"mode": "target",
"alias": "Consent"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Observation",
"mode": "target",
"alias": "Observation"
}
],
"group": [
{
"name": "ExtractDeclineForm",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "bundle",
"type": "Bundle",
"mode": "target"
}
],
"rule": [
{
"name": "setBundleType",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "bundle",
"element": "type",
"transform": "copy",
"parameter": [
{
"valueString": "transaction"
}
]
}
]
},
{
"name": "createDeclineConsent",
"source": [
{
"context": "qr",
"condition": "item.where(linkId = 'signatures').item.where(linkId = 'signatures/person-signed').answer.value = true"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "consent",
"transform": "create",
"parameter": [
{
"valueString": "Consent"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "consent"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildConsentBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "consent"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "consent",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "decision",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "consent",
"element": "decision",
"transform": "copy",
"parameter": [
{
"valueString": "deny"
}
]
}
],
"documentation": "`deny`, not `permit`. This is the one form in the set that records a\r\nrefusal, and the whole resource turns on this single code."
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "consent",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/consentcategorycodes"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "acd"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Advance Directive"
}
]
}
]
}
]
},
{
"name": "categoryText",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueString": "Decline of care, procedure or assessment"
}
]
}
]
}
]
},
{
"name": "signaturesGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "sg",
"condition": "linkId = 'signatures'"
}
],
"rule": [
{
"name": "signedOnRule",
"source": [
{
"context": "sg",
"element": "item",
"variable": "it",
"condition": "(linkId = 'signatures/signed-on') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "signedDate",
"source": [
{
"context": "a",
"element": "value",
"variable": "d"
}
],
"target": [
{
"context": "consent",
"element": "date",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
},
{
"name": "witnessVerification",
"source": [
{
"context": "sg",
"element": "item",
"variable": "it",
"condition": "(linkId = 'signatures/witness-signed') and (answer.value = true)"
}
],
"target": [
{
"context": "consent",
"element": "verification",
"variable": "ver"
}
],
"rule": [
{
"name": "verified",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "ver",
"element": "verified",
"transform": "copy",
"parameter": [
{
"valueBoolean": true
}
]
}
]
},
{
"name": "witnessNameRule",
"source": [
{
"context": "sg",
"element": "item",
"variable": "wn",
"condition": "(linkId = 'signatures/witness-name') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "wn",
"element": "answer",
"listMode": "first",
"variable": "wa"
}
],
"rule": [
{
"name": "witnessDisplay",
"source": [
{
"context": "wa",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "ver",
"element": "verifiedBy",
"variable": "ref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "ref",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
],
"documentation": "The witness verifies the refusal. On this form that matters more than on\r\na consent: the hospital is recording that somebody left against advice."
}
]
},
{
"name": "personGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "pg",
"condition": "linkId = 'person-declining'"
}
],
"rule": [
{
"name": "nameRule",
"source": [
{
"context": "pg",
"element": "item",
"variable": "it",
"condition": "(linkId = 'person-declining/name') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "grantorDisplay",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "consent",
"element": "grantor",
"variable": "ref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "ref",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "relationshipRule",
"source": [
{
"context": "pg",
"element": "item",
"variable": "it",
"condition": "(linkId = 'person-declining/relationship') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "relationshipDisplay",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "consent",
"element": "grantor",
"variable": "ref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "ref",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "explainedGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "eg",
"condition": "linkId = 'what-was-explained'"
}
],
"rule": [
{
"name": "doctorRule",
"source": [
{
"context": "eg",
"element": "item",
"variable": "it",
"condition": "(linkId = 'what-was-explained/doctor') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "manager",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "consent",
"element": "manager",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "decliningGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "linkId = 'declining'"
}
],
"rule": [
{
"name": "declineProvision",
"source": [
{
"context": "it",
"element": "answer",
"variable": "a"
}
],
"target": [
{
"context": "consent",
"element": "provision",
"variable": "prov"
}
],
"rule": [
{
"name": "declineCode",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "prov",
"element": "code",
"variable": "pc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "pc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "text",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "pc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
}
],
"documentation": "── One provision per thing refused ─────────────────────────────────────\r\nThe sheet prints \"care/procedure/assessment\" as one slashed phrase. A\r\nsingle provision saying all three would record a patient who declined one\r\ninvestigation as having refused every kind of care, which is both wrong\r\nand the sort of wrong that ends up in a coroner's court."
},
{
"name": "procedureDeclinedProvision",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'procedure-declined') and answer.value.exists()"
}
],
"target": [
{
"context": "consent",
"element": "provision",
"variable": "prov"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "procedureText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "prov",
"element": "code",
"variable": "pc"
},
{
"context": "pc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "destinationProvision",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'destination') and answer.value.exists()"
}
],
"target": [
{
"context": "consent",
"element": "provision",
"variable": "prov"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "destinationCode",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "prov",
"element": "code",
"variable": "pc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "pc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "text",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "pc",
"element": "text",
"transform": "append",
"parameter": [
{
"valueString": "Opting to go to: "
},
{
"valueId": "d"
}
]
}
]
}
]
}
]
}
],
"documentation": "Where the patient is going. Recorded on the Consent because it is part of\r\nthe refusal -- a patient transferring to another hospital and one going\r\nhome carry different follow-up obligations."
}
],
"documentation": "Guarded on the person having actually signed. A refusal built from a\r\nhalf-filled form asserts that somebody declined care when they may not have."
},
{
"name": "explainedGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'what-was-explained'"
}
],
"rule": [
{
"name": "understoodObservation",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'what-was-explained/understood') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "obs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "obs",
"element": "code",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "capacity-to-consent"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Capacity to consent"
}
]
}
]
}
]
},
{
"name": "codeText",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueString": "Understood the explanation of the condition and the risks of declining"
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codedValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "obs",
"element": "value",
"variable": "vc",
"transform": "create",
"parameter": [
{
"valueString": "CodeableConcept"
}
]
}
],
"rule": [
{
"name": "valueCoding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "vc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "valueText",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "vc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
},
{
"name": "understoodInterpretation",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "notUnderstoodInterp",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'N'"
}
],
"target": [
{
"context": "obs",
"element": "interpretation",
"variable": "interp"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "interp",
"element": "coding",
"variable": "icg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "icg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "icg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "A"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "icg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Abnormal"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "note",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "linkId = 'what-was-explained/language'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "note2",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "linkId = 'what-was-explained/condition-and-risks'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── Was the refusal informed? ───────────────────────────────────────────\r\nIts own Observation. Not a provision -- it is not a thing being refused --\r\nbut it is the fact that makes the refusal defensible, and it carries the\r\nlanguage the discussion was held in. The paper form is bilingual and the\r\nlanguage was previously only implied by which half of the sheet was signed."
}
]
},
{
"name": "BuildObsBase",
"documentation": "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each map rather than imported: the transform\r\nengine resolves `imports` against whatever StructureMaps happen to be on the\r\nserver, and a form that stops extracting because a shared map was not\r\nuploaded is a worse failure than a duplicated group.\r\nTwo notes on what the publisher's StructureMap validator says about this file.\r\nSource parameters below are left untyped on purpose. Writing `: Element` makes\r\nthe validator compare QuestionnaireResponse.item against the literal 'Element'\r\nand report them as incompatible with each other, which is noise, not a finding.\r\n`evaluate(context, expression)` is flagged as \"takes 1 parameter but 2 were\r\nfound\". Leave it. The FML parser in the same jar refuses the one-argument form\r\noutright -- it wants a parameter, a comma, then the FHIRPath -- so the\r\npublisher is objecting to what its own compiler emits. Two arguments is the\r\nonly form that compiles, and it is what the R5 transform engine executes.\r\n─────────────────────────────────────────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetObservationFullUrl",
"parameter": [
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "Observation"
}
]
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "final"
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "obs",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "obs",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "effective",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "obs",
"element": "effective",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "performerFromSource",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
},
{
"name": "performerFallback",
"source": [
{
"context": "qr",
"condition": "source.exists().not()"
}
],
"rule": [
{
"name": "performerFromAuthor",
"source": [
{
"context": "qr",
"element": "author",
"variable": "a"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "a"
}
]
}
]
}
]
},
{
"name": "linkQuestionnaireResponse",
"source": [
{
"context": "qr",
"element": "id",
"variable": "qid",
"condition": "$this.hasValue()"
}
],
"target": [
{
"context": "obs",
"element": "derivedFrom",
"variable": "ref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "ref",
"element": "reference",
"transform": "copy",
"parameter": [
{
"valueId": "qid"
}
]
}
],
"documentation": "A stored response's id already reads \"QuestionnaireResponse/<id>\", so it is\r\na relative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first\r\n-- from writing \"QuestionnaireResponse/null\" into the record."
}
]
},
{
"name": "SetObservationFullUrl",
"input": [
{
"name": "obs",
"type": "Observation",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "obs",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/Observation/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "SetComponentCodedValue",
"documentation": "The two answer shapes a component can carry. Both read the answer through the\r\nuntyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its\r\ntyped property name fails at transform time on HAPI R5 with \"Attempt to read\r\ninvalid property ... on QuestionnaireResponse.item.answer\".",
"input": [
{
"name": "it",
"mode": "source"
},
{
"name": "comp",
"mode": "target"
}
],
"rule": [
{
"name": "componentAnswer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codedValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "comp",
"element": "value",
"variable": "cc",
"transform": "create",
"parameter": [
{
"valueString": "CodeableConcept"
}
]
}
],
"rule": [
{
"name": "valueCoding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "valueText",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "SetComponentValue",
"input": [
{
"name": "it",
"mode": "source"
},
{
"name": "comp",
"mode": "target"
}
],
"rule": [
{
"name": "componentAnswer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "plainValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "comp",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
}
]
},
{
"name": "SetSurveyCategory",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
}
],
"rule": [
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "categoryCoding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "coding"
}
],
"rule": [
{
"name": "categorySystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name": "categoryCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "survey"
}
]
}
]
},
{
"name": "categoryDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Survey"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "BuildConsentBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "Consent",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetConsentFullUrl",
"parameter": [
{
"valueId": "r"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "Consent"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetConsentFullUrl",
"input": [
{
"name": "r",
"type": "Consent",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "r",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/Consent/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "SetResponseProvenance",
"documentation": "── Provenance and tenancy ───────────────────────────────────────────────────\r\nTwo tags on everything this map creates. The first says which questionnaire\r\nproduced it, so a form that reopens mid-admission recalls its own earlier\r\nentries and not another form's. The second copies the tenant tags off the\r\nresponse, because nothing else on the path puts them there.\r\nThe code is the form's document type, not the questionnaire's id: every\r\nenvironment mints its own ids, and there is only one set of maps, so an id\r\nhere would tie the tag to whichever environment stamped it.\r\n── Provenance and tenancy ───────────────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"mode": "target"
}
],
"rule": [
{
"name": "provenanceMeta",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "meta",
"variable": "m"
}
],
"rule": [
{
"name": "provenanceTag",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "m",
"element": "tag",
"variable": "t"
}
],
"rule": [
{
"name": "provenanceSystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://slade360edi.com/questionnaire-provenance"
}
]
}
]
},
{
"name": "provenanceCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "decline-form"
}
]
}
]
},
{
"name": "provenanceDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Decline form"
}
]
}
]
}
]
}
]
},
{
"name": "tenantTags",
"source": [
{
"context": "qr",
"element": "meta",
"variable": "qm"
}
],
"rule": [
{
"name": "copyTag",
"source": [
{
"context": "qm",
"element": "tag",
"variable": "qt"
}
],
"target": [
{
"context": "r",
"element": "meta",
"variable": "m"
},
{
"context": "m",
"element": "tag",
"transform": "copy",
"parameter": [
{
"valueId": "qt"
}
]
}
]
}
],
"documentation": "Every tag the response carries, onto the resource. `meta` is 0..1, so this\r\nlands on the same meta the rule above created rather than a second one."
}
]
}
]
}