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" : "ExtractBradenScale",
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractBradenScale</b></p><a name=\"ExtractBradenScale\"> </a><a name=\"hcExtractBradenScale\"> </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/ExtractBradenScale'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractBradenScale'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Braden Scale Skin Assessment 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 LOINC Braden scale panel out as one Observation carrying the total, with the six sub-scores as components, plus a RiskAssessment for the band the total falls in. The total prefers what the form submitted and otherwise sums the answers itself, and it only extracts when all six sub-scores have been answered: a Braden computed from four of six items is not a Braden score, and banding one would put a number a nurse can act on next to a risk tier that is wrong.'</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<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/riskassessment.html\" title=\"RiskAssessment\">http://hl7.org/fhir/StructureDefinition/RiskAssessment</a><span style=\"color: navy\">" </span><b>alias </b>RiskAssessment <b>as </b><b>target</b>\r\n\r\n<b>group </b>ExtractBradenScale<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\">LOINC publishes this panel flat -- the six sub-scores, the total and the risk</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">level are all top-level items, keyed by their own LOINC code -- so there is no</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">group to hang the Observation off and the response itself is the anchor.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId in ('38222-6' | '38229-1' | '38223-4' | '38224-2' | '38225-9' | '38226-7')).answer.value.ofType(Coding).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\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>code.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://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38227-5'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Braden scale total score'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">The submitted total wins; otherwise sum the answers.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">The weight cannot be read off the code the way the SGHI-coded instruments</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">allow, because these are LOINC answer codes and LA9605-2 says nothing about</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">being worth 3. It is read off a lookup instead. That lookup is safe to write</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">globally rather than per sub-score: the twenty-one answer codes across the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">six items collapse to nineteen distinct ones, and the two that repeat --</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">LA9604-5 "Very limited" and LA9605-2 "Slightly limited", shared by sensory</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">perception and mobility -- carry the same weight in both. Both paths are the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">arithmetic Bergstrom published, so they cannot disagree.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">truncate(), not toInteger(): the form types the total `decimal`, and this</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">engine's toInteger() returns empty for anything with a fractional part.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Observation.value has no decimal choice, so it has to land as an integer.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Guarded on all six sub-scores being present.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId in ('38222-6' | '38229-1' | '38223-4' | '38224-2' | '38225-9' | '38226-7')).answer.value.ofType(Coding).count() = 6<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.value = evaluate<span style=\"color: navy\">(</span>qr<span style=\"color: navy\">, </span>iif(item.where(linkId = '38227-5').answer.value.exists(), item.where(linkId = '38227-5').answer.value.truncate(), item.where(linkId in ('38222-6' | '38229-1' | '38223-4' | '38224-2' | '38225-9' | '38226-7')).answer.value.ofType(Coding).code.select(iif($this in ('LA9603-7' | 'LA9607-8' | 'LA6742-6' | 'LA9614-4' | 'LA9615-1' | 'LA9617-7'), 1, iif($this in ('LA9604-5' | 'LA9608-6' | 'LA9611-0' | 'LA9616-9' | 'LA9618-5'), 2, iif($this in ('LA9605-2' | 'LA9609-4' | 'LA9612-8' | 'LA8913-1' | 'LA9619-3'), 3, iif($this in ('LA9606-0' | 'LA9610-2' | 'LA9613-6' | 'LA120-8' | 'LA9206-9'), 4, 0))))).aggregate($this + $total, 0))<span style=\"color: navy\">)</span> <i>"totalValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"totalRule"</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 = '38222-6') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38222-6'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Sensory perception Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"sensoryCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"sensoryValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"sensoryRule"</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 = '38229-1') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38229-1'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Moisture exposure Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"moistureCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"moistureValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"moistureRule"</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 = '38223-4') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38223-4'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Physical activity Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"activityCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"activityValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"activityRule"</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 = '38224-2') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38224-2'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Physical mobility Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"mobilityCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"mobilityValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"mobilityRule"</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 = '38225-9') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38225-9'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Nutrition intake pattern Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"nutritionCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"nutritionValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"nutritionRule"</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 = '38226-7') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'38226-7'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Friction and shear Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"frictionCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"frictionValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"frictionValueRule"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span> obs<span style=\"color: navy\">, </span> bundle<b> then </b>AddBradenRiskAssessment<span style=\"color: navy\">(</span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">bundle</span><span style=\"color: navy\">)</span> <i>"band"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bradenRule"</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\">The band</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Bergstrom's published tiers: 19 and over no risk, 15-18 mild, 13-14 moderate,</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">10-12 high, 9 and under very high. Lower is worse.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">qualitativeRisk carries two codings and a text. HL7's risk-probability is what</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">a consumer escalates on, and it has five concepts against Braden's five tiers</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">but not the same five, so "very high" and "high" both land on #high. LOINC's</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">own answer list for 81636-3 -- the list printed on the form the nurse filled</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">in -- has the tier exactly, so it rides alongside and the two never drift. The</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">text spells the published wording out for anything that only prints.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The band is derived from the total rather than copied from the form's own</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">risk-level item. That item is a free pick list with nothing calculating it, so</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">deriving is the only way the number and the tier are guaranteed to agree.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>AddBradenRiskAssessment<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <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> obs<b> where </b><span style=\"color: navy\">(</span>value.ofType(integer) <= 9<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\">'RiskAssessment'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ra</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> ra<span style=\"color: navy\">, </span> entry<b> then </b>BuildRiskBase<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\">ra</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"riskBase"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra<b> then </b>SetBradenRiskCode<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ra</span><span style=\"color: navy\">)</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra.prediction<b> as </b><span style=\"color: maroon\">pred</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>pred.qualitativeRisk<b> as </b><span style=\"color: maroon\">risk</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>risk.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/risk-probability'</span> <i>"riskSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'high'</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'High likelihood'</span> <i>"riskDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"hl7Coding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.coding<b> as </b><span style=\"color: maroon\">loinc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>loinc.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"loincSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.code = <span style=\"color: blue\">'LA14637-5'</span> <i>"loincCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.display = <span style=\"color: blue\">'Very high'</span> <i>"loincDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"loincCoding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.text = <span style=\"color: blue\">'Very high risk'</span> <i>"riskText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"qualitativeRisk"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"prediction"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bradenVeryHigh"</i><span style=\"color: navy\">;</span>\r\n obs<b> where </b><span style=\"color: navy\">(</span>(value.ofType(integer) >= 10) and (value.ofType(integer) <= 12)<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\">'RiskAssessment'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ra</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> ra<span style=\"color: navy\">, </span> entry<b> then </b>BuildRiskBase<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\">ra</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"riskBase"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra<b> then </b>SetBradenRiskCode<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ra</span><span style=\"color: navy\">)</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra.prediction<b> as </b><span style=\"color: maroon\">pred</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>pred.qualitativeRisk<b> as </b><span style=\"color: maroon\">risk</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>risk.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/risk-probability'</span> <i>"riskSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'high'</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'High likelihood'</span> <i>"riskDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"hl7Coding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.coding<b> as </b><span style=\"color: maroon\">loinc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>loinc.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"loincSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.code = <span style=\"color: blue\">'LA9193-9'</span> <i>"loincCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.display = <span style=\"color: blue\">'High'</span> <i>"loincDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"loincCoding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.text = <span style=\"color: blue\">'High risk'</span> <i>"riskText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"qualitativeRisk"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"prediction"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bradenHigh"</i><span style=\"color: navy\">;</span>\r\n obs<b> where </b><span style=\"color: navy\">(</span>(value.ofType(integer) >= 13) and (value.ofType(integer) <= 14)<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\">'RiskAssessment'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ra</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> ra<span style=\"color: navy\">, </span> entry<b> then </b>BuildRiskBase<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\">ra</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"riskBase"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra<b> then </b>SetBradenRiskCode<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ra</span><span style=\"color: navy\">)</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra.prediction<b> as </b><span style=\"color: maroon\">pred</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>pred.qualitativeRisk<b> as </b><span style=\"color: maroon\">risk</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>risk.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/risk-probability'</span> <i>"riskSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'moderate'</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Moderate likelihood'</span> <i>"riskDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"hl7Coding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.coding<b> as </b><span style=\"color: maroon\">loinc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>loinc.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"loincSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.code = <span style=\"color: blue\">'LA6751-7'</span> <i>"loincCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.display = <span style=\"color: blue\">'Moderate'</span> <i>"loincDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"loincCoding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.text = <span style=\"color: blue\">'Moderate risk'</span> <i>"riskText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"qualitativeRisk"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"prediction"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bradenModerate"</i><span style=\"color: navy\">;</span>\r\n obs<b> where </b><span style=\"color: navy\">(</span>(value.ofType(integer) >= 15) and (value.ofType(integer) <= 18)<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\">'RiskAssessment'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ra</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> ra<span style=\"color: navy\">, </span> entry<b> then </b>BuildRiskBase<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\">ra</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"riskBase"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra<b> then </b>SetBradenRiskCode<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ra</span><span style=\"color: navy\">)</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra.prediction<b> as </b><span style=\"color: maroon\">pred</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>pred.qualitativeRisk<b> as </b><span style=\"color: maroon\">risk</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>risk.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/risk-probability'</span> <i>"riskSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'low'</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Low likelihood'</span> <i>"riskDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"hl7Coding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.coding<b> as </b><span style=\"color: maroon\">loinc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>loinc.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"loincSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.code = <span style=\"color: blue\">'LA6752-5'</span> <i>"loincCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.display = <span style=\"color: blue\">'Mild'</span> <i>"loincDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"loincCoding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.text = <span style=\"color: blue\">'Mild risk'</span> <i>"riskText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"qualitativeRisk"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"prediction"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bradenMild"</i><span style=\"color: navy\">;</span>\r\n obs<b> where </b><span style=\"color: navy\">(</span>value.ofType(integer) >= 19<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\">'RiskAssessment'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ra</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> ra<span style=\"color: navy\">, </span> entry<b> then </b>BuildRiskBase<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\">ra</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"riskBase"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra<b> then </b>SetBradenRiskCode<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ra</span><span style=\"color: navy\">)</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>ra.prediction<b> as </b><span style=\"color: maroon\">pred</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>pred.qualitativeRisk<b> as </b><span style=\"color: maroon\">risk</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>risk.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/risk-probability'</span> <i>"riskSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'negligible'</span> <i>"riskCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Negligible likelihood'</span> <i>"riskDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"hl7Coding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.coding<b> as </b><span style=\"color: maroon\">loinc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>loinc.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"loincSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.code = <span style=\"color: blue\">'LA19983-8'</span> <i>"loincCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>loinc.display = <span style=\"color: blue\">'No risk'</span> <i>"loincDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"loincCoding"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>risk.text = <span style=\"color: blue\">'No risk identified'</span> <i>"riskText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"qualitativeRisk"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"prediction"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bradenNoRisk"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetBradenRiskCode<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\">ra</span><span style=\"color: navy\"> : </span>RiskAssessment<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>ra.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>code.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://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'81636-3'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Pressure injury risk level Braden scale'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</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\">─────────────────────────────────────────────────────────────────────────────</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\">Untyped, it says only that it cannot check the paths.</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 publisher</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">is objecting to what its own compiler emits. Two arguments is the only form that</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">compiles, and it is what the R5 transform engine executes.</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.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 a</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">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><span style=\"color: navy\">// </span><span style=\"color: green\">The RiskAssessment stands on two things: the response that was filled in and</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the Observation that holds the number. Both go in basis, which is what the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">SGHI RiskAssessment profile binds to a QuestionnaireResponse.</span>\r\n<b>group </b>BuildRiskBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">ra</span><span style=\"color: navy\"> : </span>RiskAssessment, <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>ra.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetRiskAssessmentFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">ra</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\">'RiskAssessment'</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>ra.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>ra.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>ra.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>ra.occurrence = <span style=\"color: maroon\">t</span> <i>"occurrence"</i><span style=\"color: navy\">;</span>\r\n qr.author<b> as </b><span style=\"color: maroon\">a</span><span style=\"color: navy\"><b> -> </b></span>ra.performer = <span style=\"color: maroon\">a</span> <i>"performerFromAuthor"</i><span style=\"color: navy\">;</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>author.exists().not()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr.source<b> as </b><span style=\"color: maroon\">src</span><span style=\"color: navy\"><b> -> </b></span>ra.performer = <span style=\"color: maroon\">src</span> <i>"performerFromSource"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"performerFallback"</i><span style=\"color: navy\">;</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> ra.basis = <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\">qref</span><span style=\"color: navy\">, </span> qref.reference = <span style=\"color: maroon\">qid</span> <i>"basisResponse"</i><span style=\"color: navy\">;</span>\r\n obs.id<b> as </b><span style=\"color: maroon\">oid</span><span style=\"color: navy\"><b> -> </b></span>ra.basis = <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\">oref</span><b> then</b><span style=\"color: navy\"> {\r\n</span> oid<span style=\"color: navy\"><b> -> </b></span>oref.reference = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">oid</span><span style=\"color: navy\">)</span> <i>"basisObservationRef"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"basisObservation"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><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>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>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><b>group </b>SetRiskAssessmentFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">ra</span><span style=\"color: navy\"> : </span>RiskAssessment, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> ra.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/RiskAssessment/'</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/ExtractBradenScale",
"version" : "0.1.0",
"name" : "ExtractBradenScale",
"title" : "Braden Scale Skin Assessment 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 LOINC Braden scale panel out as one Observation carrying the total, with the six sub-scores as components, plus a RiskAssessment for the band the total falls in. The total prefers what the form submitted and otherwise sums the answers itself, and it only extracts when all six sub-scores have been answered: a Braden computed from four of six items is not a Braden score, and banding one would put a number a nurse can act on next to a risk tier that is wrong.",
"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"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/RiskAssessment",
"mode" : "target",
"alias" : "RiskAssessment"
}
],
"group" : [
{
"name" : "ExtractBradenScale",
"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" : "bradenRule",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId in ('38222-6' | '38229-1' | '38223-4' | '38224-2' | '38225-9' | '38226-7')).answer.value.ofType(Coding).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" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38227-5"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Braden scale total score"
}
]
}
]
}
]
}
]
},
{
"name" : "totalRule",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId in ('38222-6' | '38229-1' | '38223-4' | '38224-2' | '38225-9' | '38226-7')).answer.value.ofType(Coding).count() = 6"
}
],
"rule" : [
{
"name" : "totalValue",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "value",
"transform" : "evaluate",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueString" : "iif(item.where(linkId = '38227-5').answer.value.exists(), item.where(linkId = '38227-5').answer.value.truncate(), item.where(linkId in ('38222-6' | '38229-1' | '38223-4' | '38224-2' | '38225-9' | '38226-7')).answer.value.ofType(Coding).code.select(iif($this in ('LA9603-7' | 'LA9607-8' | 'LA6742-6' | 'LA9614-4' | 'LA9615-1' | 'LA9617-7'), 1, iif($this in ('LA9604-5' | 'LA9608-6' | 'LA9611-0' | 'LA9616-9' | 'LA9618-5'), 2, iif($this in ('LA9605-2' | 'LA9609-4' | 'LA9612-8' | 'LA8913-1' | 'LA9619-3'), 3, iif($this in ('LA9606-0' | 'LA9610-2' | 'LA9613-6' | 'LA120-8' | 'LA9206-9'), 4, 0))))).aggregate($this + $total, 0))"
}
]
}
]
}
],
"documentation" : "The submitted total wins; otherwise sum the answers.\r\nThe weight cannot be read off the code the way the SGHI-coded instruments\r\nallow, because these are LOINC answer codes and LA9605-2 says nothing about\r\nbeing worth 3. It is read off a lookup instead. That lookup is safe to write\r\nglobally rather than per sub-score: the twenty-one answer codes across the\r\nsix items collapse to nineteen distinct ones, and the two that repeat --\r\nLA9604-5 \"Very limited\" and LA9605-2 \"Slightly limited\", shared by sensory\r\nperception and mobility -- carry the same weight in both. Both paths are the\r\narithmetic Bergstrom published, so they cannot disagree.\r\ntruncate(), not toInteger(): the form types the total `decimal`, and this\r\nengine's toInteger() returns empty for anything with a fractional part.\r\nObservation.value has no decimal choice, so it has to land as an integer.\r\nGuarded on all six sub-scores being present."
},
{
"name" : "sensoryRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '38222-6') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "sensoryCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38222-6"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Sensory perception Braden scale"
}
]
}
]
}
]
}
]
},
{
"name" : "sensoryValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "moistureRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '38229-1') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "moistureCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38229-1"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Moisture exposure Braden scale"
}
]
}
]
}
]
}
]
},
{
"name" : "moistureValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "activityRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '38223-4') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "activityCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38223-4"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Physical activity Braden scale"
}
]
}
]
}
]
}
]
},
{
"name" : "activityValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "mobilityRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '38224-2') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "mobilityCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38224-2"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Physical mobility Braden scale"
}
]
}
]
}
]
}
]
},
{
"name" : "mobilityValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "nutritionRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '38225-9') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "nutritionCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38225-9"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Nutrition intake pattern Braden scale"
}
]
}
]
}
]
}
]
},
{
"name" : "nutritionValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "frictionValueRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = '38226-7') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "frictionCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "38226-7"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Friction and shear Braden scale"
}
]
}
]
}
]
}
]
},
{
"name" : "frictionValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "band",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
},
{
"context" : "bundle"
}
],
"dependent" : [
{
"name" : "AddBradenRiskAssessment",
"parameter" : [
{
"valueId" : "obs"
},
{
"valueId" : "qr"
},
{
"valueId" : "bundle"
}
]
}
]
}
],
"documentation" : "LOINC publishes this panel flat -- the six sub-scores, the total and the risk\r\nlevel are all top-level items, keyed by their own LOINC code -- so there is no\r\ngroup to hang the Observation off and the response itself is the anchor."
}
]
},
{
"name" : "AddBradenRiskAssessment",
"documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nThe band\r\nBergstrom's published tiers: 19 and over no risk, 15-18 mild, 13-14 moderate,\r\n10-12 high, 9 and under very high. Lower is worse.\r\nqualitativeRisk carries two codings and a text. HL7's risk-probability is what\r\na consumer escalates on, and it has five concepts against Braden's five tiers\r\nbut not the same five, so \"very high\" and \"high\" both land on #high. LOINC's\r\nown answer list for 81636-3 -- the list printed on the form the nurse filled\r\nin -- has the tier exactly, so it rides alongside and the two never drift. The\r\ntext spells the published wording out for anything that only prints.\r\nThe band is derived from the total rather than copied from the form's own\r\nrisk-level item. That item is a free pick list with nothing calculating it, so\r\nderiving is the only way the number and the tier are guaranteed to agree.\r\n─────────────────────────────────────────────────────────────────────────────",
"input" : [
{
"name" : "obs",
"type" : "Observation",
"mode" : "source"
},
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "bundle",
"type" : "Bundle",
"mode" : "target"
}
],
"rule" : [
{
"name" : "bradenVeryHigh",
"source" : [
{
"context" : "obs",
"condition" : "value.ofType(integer) <= 9"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "ra",
"transform" : "create",
"parameter" : [
{
"valueString" : "RiskAssessment"
}
]
}
],
"rule" : [
{
"name" : "riskBase",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildRiskBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "ra"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
}
],
"dependent" : [
{
"name" : "SetBradenRiskCode",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "ra"
}
]
}
]
},
{
"name" : "prediction",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "prediction",
"variable" : "pred"
}
],
"rule" : [
{
"name" : "qualitativeRisk",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "pred",
"element" : "qualitativeRisk",
"variable" : "risk"
}
],
"rule" : [
{
"name" : "hl7Coding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "riskSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/risk-probability"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "high"
}
]
}
]
},
{
"name" : "riskDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "High likelihood"
}
]
}
]
}
]
},
{
"name" : "loincCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "loinc"
}
],
"rule" : [
{
"name" : "loincSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "loincCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "LA14637-5"
}
]
}
]
},
{
"name" : "loincDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Very high"
}
]
}
]
}
]
},
{
"name" : "riskText",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Very high risk"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "bradenHigh",
"source" : [
{
"context" : "obs",
"condition" : "(value.ofType(integer) >= 10) and (value.ofType(integer) <= 12)"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "ra",
"transform" : "create",
"parameter" : [
{
"valueString" : "RiskAssessment"
}
]
}
],
"rule" : [
{
"name" : "riskBase",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildRiskBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "ra"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
}
],
"dependent" : [
{
"name" : "SetBradenRiskCode",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "ra"
}
]
}
]
},
{
"name" : "prediction",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "prediction",
"variable" : "pred"
}
],
"rule" : [
{
"name" : "qualitativeRisk",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "pred",
"element" : "qualitativeRisk",
"variable" : "risk"
}
],
"rule" : [
{
"name" : "hl7Coding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "riskSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/risk-probability"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "high"
}
]
}
]
},
{
"name" : "riskDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "High likelihood"
}
]
}
]
}
]
},
{
"name" : "loincCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "loinc"
}
],
"rule" : [
{
"name" : "loincSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "loincCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "LA9193-9"
}
]
}
]
},
{
"name" : "loincDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "High"
}
]
}
]
}
]
},
{
"name" : "riskText",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "High risk"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "bradenModerate",
"source" : [
{
"context" : "obs",
"condition" : "(value.ofType(integer) >= 13) and (value.ofType(integer) <= 14)"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "ra",
"transform" : "create",
"parameter" : [
{
"valueString" : "RiskAssessment"
}
]
}
],
"rule" : [
{
"name" : "riskBase",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildRiskBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "ra"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
}
],
"dependent" : [
{
"name" : "SetBradenRiskCode",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "ra"
}
]
}
]
},
{
"name" : "prediction",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "prediction",
"variable" : "pred"
}
],
"rule" : [
{
"name" : "qualitativeRisk",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "pred",
"element" : "qualitativeRisk",
"variable" : "risk"
}
],
"rule" : [
{
"name" : "hl7Coding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "riskSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/risk-probability"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "moderate"
}
]
}
]
},
{
"name" : "riskDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Moderate likelihood"
}
]
}
]
}
]
},
{
"name" : "loincCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "loinc"
}
],
"rule" : [
{
"name" : "loincSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "loincCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "LA6751-7"
}
]
}
]
},
{
"name" : "loincDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Moderate"
}
]
}
]
}
]
},
{
"name" : "riskText",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Moderate risk"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "bradenMild",
"source" : [
{
"context" : "obs",
"condition" : "(value.ofType(integer) >= 15) and (value.ofType(integer) <= 18)"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "ra",
"transform" : "create",
"parameter" : [
{
"valueString" : "RiskAssessment"
}
]
}
],
"rule" : [
{
"name" : "riskBase",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildRiskBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "ra"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
}
],
"dependent" : [
{
"name" : "SetBradenRiskCode",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "ra"
}
]
}
]
},
{
"name" : "prediction",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "prediction",
"variable" : "pred"
}
],
"rule" : [
{
"name" : "qualitativeRisk",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "pred",
"element" : "qualitativeRisk",
"variable" : "risk"
}
],
"rule" : [
{
"name" : "hl7Coding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "riskSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/risk-probability"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "low"
}
]
}
]
},
{
"name" : "riskDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Low likelihood"
}
]
}
]
}
]
},
{
"name" : "loincCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "loinc"
}
],
"rule" : [
{
"name" : "loincSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "loincCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "LA6752-5"
}
]
}
]
},
{
"name" : "loincDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Mild"
}
]
}
]
}
]
},
{
"name" : "riskText",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Mild risk"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "bradenNoRisk",
"source" : [
{
"context" : "obs",
"condition" : "value.ofType(integer) >= 19"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "ra",
"transform" : "create",
"parameter" : [
{
"valueString" : "RiskAssessment"
}
]
}
],
"rule" : [
{
"name" : "riskBase",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildRiskBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "ra"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra"
}
],
"dependent" : [
{
"name" : "SetBradenRiskCode",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "ra"
}
]
}
]
},
{
"name" : "prediction",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "prediction",
"variable" : "pred"
}
],
"rule" : [
{
"name" : "qualitativeRisk",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "pred",
"element" : "qualitativeRisk",
"variable" : "risk"
}
],
"rule" : [
{
"name" : "hl7Coding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "riskSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/risk-probability"
}
]
}
]
},
{
"name" : "riskCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "negligible"
}
]
}
]
},
{
"name" : "riskDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Negligible likelihood"
}
]
}
]
}
]
},
{
"name" : "loincCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "coding",
"variable" : "loinc"
}
],
"rule" : [
{
"name" : "loincSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "loincCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "LA19983-8"
}
]
}
]
},
{
"name" : "loincDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "loinc",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "No risk"
}
]
}
]
}
]
},
{
"name" : "riskText",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "risk",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "No risk identified"
}
]
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "SetBradenRiskCode",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "ra",
"type" : "RiskAssessment",
"mode" : "target"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "81636-3"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Pressure injury risk level Braden scale"
}
]
}
]
}
]
}
]
}
]
},
{
"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\n─────────────────────────────────────────────────────────────────────────────\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\nUntyped, it says only that it cannot check the paths.\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 publisher\r\nis objecting to what its own compiler emits. Two arguments is the only form that\r\ncompiles, and it is what the R5 transform engine executes.",
"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" : "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 a\r\nrelative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first --\r\nfrom writing \"QuestionnaireResponse/null\" into the record."
}
]
},
{
"name" : "BuildRiskBase",
"documentation" : "The RiskAssessment stands on two things: the response that was filled in and\r\nthe Observation that holds the number. Both go in basis, which is what the\r\nSGHI RiskAssessment profile binds to a QuestionnaireResponse.",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "source"
},
{
"name" : "ra",
"type" : "RiskAssessment",
"mode" : "target"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"name" : "idAndFullUrl",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "id",
"transform" : "uuid"
}
],
"dependent" : [
{
"name" : "SetRiskAssessmentFullUrl",
"parameter" : [
{
"valueId" : "ra"
},
{
"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" : "RiskAssessment"
}
]
}
]
}
]
},
{
"name" : "status",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "ra",
"element" : "status",
"transform" : "copy",
"parameter" : [
{
"valueString" : "final"
}
]
}
]
},
{
"name" : "subject",
"source" : [
{
"context" : "qr",
"element" : "subject",
"variable" : "s"
}
],
"target" : [
{
"context" : "ra",
"element" : "subject",
"transform" : "copy",
"parameter" : [
{
"valueId" : "s"
}
]
}
]
},
{
"name" : "encounter",
"source" : [
{
"context" : "qr",
"element" : "encounter",
"variable" : "e"
}
],
"target" : [
{
"context" : "ra",
"element" : "encounter",
"transform" : "copy",
"parameter" : [
{
"valueId" : "e"
}
]
}
]
},
{
"name" : "occurrence",
"source" : [
{
"context" : "qr",
"element" : "authored",
"variable" : "t"
}
],
"target" : [
{
"context" : "ra",
"element" : "occurrence",
"transform" : "copy",
"parameter" : [
{
"valueId" : "t"
}
]
}
]
},
{
"name" : "performerFromAuthor",
"source" : [
{
"context" : "qr",
"element" : "author",
"variable" : "a"
}
],
"target" : [
{
"context" : "ra",
"element" : "performer",
"transform" : "copy",
"parameter" : [
{
"valueId" : "a"
}
]
}
]
},
{
"name" : "performerFallback",
"source" : [
{
"context" : "qr",
"condition" : "author.exists().not()"
}
],
"rule" : [
{
"name" : "performerFromSource",
"source" : [
{
"context" : "qr",
"element" : "source",
"variable" : "src"
}
],
"target" : [
{
"context" : "ra",
"element" : "performer",
"transform" : "copy",
"parameter" : [
{
"valueId" : "src"
}
]
}
]
}
]
},
{
"name" : "basisResponse",
"source" : [
{
"context" : "qr",
"element" : "id",
"variable" : "qid",
"condition" : "$this.hasValue()"
}
],
"target" : [
{
"context" : "ra",
"element" : "basis",
"variable" : "qref",
"transform" : "create",
"parameter" : [
{
"valueString" : "Reference"
}
]
},
{
"context" : "qref",
"element" : "reference",
"transform" : "copy",
"parameter" : [
{
"valueId" : "qid"
}
]
}
]
},
{
"name" : "basisObservation",
"source" : [
{
"context" : "obs",
"element" : "id",
"variable" : "oid"
}
],
"target" : [
{
"context" : "ra",
"element" : "basis",
"variable" : "oref",
"transform" : "create",
"parameter" : [
{
"valueString" : "Reference"
}
]
}
],
"rule" : [
{
"name" : "basisObservationRef",
"source" : [
{
"context" : "oid"
}
],
"target" : [
{
"context" : "oref",
"element" : "reference",
"transform" : "append",
"parameter" : [
{
"valueString" : "Observation/"
},
{
"valueId" : "oid"
}
]
}
]
}
]
}
]
},
{
"name" : "SetComponentCodedValue",
"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" : "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" : "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" : "SetRiskAssessmentFullUrl",
"input" : [
{
"name" : "ra",
"type" : "RiskAssessment",
"mode" : "source"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"name" : "assignFullUrl",
"source" : [
{
"context" : "ra",
"element" : "id",
"variable" : "id"
}
],
"target" : [
{
"context" : "entry",
"element" : "fullUrl",
"transform" : "append",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/RiskAssessment/"
},
{
"valueId" : "id"
}
]
}
]
}
]
}
]
}