SGHI FHIR Profile Implementation Guide
0.1.0 - ci-build

SGHI FHIR Profile Implementation Guide, published by Kathurima Kimathi. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/savannahghi/sil_fhir_profile_ig/ and changes regularly. See the Directory of published versions

: Inpatient Ward Round Note Extraction - XML Representation

Active as of 2026-10-06

Raw xml | Download


<StructureMap xmlns="http://hl7.org/fhir">
  <id value="ExtractInpatientWardRoundNote"/>
  <text>
    <status value="generated"/>
    <div xmlns="http://www.w3.org/1999/xhtml"><p class="res-header-id"><b>Generated Narrative: StructureMap ExtractInpatientWardRoundNote</b></p><a name="ExtractInpatientWardRoundNote"> </a><a name="hcExtractInpatientWardRoundNote"> </a><pre class="fml">
<span style="color: #cc00cc">/// <b>url</b> = </span><span style="color: blue">'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractInpatientWardRoundNote'</span>
<span style="color: #cc00cc">/// <b>name</b> = </span><span style="color: blue">'ExtractInpatientWardRoundNote'</span>
<span style="color: #cc00cc">/// <b>title</b> = </span><span style="color: blue">'Inpatient Ward Round Note Extraction'</span>
<span style="color: #cc00cc">/// <b>status</b> = </span><span style="color: blue">'active'</span>
<span style="color: #cc00cc">/// <b>description</b> = </span><span style="color: blue">'Turns a response to the inpatient ward round into a Composition with a section per heading, one attester per clinician who was on the round, and a Task carrying the jobs the round left for the team. The jobs item is a single free-text block, so it becomes a single Task: splitting it would invent boundaries the writer did not draw. Making it several Tasks means first making the form item repeat.'</span>

<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>
<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>
<b>uses</b><span style="color: navy"> &quot;</span><a href="http://hl7.org/fhir/R5/composition.html" title="Composition">http://hl7.org/fhir/StructureDefinition/Composition</a><span style="color: navy">&quot; </span><b>alias </b>Composition <b>as </b><b>target</b>
<b>uses</b><span style="color: navy"> &quot;</span><a href="http://hl7.org/fhir/R5/task.html" title="Task">http://hl7.org/fhir/StructureDefinition/Task</a><span style="color: navy">&quot; </span><b>alias </b>Task <b>as </b><b>target</b>

