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" : "ExtractDischargeClearanceFinancialClearance",
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractDischargeClearanceFinancialClearance</b></p><a name=\"ExtractDischargeClearanceFinancialClearance\"> </a><a name=\"hcExtractDischargeClearanceFinancialClearance\"> </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/ExtractDischargeClearanceFinancialClearance'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractDischargeClearanceFinancialClearance'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Discharge Clearance: Financial Clearance 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\">'Turns the cashier\\'s record that the account was dealt with into one survey Observation, with the clerk\\'s note against it. A Task is the FHIR-correct home for work that has to be done, and this clearance is born completed -- a Task created in the `completed` state carries no workflow, and SGHITask would force an owner, a requester and a requestedPerformer that all resolve to the facility asking itself to settle the account. So this follows the other two clearances and stays an Observation, which keeps one extraction pattern across the three forms. It carries no balance: the figure belongs to billing, and one restated here would be signed against as though this were the authority for it. If billing later wants a workable item, a Task rule can be added to this map without changing anything the frontend sends.'</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/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>ExtractDischargeClearanceFinancialClearance<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\">linkId 398664818229 — "How the account was settled"</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = '398664818229') and answer.value.exists()<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<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>BuildClearanceObs<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>"settlementBase"</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\">settlementCodeCc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>settlementCodeCc.coding<b> as </b><span style=\"color: maroon\">settlementCodeCoding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>settlementCodeCoding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem'</span> <i>"settlementCodeSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>settlementCodeCoding.code = <span style=\"color: blue\">'account-settlement-at-discharge'</span> <i>"settlementCodeCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>settlementCodeCoding.display = <span style=\"color: blue\">'How the account was settled at discharge'</span> <i>"settlementCodeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"settlementCodeCodingRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"settlementCode"</i><span style=\"color: navy\">;</span>\r\n a<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">a</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"settlementValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">linkId 818765459000 — "Note"</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">itNote</span><b> where </b><span style=\"color: navy\">(</span>(linkId = '818765459000') and answer.value.exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> itNote.answer first<b> as </b><span style=\"color: maroon\">aNote</span><b> then</b><span style=\"color: navy\"> {\r\n</span> aNote.value<b> as </b><span style=\"color: maroon\">nv</span><span style=\"color: navy\"><b> -> </b></span>obs.note<b> as </b><span style=\"color: maroon\">note</span><b> then</b><span style=\"color: navy\"> {\r\n</span> nv<span style=\"color: navy\"><b> -> </b></span>note.text = <span style=\"color: maroon\">nv</span> <i>"financeNoteText"</i><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>note.time = <span style=\"color: maroon\">t</span> <i>"financeNoteTime"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"financeNote"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"financeNoteAnswer"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"financeNoteRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"settlementObs"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"settlementAnswer"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"settlementRule"</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 clearance map rather than imported: the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">transform engine resolves `imports` against whatever StructureMaps happen to</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">be on the server, and a clearance that stops extracting because a shared map</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">was not uploaded is a worse failure than a duplicated group.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Source parameters are left untyped on purpose. Writing `: Element` makes the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">publisher's StructureMap validator compare QuestionnaireResponse.item against</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the literal 'Element' and report them as incompatible, which is noise.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>BuildClearanceObs<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.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<span style=\"color: navy\"><b> -> </b></span>obs.category<b> as </b><span style=\"color: maroon\">categoryCc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>categoryCc.coding<b> as </b><span style=\"color: maroon\">categoryCoding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>categoryCoding.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>categoryCoding.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>categoryCoding.display = <span style=\"color: blue\">'Survey'</span> <i>"categoryDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"categoryCodingRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</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 <span style=\"color: navy\">// </span><span style=\"color: green\">`effective`, not `effectiveInstant`: the R5 transform engine writes choice</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">elements by their base name and rejects the typed form.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Advantage stamps `authored` when the clearances are submitted, not when each</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">was signed, so a clearance signed at two in the morning and submitted at the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">handover carries the handover time. Sending the signature time on the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">response would fix it at the source; there is nothing on the response for a</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">map to read it from.</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.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -> </b></span>obs.issued = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: maroon\">t</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'instant'</span><span style=\"color: navy\">)</span> <i>"issued"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">The facility, not the person who signed: SGHIObservation admits only an</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Organization or a Patient as performer, and the form's signature is a typed</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">name that resolves to neither. On this form the signer is routinely a</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">cashier, who has no practitioner record to reference in any case.</span>\r\n qr.source<b> as </b><span style=\"color: maroon\">src</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <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\">perf</span><b> then</b><span style=\"color: navy\"> {\r\n</span> src.reference<b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\"><b> -> </b></span>perf.reference = <span style=\"color: maroon\">ref</span> <i>"performerRef"</i><span style=\"color: navy\">;</span>\r\n src.display<b> as </b><span style=\"color: maroon\">disp</span><span style=\"color: navy\"><b> -> </b></span>perf.display = <span style=\"color: maroon\">disp</span> <i>"performerDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"performer"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">One identifier per resource. Copying the response's own would give every</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Observation from a single form the same business identity.</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.identifier<b> as </b><span style=\"color: maroon\">ident</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>ident.use = <span style=\"color: blue\">'official'</span> <i>"identifierUse"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ident.type<b> as </b><span style=\"color: maroon\">identifierTypeCc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>identifierTypeCc.coding<b> as </b><span style=\"color: maroon\">identifierTypeCoding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>identifierTypeCoding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/default-identifier-codesystem'</span> <i>"identifierTypeSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>identifierTypeCoding.code = <span style=\"color: blue\">'default-id'</span> <i>"identifierTypeCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>identifierTypeCoding.display = <span style=\"color: blue\">'Default Resource Identifier'</span> <i>"identifierTypeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"identifierTypeCodingRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"identifierType"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ident.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/default-identifier-codesystem'</span> <i>"identifierSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ident.value = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span> <i>"identifierValue"</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>ident.assigner = <span style=\"color: maroon\">src</span> <i>"identifierAssigner"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"identifier"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">No append: under this engine `qr.id` already resolves to the type-qualified</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">relative reference, so prefixing it again produces a reference to nothing.</span>\r\n qr<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><b> then</b><span style=\"color: navy\"> {\r\n</span> qr.id<b> as </b><span style=\"color: maroon\">qid</span><span style=\"color: navy\"><b> -> </b></span>ref.reference = <span style=\"color: maroon\">qid</span> <i>"derivedFromRef"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"linkQuestionnaireResponse"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetCodedValue<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">a</span>, <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> a.value<b> as </b><span style=\"color: maroon\">cv</span><span style=\"color: navy\"><b> -> </b></span>obs.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\">concept</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cv<span style=\"color: navy\"><b> -> </b></span>concept.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>concept.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\">}\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></pre></div>"
},
"url" : "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDischargeClearanceFinancialClearance",
"version" : "0.1.0",
"name" : "ExtractDischargeClearanceFinancialClearance",
"title" : "Discharge Clearance: Financial Clearance 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" : "Turns the cashier's record that the account was dealt with into one survey Observation, with the clerk's note against it. A Task is the FHIR-correct home for work that has to be done, and this clearance is born completed -- a Task created in the `completed` state carries no workflow, and SGHITask would force an owner, a requester and a requestedPerformer that all resolve to the facility asking itself to settle the account. So this follows the other two clearances and stays an Observation, which keeps one extraction pattern across the three forms. It carries no balance: the figure belongs to billing, and one restated here would be signed against as though this were the authority for it. If billing later wants a workable item, a Task rule can be added to this map without changing anything the frontend sends.",
"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/Observation",
"mode" : "target",
"alias" : "Observation"
}
],
"group" : [
{
"name" : "ExtractDischargeClearanceFinancialClearance",
"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" : "settlementRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '398664818229') and answer.value.exists()"
}
],
"rule" : [
{
"name" : "settlementAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "settlementObs",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "obs",
"transform" : "create",
"parameter" : [
{
"valueString" : "Observation"
}
]
}
],
"rule" : [
{
"name" : "settlementBase",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildClearanceObs",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "settlementCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "code",
"variable" : "settlementCodeCc"
}
],
"rule" : [
{
"name" : "settlementCodeCodingRule",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "settlementCodeCc",
"element" : "coding",
"variable" : "settlementCodeCoding"
}
],
"rule" : [
{
"name" : "settlementCodeSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "settlementCodeCoding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem"
}
]
}
]
},
{
"name" : "settlementCodeCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "settlementCodeCoding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "account-settlement-at-discharge"
}
]
}
]
},
{
"name" : "settlementCodeDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "settlementCodeCoding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "How the account was settled at discharge"
}
]
}
]
}
]
}
]
},
{
"name" : "settlementValue",
"source" : [
{
"context" : "a"
}
],
"target" : [
{
"context" : "obs"
}
],
"dependent" : [
{
"name" : "SetCodedValue",
"parameter" : [
{
"valueId" : "a"
},
{
"valueId" : "obs"
}
]
}
]
},
{
"name" : "financeNoteRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "itNote",
"condition" : "(linkId = '818765459000') and answer.value.exists()"
}
],
"rule" : [
{
"name" : "financeNoteAnswer",
"source" : [
{
"context" : "itNote",
"element" : "answer",
"listMode" : "first",
"variable" : "aNote"
}
],
"rule" : [
{
"name" : "financeNote",
"source" : [
{
"context" : "aNote",
"element" : "value",
"variable" : "nv"
}
],
"target" : [
{
"context" : "obs",
"element" : "note",
"variable" : "note"
}
],
"rule" : [
{
"name" : "financeNoteText",
"source" : [
{
"context" : "nv"
}
],
"target" : [
{
"context" : "note",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "nv"
}
]
}
]
},
{
"name" : "financeNoteTime",
"source" : [
{
"context" : "qr",
"element" : "authored",
"variable" : "t"
}
],
"target" : [
{
"context" : "note",
"element" : "time",
"transform" : "copy",
"parameter" : [
{
"valueId" : "t"
}
]
}
]
}
]
}
]
}
],
"documentation" : "linkId 818765459000 — \"Note\""
}
]
}
]
}
],
"documentation" : "linkId 398664818229 — \"How the account was settled\""
}
]
},
{
"name" : "BuildClearanceObs",
"documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each clearance map rather than imported: the\r\ntransform engine resolves `imports` against whatever StructureMaps happen to\r\nbe on the server, and a clearance that stops extracting because a shared map\r\nwas not uploaded is a worse failure than a duplicated group.\r\nSource parameters are left untyped on purpose. Writing `: Element` makes the\r\npublisher's StructureMap validator compare QuestionnaireResponse.item against\r\nthe literal 'Element' and report them as incompatible, which is noise.\r\n─────────────────────────────────────────────────────────────────────────────",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"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" : "category",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "category",
"variable" : "categoryCc"
}
],
"rule" : [
{
"name" : "categoryCodingRule",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "categoryCc",
"element" : "coding",
"variable" : "categoryCoding"
}
],
"rule" : [
{
"name" : "categorySystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "categoryCoding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name" : "categoryCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "categoryCoding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "survey"
}
]
}
]
},
{
"name" : "categoryDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "categoryCoding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Survey"
}
]
}
]
}
]
}
]
},
{
"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"
}
]
}
],
"documentation" : "`effective`, not `effectiveInstant`: the R5 transform engine writes choice\r\nelements by their base name and rejects the typed form.\r\nAdvantage stamps `authored` when the clearances are submitted, not when each\r\nwas signed, so a clearance signed at two in the morning and submitted at the\r\nhandover carries the handover time. Sending the signature time on the\r\nresponse would fix it at the source; there is nothing on the response for a\r\nmap to read it from."
},
{
"name" : "issued",
"source" : [
{
"context" : "qr",
"element" : "authored",
"variable" : "t"
}
],
"target" : [
{
"context" : "obs",
"element" : "issued",
"transform" : "cast",
"parameter" : [
{
"valueId" : "t"
},
{
"valueString" : "instant"
}
]
}
]
},
{
"name" : "performer",
"source" : [
{
"context" : "qr",
"element" : "source",
"variable" : "src"
}
],
"target" : [
{
"context" : "obs",
"element" : "performer",
"variable" : "perf",
"transform" : "create",
"parameter" : [
{
"valueString" : "Reference"
}
]
}
],
"rule" : [
{
"name" : "performerRef",
"source" : [
{
"context" : "src",
"element" : "reference",
"variable" : "ref"
}
],
"target" : [
{
"context" : "perf",
"element" : "reference",
"transform" : "copy",
"parameter" : [
{
"valueId" : "ref"
}
]
}
]
},
{
"name" : "performerDisplay",
"source" : [
{
"context" : "src",
"element" : "display",
"variable" : "disp"
}
],
"target" : [
{
"context" : "perf",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueId" : "disp"
}
]
}
]
}
],
"documentation" : "The facility, not the person who signed: SGHIObservation admits only an\r\nOrganization or a Patient as performer, and the form's signature is a typed\r\nname that resolves to neither. On this form the signer is routinely a\r\ncashier, who has no practitioner record to reference in any case."
},
{
"name" : "identifier",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "identifier",
"variable" : "ident"
}
],
"rule" : [
{
"name" : "identifierUse",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ident",
"element" : "use",
"transform" : "copy",
"parameter" : [
{
"valueString" : "official"
}
]
}
]
},
{
"name" : "identifierType",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ident",
"element" : "type",
"variable" : "identifierTypeCc"
}
],
"rule" : [
{
"name" : "identifierTypeCodingRule",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "identifierTypeCc",
"element" : "coding",
"variable" : "identifierTypeCoding"
}
],
"rule" : [
{
"name" : "identifierTypeSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "identifierTypeCoding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/default-identifier-codesystem"
}
]
}
]
},
{
"name" : "identifierTypeCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "identifierTypeCoding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "default-id"
}
]
}
]
},
{
"name" : "identifierTypeDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "identifierTypeCoding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Default Resource Identifier"
}
]
}
]
}
]
}
]
},
{
"name" : "identifierSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ident",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/default-identifier-codesystem"
}
]
}
]
},
{
"name" : "identifierValue",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ident",
"element" : "value",
"transform" : "uuid"
}
]
},
{
"name" : "identifierAssigner",
"source" : [
{
"context" : "qr",
"element" : "source",
"variable" : "src"
}
],
"target" : [
{
"context" : "ident",
"element" : "assigner",
"transform" : "copy",
"parameter" : [
{
"valueId" : "src"
}
]
}
]
}
],
"documentation" : "One identifier per resource. Copying the response's own would give every\r\nObservation from a single form the same business identity."
},
{
"name" : "linkQuestionnaireResponse",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "derivedFrom",
"variable" : "ref",
"transform" : "create",
"parameter" : [
{
"valueString" : "Reference"
}
]
}
],
"rule" : [
{
"name" : "derivedFromRef",
"source" : [
{
"context" : "qr",
"element" : "id",
"variable" : "qid"
}
],
"target" : [
{
"context" : "ref",
"element" : "reference",
"transform" : "copy",
"parameter" : [
{
"valueId" : "qid"
}
]
}
]
}
],
"documentation" : "No append: under this engine `qr.id` already resolves to the type-qualified\r\nrelative reference, so prefixing it again produces a reference to nothing."
}
]
},
{
"name" : "SetCodedValue",
"input" : [
{
"name" : "a",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
}
],
"rule" : [
{
"name" : "codedValue",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "cv"
}
],
"target" : [
{
"context" : "obs",
"element" : "value",
"variable" : "concept",
"transform" : "create",
"parameter" : [
{
"valueString" : "CodeableConcept"
}
]
}
],
"rule" : [
{
"name" : "valueCoding",
"source" : [
{
"context" : "cv"
}
],
"target" : [
{
"context" : "concept",
"element" : "coding",
"transform" : "copy",
"parameter" : [
{
"valueId" : "cv"
}
]
}
]
},
{
"name" : "valueText",
"source" : [
{
"context" : "cv",
"element" : "display",
"variable" : "d"
}
],
"target" : [
{
"context" : "concept",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "d"
}
]
}
]
}
]
}
]
},
{
"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"
}
]
}
]
}
]
}
]
}