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
| Draft as of 2026-09-14 |
{
"resourceType" : "StructureMap",
"id" : "ExtractBishopScore",
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractBishopScore</b></p><a name=\"ExtractBishopScore\"> </a><a name=\"hcExtractBishopScore\"> </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/ExtractBishopScore'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractBishopScore'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Bishop Score Extraction'</span>\r\n<span style=\"color: #cc00cc\">/// <b>status</b> = </span><span style=\"color: blue\">'draft'</span>\r\n<span style=\"color: #cc00cc\">/// <b>description</b> = </span><span style=\"color: blue\">'The Bishop score out as one Observation carrying the total, with the five weighted items as components and the fetal heart rate, the position of the presenting part and the membrane status alongside them. The total prefers what the form submitted and otherwise sums the item weights itself, and it only extracts when all five items have been answered — a Bishop of 6 out of three items answered reads as a favourable cervix and is not one.'</span>\r\n\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/questionnaireresponse.html\" title=\"QuestionnaireResponse\">http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse</a><span style=\"color: navy\">" </span><b>alias </b>QR <b>as </b><b>source</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/bundle.html\" title=\"Bundle\">http://hl7.org/fhir/StructureDefinition/Bundle</a><span style=\"color: navy\">" </span><b>alias </b>Bundle <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/observation.html\" title=\"Observation\">http://hl7.org/fhir/StructureDefinition/Observation</a><span style=\"color: navy\">" </span><b>alias </b>Observation <b>as </b><b>target</b>\r\n\r\n<b>group </b>ExtractBishopScore<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\">Anchored on any item of the assessment group being answered rather than on</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">the total, because the total is calculated and a client without a FHIRPath</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">engine submits it empty. Anchoring on the total would mean such a client</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">extracted nothing at all.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId = 'assessment').item.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 <span style=\"color: navy\">// </span><span style=\"color: green\">LOINC has no term for the Bishop score, nor for cervical dilation at all,</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">so the code is local. Searched both "Bishop" and "Dilation Cervix" in</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">LOINC's implicit value set; neither returns anything.</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\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</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\">'bishop-total'</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\">'Bishop score total'</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 qr<span style=\"color: navy\"><b> -> </b></span>code.text = <span style=\"color: blue\">'Bishop score'</span> <i>"codeText"</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 five item weights.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">The weight is read off the tail of the answer code, which is why the codes</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">are namespaced instrument-item-weight. Order matters in the nested iif:</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">'-3' has to be tested before '-1', or bishop-station-3 would never match</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">-- endsWith('-1') is false for it, but a naive test on the last character</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">is not what is written here, and the explicit chain keeps it obvious.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Guarded on all five items being answered. Bishop is a sum over five items</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">and a partial sum is not a smaller Bishop score, it is a different</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">number; nothing in the resource would say which it was.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId = 'assessment').item.answer.value.ofType(Coding).count() = 5<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 = 'total').answer.value.exists(), item.where(linkId = 'total').answer.value.truncate(), item.where(linkId = 'assessment').item.answer.value.ofType(Coding).code.select(iif($this.endsWith('-3'), 3, iif($this.endsWith('-2'), 2, iif($this.endsWith('-1'), 1, 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><span style=\"color: green\">Six or more is a favourable cervix. Stated as the interpretation rather</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">than left for a reader to recall, because the whole point of the score</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">is the induction decision it drives.</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.interpretation<b> as </b><span style=\"color: maroon\">interp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>interp.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/v3-ObservationInterpretation'</span> <i>"interpSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = evaluate<span style=\"color: navy\">(</span>qr<span style=\"color: navy\">, </span>iif(iif(item.where(linkId = 'total').answer.value.exists(), item.where(linkId = 'total').answer.value.truncate(), item.where(linkId = 'assessment').item.answer.value.ofType(Coding).code.select(iif($this.endsWith('-3'), 3, iif($this.endsWith('-2'), 2, iif($this.endsWith('-1'), 1, 0)))).aggregate($this + $total, 0)) >= 6, 'POS', 'NEG')<span style=\"color: navy\">)</span> <i>"interpCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = evaluate<span style=\"color: navy\">(</span>qr<span style=\"color: navy\">, </span>iif(iif(item.where(linkId = 'total').answer.value.exists(), item.where(linkId = 'total').answer.value.truncate(), item.where(linkId = 'assessment').item.answer.value.ofType(Coding).code.select(iif($this.endsWith('-3'), 3, iif($this.endsWith('-2'), 2, iif($this.endsWith('-1'), 1, 0)))).aggregate($this + $total, 0)) >= 6, 'Favourable cervix', 'Unfavourable cervix')<span style=\"color: navy\">)</span> <i>"interpDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"interpCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"interpretation"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"totalRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">── The five weighted items ─────────────────────────────────────────────</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">g</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'assessment'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'assessment/dilation') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'bishop-dilation'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Cervical dilation (Bishop)'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"dilationRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Effacement is the one item where LOINC has the underlying measurement:</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">11867-9 Effacement Cervix. The component below carries the scored band,</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">and the second component further down carries the same answer under the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">LOINC code, so a query for "effacement" finds it either way.</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'assessment/effacement') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'bishop-effacement'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Cervical effacement (Bishop)'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"effacementRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'assessment/effacement') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'11867-9'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Effacement Cervix'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"effacementLoincRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'assessment/consistency') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'bishop-consistency'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Cervical consistency (Bishop)'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"consistencyRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'assessment/position') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'bishop-position'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Cervical position (Bishop)'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"positionRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'assessment/station') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'bishop-station'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Head station (Bishop)'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"stationRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"assessmentItems"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">── Recorded alongside the score ────────────────────────────────────────</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">These are not part of the score and carry no weight, but they belong on</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">the same Observation: they were taken at the same examination, and the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">membrane status in particular changes what the next examination may do.</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">g</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'alongside'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'alongside/fetal-heart-rate') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'55283-6'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Fetal Heart rate'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentValue<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"fetalHeartRateRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'alongside/membranes') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'membrane-status'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Membrane status'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"membraneStatusRule"</i><span style=\"color: navy\">;</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'alongside/presenting-part-position') 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\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'11876-0'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Fetal presentation palpation'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentValue<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>"value"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"presentingPartRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Remarks become Observation.note rather than a component. A component</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">needs a code saying what the value means, and "whatever the examiner</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">wanted to add" is not one.</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'alongside/remarks'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span>obs.note<b> as </b><span style=\"color: maroon\">note</span><b> then</b><span style=\"color: navy\"> {\r\n</span> txt<span style=\"color: navy\"><b> -> </b></span>note.text = <span style=\"color: maroon\">txt</span> <i>"noteText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"createNote"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"remarksAnswer"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"remarksRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"alongsideItems"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Gestation at the assessment. Not a component: it is a fact about the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">pregnancy on the day, not a part of the cervical assessment, so it rides</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">as its own Observation in the entry below.</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">g</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'context'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> <span style=\"color: navy\">// </span><span style=\"color: green\">The indication is why induction was being considered, which is the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">reason for the whole examination. Observation has no `reason`, so it</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">goes to note alongside any remarks.</span>\r\n g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'context/indication'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">txt</span><span style=\"color: navy\"><b> -> </b></span>obs.note<b> as </b><span style=\"color: maroon\">note</span><b> then</b><span style=\"color: navy\"> {\r\n</span> txt<span style=\"color: navy\"><b> -> </b></span>note.text = <span style=\"color: maroon\">txt</span> <i>"noteText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"createNote"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"indicationAnswer"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"indicationRule"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"contextItems"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"bishopObservation"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Gestation, as its own Observation. Separate from the score because it is a</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">property of the pregnancy that other forms also record, and folding it into</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">the Bishop Observation would hide it from a query for gestational age.</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">g</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'context'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> g.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'context/gestation') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObsBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"base"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetVitalSignsCategory<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>obs.code<b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cc.coding<b> as </b><span style=\"color: maroon\">cg</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>cg.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"sys"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.code = <span style=\"color: blue\">'11884-4'</span> <i>"cd"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>cg.display = <span style=\"color: blue\">'Gestational age Estimated'</span> <i>"dsp"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"coding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -> </b></span>obs.value = <span style=\"color: maroon\">v</span> <i>"gestationValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"gestationAnswer"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"gestationObservation"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"gestationRule"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Shared scaffolding. Repeated in each map rather than imported: the transform</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">engine resolves `imports` against whatever StructureMaps happen to be on the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">server, and a form that stops extracting because a shared map was not</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">uploaded is a worse failure than a duplicated group.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Two notes on what the publisher's StructureMap validator says about this file.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Source parameters below are left untyped on purpose. Writing `: Element` makes</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the validator compare QuestionnaireResponse.item against the literal 'Element'</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">and report them as incompatible with each other, which is noise, not a finding.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`evaluate(context, expression)` is flagged as "takes 1 parameter but 2 were</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">found". Leave it. The FML parser in the same jar refuses the one-argument form</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">outright -- it wants a parameter, a comma, then the FHIRPath -- so the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">publisher is objecting to what its own compiler emits. Two arguments is the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">only form that compiles, and it is what the R5 transform engine executes.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>BuildObsBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetResponseProvenance<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"responseProvenance"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetObservationFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"idAndFullUrl"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>"requestMethod"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>request.url = <span style=\"color: blue\">'Observation'</span> <i>"requestUrl"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"entryRequest"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.status = <span style=\"color: blue\">'final'</span> <i>"status"</i><span style=\"color: navy\">;</span>\r\n qr.subject<b> as </b><span style=\"color: maroon\">s</span><span style=\"color: navy\"><b> -> </b></span>obs.subject = <span style=\"color: maroon\">s</span><span style=\"color: navy\">;</span>\r\n qr.encounter<b> as </b><span style=\"color: maroon\">e</span><span style=\"color: navy\"><b> -> </b></span>obs.encounter = <span style=\"color: maroon\">e</span><span style=\"color: navy\">;</span>\r\n qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -> </b></span>obs.effective = <span style=\"color: maroon\">t</span> <i>"effective"</i><span style=\"color: navy\">;</span>\r\n qr.source<b> as </b><span style=\"color: maroon\">src</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <span style=\"color: maroon\">src</span> <i>"performerFromSource"</i><span style=\"color: navy\">;</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>source.exists().not()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr.author<b> as </b><span style=\"color: maroon\">a</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <span style=\"color: maroon\">a</span> <i>"performerFromAuthor"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"performerFallback"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">A stored response's id already reads "QuestionnaireResponse/<id>", so it is</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">a relative reference as it stands. The hasValue() guard is what stops an</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">unsaved response -- one posted straight to $extract rather than saved first</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">-- from writing "QuestionnaireResponse/null" into the record.</span>\r\n qr.id<b> as </b><span style=\"color: maroon\">qid</span><b> where </b><span style=\"color: navy\">(</span>$this.hasValue()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> obs.derivedFrom = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Reference'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\">, </span> ref.reference = <span style=\"color: maroon\">qid</span> <i>"linkQuestionnaireResponse"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetObservationFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> obs.id<b> as </b><span style=\"color: maroon\">id</span><span style=\"color: navy\"><b> -> </b></span>entry.fullUrl = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/Observation/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>"assignFullUrl"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">The two answer shapes a component can carry. Both read the answer through the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">untyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">typed property name fails at transform time on HAPI R5 with "Attempt to read</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">invalid property ... on QuestionnaireResponse.item.answer".</span>\r\n<b>group </b>SetComponentCodedValue<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">cv</span><span style=\"color: navy\"><b> -> </b></span>comp.value = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'CodeableConcept'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cv<span style=\"color: navy\"><b> -> </b></span>cc.coding = <span style=\"color: maroon\">cv</span> <i>"valueCoding"</i><span style=\"color: navy\">;</span>\r\n cv.display<b> as </b><span style=\"color: maroon\">d</span><span style=\"color: navy\"><b> -> </b></span>cc.text = <span style=\"color: maroon\">d</span> <i>"valueText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codedValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"componentAnswer"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetComponentValue<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -> </b></span>comp.value = <span style=\"color: maroon\">v</span> <i>"plainValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"componentAnswer"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetSurveyCategory<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>"categorySystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'survey'</span> <i>"categoryCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Survey'</span> <i>"categoryDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"categoryCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetVitalSignsCategory<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>"categorySystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'vital-signs'</span> <i>"categoryCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Vital Signs'</span> <i>"categoryDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"categoryCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">── Provenance and tenancy ───────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Two tags on everything this map creates. The first says which questionnaire</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">produced it, so a form that reopens mid-admission recalls its own earlier</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">entries and not another form's. The second copies the tenant tags off the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">response, because nothing else on the path puts them there.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The code is the form's document type, not the questionnaire's id: every</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">environment mints its own ids, and there is only one set of maps, so an id</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">here would tie the tag to whichever environment stamped it.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">── Provenance and tenancy ───────────────────────────────────────────────────</span>\r\n<b>group </b>SetResponseProvenance<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">r</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>r.meta<b> as </b><span style=\"color: maroon\">m</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>m.tag<b> as </b><span style=\"color: maroon\">t</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>t.system = <span style=\"color: blue\">'http://slade360edi.com/questionnaire-provenance'</span> <i>"provenanceSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>t.code = <span style=\"color: blue\">'bishop-score'</span> <i>"provenanceCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>t.display = <span style=\"color: blue\">'Bishop score'</span> <i>"provenanceDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"provenanceTag"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"provenanceMeta"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Every tag the response carries, onto the resource. `meta` is 0..1, so this</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">lands on the same meta the rule above created rather than a second one.</span>\r\n qr.meta<b> as </b><span style=\"color: maroon\">qm</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qm.tag<b> as </b><span style=\"color: maroon\">qt</span><span style=\"color: navy\"><b> -> </b></span> r.meta<b> as </b><span style=\"color: maroon\">m</span><span style=\"color: navy\">, </span> m.tag = <span style=\"color: maroon\">qt</span> <i>"copyTag"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"tenantTags"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span></pre></div>"
},
"url" : "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractBishopScore",
"version" : "0.1.0",
"name" : "ExtractBishopScore",
"title" : "Bishop Score Extraction",
"status" : "draft",
"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 Bishop score out as one Observation carrying the total, with the five weighted items as components and the fetal heart rate, the position of the presenting part and the membrane status alongside them. The total prefers what the form submitted and otherwise sums the item weights itself, and it only extracts when all five items have been answered — a Bishop of 6 out of three items answered reads as a favourable cervix and is not one.",
"structure" : [
{
"url" : "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
"mode" : "source",
"alias" : "QR"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/Bundle",
"mode" : "target",
"alias" : "Bundle"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/Observation",
"mode" : "target",
"alias" : "Observation"
}
],
"group" : [
{
"name" : "ExtractBishopScore",
"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" : "bishopObservation",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId = 'assessment').item.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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-total"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Bishop score total"
}
]
}
]
}
]
},
{
"name" : "codeText",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "code",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Bishop score"
}
]
}
]
}
],
"documentation" : "LOINC has no term for the Bishop score, nor for cervical dilation at all,\r\nso the code is local. Searched both \"Bishop\" and \"Dilation Cervix\" in\r\nLOINC's implicit value set; neither returns anything."
},
{
"name" : "totalRule",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId = 'assessment').item.answer.value.ofType(Coding).count() = 5"
}
],
"rule" : [
{
"name" : "totalValue",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "value",
"transform" : "evaluate",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueString" : "iif(item.where(linkId = 'total').answer.value.exists(), item.where(linkId = 'total').answer.value.truncate(), item.where(linkId = 'assessment').item.answer.value.ofType(Coding).code.select(iif($this.endsWith('-3'), 3, iif($this.endsWith('-2'), 2, iif($this.endsWith('-1'), 1, 0)))).aggregate($this + $total, 0))"
}
]
}
]
},
{
"name" : "interpretation",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "interpretation",
"variable" : "interp"
}
],
"rule" : [
{
"name" : "interpCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "interp",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "interpSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
}
]
}
]
},
{
"name" : "interpCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "evaluate",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueString" : "iif(iif(item.where(linkId = 'total').answer.value.exists(), item.where(linkId = 'total').answer.value.truncate(), item.where(linkId = 'assessment').item.answer.value.ofType(Coding).code.select(iif($this.endsWith('-3'), 3, iif($this.endsWith('-2'), 2, iif($this.endsWith('-1'), 1, 0)))).aggregate($this + $total, 0)) >= 6, 'POS', 'NEG')"
}
]
}
]
},
{
"name" : "interpDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "evaluate",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueString" : "iif(iif(item.where(linkId = 'total').answer.value.exists(), item.where(linkId = 'total').answer.value.truncate(), item.where(linkId = 'assessment').item.answer.value.ofType(Coding).code.select(iif($this.endsWith('-3'), 3, iif($this.endsWith('-2'), 2, iif($this.endsWith('-1'), 1, 0)))).aggregate($this + $total, 0)) >= 6, 'Favourable cervix', 'Unfavourable cervix')"
}
]
}
]
}
]
}
],
"documentation" : "Six or more is a favourable cervix. Stated as the interpretation rather\r\nthan left for a reader to recall, because the whole point of the score\r\nis the induction decision it drives."
}
],
"documentation" : "The submitted total wins; otherwise sum the five item weights.\r\nThe weight is read off the tail of the answer code, which is why the codes\r\nare namespaced instrument-item-weight. Order matters in the nested iif:\r\n'-3' has to be tested before '-1', or bishop-station-3 would never match\r\n-- endsWith('-1') is false for it, but a naive test on the last character\r\nis not what is written here, and the explicit chain keeps it obvious.\r\nGuarded on all five items being answered. Bishop is a sum over five items\r\nand a partial sum is not a smaller Bishop score, it is a different\r\nnumber; nothing in the resource would say which it was."
},
{
"name" : "assessmentItems",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "g",
"condition" : "linkId = 'assessment'"
}
],
"rule" : [
{
"name" : "dilationRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'assessment/dilation') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-dilation"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Cervical dilation (Bishop)"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "effacementRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'assessment/effacement') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-effacement"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Cervical effacement (Bishop)"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
],
"documentation" : "Effacement is the one item where LOINC has the underlying measurement:\r\n11867-9 Effacement Cervix. The component below carries the scored band,\r\nand the second component further down carries the same answer under the\r\nLOINC code, so a query for \"effacement\" finds it either way."
},
{
"name" : "effacementLoincRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'assessment/effacement') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "11867-9"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Effacement Cervix"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "consistencyRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'assessment/consistency') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-consistency"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Cervical consistency (Bishop)"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "positionRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'assessment/position') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-position"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Cervical position (Bishop)"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "stationRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'assessment/station') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-station"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Head station (Bishop)"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
}
],
"documentation" : "── The five weighted items ─────────────────────────────────────────────"
},
{
"name" : "alongsideItems",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "g",
"condition" : "linkId = 'alongside'"
}
],
"rule" : [
{
"name" : "fetalHeartRateRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'alongside/fetal-heart-rate') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "55283-6"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Fetal Heart rate"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "membraneStatusRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'alongside/membranes') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "membrane-status"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Membrane status"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "presentingPartRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'alongside/presenting-part-position') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "11876-0"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Fetal presentation palpation"
}
]
}
]
}
]
}
]
},
{
"name" : "value",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "remarksRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "linkId = 'alongside/remarks'"
}
],
"rule" : [
{
"name" : "remarksAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "createNote",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "txt"
}
],
"target" : [
{
"context" : "obs",
"element" : "note",
"variable" : "note"
}
],
"rule" : [
{
"name" : "noteText",
"source" : [
{
"context" : "txt"
}
],
"target" : [
{
"context" : "note",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "txt"
}
]
}
]
}
]
}
]
}
],
"documentation" : "Remarks become Observation.note rather than a component. A component\r\nneeds a code saying what the value means, and \"whatever the examiner\r\nwanted to add\" is not one."
}
],
"documentation" : "── Recorded alongside the score ────────────────────────────────────────\r\nThese are not part of the score and carry no weight, but they belong on\r\nthe same Observation: they were taken at the same examination, and the\r\nmembrane status in particular changes what the next examination may do."
},
{
"name" : "contextItems",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "g",
"condition" : "linkId = 'context'"
}
],
"rule" : [
{
"name" : "indicationRule",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "linkId = 'context/indication'"
}
],
"rule" : [
{
"name" : "indicationAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "createNote",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "txt"
}
],
"target" : [
{
"context" : "obs",
"element" : "note",
"variable" : "note"
}
],
"rule" : [
{
"name" : "noteText",
"source" : [
{
"context" : "txt"
}
],
"target" : [
{
"context" : "note",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "txt"
}
]
}
]
}
]
}
]
}
],
"documentation" : "The indication is why induction was being considered, which is the\r\nreason for the whole examination. Observation has no `reason`, so it\r\ngoes to note alongside any remarks."
}
],
"documentation" : "Gestation at the assessment. Not a component: it is a fact about the\r\npregnancy on the day, not a part of the cervical assessment, so it rides\r\nas its own Observation in the entry below."
}
],
"documentation" : "Anchored on any item of the assessment group being answered rather than on\r\nthe total, because the total is calculated and a client without a FHIRPath\r\nengine submits it empty. Anchoring on the total would mean such a client\r\nextracted nothing at all."
},
{
"name" : "gestationRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "g",
"condition" : "linkId = 'context'"
}
],
"rule" : [
{
"name" : "gestationObservation",
"source" : [
{
"context" : "g",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'context/gestation') and answer.value.exists()"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "obs",
"transform" : "create",
"parameter" : [
{
"valueString" : "Observation"
}
]
}
],
"rule" : [
{
"name" : "base",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildObsBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "category",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
}
],
"dependent" : [
{
"name" : "SetVitalSignsCategory",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
}
]
}
]
},
{
"name" : "code",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "obs",
"element" : "code",
"variable" : "cc"
}
],
"rule" : [
{
"name" : "coding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"variable" : "cg"
}
],
"rule" : [
{
"name" : "sys",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "cd",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "11884-4"
}
]
}
]
},
{
"name" : "dsp",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "cg",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Gestational age Estimated"
}
]
}
]
}
]
}
]
},
{
"name" : "gestationAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "gestationValue",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "v"
}
],
"target" : [
{
"context" : "obs",
"element" : "value",
"transform" : "copy",
"parameter" : [
{
"valueId" : "v"
}
]
}
]
}
]
}
]
}
],
"documentation" : "Gestation, as its own Observation. Separate from the score because it is a\r\nproperty of the pregnancy that other forms also record, and folding it into\r\nthe Bishop Observation would hide it from a query for gestational age."
}
]
},
{
"name" : "BuildObsBase",
"documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each map rather than imported: the transform\r\nengine resolves `imports` against whatever StructureMaps happen to be on the\r\nserver, and a form that stops extracting because a shared map was not\r\nuploaded is a worse failure than a duplicated group.\r\nTwo notes on what the publisher's StructureMap validator says about this file.\r\nSource parameters below are left untyped on purpose. Writing `: Element` makes\r\nthe validator compare QuestionnaireResponse.item against the literal 'Element'\r\nand report them as incompatible with each other, which is noise, not a finding.\r\n`evaluate(context, expression)` is flagged as \"takes 1 parameter but 2 were\r\nfound\". Leave it. The FML parser in the same jar refuses the one-argument form\r\noutright -- it wants a parameter, a comma, then the FHIRPath -- so the\r\npublisher is objecting to what its own compiler emits. Two arguments is the\r\nonly form that compiles, and it is what the R5 transform engine executes.\r\n─────────────────────────────────────────────────────────────────────────────",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"name" : "responseProvenance",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
}
],
"dependent" : [
{
"name" : "SetResponseProvenance",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
}
]
}
]
},
{
"name" : "idAndFullUrl",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "id",
"transform" : "uuid"
}
],
"dependent" : [
{
"name" : "SetObservationFullUrl",
"parameter" : [
{
"valueId" : "obs"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "entryRequest",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "entry",
"element" : "request",
"variable" : "request"
}
],
"rule" : [
{
"name" : "requestMethod",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "request",
"element" : "method",
"transform" : "copy",
"parameter" : [
{
"valueString" : "POST"
}
]
}
]
},
{
"name" : "requestUrl",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "request",
"element" : "url",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Observation"
}
]
}
]
}
]
},
{
"name" : "status",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "status",
"transform" : "copy",
"parameter" : [
{
"valueString" : "final"
}
]
}
]
},
{
"name" : "subject",
"source" : [
{
"context" : "qr",
"element" : "subject",
"variable" : "s"
}
],
"target" : [
{
"context" : "obs",
"element" : "subject",
"transform" : "copy",
"parameter" : [
{
"valueId" : "s"
}
]
}
]
},
{
"name" : "encounter",
"source" : [
{
"context" : "qr",
"element" : "encounter",
"variable" : "e"
}
],
"target" : [
{
"context" : "obs",
"element" : "encounter",
"transform" : "copy",
"parameter" : [
{
"valueId" : "e"
}
]
}
]
},
{
"name" : "effective",
"source" : [
{
"context" : "qr",
"element" : "authored",
"variable" : "t"
}
],
"target" : [
{
"context" : "obs",
"element" : "effective",
"transform" : "copy",
"parameter" : [
{
"valueId" : "t"
}
]
}
]
},
{
"name" : "performerFromSource",
"source" : [
{
"context" : "qr",
"element" : "source",
"variable" : "src"
}
],
"target" : [
{
"context" : "obs",
"element" : "performer",
"transform" : "copy",
"parameter" : [
{
"valueId" : "src"
}
]
}
]
},
{
"name" : "performerFallback",
"source" : [
{
"context" : "qr",
"condition" : "source.exists().not()"
}
],
"rule" : [
{
"name" : "performerFromAuthor",
"source" : [
{
"context" : "qr",
"element" : "author",
"variable" : "a"
}
],
"target" : [
{
"context" : "obs",
"element" : "performer",
"transform" : "copy",
"parameter" : [
{
"valueId" : "a"
}
]
}
]
}
]
},
{
"name" : "linkQuestionnaireResponse",
"source" : [
{
"context" : "qr",
"element" : "id",
"variable" : "qid",
"condition" : "$this.hasValue()"
}
],
"target" : [
{
"context" : "obs",
"element" : "derivedFrom",
"variable" : "ref",
"transform" : "create",
"parameter" : [
{
"valueString" : "Reference"
}
]
},
{
"context" : "ref",
"element" : "reference",
"transform" : "copy",
"parameter" : [
{
"valueId" : "qid"
}
]
}
],
"documentation" : "A stored response's id already reads \"QuestionnaireResponse/<id>\", so it is\r\na relative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first\r\n-- from writing \"QuestionnaireResponse/null\" into the record."
}
]
},
{
"name" : "SetObservationFullUrl",
"input" : [
{
"name" : "obs",
"type" : "Observation",
"mode" : "source"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"name" : "assignFullUrl",
"source" : [
{
"context" : "obs",
"element" : "id",
"variable" : "id"
}
],
"target" : [
{
"context" : "entry",
"element" : "fullUrl",
"transform" : "append",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/Observation/"
},
{
"valueId" : "id"
}
]
}
]
}
]
},
{
"name" : "SetComponentCodedValue",
"documentation" : "The two answer shapes a component can carry. Both read the answer through the\r\nuntyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its\r\ntyped property name fails at transform time on HAPI R5 with \"Attempt to read\r\ninvalid property ... on QuestionnaireResponse.item.answer\".",
"input" : [
{
"name" : "it",
"mode" : "source"
},
{
"name" : "comp",
"mode" : "target"
}
],
"rule" : [
{
"name" : "componentAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "codedValue",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "cv"
}
],
"target" : [
{
"context" : "comp",
"element" : "value",
"variable" : "cc",
"transform" : "create",
"parameter" : [
{
"valueString" : "CodeableConcept"
}
]
}
],
"rule" : [
{
"name" : "valueCoding",
"source" : [
{
"context" : "cv"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"transform" : "copy",
"parameter" : [
{
"valueId" : "cv"
}
]
}
]
},
{
"name" : "valueText",
"source" : [
{
"context" : "cv",
"element" : "display",
"variable" : "d"
}
],
"target" : [
{
"context" : "cc",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "d"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "SetComponentValue",
"input" : [
{
"name" : "it",
"mode" : "source"
},
{
"name" : "comp",
"mode" : "target"
}
],
"rule" : [
{
"name" : "componentAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "plainValue",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "v"
}
],
"target" : [
{
"context" : "comp",
"element" : "value",
"transform" : "copy",
"parameter" : [
{
"valueId" : "v"
}
]
}
]
}
]
}
]
},
{
"name" : "SetSurveyCategory",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
}
],
"rule" : [
{
"name" : "category",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "category",
"variable" : "cat"
}
],
"rule" : [
{
"name" : "categoryCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cat",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "categorySystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name" : "categoryCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "survey"
}
]
}
]
},
{
"name" : "categoryDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Survey"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "SetVitalSignsCategory",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
}
],
"rule" : [
{
"name" : "category",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "category",
"variable" : "cat"
}
],
"rule" : [
{
"name" : "categoryCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cat",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "categorySystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name" : "categoryCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "vital-signs"
}
]
}
]
},
{
"name" : "categoryDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Vital Signs"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "SetResponseProvenance",
"documentation" : "── Provenance and tenancy ───────────────────────────────────────────────────\r\nTwo tags on everything this map creates. The first says which questionnaire\r\nproduced it, so a form that reopens mid-admission recalls its own earlier\r\nentries and not another form's. The second copies the tenant tags off the\r\nresponse, because nothing else on the path puts them there.\r\nThe code is the form's document type, not the questionnaire's id: every\r\nenvironment mints its own ids, and there is only one set of maps, so an id\r\nhere would tie the tag to whichever environment stamped it.\r\n── Provenance and tenancy ───────────────────────────────────────────────────",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "r",
"mode" : "target"
}
],
"rule" : [
{
"name" : "provenanceMeta",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "r",
"element" : "meta",
"variable" : "m"
}
],
"rule" : [
{
"name" : "provenanceTag",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "m",
"element" : "tag",
"variable" : "t"
}
],
"rule" : [
{
"name" : "provenanceSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "t",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://slade360edi.com/questionnaire-provenance"
}
]
}
]
},
{
"name" : "provenanceCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "t",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "bishop-score"
}
]
}
]
},
{
"name" : "provenanceDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "t",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Bishop score"
}
]
}
]
}
]
}
]
},
{
"name" : "tenantTags",
"source" : [
{
"context" : "qr",
"element" : "meta",
"variable" : "qm"
}
],
"rule" : [
{
"name" : "copyTag",
"source" : [
{
"context" : "qm",
"element" : "tag",
"variable" : "qt"
}
],
"target" : [
{
"context" : "r",
"element" : "meta",
"variable" : "m"
},
{
"context" : "m",
"element" : "tag",
"transform" : "copy",
"parameter" : [
{
"valueId" : "qt"
}
]
}
]
}
],
"documentation" : "Every tag the response carries, onto the resource. `meta` is 0..1, so this\r\nlands on the same meta the rule above created rather than a second one."
}
]
}
]
}