<b>group </b>ExtractInpatientWardRoundNote<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"> {
</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>
  qr<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">'Composition'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">comp</span><b> then</b><span style="color: navy"> {
</span>    qr<span style="color: navy"><b> -&gt; </b></span>comp<b> then </b>CopyResponseTags<span style="color: navy">(</span><span style="color: maroon">qr</span><span style="color: navy">, </span><span style="color: maroon">comp</span><span style="color: navy">)</span> <i>&quot;responseTags&quot;</i><span style="color: navy">;</span>
    qr<span style="color: navy"><b> -&gt; </b></span> comp<span style="color: navy">, </span> entry<b> then </b>BuildNoteBase<span style="color: navy">(</span><span style="color: maroon">qr</span><span style="color: navy">, </span><span style="color: maroon">comp</span><span style="color: navy">, </span><span style="color: maroon">entry</span><span style="color: navy">)</span> <i>&quot;noteBase&quot;</i><span style="color: navy">;</span>
    qr<span style="color: navy"><b> -&gt; </b></span>comp.name = <span style="color: blue">'InpatientWardRoundNote'</span> <i>&quot;noteName&quot;</i><span style="color: navy">;</span>
    qr<span style="color: navy"><b> -&gt; </b></span>comp.title = <span style="color: blue">'Ward round'</span> <i>&quot;noteTitle&quot;</i><span style="color: navy">;</span>
    qr<span style="color: navy"><b> -&gt; </b></span>comp.type<b> as </b><span style="color: maroon">ty</span><b> then</b><span style="color: navy"> {
</span>      qr<span style="color: navy"><b> -&gt; </b></span>ty.coding<b> as </b><span style="color: maroon">sghi</span><b> then</b><span style="color: navy"> {
</span>        qr<span style="color: navy"><b> -&gt; </b></span>sghi.system = <span style="color: blue">'https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-document-type-codesystem'</span> <i>&quot;sghiSystem&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>sghi.code = <span style="color: blue">'ward-round-note'</span> <i>&quot;sghiCode&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>sghi.display = <span style="color: blue">'Ward round'</span> <i>&quot;sghiDisplay&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;sghiCoding&quot;</i><span style="color: navy">;</span>
      qr<span style="color: navy"><b> -&gt; </b></span>ty.text = <span style="color: blue">'Ward round'</span> <i>&quot;typeText&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;noteType&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">// </span><span style="color: green">Everyone on the round attests the note. The item repeats, so this yields</span>
    <span style="color: navy">// </span><span style="color: green">one attester per clinician picked.</span>
    qr.item<b> as </b><span style="color: maroon">itP</span><b> where </b><span style="color: navy">(</span>linkId = 'present'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>      itP.answer<b> as </b><span style="color: maroon">aP</span><b> then</b><span style="color: navy"> {
</span>        aP.value<b> as </b><span style="color: maroon">pv</span><span style="color: navy"><b> -&gt; </b></span>comp.attester<b> as </b><span style="color: maroon">att</span><b> then</b><span style="color: navy"> {
</span>          aP<span style="color: navy"><b> -&gt; </b></span>att.mode<b> as </b><span style="color: maroon">mode</span><b> then</b><span style="color: navy"> {
</span>            aP<span style="color: navy"><b> -&gt; </b></span>mode.coding<b> as </b><span style="color: maroon">modec</span><b> then</b><span style="color: navy"> {
</span>              aP<span style="color: navy"><b> -&gt; </b></span>modec.system = <span style="color: blue">'http://hl7.org/fhir/composition-attestation-mode'</span> <i>&quot;attModeSystem&quot;</i><span style="color: navy">;</span>
              aP<span style="color: navy"><b> -&gt; </b></span>modec.code = <span style="color: blue">'professional'</span> <i>&quot;attModeCode&quot;</i><span style="color: navy">;</span>
              aP<span style="color: navy"><b> -&gt; </b></span>modec.display = <span style="color: blue">'Professional'</span> <i>&quot;attModeDisplay&quot;</i><span style="color: navy">;</span>
            <span style="color: navy">}</span> <i>&quot;attModeCoding&quot;</i><span style="color: navy">;</span>
          <span style="color: navy">}</span> <i>&quot;attesterMode&quot;</i><span style="color: navy">;</span>
          qr.authored<b> as </b><span style="color: maroon">t</span><span style="color: navy"><b> -&gt; </b></span>att.time = <span style="color: maroon">t</span> <i>&quot;attesterTime&quot;</i><span style="color: navy">;</span>
          pv<b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>att.party = <span style="color: maroon">pv</span> <i>&quot;attesterParty&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;attester&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;presentAnswer&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;presentRule&quot;</i><span style="color: navy">;</span>
    qr.item<b> as </b><span style="color: maroon">it</span><b> where </b><span style="color: navy">(</span>(linkId = 'findings') and answer.value.exists()<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.section<b> as </b><span style="color: maroon">sec</span><b> then</b><span style="color: navy"> {
</span>      it<span style="color: navy"><b> -&gt; </b></span>sec.title = <span style="color: blue">'Findings'</span> <i>&quot;findingsTitle&quot;</i><span style="color: navy">;</span>
      it<span style="color: navy"><b> -&gt; </b></span>sec<b> then </b>AddSectionText<span style="color: navy">(</span><span style="color: maroon">it</span><span style="color: navy">, </span><span style="color: maroon">sec</span><span style="color: navy">)</span> <i>&quot;findingsText&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;findingsRule&quot;</i><span style="color: navy">;</span>
    qr.item<b> as </b><span style="color: maroon">it</span><b> where </b><span style="color: navy">(</span>(linkId = 'decisions') and answer.value.exists()<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.section<b> as </b><span style="color: maroon">sec</span><b> then</b><span style="color: navy"> {
</span>      it<span style="color: navy"><b> -&gt; </b></span>sec.title = <span style="color: blue">'Decisions'</span> <i>&quot;decisionsTitle&quot;</i><span style="color: navy">;</span>
      it<span style="color: navy"><b> -&gt; </b></span>sec<b> then </b>AddSectionText<span style="color: navy">(</span><span style="color: maroon">it</span><span style="color: navy">, </span><span style="color: maroon">sec</span><span style="color: navy">)</span> <i>&quot;decisionsText&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;decisionsRule&quot;</i><span style="color: navy">;</span>
    qr.item<b> as </b><span style="color: maroon">it</span><b> where </b><span style="color: navy">(</span>(linkId = 'jobs') and answer.value.exists()<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.section<b> as </b><span style="color: maroon">sec</span><b> then</b><span style="color: navy"> {
</span>      it<span style="color: navy"><b> -&gt; </b></span>sec.title = <span style="color: blue">'Jobs for the team'</span> <i>&quot;jobsTitle&quot;</i><span style="color: navy">;</span>
      it<span style="color: navy"><b> -&gt; </b></span>sec<b> then </b>AddSectionText<span style="color: navy">(</span><span style="color: maroon">it</span><span style="color: navy">, </span><span style="color: maroon">sec</span><span style="color: navy">)</span> <i>&quot;jobsText&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;jobsSectionRule&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;composition&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">The jobs are also actionable work, so they leave the document as a Task the</span>
  <span style="color: navy">// </span><span style="color: green">ward can pick up and close.</span>
  qr.item<b> as </b><span style="color: maroon">itJ</span><b> where </b><span style="color: navy">(</span>(linkId = 'jobs') and answer.value.exists()<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    itJ.answer first<b> as </b><span style="color: maroon">aJ</span><b> then</b><span style="color: navy"> {
</span>      aJ<span style="color: navy"><b> -&gt; </b></span> bundle.entry<b> as </b><span style="color: maroon">entryT</span><span style="color: navy">, </span> entryT.resource = <b>create</b><span style="color: navy">(</span><span style="color: blue">'Task'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">task</span><b> then</b><span style="color: navy"> {
</span>        qr<span style="color: navy"><b> -&gt; </b></span>task<b> then </b>CopyResponseTags<span style="color: navy">(</span><span style="color: maroon">qr</span><span style="color: navy">, </span><span style="color: maroon">task</span><span style="color: navy">)</span> <i>&quot;responseTags&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>task.id = <b>uuid</b><span style="color: navy">(</span><span style="color: navy">)</span><b> then </b>SetTaskFullUrl<span style="color: navy">(</span><span style="color: maroon">task</span><span style="color: navy">, </span><span style="color: maroon">entryT</span><span style="color: navy">)</span> <i>&quot;idAndFullUrl&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>entryT.request<b> as </b><span style="color: maroon">request</span><b> then</b><span style="color: navy"> {
</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>
          qr<span style="color: navy"><b> -&gt; </b></span>request.url = <span style="color: blue">'Task'</span> <i>&quot;requestUrl&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;entryRequest&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>task.status = <span style="color: blue">'requested'</span> <i>&quot;status&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>task.intent = <span style="color: blue">'order'</span> <i>&quot;intent&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>task.priority = <span style="color: blue">'routine'</span> <i>&quot;priority&quot;</i><span style="color: navy">;</span>
        qr<span style="color: navy"><b> -&gt; </b></span>task.code<b> as </b><span style="color: maroon">code</span><b> then</b><span style="color: navy"> {
</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"> {
</span>            qr<span style="color: navy"><b> -&gt; </b></span>coding.system = <span style="color: blue">'https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem'</span> <i>&quot;codeSystem&quot;</i><span style="color: navy">;</span>
            qr<span style="color: navy"><b> -&gt; </b></span>coding.code = <span style="color: blue">'ward-round-job'</span> <i>&quot;codeCode&quot;</i><span style="color: navy">;</span>
            qr<span style="color: navy"><b> -&gt; </b></span>coding.display = <span style="color: blue">'Job for the team from a ward round'</span> <i>&quot;codeDisplay&quot;</i><span style="color: navy">;</span>
          <span style="color: navy">}</span> <i>&quot;codeCoding&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;taskCode&quot;</i><span style="color: navy">;</span>
        aJ.value<b> as </b><span style="color: maroon">v</span><span style="color: navy"><b> -&gt; </b></span>task.description = <span style="color: maroon">v</span> <i>&quot;description&quot;</i><span style="color: navy">;</span>
        qr.subject<b> as </b><span style="color: maroon">s</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>task.for = <span style="color: maroon">s</span> <i>&quot;for&quot;</i><span style="color: navy">;</span>
        qr.encounter<b> as </b><span style="color: maroon">e</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>task.encounter = <span style="color: maroon">e</span><span style="color: navy">;</span>
        qr.authored<b> as </b><span style="color: maroon">t</span><span style="color: navy"><b> -&gt; </b></span>task.authoredOn = <span style="color: maroon">t</span> <i>&quot;authoredOn&quot;</i><span style="color: navy">;</span>
        qr.authored<b> as </b><span style="color: maroon">t</span><span style="color: navy"><b> -&gt; </b></span>task.lastModified = <span style="color: maroon">t</span> <i>&quot;lastModified&quot;</i><span style="color: navy">;</span>
        qr.author<b> as </b><span style="color: maroon">a</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>task.requester = <span style="color: maroon">a</span> <i>&quot;requesterFromAuthor&quot;</i><span style="color: navy">;</span>
        qr<b> where </b><span style="color: navy">(</span>author.where(((reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization'))))).exists().not()<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>          qr.source<b> as </b><span style="color: maroon">src</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>task.requester = <span style="color: maroon">src</span> <i>&quot;requesterFromSource&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;requesterFallback&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">// </span><span style="color: green">basedOn, not focus: the round authorised the work, it is not the</span>
        <span style="color: navy">// </span><span style="color: green">thing the work acts upon.</span>
        qr<span style="color: navy"><b> -&gt; </b></span>task.basedOn = <b>create</b><span style="color: navy">(</span><span style="color: blue">'Reference'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">ref</span><b> then</b><span style="color: navy"> {
</span>          qr.id<b> as </b><span style="color: maroon">qid</span><span style="color: navy"><b> -&gt; </b></span>ref.reference = <span style="color: maroon">qid</span> <i>&quot;basedOnRef&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;linkQuestionnaireResponse&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;task&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;jobsAnswer&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;jobsTaskRule&quot;</i><span style="color: navy">;</span>
<span style="color: navy">}

</span><span style="color: navy">// </span><span style="color: green">─────────────────────────────────────────────────────────────────────────────</span>
<span style="color: navy">// </span><span style="color: green">Shared note scaffolding. Repeated in each note map rather than imported: the</span>
<span style="color: navy">// </span><span style="color: green">transform engine resolves `imports` against whatever StructureMaps happen to</span>
<span style="color: navy">// </span><span style="color: green">be on the server, and a note that stops extracting because a shared map was</span>
<span style="color: navy">// </span><span style="color: green">not uploaded is a worse failure than a duplicated group.</span>
<span style="color: navy">// </span><span style="color: green">─────────────────────────────────────────────────────────────────────────────</span>
<span style="color: navy">// </span><span style="color: green">Two notes on what the publisher's StructureMap validator says about this file.</span>
<span style="color: navy">// </span><span style="color: green">Source parameters below are left untyped on purpose. Writing `: Element` makes</span>
<span style="color: navy">// </span><span style="color: green">the validator compare QuestionnaireResponse.item against the literal 'Element'</span>
<span style="color: navy">// </span><span style="color: green">and report them as incompatible with each other, which is noise, not a finding.</span>
<span style="color: navy">// </span><span style="color: green">Untyped, it says only that it cannot check the paths.</span>
<span style="color: navy">// </span><span style="color: green">`evaluate(context, expression)` is flagged as &quot;takes 1 parameter but 2 were</span>
<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>
<span style="color: navy">// </span><span style="color: green">outright -- it wants a parameter, a comma, then the FHIRPath -- so the publisher</span>
<span style="color: navy">// </span><span style="color: green">is objecting to what its own compiler emits. Two arguments is the only form that</span>
<span style="color: navy">// </span><span style="color: green">compiles, and it is what the R5 transform engine executes.</span>
<b>group </b>BuildNoteBase<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">comp</span><span style="color: navy"> : </span>Composition, <b>target</b> <span style="color: maroon">entry</span><span style="color: navy">)</span><span style="color: navy"> {
</span>  qr<span style="color: navy"><b> -&gt; </b></span>comp.id = <b>uuid</b><span style="color: navy">(</span><span style="color: navy">)</span><b> then </b>SetCompositionFullUrl<span style="color: navy">(</span><span style="color: maroon">comp</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>
  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"> {
</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>
    qr<span style="color: navy"><b> -&gt; </b></span>request.url = <span style="color: blue">'Composition'</span> <i>&quot;requestUrl&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;entryRequest&quot;</i><span style="color: navy">;</span>
  qr<span style="color: navy"><b> -&gt; </b></span>comp.status = <span style="color: blue">'final'</span> <i>&quot;status&quot;</i><span style="color: navy">;</span>
  qr.subject<b> as </b><span style="color: maroon">s</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.contains('://').not() and reference.startsWith('#').not() and reference.startsWith('urn:').not())) or reference.empty()<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.subject = <span style="color: maroon">s</span><span style="color: navy">;</span>
  qr.encounter<b> as </b><span style="color: maroon">e</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.encounter = <span style="color: maroon">e</span><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Composition.date is 1..1. `authored` is only 0..1 on the response, so when a</span>
  <span style="color: navy">// </span><span style="color: green">client sends none the extraction time stands in. It is a poor substitute for</span>
  <span style="color: navy">// </span><span style="color: green">when the note was written, but a document with no date at all is worse, and</span>
  <span style="color: navy">// </span><span style="color: green">extraction happens moments after submission in practice.</span>
  qr.authored<b> as </b><span style="color: maroon">t</span><span style="color: navy"><b> -&gt; </b></span>comp.date = <span style="color: maroon">t</span> <i>&quot;date&quot;</i><span style="color: navy">;</span>
  qr<b> where </b><span style="color: navy">(</span>authored.exists().not()<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    qr<span style="color: navy"><b> -&gt; </b></span>comp.date = evaluate<span style="color: navy">(</span>qr<span style="color: navy">, </span>now()<span style="color: navy">)</span> <i>&quot;dateFromExtractionTime&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;dateFallback&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Composition.author is 1..1 minimum. R5 QuestionnaireResponse carries both</span>
  <span style="color: navy">// </span><span style="color: green">`author` (who recorded the answers) and `source` (who supplied them); the</span>
  <span style="color: navy">// </span><span style="color: green">author is the one who wrote the note, so it wins, and `source` only stands</span>
  <span style="color: navy">// </span><span style="color: green">in when the client did not send an author. If the response carries neither,</span>
  <span style="color: navy">// </span><span style="color: green">the note comes out unauthored -- there is nothing on a QuestionnaireResponse</span>
  <span style="color: navy">// </span><span style="color: green">to invent one from, and guessing at who wrote a clinical note is not a thing</span>
  <span style="color: navy">// </span><span style="color: green">a map should do.</span>
  qr.author<b> as </b><span style="color: maroon">a</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.author = <span style="color: maroon">a</span> <i>&quot;authorFromAuthor&quot;</i><span style="color: navy">;</span>
  qr<b> where </b><span style="color: navy">(</span>author.where(((reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization'))))).exists().not()<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    qr.source<b> as </b><span style="color: maroon">src</span><b> where </b><span style="color: navy">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style="color: navy">)</span><span style="color: navy"><b> -&gt; </b></span>comp.author = <span style="color: maroon">src</span> <i>&quot;authorFromSource&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;authorFallback&quot;</i><span style="color: navy">;</span>
  qr<span style="color: navy"><b> -&gt; </b></span>comp.relatesTo<b> as </b><span style="color: maroon">rel</span><b> then</b><span style="color: navy"> {
</span>    qr<span style="color: navy"><b> -&gt; </b></span>rel.type = <span style="color: blue">'derived-from'</span> <i>&quot;relatesToType&quot;</i><span style="color: navy">;</span>
    qr<span style="color: navy"><b> -&gt; </b></span>rel.resourceReference = <b>create</b><span style="color: navy">(</span><span style="color: blue">'Reference'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">ref</span><b> then</b><span style="color: navy"> {
</span>      qr.id<b> as </b><span style="color: maroon">qid</span><span style="color: navy"><b> -&gt; </b></span>ref.reference = <span style="color: maroon">qid</span> <i>&quot;relatesToRef&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;relatesToTarget&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;linkQuestionnaireResponse&quot;</i><span style="color: navy">;</span>
<span style="color: navy">}

</span><b>group </b>AddSectionText<span style="color: navy">(</span><b>source</b> <span style="color: maroon">it</span>, <b>target</b> <span style="color: maroon">sec</span><span style="color: navy">)</span><span style="color: navy"> {
</span>  it.answer first<b> as </b><span style="color: maroon">a</span><b> then</b><span style="color: navy"> {
</span>    a.value<b> as </b><span style="color: maroon">v</span><span style="color: navy"><b> -&gt; </b></span>sec.text<b> as </b><span style="color: maroon">narrative</span><b> then</b><span style="color: navy"> {
</span>      v<span style="color: navy"><b> -&gt; </b></span>narrative.status = <span style="color: blue">'generated'</span> <i>&quot;narrativeStatus&quot;</i><span style="color: navy">;</span>
      v<span style="color: navy"><b> -&gt; </b></span>narrative.div = <b>create</b><span style="color: navy">(</span><span style="color: blue">'xhtml'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">xhtml</span><b> then</b><span style="color: navy"> {
</span>        v<span style="color: navy"><b> -&gt; </b></span>xhtml.value = evaluate<span style="color: navy">(</span>a<span style="color: navy">, </span>'&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;p&gt;' + value.toString().escape('html') + '&lt;/p&gt;&lt;/div&gt;'<span style="color: navy">)</span> <i>&quot;narrativeDiv&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;narrativeXhtml&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;sectionText&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;sectionAnswer&quot;</i><span style="color: navy">;</span>
<span style="color: navy">}

</span><b>group </b>SetCompositionFullUrl<span style="color: navy">(</span><b>source</b> <span style="color: maroon">comp</span><span style="color: navy"> : </span>Composition, <b>target</b> <span style="color: maroon">entry</span><span style="color: navy">)</span><span style="color: navy"> {
</span>  comp.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/Composition/'</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>
<span style="color: navy">}

</span><b>group </b>SetTaskFullUrl<span style="color: navy">(</span><b>source</b> <span style="color: maroon">task</span><span style="color: navy"> : </span>Task, <b>target</b> <span style="color: maroon">entry</span><span style="color: navy">)</span><span style="color: navy"> {
</span>  task.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/Task/'</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>
<span style="color: navy">}

</span><span style="color: navy">// </span><span style="color: green">── Tenancy ──────────────────────────────────────────────────────────────────</span>
<span style="color: navy">// </span><span style="color: green">Whose this is. The platform says which tenant a response belongs to with a</span>
<span style="color: navy">// </span><span style="color: green">tag on the response, and every tag the response carries is copied onto</span>
<span style="color: navy">// </span><span style="color: green">everything this map creates, as it is. Copied rather than named here, so the</span>
<span style="color: navy">// </span><span style="color: green">map never has to know which tenant it is running for, nor which system the</span>
<span style="color: navy">// </span><span style="color: green">tag is under: that system has moved more than once.</span>
<b>group </b>CopyResponseTags<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"> {
</span>  qr.meta<b> as </b><span style="color: maroon">qm</span><b> then</b><span style="color: navy"> {
</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>
  <span style="color: navy">}</span> <i>&quot;tenantTags&quot;</i><span style="color: navy">;</span>
<span style="color: navy">}

</span></pre></div>
  </text>
  <url
       value="https://fhir.slade360.co.ke/fhir/StructureMap/ExtractInpatientWardRoundNote"/>
  <version value="0.1.0"/>
  <name value="ExtractInpatientWardRoundNote"/>
  <title value="Inpatient Ward Round Note Extraction"/>
  <status value="active"/>
  <date value="2026-10-06T18:48:22+00:00"/>
  <publisher value="Kathurima Kimathi"/>
  <contact>
    <name value="Kathurima Kimathi"/>
    <telecom>
      <system value="url"/>
      <value value="https://www.linkedin.com/in/kathurima-kimathi/"/>
    </telecom>
    <telecom>
      <system value="email"/>
      <value value="kathurimakimathi415@gmail.com"/>
    </telecom>
  </contact>
  <contact>
    <name value="Oscar John"/>
    <telecom>
      <system value="email"/>
      <value value="oscarjohnotieno@gmail.com"/>
      <use value="work"/>
    </telecom>
  </contact>
  <contact>
    <name value="Kennedy Omondi"/>
    <telecom>
      <system value="email"/>
      <value value="kennankole@gmail.com"/>
      <use value="work"/>
    </telecom>
  </contact>
  <description
               value="Turns a response to the inpatient ward round into a Composition with a section per heading, one attester per clinician who was on the round, and a Task carrying the jobs the round left for the team. The jobs item is a single free-text block, so it becomes a single Task: splitting it would invent boundaries the writer did not draw. Making it several Tasks means first making the form item repeat."/>
  <structure>
    <url
         value="http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse"/>
    <mode value="source"/>
    <alias value="QR"/>
  </structure>
  <structure>
    <url value="http://hl7.org/fhir/StructureDefinition/Bundle"/>
    <mode value="target"/>
    <alias value="Bundle"/>
  </structure>
  <structure>
    <url value="http://hl7.org/fhir/StructureDefinition/Composition"/>
    <mode value="target"/>
    <alias value="Composition"/>
  </structure>
  <structure>
    <url value="http://hl7.org/fhir/StructureDefinition/Task"/>
    <mode value="target"/>
    <alias value="Task"/>
  </structure>
  <group>
    <name value="ExtractInpatientWardRoundNote"/>
    <input>
      <name value="qr"/>
      <type value="QR"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="bundle"/>
      <type value="Bundle"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="setBundleType"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="bundle"/>
        <element value="type"/>
        <transform value="copy"/>
        <parameter>
          <valueString value="transaction"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="composition"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="bundle"/>
        <element value="entry"/>
        <variable value="entry"/>
      </target>
      <target>
        <context value="entry"/>
        <element value="resource"/>
        <variable value="comp"/>
        <transform value="create"/>
        <parameter>
          <valueString value="Composition"/>
        </parameter>
      </target>
      <rule>
        <name value="responseTags"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="comp"/>
        </target>
        <dependent>
          <name value="CopyResponseTags"/>
          <parameter>
            <valueId value="qr"/>
          </parameter>
          <parameter>
            <valueId value="comp"/>
          </parameter>
        </dependent>
      </rule>
      <rule>
        <name value="noteBase"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="comp"/>
        </target>
        <target>
          <context value="entry"/>
        </target>
        <dependent>
          <name value="BuildNoteBase"/>
          <parameter>
            <valueId value="qr"/>
          </parameter>
          <parameter>
            <valueId value="comp"/>
          </parameter>
          <parameter>
            <valueId value="entry"/>
          </parameter>
        </dependent>
      </rule>
      <rule>
        <name value="noteName"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="name"/>
          <transform value="copy"/>
          <parameter>
            <valueString value="InpatientWardRoundNote"/>
          </parameter>
        </target>
      </rule>
      <rule>
        <name value="noteTitle"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="title"/>
          <transform value="copy"/>
          <parameter>
            <valueString value="Ward round"/>
          </parameter>
        </target>
      </rule>
      <rule>
        <name value="noteType"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="type"/>
          <variable value="ty"/>
        </target>
        <rule>
          <name value="sghiCoding"/>
          <source>
            <context value="qr"/>
          </source>
          <target>
            <context value="ty"/>
            <element value="coding"/>
            <variable value="sghi"/>
          </target>
          <rule>
            <name value="sghiSystem"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="sghi"/>
              <element value="system"/>
              <transform value="copy"/>
              <parameter>
                <valueString
                             value="https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-document-type-codesystem"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="sghiCode"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="sghi"/>
              <element value="code"/>
              <transform value="copy"/>
              <parameter>
                <valueString value="ward-round-note"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="sghiDisplay"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="sghi"/>
              <element value="display"/>
              <transform value="copy"/>
              <parameter>
                <valueString value="Ward round"/>
              </parameter>
            </target>
          </rule>
        </rule>
        <rule>
          <name value="typeText"/>
          <source>
            <context value="qr"/>
          </source>
          <target>
            <context value="ty"/>
            <element value="text"/>
            <transform value="copy"/>
            <parameter>
              <valueString value="Ward round"/>
            </parameter>
          </target>
        </rule>
      </rule>
      <rule>
        <name value="presentRule"/>
        <source>
          <context value="qr"/>
          <element value="item"/>
          <variable value="itP"/>
          <condition value="linkId = 'present'"/>
        </source>
        <rule>
          <name value="presentAnswer"/>
          <source>
            <context value="itP"/>
            <element value="answer"/>
            <variable value="aP"/>
          </source>
          <rule>
            <name value="attester"/>
            <source>
              <context value="aP"/>
              <element value="value"/>
              <variable value="pv"/>
            </source>
            <target>
              <context value="comp"/>
              <element value="attester"/>
              <variable value="att"/>
            </target>
            <rule>
              <name value="attesterMode"/>
              <source>
                <context value="aP"/>
              </source>
              <target>
                <context value="att"/>
                <element value="mode"/>
                <variable value="mode"/>
              </target>
              <rule>
                <name value="attModeCoding"/>
                <source>
                  <context value="aP"/>
                </source>
                <target>
                  <context value="mode"/>
                  <element value="coding"/>
                  <variable value="modec"/>
                </target>
                <rule>
                  <name value="attModeSystem"/>
                  <source>
                    <context value="aP"/>
                  </source>
                  <target>
                    <context value="modec"/>
                    <element value="system"/>
                    <transform value="copy"/>
                    <parameter>
                      <valueString
                                   value="http://hl7.org/fhir/composition-attestation-mode"/>
                    </parameter>
                  </target>
                </rule>
                <rule>
                  <name value="attModeCode"/>
                  <source>
                    <context value="aP"/>
                  </source>
                  <target>
                    <context value="modec"/>
                    <element value="code"/>
                    <transform value="copy"/>
                    <parameter>
                      <valueString value="professional"/>
                    </parameter>
                  </target>
                </rule>
                <rule>
                  <name value="attModeDisplay"/>
                  <source>
                    <context value="aP"/>
                  </source>
                  <target>
                    <context value="modec"/>
                    <element value="display"/>
                    <transform value="copy"/>
                    <parameter>
                      <valueString value="Professional"/>
                    </parameter>
                  </target>
                </rule>
              </rule>
            </rule>
            <rule>
              <name value="attesterTime"/>
              <source>
                <context value="qr"/>
                <element value="authored"/>
                <variable value="t"/>
              </source>
              <target>
                <context value="att"/>
                <element value="time"/>
                <transform value="copy"/>
                <parameter>
                  <valueId value="t"/>
                </parameter>
              </target>
            </rule>
            <rule>
              <name value="attesterParty"/>
              <source>
                <context value="pv"/>
                <condition
                           value="(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"/>
              </source>
              <target>
                <context value="att"/>
                <element value="party"/>
                <transform value="copy"/>
                <parameter>
                  <valueId value="pv"/>
                </parameter>
              </target>
            </rule>
          </rule>
        </rule>
        <documentation
                       value="Everyone on the round attests the note. The item repeats, so this yields
one attester per clinician picked."/>
      </rule>
      <rule>
        <name value="findingsRule"/>
        <source>
          <context value="qr"/>
          <element value="item"/>
          <variable value="it"/>
          <condition value="(linkId = 'findings') and answer.value.exists()"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="section"/>
          <variable value="sec"/>
        </target>
        <rule>
          <name value="findingsTitle"/>
          <source>
            <context value="it"/>
          </source>
          <target>
            <context value="sec"/>
            <element value="title"/>
            <transform value="copy"/>
            <parameter>
              <valueString value="Findings"/>
            </parameter>
          </target>
        </rule>
        <rule>
          <name value="findingsText"/>
          <source>
            <context value="it"/>
          </source>
          <target>
            <context value="sec"/>
          </target>
          <dependent>
            <name value="AddSectionText"/>
            <parameter>
              <valueId value="it"/>
            </parameter>
            <parameter>
              <valueId value="sec"/>
            </parameter>
          </dependent>
        </rule>
      </rule>
      <rule>
        <name value="decisionsRule"/>
        <source>
          <context value="qr"/>
          <element value="item"/>
          <variable value="it"/>
          <condition
                     value="(linkId = 'decisions') and answer.value.exists()"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="section"/>
          <variable value="sec"/>
        </target>
        <rule>
          <name value="decisionsTitle"/>
          <source>
            <context value="it"/>
          </source>
          <target>
            <context value="sec"/>
            <element value="title"/>
            <transform value="copy"/>
            <parameter>
              <valueString value="Decisions"/>
            </parameter>
          </target>
        </rule>
        <rule>
          <name value="decisionsText"/>
          <source>
            <context value="it"/>
          </source>
          <target>
            <context value="sec"/>
          </target>
          <dependent>
            <name value="AddSectionText"/>
            <parameter>
              <valueId value="it"/>
            </parameter>
            <parameter>
              <valueId value="sec"/>
            </parameter>
          </dependent>
        </rule>
      </rule>
      <rule>
        <name value="jobsSectionRule"/>
        <source>
          <context value="qr"/>
          <element value="item"/>
          <variable value="it"/>
          <condition value="(linkId = 'jobs') and answer.value.exists()"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="section"/>
          <variable value="sec"/>
        </target>
        <rule>
          <name value="jobsTitle"/>
          <source>
            <context value="it"/>
          </source>
          <target>
            <context value="sec"/>
            <element value="title"/>
            <transform value="copy"/>
            <parameter>
              <valueString value="Jobs for the team"/>
            </parameter>
          </target>
        </rule>
        <rule>
          <name value="jobsText"/>
          <source>
            <context value="it"/>
          </source>
          <target>
            <context value="sec"/>
          </target>
          <dependent>
            <name value="AddSectionText"/>
            <parameter>
              <valueId value="it"/>
            </parameter>
            <parameter>
              <valueId value="sec"/>
            </parameter>
          </dependent>
        </rule>
      </rule>
    </rule>
    <rule>
      <name value="jobsTaskRule"/>
      <source>
        <context value="qr"/>
        <element value="item"/>
        <variable value="itJ"/>
        <condition value="(linkId = 'jobs') and answer.value.exists()"/>
      </source>
      <rule>
        <name value="jobsAnswer"/>
        <source>
          <context value="itJ"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="aJ"/>
        </source>
        <rule>
          <name value="task"/>
          <source>
            <context value="aJ"/>
          </source>
          <target>
            <context value="bundle"/>
            <element value="entry"/>
            <variable value="entryT"/>
          </target>
          <target>
            <context value="entryT"/>
            <element value="resource"/>
            <variable value="task"/>
            <transform value="create"/>
            <parameter>
              <valueString value="Task"/>
            </parameter>
          </target>
          <rule>
            <name value="responseTags"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
            </target>
            <dependent>
              <name value="CopyResponseTags"/>
              <parameter>
                <valueId value="qr"/>
              </parameter>
              <parameter>
                <valueId value="task"/>
              </parameter>
            </dependent>
          </rule>
          <rule>
            <name value="idAndFullUrl"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
              <element value="id"/>
              <transform value="uuid"/>
            </target>
            <dependent>
              <name value="SetTaskFullUrl"/>
              <parameter>
                <valueId value="task"/>
              </parameter>
              <parameter>
                <valueId value="entryT"/>
              </parameter>
            </dependent>
          </rule>
          <rule>
            <name value="entryRequest"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="entryT"/>
              <element value="request"/>
              <variable value="request"/>
            </target>
            <rule>
              <name value="requestMethod"/>
              <source>
                <context value="qr"/>
              </source>
              <target>
                <context value="request"/>
                <element value="method"/>
                <transform value="copy"/>
                <parameter>
                  <valueString value="POST"/>
                </parameter>
              </target>
            </rule>
            <rule>
              <name value="requestUrl"/>
              <source>
                <context value="qr"/>
              </source>
              <target>
                <context value="request"/>
                <element value="url"/>
                <transform value="copy"/>
                <parameter>
                  <valueString value="Task"/>
                </parameter>
              </target>
            </rule>
          </rule>
          <rule>
            <name value="status"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
              <element value="status"/>
              <transform value="copy"/>
              <parameter>
                <valueString value="requested"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="intent"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
              <element value="intent"/>
              <transform value="copy"/>
              <parameter>
                <valueString value="order"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="priority"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
              <element value="priority"/>
              <transform value="copy"/>
              <parameter>
                <valueString value="routine"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="taskCode"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
              <element value="code"/>
              <variable value="code"/>
            </target>
            <rule>
              <name value="codeCoding"/>
              <source>
                <context value="qr"/>
              </source>
              <target>
                <context value="code"/>
                <element value="coding"/>
                <variable value="coding"/>
              </target>
              <rule>
                <name value="codeSystem"/>
                <source>
                  <context value="qr"/>
                </source>
                <target>
                  <context value="coding"/>
                  <element value="system"/>
                  <transform value="copy"/>
                  <parameter>
                    <valueString
                                 value="https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem"/>
                  </parameter>
                </target>
              </rule>
              <rule>
                <name value="codeCode"/>
                <source>
                  <context value="qr"/>
                </source>
                <target>
                  <context value="coding"/>
                  <element value="code"/>
                  <transform value="copy"/>
                  <parameter>
                    <valueString value="ward-round-job"/>
                  </parameter>
                </target>
              </rule>
              <rule>
                <name value="codeDisplay"/>
                <source>
                  <context value="qr"/>
                </source>
                <target>
                  <context value="coding"/>
                  <element value="display"/>
                  <transform value="copy"/>
                  <parameter>
                    <valueString value="Job for the team from a ward round"/>
                  </parameter>
                </target>
              </rule>
            </rule>
          </rule>
          <rule>
            <name value="description"/>
            <source>
              <context value="aJ"/>
              <element value="value"/>
              <variable value="v"/>
            </source>
            <target>
              <context value="task"/>
              <element value="description"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="v"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="for"/>
            <source>
              <context value="qr"/>
              <element value="subject"/>
              <variable value="s"/>
              <condition
                         value="(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"/>
            </source>
            <target>
              <context value="task"/>
              <element value="for"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="s"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="encounter"/>
            <source>
              <context value="qr"/>
              <element value="encounter"/>
              <variable value="e"/>
              <condition
                         value="(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"/>
            </source>
            <target>
              <context value="task"/>
              <element value="encounter"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="e"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="authoredOn"/>
            <source>
              <context value="qr"/>
              <element value="authored"/>
              <variable value="t"/>
            </source>
            <target>
              <context value="task"/>
              <element value="authoredOn"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="t"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="lastModified"/>
            <source>
              <context value="qr"/>
              <element value="authored"/>
              <variable value="t"/>
            </source>
            <target>
              <context value="task"/>
              <element value="lastModified"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="t"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="requesterFromAuthor"/>
            <source>
              <context value="qr"/>
              <element value="author"/>
              <variable value="a"/>
              <condition
                         value="(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"/>
            </source>
            <target>
              <context value="task"/>
              <element value="requester"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="a"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="requesterFallback"/>
            <source>
              <context value="qr"/>
              <condition
                         value="author.where(((reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization'))))).exists().not()"/>
            </source>
            <rule>
              <name value="requesterFromSource"/>
              <source>
                <context value="qr"/>
                <element value="source"/>
                <variable value="src"/>
                <condition
                           value="(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"/>
              </source>
              <target>
                <context value="task"/>
                <element value="requester"/>
                <transform value="copy"/>
                <parameter>
                  <valueId value="src"/>
                </parameter>
              </target>
            </rule>
          </rule>
          <rule>
            <name value="linkQuestionnaireResponse"/>
            <source>
              <context value="qr"/>
            </source>
            <target>
              <context value="task"/>
              <element value="basedOn"/>
              <variable value="ref"/>
              <transform value="create"/>
              <parameter>
                <valueString value="Reference"/>
              </parameter>
            </target>
            <rule>
              <name value="basedOnRef"/>
              <source>
                <context value="qr"/>
                <element value="id"/>
                <variable value="qid"/>
              </source>
              <target>
                <context value="ref"/>
                <element value="reference"/>
                <transform value="copy"/>
                <parameter>
                  <valueId value="qid"/>
                </parameter>
              </target>
            </rule>
            <documentation
                           value="basedOn, not focus: the round authorised the work, it is not the
thing the work acts upon."/>
          </rule>
        </rule>
      </rule>
      <documentation
                     value="The jobs are also actionable work, so they leave the document as a Task the
ward can pick up and close."/>
    </rule>
  </group>
  <group>
    <name value="BuildNoteBase"/>
    <documentation
                   value="─────────────────────────────────────────────────────────────────────────────
Shared note scaffolding. Repeated in each note map rather than imported: the
transform engine resolves `imports` against whatever StructureMaps happen to
be on the server, and a note that stops extracting because a shared map was
not uploaded is a worse failure than a duplicated group.
─────────────────────────────────────────────────────────────────────────────
Two notes on what the publisher's StructureMap validator says about this file.
Source parameters below are left untyped on purpose. Writing `: Element` makes
the validator compare QuestionnaireResponse.item against the literal 'Element'
and report them as incompatible with each other, which is noise, not a finding.
Untyped, it says only that it cannot check the paths.
`evaluate(context, expression)` is flagged as &quot;takes 1 parameter but 2 were
found&quot;. Leave it. The FML parser in the same jar refuses the one-argument form
outright -- it wants a parameter, a comma, then the FHIRPath -- so the publisher
is objecting to what its own compiler emits. Two arguments is the only form that
compiles, and it is what the R5 transform engine executes."/>
    <input>
      <name value="qr"/>
      <type value="QR"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="comp"/>
      <type value="Composition"/>
      <mode value="target"/>
    </input>
    <input>
      <name value="entry"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="idAndFullUrl"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="id"/>
        <transform value="uuid"/>
      </target>
      <dependent>
        <name value="SetCompositionFullUrl"/>
        <parameter>
          <valueId value="comp"/>
        </parameter>
        <parameter>
          <valueId value="entry"/>
        </parameter>
      </dependent>
    </rule>
    <rule>
      <name value="entryRequest"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="entry"/>
        <element value="request"/>
        <variable value="request"/>
      </target>
      <rule>
        <name value="requestMethod"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="request"/>
          <element value="method"/>
          <transform value="copy"/>
          <parameter>
            <valueString value="POST"/>
          </parameter>
        </target>
      </rule>
      <rule>
        <name value="requestUrl"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="request"/>
          <element value="url"/>
          <transform value="copy"/>
          <parameter>
            <valueString value="Composition"/>
          </parameter>
        </target>
      </rule>
    </rule>
    <rule>
      <name value="status"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="status"/>
        <transform value="copy"/>
        <parameter>
          <valueString value="final"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="subject"/>
      <source>
        <context value="qr"/>
        <element value="subject"/>
        <variable value="s"/>
        <condition
                   value="(reference.exists() and (reference.contains('://').not() and reference.startsWith('#').not() and reference.startsWith('urn:').not())) or reference.empty()"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="subject"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="s"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="encounter"/>
      <source>
        <context value="qr"/>
        <element value="encounter"/>
        <variable value="e"/>
        <condition
                   value="(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="encounter"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="e"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="date"/>
      <source>
        <context value="qr"/>
        <element value="authored"/>
        <variable value="t"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="date"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="t"/>
        </parameter>
      </target>
      <documentation
                     value="Composition.date is 1..1. `authored` is only 0..1 on the response, so when a
client sends none the extraction time stands in. It is a poor substitute for
when the note was written, but a document with no date at all is worse, and
extraction happens moments after submission in practice."/>
    </rule>
    <rule>
      <name value="dateFallback"/>
      <source>
        <context value="qr"/>
        <condition value="authored.exists().not()"/>
      </source>
      <rule>
        <name value="dateFromExtractionTime"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="date"/>
          <transform value="evaluate"/>
          <parameter>
            <valueId value="qr"/>
          </parameter>
          <parameter>
            <valueString value="now()"/>
          </parameter>
        </target>
      </rule>
    </rule>
    <rule>
      <name value="authorFromAuthor"/>
      <source>
        <context value="qr"/>
        <element value="author"/>
        <variable value="a"/>
        <condition
                   value="(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="author"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="a"/>
        </parameter>
      </target>
      <documentation
                     value="Composition.author is 1..1 minimum. R5 QuestionnaireResponse carries both
`author` (who recorded the answers) and `source` (who supplied them); the
author is the one who wrote the note, so it wins, and `source` only stands
in when the client did not send an author. If the response carries neither,
the note comes out unauthored -- there is nothing on a QuestionnaireResponse
to invent one from, and guessing at who wrote a clinical note is not a thing
a map should do."/>
    </rule>
    <rule>
      <name value="authorFallback"/>
      <source>
        <context value="qr"/>
        <condition
                   value="author.where(((reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization'))))).exists().not()"/>
      </source>
      <rule>
        <name value="authorFromSource"/>
        <source>
          <context value="qr"/>
          <element value="source"/>
          <variable value="src"/>
          <condition
                     value="(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"/>
        </source>
        <target>
          <context value="comp"/>
          <element value="author"/>
          <transform value="copy"/>
          <parameter>
            <valueId value="src"/>
          </parameter>
        </target>
      </rule>
    </rule>
    <rule>
      <name value="linkQuestionnaireResponse"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="comp"/>
        <element value="relatesTo"/>
        <variable value="rel"/>
      </target>
      <rule>
        <name value="relatesToType"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="rel"/>
          <element value="type"/>
          <transform value="copy"/>
          <parameter>
            <valueString value="derived-from"/>
          </parameter>
        </target>
      </rule>
      <rule>
        <name value="relatesToTarget"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="rel"/>
          <element value="resourceReference"/>
          <variable value="ref"/>
          <transform value="create"/>
          <parameter>
            <valueString value="Reference"/>
          </parameter>
        </target>
        <rule>
          <name value="relatesToRef"/>
          <source>
            <context value="qr"/>
            <element value="id"/>
            <variable value="qid"/>
          </source>
          <target>
            <context value="ref"/>
            <element value="reference"/>
            <transform value="copy"/>
            <parameter>
              <valueId value="qid"/>
            </parameter>
          </target>
        </rule>
      </rule>
    </rule>
  </group>
  <group>
    <name value="AddSectionText"/>
    <input>
      <name value="it"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="sec"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="sectionAnswer"/>
      <source>
        <context value="it"/>
        <element value="answer"/>
        <listMode value="first"/>
        <variable value="a"/>
      </source>
      <rule>
        <name value="sectionText"/>
        <source>
          <context value="a"/>
          <element value="value"/>
          <variable value="v"/>
        </source>
        <target>
          <context value="sec"/>
          <element value="text"/>
          <variable value="narrative"/>
        </target>
        <rule>
          <name value="narrativeStatus"/>
          <source>
            <context value="v"/>
          </source>
          <target>
            <context value="narrative"/>
            <element value="status"/>
            <transform value="copy"/>
            <parameter>
              <valueString value="generated"/>
            </parameter>
          </target>
        </rule>
        <rule>
          <name value="narrativeXhtml"/>
          <source>
            <context value="v"/>
          </source>
          <target>
            <context value="narrative"/>
            <element value="div"/>
            <variable value="xhtml"/>
            <transform value="create"/>
            <parameter>
              <valueString value="xhtml"/>
            </parameter>
          </target>
          <rule>
            <name value="narrativeDiv"/>
            <source>
              <context value="v"/>
            </source>
            <target>
              <context value="xhtml"/>
              <element value="value"/>
              <transform value="evaluate"/>
              <parameter>
                <valueId value="a"/>
              </parameter>
              <parameter>
                <valueString
                             value="'&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;p&gt;' + value.toString().escape('html') + '&lt;/p&gt;&lt;/div&gt;'"/>
              </parameter>
            </target>
          </rule>
        </rule>
      </rule>
    </rule>
  </group>
  <group>
    <name value="SetCompositionFullUrl"/>
    <input>
      <name value="comp"/>
      <type value="Composition"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="entry"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="assignFullUrl"/>
      <source>
        <context value="comp"/>
        <element value="id"/>
        <variable value="id"/>
      </source>
      <target>
        <context value="entry"/>
        <element value="fullUrl"/>
        <transform value="append"/>
        <parameter>
          <valueString value="https://fhir.slade360.co.ke/fhir/Composition/"/>
        </parameter>
        <parameter>
          <valueId value="id"/>
        </parameter>
      </target>
    </rule>
  </group>
  <group>
    <name value="SetTaskFullUrl"/>
    <input>
      <name value="task"/>
      <type value="Task"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="entry"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="assignFullUrl"/>
      <source>
        <context value="task"/>
        <element value="id"/>
        <variable value="id"/>
      </source>
      <target>
        <context value="entry"/>
        <element value="fullUrl"/>
        <transform value="append"/>
        <parameter>
          <valueString value="https://fhir.slade360.co.ke/fhir/Task/"/>
        </parameter>
        <parameter>
          <valueId value="id"/>
        </parameter>
      </target>
    </rule>
  </group>
  <group>
    <name value="CopyResponseTags"/>
    <documentation
                   value="── Tenancy ──────────────────────────────────────────────────────────────────
Whose this is. The platform says which tenant a response belongs to with a
tag on the response, and every tag the response carries is copied onto
everything this map creates, as it is. Copied rather than named here, so the
map never has to know which tenant it is running for, nor which system the
tag is under: that system has moved more than once."/>
    <input>
      <name value="qr"/>
      <type value="QR"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="r"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="tenantTags"/>
      <source>
        <context value="qr"/>
        <element value="meta"/>
        <variable value="qm"/>
      </source>
      <rule>
        <name value="copyTag"/>
        <source>
          <context value="qm"/>
          <element value="tag"/>
          <variable value="qt"/>
        </source>
        <target>
          <context value="r"/>
          <element value="meta"/>
          <variable value="m"/>
        </target>
        <target>
          <context value="m"/>
          <element value="tag"/>
          <transform value="copy"/>
          <parameter>
            <valueId value="qt"/>
          </parameter>
        </target>
      </rule>
    </rule>
  </group>
</StructureMap>