SGHI FHIR Profile Implementation Guide
0.1.0 - ci-build
SGHI FHIR Profile Implementation Guide, published by Kathurima Kimathi. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/savannahghi/sil_fhir_profile_ig/ and changes regularly. See the Directory of published versions
| Active as of 2026-09-14 |
{
"resourceType" : "StructureMap",
"id" : "ExtractImagingRequest",
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractImagingRequest</b></p><a name=\"ExtractImagingRequest\"> </a><a name=\"hcExtractImagingRequest\"> </a><pre class=\"fml\">\r\n<span style=\"color: #cc00cc\">/// <b>url</b> = </span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractImagingRequest'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractImagingRequest'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Imaging Request Extraction'</span>\r\n<span style=\"color: #cc00cc\">/// <b>status</b> = </span><span style=\"color: blue\">'active'</span>\r\n<span style=\"color: #cc00cc\">/// <b>description</b> = </span><span style=\"color: blue\">'The X-ray and ultrasound request forms out as ServiceRequests: one per scan type ticked on an ultrasound request, or a single one carrying the region and view for an X-ray. The clinical question rides as a supporting Observation the request points at, because the SGHI ServiceRequest profile binds `reason` required to LOINC and the form takes free text -- so the indication cannot go in `reason` without inventing a code for it.'</span>\r\n\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/questionnaireresponse.html\" title=\"QuestionnaireResponse\">http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse</a><span style=\"color: navy\">" </span><b>alias </b>QR <b>as </b><b>source</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/bundle.html\" title=\"Bundle\">http://hl7.org/fhir/StructureDefinition/Bundle</a><span style=\"color: navy\">" </span><b>alias </b>Bundle <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/servicerequest.html\" title=\"ServiceRequest\">http://hl7.org/fhir/StructureDefinition/ServiceRequest</a><span style=\"color: navy\">" </span><b>alias </b>ServiceRequest <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/observation.html\" title=\"Observation\">http://hl7.org/fhir/StructureDefinition/Observation</a><span style=\"color: navy\">" </span><b>alias </b>Observation <b>as </b><b>target</b>\r\n\r\n<b>group </b>ExtractImagingRequest<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">bundle</span><span style=\"color: navy\"> : </span>Bundle<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>bundle.type = <span style=\"color: blue\">'transaction'</span> <i>"setBundleType"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">── The indication, as a supporting Observation ─────────────────────────</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Built first so the ServiceRequests below can point at it. It carries the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">indication, the clinical summary and the provisional diagnosis: everything</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">the radiographer needs in order to tailor the study, which is the whole</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">reason the form asks for them.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId = 'indication').answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObsBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"base"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetSurveyCategory<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.code<b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'imaging-indication'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Indication for imaging'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'indication'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> obs.note<b> as </b><span style=\"color: maroon\">n</span><span style=\"color: navy\">, </span> n.text = <span style=\"color: maroon\">txt</span> <i>"text"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"note"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'clinical-summary'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> obs.note<b> as </b><span style=\"color: maroon\">n</span><span style=\"color: navy\">, </span> n.text = <span style=\"color: maroon\">txt</span> <i>"text"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"note2"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'provisional-diagnosis'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> obs.note<b> as </b><span style=\"color: maroon\">n</span><span style=\"color: navy\">, </span> n.text = <span style=\"color: maroon\">txt</span> <i>"text"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"note3"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"indicationObservation"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">── Last menstrual period ───────────────────────────────────────────────</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Extracted as its own Observation. The X-ray form asks for it so a woman of</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">childbearing age is not irradiated unknowingly in early pregnancy; that is</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">a safety check, and a safety check buried in a request's free text is not</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">one anybody can audit.</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'last-menstrual-period') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObsBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"base"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetSurveyCategory<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>obs.code<b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'8665-2'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Last menstrual period start date'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -> </b></span>obs.value = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: maroon\">v</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'dateTime'</span><span style=\"color: navy\">)</span> <i>"set"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"measure_8665_2"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">── The ultrasound requests, one per scan ticked ─────────────────────────</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">The scan type answer's own coding travels, so a request for a lower limb</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">venous Doppler is coded as exactly that rather than as "ultrasound".</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'scan-type'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it.answer<b> as </b><span style=\"color: maroon\">a</span><span style=\"color: navy\"><b> -> </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'ServiceRequest'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">sr</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> sr<span style=\"color: navy\">, </span> entry<b> then </b>BuildServiceRequestBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">sr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"base"</i><span style=\"color: navy\">;</span>\r\n a<span style=\"color: navy\"><b> -> </b></span>sr.status = <span style=\"color: blue\">'active'</span> <i>"status"</i><span style=\"color: navy\">;</span>\r\n a<span style=\"color: navy\"><b> -> </b></span>sr.intent = <span style=\"color: blue\">'order'</span> <i>"intent"</i><span style=\"color: navy\">;</span>\r\n a<span style=\"color: navy\"><b> -> </b></span>sr.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://snomed.info/sct'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n a<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'363679005'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n a<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Imaging'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n a.value<b> as </b><span style=\"color: maroon\">cv</span><span style=\"color: navy\"><b> -> </b></span> sr.code<b> as </b><span style=\"color: maroon\">cr</span><span style=\"color: navy\">, </span> cr.concept<b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cv<span style=\"color: navy\"><b> -> </b></span>cc.coding = <span style=\"color: maroon\">cv</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n cv.display<b> as </b><span style=\"color: maroon\">d</span><span style=\"color: navy\"><b> -> </b></span>cc.text = <span style=\"color: maroon\">d</span> <i>"text"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeFromAnswer"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>sr<b> then </b>SetImagingRequestCommon<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">sr</span><span style=\"color: navy\">)</span> <i>"common"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"createUltrasoundRequest"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"scanTypeGroup"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">── The X-ray request ───────────────────────────────────────────────────</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">One request, coded by its free text. Guarded on the modality being X-ray so</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">an ultrasound request does not also produce a second, uncoded request for</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">whatever was typed in the investigation line.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId = 'request').item.where(linkId = 'request/modality').answer.value.ofType(Coding).code = 'modality-x-ray'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'investigation-requested') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'ServiceRequest'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">sr</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> sr<span style=\"color: navy\">, </span> entry<b> then </b>BuildServiceRequestBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">sr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"base"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>sr.status = <span style=\"color: blue\">'active'</span> <i>"status"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>sr.intent = <span style=\"color: blue\">'order'</span> <i>"intent"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>sr.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://snomed.info/sct'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'363679005'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Imaging'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> sr.code<b> as </b><span style=\"color: maroon\">cr</span><span style=\"color: navy\">, </span> cr.concept<b> as </b><span style=\"color: maroon\">cc</span><span style=\"color: navy\">, </span> cc.text = <span style=\"color: maroon\">txt</span> <i>"codeText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>sr<b> then </b>SetImagingRequestCommon<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">sr</span><span style=\"color: navy\">)</span> <i>"common"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"createXrayRequest"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"xrayGroup"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">Everything both request shapes share: who asked, when, how urgently, from</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">which department, and the clinical summary as a note. Factored into a group</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">because it is identical for an X-ray and an ultrasound and drifting copies is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">how one of them silently loses its priority.</span>\r\n<b>group </b>SetImagingRequestCommon<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">sr</span><span style=\"color: navy\"> : </span>ServiceRequest<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -> </b></span>sr.authoredOn = <span style=\"color: maroon\">t</span> <i>"authoredOn"</i><span style=\"color: navy\">;</span>\r\n qr.encounter<b> as </b><span style=\"color: maroon\">e</span><span style=\"color: navy\"><b> -> </b></span>sr.encounter = <span style=\"color: maroon\">e</span><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">g</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'request'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> g.item<b> as </b><span style=\"color: maroon\">rq</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'request/requester') and answer.value.exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> rq.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\"><b> -> </b></span>sr.requester = <span style=\"color: maroon\">ref</span> <i>"requester"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"requesterRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Priority is a code on ServiceRequest, not a Coding: it takes the code</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">alone and has nowhere to record the system it came from.</span>\r\n g.item<b> as </b><span style=\"color: maroon\">pr</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'request/priority') and answer.value.exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> pr.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">cv</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cv.code<b> as </b><span style=\"color: maroon\">c</span><span style=\"color: navy\"><b> -> </b></span>sr.priority = <span style=\"color: maroon\">c</span> <i>"priorityCode"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"priorityRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">dp</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'request/department') and answer.value.exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> dp.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> sr.note<b> as </b><span style=\"color: maroon\">n</span><span style=\"color: navy\">, </span> n.text = <span style=\"color: maroon\">txt</span> <i>"departmentNote"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"departmentRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"requestGroup"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">ind</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'indication'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> ind.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> sr.note<b> as </b><span style=\"color: maroon\">n</span><span style=\"color: navy\">, </span> n.text = <span style=\"color: maroon\">txt</span> <i>"indicationNote"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"indicationRule"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">cs</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'clinical-summary'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cs.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span> sr.note<b> as </b><span style=\"color: maroon\">n</span><span style=\"color: navy\">, </span> n.text = <span style=\"color: maroon\">txt</span> <i>"clinicalSummaryNote"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"clinicalSummaryRule"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Shared scaffolding. Repeated in each map rather than imported: the transform</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">engine resolves `imports` against whatever StructureMaps happen to be on the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">server, and a form that stops extracting because a shared map was not</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">uploaded is a worse failure than a duplicated group.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Two notes on what the publisher's StructureMap validator says about this file.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Source parameters below are left untyped on purpose. Writing `: Element` makes</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the validator compare QuestionnaireResponse.item against the literal 'Element'</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">and report them as incompatible with each other, which is noise, not a finding.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`evaluate(context, expression)` is flagged as "takes 1 parameter but 2 were</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">found". Leave it. The FML parser in the same jar refuses the one-argument form</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">outright -- it wants a parameter, a comma, then the FHIRPath -- so the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">publisher is objecting to what its own compiler emits. Two arguments is the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">only form that compiles, and it is what the R5 transform engine executes.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>BuildObsBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetResponseProvenance<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"responseProvenance"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetObservationFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"idAndFullUrl"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>"requestMethod"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>request.url = <span style=\"color: blue\">'Observation'</span> <i>"requestUrl"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"entryRequest"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.status = <span style=\"color: blue\">'final'</span> <i>"status"</i><span style=\"color: navy\">;</span>\r\n qr.subject<b> as </b><span style=\"color: maroon\">s</span><span style=\"color: navy\"><b> -> </b></span>obs.subject = <span style=\"color: maroon\">s</span><span style=\"color: navy\">;</span>\r\n qr.encounter<b> as </b><span style=\"color: maroon\">e</span><span style=\"color: navy\"><b> -> </b></span>obs.encounter = <span style=\"color: maroon\">e</span><span style=\"color: navy\">;</span>\r\n qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -> </b></span>obs.effective = <span style=\"color: maroon\">t</span> <i>"effective"</i><span style=\"color: navy\">;</span>\r\n qr.source<b> as </b><span style=\"color: maroon\">src</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <span style=\"color: maroon\">src</span> <i>"performerFromSource"</i><span style=\"color: navy\">;</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>source.exists().not()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr.author<b> as </b><span style=\"color: maroon\">a</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <span style=\"color: maroon\">a</span> <i>"performerFromAuthor"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"performerFallback"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">A stored response's id already reads "QuestionnaireResponse/<id>", so it is</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">a relative reference as it stands. The hasValue() guard is what stops an</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">unsaved response -- one posted straight to $extract rather than saved first</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">-- from writing "QuestionnaireResponse/null" into the record.</span>\r\n qr.id<b> as </b><span style=\"color: maroon\">qid</span><b> where </b><span style=\"color: navy\">(</span>$this.hasValue()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> obs.derivedFrom = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Reference'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\">, </span> ref.reference = <span style=\"color: maroon\">qid</span> <i>"linkQuestionnaireResponse"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetObservationFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> obs.id<b> as </b><span style=\"color: maroon\">id</span><span style=\"color: navy\"><b> -> </b></span>entry.fullUrl = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/Observation/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>"assignFullUrl"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">The two answer shapes a component can carry. Both read the answer through the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">untyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">typed property name fails at transform time on HAPI R5 with "Attempt to read</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">invalid property ... on QuestionnaireResponse.item.answer".</span>\r\n<b>group </b>SetComponentCodedValue<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">cv</span><span style=\"color: navy\"><b> -> </b></span>comp.value = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'CodeableConcept'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cv<span style=\"color: navy\"><b> -> </b></span>cc.coding = <span style=\"color: maroon\">cv</span> <i>"valueCoding"</i><span style=\"color: navy\">;</span>\r\n cv.display<b> as </b><span style=\"color: maroon\">d</span><span style=\"color: navy\"><b> -> </b></span>cc.text = <span style=\"color: maroon\">d</span> <i>"valueText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codedValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"componentAnswer"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetComponentValue<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -> </b></span>comp.value = <span style=\"color: maroon\">v</span> <i>"plainValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"componentAnswer"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetSurveyCategory<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>"categorySystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'survey'</span> <i>"categoryCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Survey'</span> <i>"categoryDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"categoryCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetVitalSignsCategory<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>"categorySystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'vital-signs'</span> <i>"categoryCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Vital Signs'</span> <i>"categoryDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"categoryCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>BuildServiceRequestBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">r</span><span style=\"color: navy\"> : </span>ServiceRequest, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>r<b> then </b>SetResponseProvenance<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">r</span><span style=\"color: navy\">)</span> <i>"responseProvenance"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>r.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetServiceRequestFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">r</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"idAndFullUrl"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>"requestMethod"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>request.url = <span style=\"color: blue\">'ServiceRequest'</span> <i>"requestUrl"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"entryRequest"</i><span style=\"color: navy\">;</span>\r\n qr.subject<b> as </b><span style=\"color: maroon\">s</span><span style=\"color: navy\"><b> -> </b></span>r.subject = <span style=\"color: maroon\">s</span><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetServiceRequestFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">r</span><span style=\"color: navy\"> : </span>ServiceRequest, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> r.id<b> as </b><span style=\"color: maroon\">id</span><span style=\"color: navy\"><b> -> </b></span>entry.fullUrl = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/ServiceRequest/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>"assignFullUrl"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">── Provenance and tenancy ───────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Two tags on everything this map creates. The first says which questionnaire</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">produced it, so a form that reopens mid-admission recalls its own earlier</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">entries and not another form's. The second copies the tenant tags off the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">response, because nothing else on the path puts them there.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The code is the form's document type, not the questionnaire's id: every</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">environment mints its own ids, and there is only one set of maps, so an id</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">here would tie the tag to whichever environment stamped it.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">── Provenance and tenancy ───────────────────────────────────────────────────</span>\r\n<b>group </b>SetResponseProvenance<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">r</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>r.meta<b> as </b><span style=\"color: maroon\">m</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>m.tag<b> as </b><span style=\"color: maroon\">t</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>t.system = <span style=\"color: blue\">'http://slade360edi.com/questionnaire-provenance'</span> <i>"provenanceSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>t.code = <span style=\"color: blue\">'imaging-request'</span> <i>"provenanceCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>t.display = <span style=\"color: blue\">'Imaging request'</span> <i>"provenanceDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"provenanceTag"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"provenanceMeta"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Every tag the response carries, onto the resource. `meta` is 0..1, so this</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">lands on the same meta the rule above created rather than a second one.</span>\r\n qr.meta<b> as </b><span style=\"color: maroon\">qm</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qm.tag<b> as </b><span style=\"color: maroon\">qt</span><span style=\"color: navy\"><b> -> </b></span> r.meta<b> as </b><span style=\"color: maroon\">m</span><span style=\"color: navy\">, </span> m.tag = <span style=\"color: maroon\">qt</span> <i>"copyTag"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"tenantTags"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span></pre></div>"
},
"url" : "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractImagingRequest",
"version" : "0.1.0",
"name" : "ExtractImagingRequest",
"title" : "Imaging Request Extraction",
"status" : "active",
"date" : "2026-09-14T06:31:13+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 X-ray and ultrasound request forms out as ServiceRequests: one per scan type ticked on an ultrasound request, or a single one carrying the region and view for an X-ray. The clinical question rides as a supporting Observation the request points at, because the SGHI ServiceRequest profile binds `reason` required to LOINC and the form takes free text -- so the indication cannot go in `reason` without inventing a code for it.",
"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/ServiceRequest",
"mode" : "target",
"alias" : "ServiceRequest"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/Observation",
"mode" : "target",
"alias" : "Observation"
}
],
"group" : [
{
"name" : "ExtractImagingRequest",
"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" : "indicationObservation",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId = 'indication').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" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "imaging-indication"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Indication for imaging"
}
]
}
]
}
]
}
]
},
{
"name" : "note",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "linkId = 'indication'"
}
],
"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" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "linkId = 'clinical-summary'"
}
],
"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" : "note3",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "linkId = 'provisional-diagnosis'"
}
],
"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" : "── The indication, as a supporting Observation ─────────────────────────\r\nBuilt first so the ServiceRequests below can point at it. It carries the\r\nindication, the clinical summary and the provisional diagnosis: everything\r\nthe radiographer needs in order to tailor the study, which is the whole\r\nreason the form asks for them."
},
{
"name" : "measure_8665_2",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'last-menstrual-period') 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" : "http://loinc.org"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "8665-2"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Last menstrual period start date"
}
]
}
]
}
]
}
]
},
{
"name" : "answer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "set",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "v"
}
],
"target" : [
{
"context" : "obs",
"element" : "value",
"transform" : "cast",
"parameter" : [
{
"valueId" : "v"
},
{
"valueString" : "dateTime"
}
]
}
]
}
]
}
],
"documentation" : "── Last menstrual period ───────────────────────────────────────────────\r\nExtracted as its own Observation. The X-ray form asks for it so a woman of\r\nchildbearing age is not irradiated unknowingly in early pregnancy; that is\r\na safety check, and a safety check buried in a request's free text is not\r\none anybody can audit."
},
{
"name" : "scanTypeGroup",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "linkId = 'scan-type'"
}
],
"rule" : [
{
"name" : "createUltrasoundRequest",
"source" : [
{
"context" : "it",
"element" : "answer",
"variable" : "a"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "sr",
"transform" : "create",
"parameter" : [
{
"valueString" : "ServiceRequest"
}
]
}
],
"rule" : [
{
"name" : "base",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "sr"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildServiceRequestBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "sr"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "status",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "sr",
"element" : "status",
"transform" : "copy",
"parameter" : [
{
"valueString" : "active"
}
]
}
]
},
{
"name" : "intent",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "sr",
"element" : "intent",
"transform" : "copy",
"parameter" : [
{
"valueString" : "order"
}
]
}
]
},
{
"name" : "category",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "sr",
"element" : "category",
"variable" : "cat"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "cat",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://snomed.info/sct"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "363679005"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Imaging"
}
]
}
]
}
]
}
]
},
{
"name" : "codeFromAnswer",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "cv"
}
],
"target" : [
{
"context" : "sr",
"element" : "code",
"variable" : "cr"
},
{
"context" : "cr",
"element" : "concept",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "cv"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"transform" : "copy",
"parameter" : [
{
"valueId" : "cv"
}
]
}
]
},
{
"name" : "text",
"source" : [
{
"context" : "cv",
"element" : "display",
"variable" : "d"
}
],
"target" : [
{
"context" : "cc",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "d"
}
]
}
]
}
]
},
{
"name" : "common",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "sr"
}
],
"dependent" : [
{
"name" : "SetImagingRequestCommon",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "sr"
}
]
}
]
}
]
}
],
"documentation" : "── The ultrasound requests, one per scan ticked ─────────────────────────\r\nThe scan type answer's own coding travels, so a request for a lower limb\r\nvenous Doppler is coded as exactly that rather than as \"ultrasound\"."
},
{
"name" : "xrayGroup",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId = 'request').item.where(linkId = 'request/modality').answer.value.ofType(Coding).code = 'modality-x-ray'"
}
],
"rule" : [
{
"name" : "createXrayRequest",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'investigation-requested') and answer.value.exists()"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "sr",
"transform" : "create",
"parameter" : [
{
"valueString" : "ServiceRequest"
}
]
}
],
"rule" : [
{
"name" : "base",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "sr"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildServiceRequestBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "sr"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "status",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "sr",
"element" : "status",
"transform" : "copy",
"parameter" : [
{
"valueString" : "active"
}
]
}
]
},
{
"name" : "intent",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "sr",
"element" : "intent",
"transform" : "copy",
"parameter" : [
{
"valueString" : "order"
}
]
}
]
},
{
"name" : "category",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "sr",
"element" : "category",
"variable" : "cat"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cat",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://snomed.info/sct"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "363679005"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Imaging"
}
]
}
]
}
]
}
]
},
{
"name" : "answer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "codeText",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "txt"
}
],
"target" : [
{
"context" : "sr",
"element" : "code",
"variable" : "cr"
},
{
"context" : "cr",
"element" : "concept",
"variable" : "cc"
},
{
"context" : "cc",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "txt"
}
]
}
]
}
]
},
{
"name" : "common",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "sr"
}
],
"dependent" : [
{
"name" : "SetImagingRequestCommon",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "sr"
}
]
}
]
}
]
}
],
"documentation" : "── The X-ray request ───────────────────────────────────────────────────\r\nOne request, coded by its free text. Guarded on the modality being X-ray so\r\nan ultrasound request does not also produce a second, uncoded request for\r\nwhatever was typed in the investigation line."
}
]
},
{
"name" : "SetImagingRequestCommon",
"documentation" : "Everything both request shapes share: who asked, when, how urgently, from\r\nwhich department, and the clinical summary as a note. Factored into a group\r\nbecause it is identical for an X-ray and an ultrasound and drifting copies is\r\nhow one of them silently loses its priority.",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "sr",
"type" : "ServiceRequest",
"mode" : "target"
}
],
"rule" : [
{
"name" : "authoredOn",
"source" : [
{
"context" : "qr",
"element" : "authored",
"variable" : "t"
}
],
"target" : [
{
"context" : "sr",
"element" : "authoredOn",
"transform" : "copy",
"parameter" : [
{
"valueId" : "t"
}
]
}
]
},
{
"name" : "encounter",
"source" : [
{
"context" : "qr",
"element" : "encounter",
"variable" : "e"
}
],
"target" : [
{
"context" : "sr",
"element" : "encounter",
"transform" : "copy",
"parameter" : [
{
"valueId" : "e"
}
]
}
]
},
{
"name" : "requestGroup",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "g",
"condition" : "linkId = 'request'"
}
],
"rule" : [
{
"name" : "requesterRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "rq",
"condition" : "(linkId = 'request/requester') and answer.value.exists()"
}
],
"rule" : [
{
"name" : "answer",
"source" : [
{
"context" : "rq",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "requester",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "ref"
}
],
"target" : [
{
"context" : "sr",
"element" : "requester",
"transform" : "copy",
"parameter" : [
{
"valueId" : "ref"
}
]
}
]
}
]
}
]
},
{
"name" : "priorityRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "pr",
"condition" : "(linkId = 'request/priority') and answer.value.exists()"
}
],
"rule" : [
{
"name" : "answer",
"source" : [
{
"context" : "pr",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "cv"
}
],
"rule" : [
{
"name" : "priorityCode",
"source" : [
{
"context" : "cv",
"element" : "code",
"variable" : "c"
}
],
"target" : [
{
"context" : "sr",
"element" : "priority",
"transform" : "copy",
"parameter" : [
{
"valueId" : "c"
}
]
}
]
}
]
}
]
}
],
"documentation" : "Priority is a code on ServiceRequest, not a Coding: it takes the code\r\nalone and has nowhere to record the system it came from."
},
{
"name" : "departmentRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "dp",
"condition" : "(linkId = 'request/department') and answer.value.exists()"
}
],
"rule" : [
{
"name" : "answer",
"source" : [
{
"context" : "dp",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "departmentNote",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "txt"
}
],
"target" : [
{
"context" : "sr",
"element" : "note",
"variable" : "n"
},
{
"context" : "n",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "txt"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "indicationRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "ind",
"condition" : "linkId = 'indication'"
}
],
"rule" : [
{
"name" : "answer",
"source" : [
{
"context" : "ind",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "indicationNote",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "txt"
}
],
"target" : [
{
"context" : "sr",
"element" : "note",
"variable" : "n"
},
{
"context" : "n",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "txt"
}
]
}
]
}
]
}
]
},
{
"name" : "clinicalSummaryRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "cs",
"condition" : "linkId = 'clinical-summary'"
}
],
"rule" : [
{
"name" : "answer",
"source" : [
{
"context" : "cs",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "clinicalSummaryNote",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "txt"
}
],
"target" : [
{
"context" : "sr",
"element" : "note",
"variable" : "n"
},
{
"context" : "n",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "txt"
}
]
}
]
}
]
}
]
}
]
},
{
"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" : "SetVitalSignsCategory",
"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" : "vital-signs"
}
]
}
]
},
{
"name" : "categoryDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Vital Signs"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "BuildServiceRequestBase",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "r",
"type" : "ServiceRequest",
"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" : "SetServiceRequestFullUrl",
"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" : "ServiceRequest"
}
]
}
]
}
]
},
{
"name" : "subject",
"source" : [
{
"context" : "qr",
"element" : "subject",
"variable" : "s"
}
],
"target" : [
{
"context" : "r",
"element" : "subject",
"transform" : "copy",
"parameter" : [
{
"valueId" : "s"
}
]
}
]
}
]
},
{
"name" : "SetServiceRequestFullUrl",
"input" : [
{
"name" : "r",
"type" : "ServiceRequest",
"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/ServiceRequest/"
},
{
"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" : "imaging-request"
}
]
}
]
},
{
"name" : "provenanceDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "t",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Imaging request"
}
]
}
]
}
]
}
]
},
{
"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."
}
]
}
]
}