{
  "resourceType" : "StructureMap",
  "id" : "ExtractPaediatricTbIcfScreening",
  "text" : {
    "status" : "generated",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractPaediatricTbIcfScreening</b></p><a name=\"ExtractPaediatricTbIcfScreening\"> </a><a name=\"hcExtractPaediatricTbIcfScreening\"> </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/ExtractPaediatricTbIcfScreening'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractPaediatricTbIcfScreening'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Paediatric TB Intensified Case Finding Screening 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 paediatric intensified case finding screen out as one Observation carrying the screen result, with the five questions as components, plus a RiskAssessment for the band that result falls in. The tool has no score: it is answered yes to any one question or no to all five, so the band is binary and the arithmetic is a disjunction rather than a sum. Both branches extract. A screen that came back negative is the record that the screen was done, which is what makes the guideline\\'s `repeat screening on subsequent visits` a thing the notes can show, and it is what carries the IPT workup as its mitigation. The result is derived from the five answers rather than read off an outcome item the form does not have, so the questions and the conclusion cannot disagree.'</span>\r\n\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/questionnaireresponse.html\" title=\"QuestionnaireResponse\">http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse</a><span style=\"color: navy\">&quot; </span><b>alias </b>QR <b>as </b><b>source</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/bundle.html\" title=\"Bundle\">http://hl7.org/fhir/StructureDefinition/Bundle</a><span style=\"color: navy\">&quot; </span><b>alias </b>Bundle <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/observation.html\" title=\"Observation\">http://hl7.org/fhir/StructureDefinition/Observation</a><span style=\"color: navy\">&quot; </span><b>alias </b>Observation <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/riskassessment.html\" title=\"RiskAssessment\">http://hl7.org/fhir/StructureDefinition/RiskAssessment</a><span style=\"color: navy\">&quot; </span><b>alias </b>RiskAssessment <b>as </b><b>target</b>\r\n\r\n<b>group </b>ExtractPaediatricTbIcfScreening<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> -&gt; </b></span>bundle.type = <span style=\"color: blue\">'transaction'</span> <i>&quot;setBundleType&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">The paper is a flat five-row table, so the questions are top-level items and</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">the response itself is the anchor. One answered question is enough to make</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">an Observation: a partly filled screen still records findings worth keeping.</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Whether it is enough to conclude anything is a separate question, and</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">SetScreenOutcome is where that is decided.</span>\r\n  qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </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>&quot;category&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">Local, from concept-codesystem, because no code system this IG can resolve</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">names this screen. LOINC publishes no paediatric TB symptom screen -- only</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">the CPHS exposure-screen family, which is about exposure follow-up in a US</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">public-health programme -- and the ICD-10 and ICD-11 resources here are</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">`content: fragment` stubs with no url, so an ICD code could not be</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">validated against anything. The same code goes on the RiskAssessment: the</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">resource type already says which of the two is the observation and which</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">is the assessment, so a second code would only be a second thing to keep</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">in step.</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n        qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n        qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Paediatric TB intensified case finding screen'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Paediatric TB intensified case finding screen'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">The five questions, each coded to the finding it asks about rather than to</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">one bucket code with the question in the display. Observation.component</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">.code is what a query filters on, so `which children screened positive for</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">a TB contact` has to be a question the record can answer.</span>\r\n    qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'cough') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen-cough'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Cough of any duration'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Cough of any duration'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;coughCode&quot;</i><span style=\"color: navy\">;</span>\r\n      it<span style=\"color: navy\"><b> -&gt; </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>&quot;coughValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;coughRule&quot;</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 = 'fever') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen-fever'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Fever'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Fever'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;feverCode&quot;</i><span style=\"color: navy\">;</span>\r\n      it<span style=\"color: navy\"><b> -&gt; </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>&quot;feverValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;feverRule&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">One item on the paper, and one component here. The tool asks failure to</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">thrive *or* poor weight gain as a single question and the reviewer wrote</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">`malnutrition` against it, so splitting it into two components would</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">invent a distinction the nurse was never asked to make. The question as</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">printed is what the code and its text both say.</span>\r\n    qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'failure-to-thrive') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen-failure-to-thrive'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Failure to thrive or poor weight gain'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Failure to thrive or poor weight gain'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;thriveCode&quot;</i><span style=\"color: navy\">;</span>\r\n      it<span style=\"color: navy\"><b> -&gt; </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>&quot;thriveValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;thriveRule&quot;</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 = 'lethargy') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen-lethargy'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Lethargy, less playful than usual'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Lethargy, less playful than usual'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;lethargyCode&quot;</i><span style=\"color: navy\">;</span>\r\n      it<span style=\"color: navy\"><b> -&gt; </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>&quot;lethargyValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;lethargyRule&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">The one question of the five that is about exposure rather than about the</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">child. It stays a component of the same screen rather than becoming its</span>\r\n    <span style=\"color: navy\">// </span><span style=\"color: green\">own resource: what makes it meaningful is the four answers beside it.</span>\r\n    qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'tb-contact') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen-contact'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Contact with a TB case'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Contact with a TB case'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;contactCode&quot;</i><span style=\"color: navy\">;</span>\r\n      it<span style=\"color: navy\"><b> -&gt; </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>&quot;contactValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;contactRule&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetScreenOutcome<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>&quot;outcome&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> bundle<b> then </b>AddTbScreenRiskAssessment<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>&quot;band&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;screenRule&quot;</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 screen result</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The tool states its own rule, in the two bullets printed under the table: yes</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">to any one question means suspect TB, no to all of them means initiate workup</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">for IPT and screen again next visit. So the result is a disjunction over five</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">yes/no answers, and there is nothing to sum.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">**Both branches are guarded on all five having been answered.** The positive</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">branch does not need to be for the yes to be true -- one yes is one yes -- but</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">it does need to be for the *negative* branch to be safe, and the two have to</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">agree about what a complete screen is or a form answered `no, no, yes` to the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">first three questions would extract a positive result while `no, no, no` to</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the same three extracted nothing at all. A screen short of an item is not this</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">screen: four questions answered no says nothing about the fifth, and a clinician</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">reading `no signs of TB` off a form where nobody asked about the TB contact is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">being told something the form does not know.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The answers are `Y` and `N`, from CodeSystem/v2-0532. The value set the form</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">binds is ValueSet/v2-0136, whose codes come from 0532 -- table 0136 was folded</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">into it -- so a guard testing 'yes' compiles, never fires, and silently</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">extracts nothing.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The result reuses `special-clinic-code-system#presumed-tb` and `#no-tb-signs`,</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">which this IG already defines for TB screening in the ANC and CWC workflows.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Nothing new was minted for it: a query for presumed TB should find this form</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">and those together, and a second code saying the same thing in a different</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">system would be a synonym to keep in step rather than information.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>SetScreenOutcome<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<b> where </b><span style=\"color: navy\">(</span>(item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).count() = 5) and item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).where(code = 'Y').exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.value = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'CodeableConcept'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>cc.coding<b> as </b><span style=\"color: maroon\">local</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      qr<span style=\"color: navy\"><b> -&gt; </b></span>local.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system'</span> <i>&quot;localSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>local.code = <span style=\"color: blue\">'presumed-tb'</span> <i>&quot;localCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>local.display = <span style=\"color: blue\">'Presumed TB'</span> <i>&quot;localDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;localCoding&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>cc.text = <span style=\"color: blue\">'Presumed TB — at least one screening question answered yes'</span> <i>&quot;outcomeText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;screenPositive&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<b> where </b><span style=\"color: navy\">(</span>(item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).count() = 5) and item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).where(code = 'Y').exists().not()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.value = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'CodeableConcept'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>cc.coding<b> as </b><span style=\"color: maroon\">local</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      qr<span style=\"color: navy\"><b> -&gt; </b></span>local.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system'</span> <i>&quot;localSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>local.code = <span style=\"color: blue\">'no-tb-signs'</span> <i>&quot;localCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>local.display = <span style=\"color: blue\">'No Signs of TB'</span> <i>&quot;localDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;localCoding&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>cc.text = <span style=\"color: blue\">'No signs of TB — all five screening questions answered no'</span> <i>&quot;outcomeText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;screenNegative&quot;</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\">Read off the Observation the rule above just built, not recomputed from the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">answers. Deriving it a second time would be a second implementation of the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">same disjunction, and two implementations of one rule is one more than can be</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">kept in agreement. It is also why a partly answered screen produces no</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">RiskAssessment at all: no result, nothing to band.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`qualitativeRisk` carries HL7 risk-probability -- which is what a consumer</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">escalates on -- alongside the local screen-result code, and the plain wording</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">in `.text`. `prediction.outcome` is the disease being predicted, which is the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">question a RiskAssessment exists to answer and is the same concept in both</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">branches; only the likelihood differs.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`mitigation` is the guideline's own instruction, verbatim in substance. That</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">element is the right home for it: it is what to do to reduce the risk, it</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">travels with the assessment, and it means a screen recorded at a health centre</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">arrives at the next clinician with the action already attached.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">A negative screen bands `low`, not `negligible`. The tool does not clear a</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">child -- it sends them for IPT workup and asks for the screen again next visit</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">-- so a code that reads as no further action would misstate it.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>AddTbScreenRiskAssessment<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(CodeableConcept).coding.where(code = 'presumed-tb').exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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>&quot;riskBase&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>ra<b> then </b>SetTbScreenRiskCode<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>&quot;riskCode&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </b></span>pred<b> then </b>SetTbPredictionOutcome<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">pred</span><span style=\"color: navy\">)</span> <i>&quot;predictionOutcome&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/risk-probability'</span> <i>&quot;riskSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'high'</span> <i>&quot;riskCode&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'High likelihood'</span> <i>&quot;riskDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;hl7Coding&quot;</i><span style=\"color: navy\">;</span>\r\n        qr<span style=\"color: navy\"><b> -&gt; </b></span>risk.coding<b> as </b><span style=\"color: maroon\">local</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          qr<span style=\"color: navy\"><b> -&gt; </b></span>local.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system'</span> <i>&quot;localSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>local.code = <span style=\"color: blue\">'presumed-tb'</span> <i>&quot;localCode&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>local.display = <span style=\"color: blue\">'Presumed TB'</span> <i>&quot;localDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;localCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        qr<span style=\"color: navy\"><b> -&gt; </b></span>risk.text = <span style=\"color: blue\">'Presumed TB'</span> <i>&quot;riskText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;qualitativeRisk&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>pred.rationale = <span style=\"color: blue\">'At least one of the five intensified case finding questions was answered yes.'</span> <i>&quot;rationale&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;prediction&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>ra.mitigation = <span style=\"color: blue\">'Suspect TB. Examine the child and use the paediatric TB diagnostic algorithm to evaluate for active disease. Rule out underlying conditions and refer if necessary.'</span> <i>&quot;mitigation&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;presumedTb&quot;</i><span style=\"color: navy\">;</span>\r\n  obs<b> where </b><span style=\"color: navy\">(</span>value.ofType(CodeableConcept).coding.where(code = 'no-tb-signs').exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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>&quot;riskBase&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>ra<b> then </b>SetTbScreenRiskCode<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>&quot;riskCode&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </b></span>pred<b> then </b>SetTbPredictionOutcome<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">pred</span><span style=\"color: navy\">)</span> <i>&quot;predictionOutcome&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/risk-probability'</span> <i>&quot;riskSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'low'</span> <i>&quot;riskCode&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Low likelihood'</span> <i>&quot;riskDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;hl7Coding&quot;</i><span style=\"color: navy\">;</span>\r\n        qr<span style=\"color: navy\"><b> -&gt; </b></span>risk.coding<b> as </b><span style=\"color: maroon\">local</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          qr<span style=\"color: navy\"><b> -&gt; </b></span>local.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system'</span> <i>&quot;localSystem&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>local.code = <span style=\"color: blue\">'no-tb-signs'</span> <i>&quot;localCode&quot;</i><span style=\"color: navy\">;</span>\r\n          qr<span style=\"color: navy\"><b> -&gt; </b></span>local.display = <span style=\"color: blue\">'No Signs of TB'</span> <i>&quot;localDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;localCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        qr<span style=\"color: navy\"><b> -&gt; </b></span>risk.text = <span style=\"color: blue\">'No signs of TB'</span> <i>&quot;riskText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;qualitativeRisk&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>pred.rationale = <span style=\"color: blue\">'All five intensified case finding questions were answered no.'</span> <i>&quot;rationale&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;prediction&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>ra.mitigation = <span style=\"color: blue\">'Initiate workup for isoniazid preventive therapy and repeat this screen at subsequent visits.'</span> <i>&quot;mitigation&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;noTbSigns&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetTbScreenRiskCode<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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen'</span> <i>&quot;codeCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Paediatric TB intensified case finding screen'</span> <i>&quot;codeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;codeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Paediatric TB intensified case finding screen'</span> <i>&quot;codeText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetTbPredictionOutcome<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\">pred</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr<span style=\"color: navy\"><b> -&gt; </b></span>pred.outcome<b> as </b><span style=\"color: maroon\">outcome</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>outcome.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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;outcomeSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'tb-screen-tuberculosis'</span> <i>&quot;outcomeCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Tuberculosis'</span> <i>&quot;outcomeDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;outcomeCoding&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;predictionOutcome&quot;</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 &quot;takes 1 parameter but 2 were</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">found&quot;. 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> -&gt; </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>&quot;responseProvenance&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </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>&quot;idAndFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>&quot;requestMethod&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.url = <span style=\"color: blue\">'Observation'</span> <i>&quot;requestUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;entryRequest&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>obs.status = <span style=\"color: blue\">'final'</span> <i>&quot;status&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.subject<b> as </b><span style=\"color: maroon\">s</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </b></span>obs.effective = <span style=\"color: maroon\">t</span> <i>&quot;effective&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.source<b> as </b><span style=\"color: maroon\">src</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.performer = <span style=\"color: maroon\">src</span> <i>&quot;performerFromSource&quot;</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> -&gt; </b></span>obs.performer = <span style=\"color: maroon\">a</span> <i>&quot;performerFromAuthor&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;performerFallback&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">A stored response's id already reads &quot;QuestionnaireResponse/&lt;id&gt;&quot;, 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 &quot;QuestionnaireResponse/null&quot; 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> -&gt; </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>&quot;linkQuestionnaireResponse&quot;</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 result. 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> -&gt; </b></span>ra<b> then </b>SetResponseProvenance<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>&quot;responseProvenance&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </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>&quot;idAndFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </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> -&gt; </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>&quot;requestMethod&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.url = <span style=\"color: blue\">'RiskAssessment'</span> <i>&quot;requestUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;entryRequest&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>ra.status = <span style=\"color: blue\">'final'</span> <i>&quot;status&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.subject<b> as </b><span style=\"color: maroon\">s</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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> -&gt; </b></span>ra.occurrence = <span style=\"color: maroon\">t</span> <i>&quot;occurrence&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.author<b> as </b><span style=\"color: maroon\">a</span><span style=\"color: navy\"><b> -&gt; </b></span>ra.performer = <span style=\"color: maroon\">a</span> <i>&quot;performerFromAuthor&quot;</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> -&gt; </b></span>ra.performer = <span style=\"color: maroon\">src</span> <i>&quot;performerFromSource&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;performerFallback&quot;</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> -&gt; </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>&quot;basisResponse&quot;</i><span style=\"color: navy\">;</span>\r\n  obs.id<b> as </b><span style=\"color: maroon\">oid</span><span style=\"color: navy\"><b> -&gt; </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> -&gt; </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>&quot;basisObservationRef&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;basisObservation&quot;</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 &quot;Attempt to read</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">invalid property ... on QuestionnaireResponse.item.answer&quot;.</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> -&gt; </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> -&gt; </b></span>cc.coding = <span style=\"color: maroon\">cv</span> <i>&quot;valueCoding&quot;</i><span style=\"color: navy\">;</span>\r\n      cv.display<b> as </b><span style=\"color: maroon\">d</span><span style=\"color: navy\"><b> -&gt; </b></span>cc.text = <span style=\"color: maroon\">d</span> <i>&quot;valueText&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;codedValue&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;componentAnswer&quot;</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> -&gt; </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> -&gt; </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> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>&quot;categorySystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'survey'</span> <i>&quot;categoryCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Survey'</span> <i>&quot;categoryDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;categoryCoding&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;category&quot;</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> -&gt; </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>&quot;assignFullUrl&quot;</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> -&gt; </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>&quot;assignFullUrl&quot;</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 screen recorded at one visit can be told from the screen</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">recorded at the next and from every other form that codes the same findings.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The second copies the tenant tags off the response, because nothing else on</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">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> -&gt; </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> -&gt; </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> -&gt; </b></span>t.system = <span style=\"color: blue\">'http://slade360edi.com/questionnaire-provenance'</span> <i>&quot;provenanceSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>t.code = <span style=\"color: blue\">'paediatric-tb-icf-screening'</span> <i>&quot;provenanceCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>t.display = <span style=\"color: blue\">'Paediatric TB intensified case finding screening tool'</span> <i>&quot;provenanceDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;provenanceTag&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;provenanceMeta&quot;</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> -&gt; </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>&quot;copyTag&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;tenantTags&quot;</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/ExtractPaediatricTbIcfScreening",
  "version" : "0.1.0",
  "name" : "ExtractPaediatricTbIcfScreening",
  "title" : "Paediatric TB Intensified Case Finding Screening 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 paediatric intensified case finding screen out as one Observation carrying the screen result, with the five questions as components, plus a RiskAssessment for the band that result falls in. The tool has no score: it is answered yes to any one question or no to all five, so the band is binary and the arithmetic is a disjunction rather than a sum. Both branches extract. A screen that came back negative is the record that the screen was done, which is what makes the guideline's `repeat screening on subsequent visits` a thing the notes can show, and it is what carries the IPT workup as its mitigation. The result is derived from the five answers rather than read off an outcome item the form does not have, so the questions and the conclusion cannot disagree.",
  "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" : "ExtractPaediatricTbIcfScreening",
    "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" : "screenRule",
      "source" : [{
        "context" : "qr",
        "condition" : "item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).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" : "tb-screen"
              }]
            }]
          },
          {
            "name" : "codeDisplay",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "coding",
              "element" : "display",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Paediatric TB intensified case finding screen"
              }]
            }]
          }]
        },
        {
          "name" : "codeText",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "code",
            "element" : "text",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Paediatric TB intensified case finding screen"
            }]
          }]
        }],
        "documentation" : "Local, from concept-codesystem, because no code system this IG can resolve\r\nnames this screen. LOINC publishes no paediatric TB symptom screen -- only\r\nthe CPHS exposure-screen family, which is about exposure follow-up in a US\r\npublic-health programme -- and the ICD-10 and ICD-11 resources here are\r\n`content: fragment` stubs with no url, so an ICD code could not be\r\nvalidated against anything. The same code goes on the RiskAssessment: the\r\nresource type already says which of the two is the observation and which\r\nis the assessment, so a second code would only be a second thing to keep\r\nin step."
      },
      {
        "name" : "coughRule",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "it",
          "condition" : "(linkId = 'cough') and answer.value.exists()"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "component",
          "variable" : "comp"
        }],
        "rule" : [{
          "name" : "coughCode",
          "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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
                }]
              }]
            },
            {
              "name" : "codeCode",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "tb-screen-cough"
                }]
              }]
            },
            {
              "name" : "codeDisplay",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Cough of any duration"
                }]
              }]
            }]
          },
          {
            "name" : "codeText",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "code",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Cough of any duration"
              }]
            }]
          }]
        },
        {
          "name" : "coughValue",
          "source" : [{
            "context" : "it"
          }],
          "target" : [{
            "context" : "comp"
          }],
          "dependent" : [{
            "name" : "SetComponentCodedValue",
            "parameter" : [{
              "valueId" : "it"
            },
            {
              "valueId" : "comp"
            }]
          }]
        }],
        "documentation" : "The five questions, each coded to the finding it asks about rather than to\r\none bucket code with the question in the display. Observation.component\r\n.code is what a query filters on, so `which children screened positive for\r\na TB contact` has to be a question the record can answer."
      },
      {
        "name" : "feverRule",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "it",
          "condition" : "(linkId = 'fever') and answer.value.exists()"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "component",
          "variable" : "comp"
        }],
        "rule" : [{
          "name" : "feverCode",
          "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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
                }]
              }]
            },
            {
              "name" : "codeCode",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "tb-screen-fever"
                }]
              }]
            },
            {
              "name" : "codeDisplay",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Fever"
                }]
              }]
            }]
          },
          {
            "name" : "codeText",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "code",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Fever"
              }]
            }]
          }]
        },
        {
          "name" : "feverValue",
          "source" : [{
            "context" : "it"
          }],
          "target" : [{
            "context" : "comp"
          }],
          "dependent" : [{
            "name" : "SetComponentCodedValue",
            "parameter" : [{
              "valueId" : "it"
            },
            {
              "valueId" : "comp"
            }]
          }]
        }]
      },
      {
        "name" : "thriveRule",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "it",
          "condition" : "(linkId = 'failure-to-thrive') and answer.value.exists()"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "component",
          "variable" : "comp"
        }],
        "rule" : [{
          "name" : "thriveCode",
          "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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
                }]
              }]
            },
            {
              "name" : "codeCode",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "tb-screen-failure-to-thrive"
                }]
              }]
            },
            {
              "name" : "codeDisplay",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Failure to thrive or poor weight gain"
                }]
              }]
            }]
          },
          {
            "name" : "codeText",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "code",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Failure to thrive or poor weight gain"
              }]
            }]
          }]
        },
        {
          "name" : "thriveValue",
          "source" : [{
            "context" : "it"
          }],
          "target" : [{
            "context" : "comp"
          }],
          "dependent" : [{
            "name" : "SetComponentCodedValue",
            "parameter" : [{
              "valueId" : "it"
            },
            {
              "valueId" : "comp"
            }]
          }]
        }],
        "documentation" : "One item on the paper, and one component here. The tool asks failure to\r\nthrive *or* poor weight gain as a single question and the reviewer wrote\r\n`malnutrition` against it, so splitting it into two components would\r\ninvent a distinction the nurse was never asked to make. The question as\r\nprinted is what the code and its text both say."
      },
      {
        "name" : "lethargyRule",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "it",
          "condition" : "(linkId = 'lethargy') and answer.value.exists()"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "component",
          "variable" : "comp"
        }],
        "rule" : [{
          "name" : "lethargyCode",
          "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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
                }]
              }]
            },
            {
              "name" : "codeCode",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "tb-screen-lethargy"
                }]
              }]
            },
            {
              "name" : "codeDisplay",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Lethargy, less playful than usual"
                }]
              }]
            }]
          },
          {
            "name" : "codeText",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "code",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Lethargy, less playful than usual"
              }]
            }]
          }]
        },
        {
          "name" : "lethargyValue",
          "source" : [{
            "context" : "it"
          }],
          "target" : [{
            "context" : "comp"
          }],
          "dependent" : [{
            "name" : "SetComponentCodedValue",
            "parameter" : [{
              "valueId" : "it"
            },
            {
              "valueId" : "comp"
            }]
          }]
        }]
      },
      {
        "name" : "contactRule",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "it",
          "condition" : "(linkId = 'tb-contact') and answer.value.exists()"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "component",
          "variable" : "comp"
        }],
        "rule" : [{
          "name" : "contactCode",
          "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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
                }]
              }]
            },
            {
              "name" : "codeCode",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "tb-screen-contact"
                }]
              }]
            },
            {
              "name" : "codeDisplay",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "coding",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Contact with a TB case"
                }]
              }]
            }]
          },
          {
            "name" : "codeText",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "code",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Contact with a TB case"
              }]
            }]
          }]
        },
        {
          "name" : "contactValue",
          "source" : [{
            "context" : "it"
          }],
          "target" : [{
            "context" : "comp"
          }],
          "dependent" : [{
            "name" : "SetComponentCodedValue",
            "parameter" : [{
              "valueId" : "it"
            },
            {
              "valueId" : "comp"
            }]
          }]
        }],
        "documentation" : "The one question of the five that is about exposure rather than about the\r\nchild. It stays a component of the same screen rather than becoming its\r\nown resource: what makes it meaningful is the four answers beside it."
      },
      {
        "name" : "outcome",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "obs"
        }],
        "dependent" : [{
          "name" : "SetScreenOutcome",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "obs"
          }]
        }]
      },
      {
        "name" : "band",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "obs"
        },
        {
          "context" : "bundle"
        }],
        "dependent" : [{
          "name" : "AddTbScreenRiskAssessment",
          "parameter" : [{
            "valueId" : "obs"
          },
          {
            "valueId" : "qr"
          },
          {
            "valueId" : "bundle"
          }]
        }]
      }],
      "documentation" : "The paper is a flat five-row table, so the questions are top-level items and\r\nthe response itself is the anchor. One answered question is enough to make\r\nan Observation: a partly filled screen still records findings worth keeping.\r\nWhether it is enough to conclude anything is a separate question, and\r\nSetScreenOutcome is where that is decided."
    }]
  },
  {
    "name" : "SetScreenOutcome",
    "documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nThe screen result\r\nThe tool states its own rule, in the two bullets printed under the table: yes\r\nto any one question means suspect TB, no to all of them means initiate workup\r\nfor IPT and screen again next visit. So the result is a disjunction over five\r\nyes/no answers, and there is nothing to sum.\r\n**Both branches are guarded on all five having been answered.** The positive\r\nbranch does not need to be for the yes to be true -- one yes is one yes -- but\r\nit does need to be for the *negative* branch to be safe, and the two have to\r\nagree about what a complete screen is or a form answered `no, no, yes` to the\r\nfirst three questions would extract a positive result while `no, no, no` to\r\nthe same three extracted nothing at all. A screen short of an item is not this\r\nscreen: four questions answered no says nothing about the fifth, and a clinician\r\nreading `no signs of TB` off a form where nobody asked about the TB contact is\r\nbeing told something the form does not know.\r\nThe answers are `Y` and `N`, from CodeSystem/v2-0532. The value set the form\r\nbinds is ValueSet/v2-0136, whose codes come from 0532 -- table 0136 was folded\r\ninto it -- so a guard testing 'yes' compiles, never fires, and silently\r\nextracts nothing.\r\nThe result reuses `special-clinic-code-system#presumed-tb` and `#no-tb-signs`,\r\nwhich this IG already defines for TB screening in the ANC and CWC workflows.\r\nNothing new was minted for it: a query for presumed TB should find this form\r\nand those together, and a second code saying the same thing in a different\r\nsystem would be a synonym to keep in step rather than information.\r\n─────────────────────────────────────────────────────────────────────────────",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "obs",
      "type" : "Observation",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "screenPositive",
      "source" : [{
        "context" : "qr",
        "condition" : "(item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).count() = 5) and item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).where(code = 'Y').exists()"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "value",
        "variable" : "cc",
        "transform" : "create",
        "parameter" : [{
          "valueString" : "CodeableConcept"
        }]
      }],
      "rule" : [{
        "name" : "localCoding",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "cc",
          "element" : "coding",
          "variable" : "local"
        }],
        "rule" : [{
          "name" : "localSystem",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "local",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system"
            }]
          }]
        },
        {
          "name" : "localCode",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "local",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "presumed-tb"
            }]
          }]
        },
        {
          "name" : "localDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "local",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Presumed TB"
            }]
          }]
        }]
      },
      {
        "name" : "outcomeText",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "cc",
          "element" : "text",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Presumed TB — at least one screening question answered yes"
          }]
        }]
      }]
    },
    {
      "name" : "screenNegative",
      "source" : [{
        "context" : "qr",
        "condition" : "(item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).count() = 5) and item.where(linkId in ('cough' | 'fever' | 'failure-to-thrive' | 'lethargy' | 'tb-contact')).answer.value.ofType(Coding).where(code = 'Y').exists().not()"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "value",
        "variable" : "cc",
        "transform" : "create",
        "parameter" : [{
          "valueString" : "CodeableConcept"
        }]
      }],
      "rule" : [{
        "name" : "localCoding",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "cc",
          "element" : "coding",
          "variable" : "local"
        }],
        "rule" : [{
          "name" : "localSystem",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "local",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system"
            }]
          }]
        },
        {
          "name" : "localCode",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "local",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "no-tb-signs"
            }]
          }]
        },
        {
          "name" : "localDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "local",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "No Signs of TB"
            }]
          }]
        }]
      },
      {
        "name" : "outcomeText",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "cc",
          "element" : "text",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "No signs of TB — all five screening questions answered no"
          }]
        }]
      }]
    }]
  },
  {
    "name" : "AddTbScreenRiskAssessment",
    "documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nThe band\r\nRead off the Observation the rule above just built, not recomputed from the\r\nanswers. Deriving it a second time would be a second implementation of the\r\nsame disjunction, and two implementations of one rule is one more than can be\r\nkept in agreement. It is also why a partly answered screen produces no\r\nRiskAssessment at all: no result, nothing to band.\r\n`qualitativeRisk` carries HL7 risk-probability -- which is what a consumer\r\nescalates on -- alongside the local screen-result code, and the plain wording\r\nin `.text`. `prediction.outcome` is the disease being predicted, which is the\r\nquestion a RiskAssessment exists to answer and is the same concept in both\r\nbranches; only the likelihood differs.\r\n`mitigation` is the guideline's own instruction, verbatim in substance. That\r\nelement is the right home for it: it is what to do to reduce the risk, it\r\ntravels with the assessment, and it means a screen recorded at a health centre\r\narrives at the next clinician with the action already attached.\r\nA negative screen bands `low`, not `negligible`. The tool does not clear a\r\nchild -- it sends them for IPT workup and asks for the screen again next visit\r\n-- so a code that reads as no further action would misstate it.\r\n─────────────────────────────────────────────────────────────────────────────",
    "input" : [{
      "name" : "obs",
      "type" : "Observation",
      "mode" : "source"
    },
    {
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "bundle",
      "type" : "Bundle",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "presumedTb",
      "source" : [{
        "context" : "obs",
        "condition" : "value.ofType(CodeableConcept).coding.where(code = 'presumed-tb').exists()"
      }],
      "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" : "SetTbScreenRiskCode",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "ra"
          }]
        }]
      },
      {
        "name" : "prediction",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "ra",
          "element" : "prediction",
          "variable" : "pred"
        }],
        "rule" : [{
          "name" : "predictionOutcome",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "pred"
          }],
          "dependent" : [{
            "name" : "SetTbPredictionOutcome",
            "parameter" : [{
              "valueId" : "qr"
            },
            {
              "valueId" : "pred"
            }]
          }]
        },
        {
          "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" : "localCoding",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "risk",
              "element" : "coding",
              "variable" : "local"
            }],
            "rule" : [{
              "name" : "localSystem",
              "source" : [{
                "context" : "qr"
              }],
              "target" : [{
                "context" : "local",
                "element" : "system",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system"
                }]
              }]
            },
            {
              "name" : "localCode",
              "source" : [{
                "context" : "qr"
              }],
              "target" : [{
                "context" : "local",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "presumed-tb"
                }]
              }]
            },
            {
              "name" : "localDisplay",
              "source" : [{
                "context" : "qr"
              }],
              "target" : [{
                "context" : "local",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Presumed TB"
                }]
              }]
            }]
          },
          {
            "name" : "riskText",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "risk",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "Presumed TB"
              }]
            }]
          }]
        },
        {
          "name" : "rationale",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "pred",
            "element" : "rationale",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "At least one of the five intensified case finding questions was answered yes."
            }]
          }]
        }]
      },
      {
        "name" : "mitigation",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "ra",
          "element" : "mitigation",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Suspect TB. Examine the child and use the paediatric TB diagnostic algorithm to evaluate for active disease. Rule out underlying conditions and refer if necessary."
          }]
        }]
      }]
    },
    {
      "name" : "noTbSigns",
      "source" : [{
        "context" : "obs",
        "condition" : "value.ofType(CodeableConcept).coding.where(code = 'no-tb-signs').exists()"
      }],
      "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" : "SetTbScreenRiskCode",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "ra"
          }]
        }]
      },
      {
        "name" : "prediction",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "ra",
          "element" : "prediction",
          "variable" : "pred"
        }],
        "rule" : [{
          "name" : "predictionOutcome",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "pred"
          }],
          "dependent" : [{
            "name" : "SetTbPredictionOutcome",
            "parameter" : [{
              "valueId" : "qr"
            },
            {
              "valueId" : "pred"
            }]
          }]
        },
        {
          "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" : "localCoding",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "risk",
              "element" : "coding",
              "variable" : "local"
            }],
            "rule" : [{
              "name" : "localSystem",
              "source" : [{
                "context" : "qr"
              }],
              "target" : [{
                "context" : "local",
                "element" : "system",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/special-clinic-code-system"
                }]
              }]
            },
            {
              "name" : "localCode",
              "source" : [{
                "context" : "qr"
              }],
              "target" : [{
                "context" : "local",
                "element" : "code",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "no-tb-signs"
                }]
              }]
            },
            {
              "name" : "localDisplay",
              "source" : [{
                "context" : "qr"
              }],
              "target" : [{
                "context" : "local",
                "element" : "display",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "No Signs of TB"
                }]
              }]
            }]
          },
          {
            "name" : "riskText",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "risk",
              "element" : "text",
              "transform" : "copy",
              "parameter" : [{
                "valueString" : "No signs of TB"
              }]
            }]
          }]
        },
        {
          "name" : "rationale",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "pred",
            "element" : "rationale",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "All five intensified case finding questions were answered no."
            }]
          }]
        }]
      },
      {
        "name" : "mitigation",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "ra",
          "element" : "mitigation",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Initiate workup for isoniazid preventive therapy and repeat this screen at subsequent visits."
          }]
        }]
      }]
    }]
  },
  {
    "name" : "SetTbScreenRiskCode",
    "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" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
            }]
          }]
        },
        {
          "name" : "codeCode",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "tb-screen"
            }]
          }]
        },
        {
          "name" : "codeDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Paediatric TB intensified case finding screen"
            }]
          }]
        }]
      },
      {
        "name" : "codeText",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "code",
          "element" : "text",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Paediatric TB intensified case finding screen"
          }]
        }]
      }]
    }]
  },
  {
    "name" : "SetTbPredictionOutcome",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "pred",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "predictionOutcome",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "pred",
        "element" : "outcome",
        "variable" : "outcome"
      }],
      "rule" : [{
        "name" : "outcomeCoding",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "outcome",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "outcomeSystem",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
            }]
          }]
        },
        {
          "name" : "outcomeCode",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "tb-screen-tuberculosis"
            }]
          }]
        },
        {
          "name" : "outcomeDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Tuberculosis"
            }]
          }]
        }]
      }]
    }]
  },
  {
    "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" : "BuildRiskBase",
    "documentation" : "The RiskAssessment stands on two things: the response that was filled in and\r\nthe Observation that holds the result. 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" : "responseProvenance",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "ra"
      }],
      "dependent" : [{
        "name" : "SetResponseProvenance",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "ra"
        }]
      }]
    },
    {
      "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",
    "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" : "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"
        }]
      }]
    }]
  },
  {
    "name" : "SetResponseProvenance",
    "documentation" : "── Provenance and tenancy ───────────────────────────────────────────────────\r\nTwo tags on everything this map creates. The first says which questionnaire\r\nproduced it, so a screen recorded at one visit can be told from the screen\r\nrecorded at the next and from every other form that codes the same findings.\r\nThe second copies the tenant tags off the response, because nothing else on\r\nthe 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" : "paediatric-tb-icf-screening"
            }]
          }]
        },
        {
          "name" : "provenanceDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "t",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Paediatric TB intensified case finding screening tool"
            }]
          }]
        }]
      }]
    },
    {
      "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."
    }]
  }]
}