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

: ExtractDeviceRequest - XML Representation

Draft as of 2026-09-14

Raw xml | Download


<StructureMap xmlns="http://hl7.org/fhir">
  <id value="ExtractDeviceRequest"/>
  <text>
    <status value="generated"/>
    <div xmlns="http://www.w3.org/1999/xhtml"><p class="res-header-id"><b>Generated Narrative: StructureMap ExtractDeviceRequest</b></p><a name="ExtractDeviceRequest"> </a><a name="hcExtractDeviceRequest"> </a><pre class="fml">
<span style="color: #cc00cc">/// <b>url</b> = </span><span style="color: blue">'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDeviceRequest'</span>
<span style="color: #cc00cc">/// <b>name</b> = </span><span style="color: blue">'ExtractDeviceRequest'</span>
<span style="color: #cc00cc">/// <b>status</b> = </span><span style="color: blue">'draft'</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/devicerequest.html" title="DeviceRequest">http://hl7.org/fhir/StructureDefinition/DeviceRequest</a><span style="color: navy">&quot; </span><b>alias </b>DeviceRequest <b>as </b><b>target</b>

<b>group </b>ExtractDeviceRequest<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>
  <span style="color: navy">// </span><span style="color: green">Subject, encounter, authored date, requester, identifier and the device extension all</span>
  <span style="color: navy">// </span><span style="color: green">live on the response itself, so the whole of it is carried into the build group rather</span>
  <span style="color: navy">// </span><span style="color: green">than the answer group alone.</span>
  qr.item<b> as </b><span style="color: maroon">requestGroup</span><b> where </b><span style="color: navy">(</span>linkId = 'the-request'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    requestGroup<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">'DeviceRequest'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">devReq</span><b> then</b><span style="color: navy"> {
</span>      qr<span style="color: navy"><b> -&gt; </b></span> devReq<span style="color: navy">, </span> entry<b> then </b>BuildDeviceRequest<span style="color: navy">(</span><span style="color: maroon">qr</span><span style="color: navy">, </span><span style="color: maroon">requestGroup</span><span style="color: navy">, </span><span style="color: maroon">devReq</span><span style="color: navy">, </span><span style="color: maroon">entry</span><span style="color: navy">)</span> <i>&quot;buildDevReq&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;createDevReq&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findRequestGroup&quot;</i><span style="color: navy">;</span>
<span style="color: navy">}

</span><b>group </b>BuildDeviceRequest<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">requestGroup</span>, <b>target</b> <span style="color: maroon">devReq</span><span style="color: navy"> : </span>DeviceRequest, <b>target</b> <span style="color: maroon">entry</span><span style="color: navy">)</span><span style="color: navy"> {
</span>  <span style="color: navy">// </span><span style="color: green">The form has no sign-off step, so a submitted order is already actionable. If a</span>
  <span style="color: navy">// </span><span style="color: green">review step is added later this becomes 'draft', as it is on the medication order.</span>
  qr<span style="color: navy"><b> -&gt; </b></span>devReq.status = <span style="color: blue">'active'</span> <i>&quot;setStatus&quot;</i><span style="color: navy">;</span>
  qr.subject<b> as </b><span style="color: maroon">s</span><span style="color: navy"><b> -&gt; </b></span>devReq.subject = <span style="color: maroon">s</span> <i>&quot;setSubject&quot;</i><span style="color: navy">;</span>
  qr.encounter<b> as </b><span style="color: maroon">enc</span><span style="color: navy"><b> -&gt; </b></span>devReq.encounter = <span style="color: maroon">enc</span> <i>&quot;setEncounter&quot;</i><span style="color: navy">;</span>
  qr.authored<b> as </b><span style="color: maroon">authored</span><span style="color: navy"><b> -&gt; </b></span>devReq.authoredOn = <span style="color: maroon">authored</span> <i>&quot;setAuthoredOn&quot;</i><span style="color: navy">;</span>
  qr.source<b> as </b><span style="color: maroon">src</span><span style="color: navy"><b> -&gt; </b></span>devReq.requester = <span style="color: maroon">src</span> <i>&quot;setRequester&quot;</i><span style="color: navy">;</span>
  qr.identifier first<b> as </b><span style="color: maroon">qrIdent</span><span style="color: navy"><b> -&gt; </b></span>devReq.identifier = <span style="color: maroon">qrIdent</span> <i>&quot;copyIdentifier&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Device as CodeableReference from the QR extension (using concept). The ordering</span>
  <span style="color: navy">// </span><span style="color: green">client sets the device there rather than answering a form item, so this reads exactly</span>
  <span style="color: navy">// </span><span style="color: green">as the medication order map reads its medication concept. Assigning the whole</span>
  <span style="color: navy">// </span><span style="color: green">CodeableConcept carries its codings and their systems, so nothing further is copied.</span>
  <span style="color: navy">// </span><span style="color: green">`value`, not `valueCodeableConcept`: this engine resolves the choice element by its</span>
  <span style="color: navy">// </span><span style="color: green">base name and rejects the typed one outright --</span>
  <span style="color: navy">// </span><span style="color: green">&quot;Attempt to read invalid property 'valueCodeableConcept' on type Extension&quot; -- which</span>
  <span style="color: navy">// </span><span style="color: green">fails the whole transform, not just this rule. Same accessor every answer below uses.</span>
  <span style="color: navy">// </span><span style="color: green">The url is matched on its tail rather than in full: a map is published once at the</span>
  <span style="color: navy">// </span><span style="color: green">production canonical while the extension url is built from each environment's own</span>
  <span style="color: navy">// </span><span style="color: green">base, so an equality test would hold in production alone. Matching beats taking the</span>
  <span style="color: navy">// </span><span style="color: green">first extension, which silently reads whichever one the client happened to put first.</span>
  qr.extension<b> as </b><span style="color: maroon">ext</span><b> where </b><span style="color: navy">(</span>url.endsWith('/StructureDefinition/device-reference')<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    ext.value<b> as </b><span style="color: maroon">deviceCC</span><span style="color: navy"><b> -&gt; </b></span>devReq.code<b> as </b><span style="color: maroon">code</span><b> then</b><span style="color: navy"> {
</span>      deviceCC<span style="color: navy"><b> -&gt; </b></span>code.concept = <span style="color: maroon">deviceCC</span> <i>&quot;setDeviceConcept&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;accessDevice&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findDeviceExt&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Intent. DeviceRequest.intent is a code, not a Coding: it takes the code alone and has</span>
  <span style="color: navy">// </span><span style="color: green">nowhere to record the system it came from.</span>
  requestGroup.item<b> as </b><span style="color: maroon">intentItem</span><b> where </b><span style="color: navy">(</span>linkId = 'intent'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    intentItem.answer first<b> as </b><span style="color: maroon">intentAns</span><b> then</b><span style="color: navy"> {
</span>      intentAns.value<b> as </b><span style="color: maroon">intentCoding</span><b> then</b><span style="color: navy"> {
</span>        intentCoding.code<b> as </b><span style="color: maroon">intentCode</span><span style="color: navy"><b> -&gt; </b></span>devReq.intent = <span style="color: maroon">intentCode</span> <i>&quot;setIntentCode&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;extractIntentCode&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractIntent&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findIntent&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Priority. Same shape as intent, and same reason.</span>
  requestGroup.item<b> as </b><span style="color: maroon">priorityItem</span><b> where </b><span style="color: navy">(</span>linkId = 'priority'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    priorityItem.answer first<b> as </b><span style="color: maroon">priorityAns</span><b> then</b><span style="color: navy"> {
</span>      priorityAns.value<b> as </b><span style="color: maroon">priorityCoding</span><b> then</b><span style="color: navy"> {
</span>        priorityCoding.code<b> as </b><span style="color: maroon">priorityCode</span><span style="color: navy"><b> -&gt; </b></span>devReq.priority = <span style="color: maroon">priorityCode</span> <i>&quot;setPriorityCode&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;extractPriorityCode&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractPriority&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findPriority&quot;</i><span style="color: navy">;</span>
  requestGroup.item<b> as </b><span style="color: maroon">qtyItem</span><b> where </b><span style="color: navy">(</span>linkId = 'quantity'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    qtyItem.answer first<b> as </b><span style="color: maroon">qtyAns</span><b> then</b><span style="color: navy"> {
</span>      qtyAns.value<b> as </b><span style="color: maroon">qtyValue</span><span style="color: navy"><b> -&gt; </b></span>devReq.quantity = <span style="color: maroon">qtyValue</span> <i>&quot;setQuantity&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractQuantity&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findQuantity&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">How it is supplied. DeviceRequest has no element for this, so it becomes a parameter:</span>
  <span style="color: navy">// </span><span style="color: green">parameter.code names the question, parameter.value carries the answer.</span>
  requestGroup.item<b> as </b><span style="color: maroon">supplyItem</span><b> where </b><span style="color: navy">(</span>linkId = 'supply-method'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    supplyItem.answer first<b> as </b><span style="color: maroon">supplyAns</span><b> then</b><span style="color: navy"> {
</span>      supplyAns.value<b> as </b><span style="color: maroon">supplyCoding</span><span style="color: navy"><b> -&gt; </b></span>devReq.parameter<b> as </b><span style="color: maroon">param</span><b> then</b><span style="color: navy"> {
</span>        supplyCoding<span style="color: navy"><b> -&gt; </b></span>param.code = <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">paramCode</span><b> then</b><span style="color: navy"> {
</span>          supplyCoding<span style="color: navy"><b> -&gt; </b></span>paramCode.coding = <b>create</b><span style="color: navy">(</span><span style="color: blue">'Coding'</span><span style="color: navy">)</span><b> as </b><span style="color: maroon">paramCoding</span><b> then</b><span style="color: navy"> {
</span>            supplyCoding<span style="color: navy"><b> -&gt; </b></span>paramCoding.system = <span style="color: blue">'https://fhir.slade360.co.ke/fhir/CodeSystem/device-order-codesystem'</span> <i>&quot;setParamSystem&quot;</i><span style="color: navy">;</span>
            supplyCoding<span style="color: navy"><b> -&gt; </b></span>paramCoding.code = <span style="color: blue">'supply-method'</span> <i>&quot;setParamCode&quot;</i><span style="color: navy">;</span>
            supplyCoding<span style="color: navy"><b> -&gt; </b></span>paramCoding.display = <span style="color: blue">'How the device is supplied'</span> <i>&quot;setParamDisplay&quot;</i><span style="color: navy">;</span>
          <span style="color: navy">}</span> <i>&quot;buildParamCoding&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;buildParamCode&quot;</i><span style="color: navy">;</span>
        supplyCoding<span style="color: navy"><b> -&gt; </b></span>param.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">paramValue</span><b> then</b><span style="color: navy"> {
</span>          supplyCoding<span style="color: navy"><b> -&gt; </b></span>paramValue.coding = <span style="color: maroon">supplyCoding</span> <i>&quot;setParamValueCoding&quot;</i><span style="color: navy">;</span>
          supplyCoding.display<b> as </b><span style="color: maroon">supplyDisp</span><span style="color: navy"><b> -&gt; </b></span>paramValue.text = <span style="color: maroon">supplyDisp</span> <i>&quot;setParamValueText&quot;</i><span style="color: navy">;</span>
        <span style="color: navy">}</span> <i>&quot;buildParamValue&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;createParameter&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractSupply&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findSupply&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Reason is free text on the form, so it lands as CodeableReference.concept.text with</span>
  <span style="color: navy">// </span><span style="color: green">no coding. A coded reason would need a value set the form does not offer.</span>
  requestGroup.item<b> as </b><span style="color: maroon">reasonItem</span><b> where </b><span style="color: navy">(</span>linkId = 'reason'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    reasonItem.answer first<b> as </b><span style="color: maroon">reasonAns</span><b> then</b><span style="color: navy"> {
</span>      reasonAns.value<b> as </b><span style="color: maroon">reasonText</span><span style="color: navy"><b> -&gt; </b></span> devReq.reason<b> as </b><span style="color: maroon">reasonRef</span><span style="color: navy">, </span> reasonRef.concept<b> as </b><span style="color: maroon">reasonCC</span><b> then</b><span style="color: navy"> {
</span>        reasonText<span style="color: navy"><b> -&gt; </b></span>reasonCC.text = <span style="color: maroon">reasonText</span> <i>&quot;setReasonText&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;setReason&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractReason&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findReason&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">// </span><span style="color: green">Patient instruction. DeviceRequest has no equivalent of Dosage.patientInstruction, so</span>
  <span style="color: navy">// </span><span style="color: green">this rides a local extension rather than collapsing into note alongside the message</span>
  <span style="color: navy">// </span><span style="color: green">written for the dispensing team.</span>
  requestGroup.item<b> as </b><span style="color: maroon">instructionItem</span><b> where </b><span style="color: navy">(</span>linkId = 'patient-instructions'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    instructionItem.answer first<b> as </b><span style="color: maroon">instructionAns</span><b> then</b><span style="color: navy"> {
</span>      instructionAns.value<b> as </b><span style="color: maroon">instructionText</span><span style="color: navy"><b> -&gt; </b></span>devReq.extension<b> as </b><span style="color: maroon">instructionExt</span><b> then</b><span style="color: navy"> {
</span>        instructionText<span style="color: navy"><b> -&gt; </b></span>instructionExt.url = <span style="color: blue">'https://fhir.slade360.co.ke/fhir/StructureDefinition/sghi-device-patient-instruction'</span> <i>&quot;setInstructionExtUrl&quot;</i><span style="color: navy">;</span>
        instructionText<span style="color: navy"><b> -&gt; </b></span>instructionExt.value = <span style="color: maroon">instructionText</span> <i>&quot;setInstructionExtValue&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;createInstructionExt&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractInstruction&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findInstruction&quot;</i><span style="color: navy">;</span>
  requestGroup.item<b> as </b><span style="color: maroon">notesItem</span><b> where </b><span style="color: navy">(</span>linkId = 'notes'<span style="color: navy">)</span><b> then</b><span style="color: navy"> {
</span>    notesItem.answer first<b> as </b><span style="color: maroon">notesAns</span><b> then</b><span style="color: navy"> {
</span>      notesAns.value<b> as </b><span style="color: maroon">notesText</span><span style="color: navy"><b> -&gt; </b></span>devReq.note<b> as </b><span style="color: maroon">note</span><b> then</b><span style="color: navy"> {
</span>        notesText<span style="color: navy"><b> -&gt; </b></span>note.text = <span style="color: maroon">notesText</span> <i>&quot;setNoteText&quot;</i><span style="color: navy">;</span>
      <span style="color: navy">}</span> <i>&quot;createNote&quot;</i><span style="color: navy">;</span>
    <span style="color: navy">}</span> <i>&quot;extractNotes&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;findNotes&quot;</i><span style="color: navy">;</span>
  qr<span style="color: navy"><b> -&gt; </b></span>devReq.id = <b>uuid</b><span style="color: navy">(</span><span style="color: navy">)</span><b> then </b>SetDeviceRequestFullUrl<span style="color: navy">(</span><span style="color: maroon">devReq</span><span style="color: navy">, </span><span style="color: maroon">entry</span><span style="color: navy">)</span> <i>&quot;setDevReqIdAndFullUrl&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;reqMethod&quot;</i><span style="color: navy">;</span>
    qr<span style="color: navy"><b> -&gt; </b></span>request.url = <span style="color: blue">'DeviceRequest'</span> <i>&quot;reqUrl&quot;</i><span style="color: navy">;</span>
  <span style="color: navy">}</span> <i>&quot;entryRequest&quot;</i><span style="color: navy">;</span>
<span style="color: navy">}

</span><b>group </b>SetDeviceRequestFullUrl<span style="color: navy">(</span><b>source</b> <span style="color: maroon">devReq</span><span style="color: navy"> : </span>DeviceRequest, <b>target</b> <span style="color: maroon">entry</span><span style="color: navy">)</span><span style="color: navy"> {
</span>  devReq.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/DeviceRequest/'</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></pre></div>
  </text>
  <url
       value="https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDeviceRequest"/>
  <version value="0.1.0"/>
  <name value="ExtractDeviceRequest"/>
  <status value="draft"/>
  <date value="2026-09-14T06:31:13+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>
  <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/DeviceRequest"/>
    <mode value="target"/>
    <alias value="DeviceRequest"/>
  </structure>
  <group>
    <name value="ExtractDeviceRequest"/>
    <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="findRequestGroup"/>
      <source>
        <context value="qr"/>
        <element value="item"/>
        <variable value="requestGroup"/>
        <condition value="linkId = 'the-request'"/>
      </source>
      <rule>
        <name value="createDevReq"/>
        <source>
          <context value="requestGroup"/>
        </source>
        <target>
          <context value="bundle"/>
          <element value="entry"/>
          <variable value="entry"/>
        </target>
        <target>
          <context value="entry"/>
          <element value="resource"/>
          <variable value="devReq"/>
          <transform value="create"/>
          <parameter>
            <valueString value="DeviceRequest"/>
          </parameter>
        </target>
        <rule>
          <name value="buildDevReq"/>
          <source>
            <context value="qr"/>
          </source>
          <target>
            <context value="devReq"/>
          </target>
          <target>
            <context value="entry"/>
          </target>
          <dependent>
            <name value="BuildDeviceRequest"/>
            <parameter>
              <valueId value="qr"/>
            </parameter>
            <parameter>
              <valueId value="requestGroup"/>
            </parameter>
            <parameter>
              <valueId value="devReq"/>
            </parameter>
            <parameter>
              <valueId value="entry"/>
            </parameter>
          </dependent>
        </rule>
      </rule>
      <documentation
                     value="Subject, encounter, authored date, requester, identifier and the device extension all
live on the response itself, so the whole of it is carried into the build group rather
than the answer group alone."/>
    </rule>
  </group>
  <group>
    <name value="BuildDeviceRequest"/>
    <input>
      <name value="qr"/>
      <type value="QR"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="requestGroup"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="devReq"/>
      <type value="DeviceRequest"/>
      <mode value="target"/>
    </input>
    <input>
      <name value="entry"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="setStatus"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="status"/>
        <transform value="copy"/>
        <parameter>
          <valueString value="active"/>
        </parameter>
      </target>
      <documentation
                     value="The form has no sign-off step, so a submitted order is already actionable. If a
review step is added later this becomes 'draft', as it is on the medication order."/>
    </rule>
    <rule>
      <name value="setSubject"/>
      <source>
        <context value="qr"/>
        <element value="subject"/>
        <variable value="s"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="subject"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="s"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="setEncounter"/>
      <source>
        <context value="qr"/>
        <element value="encounter"/>
        <variable value="enc"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="encounter"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="enc"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="setAuthoredOn"/>
      <source>
        <context value="qr"/>
        <element value="authored"/>
        <variable value="authored"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="authoredOn"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="authored"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="setRequester"/>
      <source>
        <context value="qr"/>
        <element value="source"/>
        <variable value="src"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="requester"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="src"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="copyIdentifier"/>
      <source>
        <context value="qr"/>
        <element value="identifier"/>
        <listMode value="first"/>
        <variable value="qrIdent"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="identifier"/>
        <transform value="copy"/>
        <parameter>
          <valueId value="qrIdent"/>
        </parameter>
      </target>
    </rule>
    <rule>
      <name value="findDeviceExt"/>
      <source>
        <context value="qr"/>
        <element value="extension"/>
        <variable value="ext"/>
        <condition
                   value="url.endsWith('/StructureDefinition/device-reference')"/>
      </source>
      <rule>
        <name value="accessDevice"/>
        <source>
          <context value="ext"/>
          <element value="value"/>
          <variable value="deviceCC"/>
        </source>
        <target>
          <context value="devReq"/>
          <element value="code"/>
          <variable value="code"/>
        </target>
        <rule>
          <name value="setDeviceConcept"/>
          <source>
            <context value="deviceCC"/>
          </source>
          <target>
            <context value="code"/>
            <element value="concept"/>
            <transform value="copy"/>
            <parameter>
              <valueId value="deviceCC"/>
            </parameter>
          </target>
        </rule>
      </rule>
      <documentation
                     value="Device as CodeableReference from the QR extension (using concept). The ordering
client sets the device there rather than answering a form item, so this reads exactly
as the medication order map reads its medication concept. Assigning the whole
CodeableConcept carries its codings and their systems, so nothing further is copied.
`value`, not `valueCodeableConcept`: this engine resolves the choice element by its
base name and rejects the typed one outright --
&quot;Attempt to read invalid property 'valueCodeableConcept' on type Extension&quot; -- which
fails the whole transform, not just this rule. Same accessor every answer below uses.
The url is matched on its tail rather than in full: a map is published once at the
production canonical while the extension url is built from each environment's own
base, so an equality test would hold in production alone. Matching beats taking the
first extension, which silently reads whichever one the client happened to put first."/>
    </rule>
    <rule>
      <name value="findIntent"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="intentItem"/>
        <condition value="linkId = 'intent'"/>
      </source>
      <rule>
        <name value="extractIntent"/>
        <source>
          <context value="intentItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="intentAns"/>
        </source>
        <rule>
          <name value="extractIntentCode"/>
          <source>
            <context value="intentAns"/>
            <element value="value"/>
            <variable value="intentCoding"/>
          </source>
          <rule>
            <name value="setIntentCode"/>
            <source>
              <context value="intentCoding"/>
              <element value="code"/>
              <variable value="intentCode"/>
            </source>
            <target>
              <context value="devReq"/>
              <element value="intent"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="intentCode"/>
              </parameter>
            </target>
          </rule>
        </rule>
      </rule>
      <documentation
                     value="Intent. DeviceRequest.intent is a code, not a Coding: it takes the code alone and has
nowhere to record the system it came from."/>
    </rule>
    <rule>
      <name value="findPriority"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="priorityItem"/>
        <condition value="linkId = 'priority'"/>
      </source>
      <rule>
        <name value="extractPriority"/>
        <source>
          <context value="priorityItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="priorityAns"/>
        </source>
        <rule>
          <name value="extractPriorityCode"/>
          <source>
            <context value="priorityAns"/>
            <element value="value"/>
            <variable value="priorityCoding"/>
          </source>
          <rule>
            <name value="setPriorityCode"/>
            <source>
              <context value="priorityCoding"/>
              <element value="code"/>
              <variable value="priorityCode"/>
            </source>
            <target>
              <context value="devReq"/>
              <element value="priority"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="priorityCode"/>
              </parameter>
            </target>
          </rule>
        </rule>
      </rule>
      <documentation
                     value="Priority. Same shape as intent, and same reason."/>
    </rule>
    <rule>
      <name value="findQuantity"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="qtyItem"/>
        <condition value="linkId = 'quantity'"/>
      </source>
      <rule>
        <name value="extractQuantity"/>
        <source>
          <context value="qtyItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="qtyAns"/>
        </source>
        <rule>
          <name value="setQuantity"/>
          <source>
            <context value="qtyAns"/>
            <element value="value"/>
            <variable value="qtyValue"/>
          </source>
          <target>
            <context value="devReq"/>
            <element value="quantity"/>
            <transform value="copy"/>
            <parameter>
              <valueId value="qtyValue"/>
            </parameter>
          </target>
        </rule>
      </rule>
    </rule>
    <rule>
      <name value="findSupply"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="supplyItem"/>
        <condition value="linkId = 'supply-method'"/>
      </source>
      <rule>
        <name value="extractSupply"/>
        <source>
          <context value="supplyItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="supplyAns"/>
        </source>
        <rule>
          <name value="createParameter"/>
          <source>
            <context value="supplyAns"/>
            <element value="value"/>
            <variable value="supplyCoding"/>
          </source>
          <target>
            <context value="devReq"/>
            <element value="parameter"/>
            <variable value="param"/>
          </target>
          <rule>
            <name value="buildParamCode"/>
            <source>
              <context value="supplyCoding"/>
            </source>
            <target>
              <context value="param"/>
              <element value="code"/>
              <variable value="paramCode"/>
              <transform value="create"/>
              <parameter>
                <valueString value="CodeableConcept"/>
              </parameter>
            </target>
            <rule>
              <name value="buildParamCoding"/>
              <source>
                <context value="supplyCoding"/>
              </source>
              <target>
                <context value="paramCode"/>
                <element value="coding"/>
                <variable value="paramCoding"/>
                <transform value="create"/>
                <parameter>
                  <valueString value="Coding"/>
                </parameter>
              </target>
              <rule>
                <name value="setParamSystem"/>
                <source>
                  <context value="supplyCoding"/>
                </source>
                <target>
                  <context value="paramCoding"/>
                  <element value="system"/>
                  <transform value="copy"/>
                  <parameter>
                    <valueString
                                 value="https://fhir.slade360.co.ke/fhir/CodeSystem/device-order-codesystem"/>
                  </parameter>
                </target>
              </rule>
              <rule>
                <name value="setParamCode"/>
                <source>
                  <context value="supplyCoding"/>
                </source>
                <target>
                  <context value="paramCoding"/>
                  <element value="code"/>
                  <transform value="copy"/>
                  <parameter>
                    <valueString value="supply-method"/>
                  </parameter>
                </target>
              </rule>
              <rule>
                <name value="setParamDisplay"/>
                <source>
                  <context value="supplyCoding"/>
                </source>
                <target>
                  <context value="paramCoding"/>
                  <element value="display"/>
                  <transform value="copy"/>
                  <parameter>
                    <valueString value="How the device is supplied"/>
                  </parameter>
                </target>
              </rule>
            </rule>
          </rule>
          <rule>
            <name value="buildParamValue"/>
            <source>
              <context value="supplyCoding"/>
            </source>
            <target>
              <context value="param"/>
              <element value="value"/>
              <variable value="paramValue"/>
              <transform value="create"/>
              <parameter>
                <valueString value="CodeableConcept"/>
              </parameter>
            </target>
            <rule>
              <name value="setParamValueCoding"/>
              <source>
                <context value="supplyCoding"/>
              </source>
              <target>
                <context value="paramValue"/>
                <element value="coding"/>
                <transform value="copy"/>
                <parameter>
                  <valueId value="supplyCoding"/>
                </parameter>
              </target>
            </rule>
            <rule>
              <name value="setParamValueText"/>
              <source>
                <context value="supplyCoding"/>
                <element value="display"/>
                <variable value="supplyDisp"/>
              </source>
              <target>
                <context value="paramValue"/>
                <element value="text"/>
                <transform value="copy"/>
                <parameter>
                  <valueId value="supplyDisp"/>
                </parameter>
              </target>
            </rule>
          </rule>
        </rule>
      </rule>
      <documentation
                     value="How it is supplied. DeviceRequest has no element for this, so it becomes a parameter:
parameter.code names the question, parameter.value carries the answer."/>
    </rule>
    <rule>
      <name value="findReason"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="reasonItem"/>
        <condition value="linkId = 'reason'"/>
      </source>
      <rule>
        <name value="extractReason"/>
        <source>
          <context value="reasonItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="reasonAns"/>
        </source>
        <rule>
          <name value="setReason"/>
          <source>
            <context value="reasonAns"/>
            <element value="value"/>
            <variable value="reasonText"/>
          </source>
          <target>
            <context value="devReq"/>
            <element value="reason"/>
            <variable value="reasonRef"/>
          </target>
          <target>
            <context value="reasonRef"/>
            <element value="concept"/>
            <variable value="reasonCC"/>
          </target>
          <rule>
            <name value="setReasonText"/>
            <source>
              <context value="reasonText"/>
            </source>
            <target>
              <context value="reasonCC"/>
              <element value="text"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="reasonText"/>
              </parameter>
            </target>
          </rule>
        </rule>
      </rule>
      <documentation
                     value="Reason is free text on the form, so it lands as CodeableReference.concept.text with
no coding. A coded reason would need a value set the form does not offer."/>
    </rule>
    <rule>
      <name value="findInstruction"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="instructionItem"/>
        <condition value="linkId = 'patient-instructions'"/>
      </source>
      <rule>
        <name value="extractInstruction"/>
        <source>
          <context value="instructionItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="instructionAns"/>
        </source>
        <rule>
          <name value="createInstructionExt"/>
          <source>
            <context value="instructionAns"/>
            <element value="value"/>
            <variable value="instructionText"/>
          </source>
          <target>
            <context value="devReq"/>
            <element value="extension"/>
            <variable value="instructionExt"/>
          </target>
          <rule>
            <name value="setInstructionExtUrl"/>
            <source>
              <context value="instructionText"/>
            </source>
            <target>
              <context value="instructionExt"/>
              <element value="url"/>
              <transform value="copy"/>
              <parameter>
                <valueString
                             value="https://fhir.slade360.co.ke/fhir/StructureDefinition/sghi-device-patient-instruction"/>
              </parameter>
            </target>
          </rule>
          <rule>
            <name value="setInstructionExtValue"/>
            <source>
              <context value="instructionText"/>
            </source>
            <target>
              <context value="instructionExt"/>
              <element value="value"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="instructionText"/>
              </parameter>
            </target>
          </rule>
        </rule>
      </rule>
      <documentation
                     value="Patient instruction. DeviceRequest has no equivalent of Dosage.patientInstruction, so
this rides a local extension rather than collapsing into note alongside the message
written for the dispensing team."/>
    </rule>
    <rule>
      <name value="findNotes"/>
      <source>
        <context value="requestGroup"/>
        <element value="item"/>
        <variable value="notesItem"/>
        <condition value="linkId = 'notes'"/>
      </source>
      <rule>
        <name value="extractNotes"/>
        <source>
          <context value="notesItem"/>
          <element value="answer"/>
          <listMode value="first"/>
          <variable value="notesAns"/>
        </source>
        <rule>
          <name value="createNote"/>
          <source>
            <context value="notesAns"/>
            <element value="value"/>
            <variable value="notesText"/>
          </source>
          <target>
            <context value="devReq"/>
            <element value="note"/>
            <variable value="note"/>
          </target>
          <rule>
            <name value="setNoteText"/>
            <source>
              <context value="notesText"/>
            </source>
            <target>
              <context value="note"/>
              <element value="text"/>
              <transform value="copy"/>
              <parameter>
                <valueId value="notesText"/>
              </parameter>
            </target>
          </rule>
        </rule>
      </rule>
    </rule>
    <rule>
      <name value="setDevReqIdAndFullUrl"/>
      <source>
        <context value="qr"/>
      </source>
      <target>
        <context value="devReq"/>
        <element value="id"/>
        <transform value="uuid"/>
      </target>
      <dependent>
        <name value="SetDeviceRequestFullUrl"/>
        <parameter>
          <valueId value="devReq"/>
        </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="reqMethod"/>
        <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="reqUrl"/>
        <source>
          <context value="qr"/>
        </source>
        <target>
          <context value="request"/>
          <element value="url"/>
          <transform value="copy"/>
          <parameter>
            <valueString value="DeviceRequest"/>
          </parameter>
        </target>
      </rule>
    </rule>
  </group>
  <group>
    <name value="SetDeviceRequestFullUrl"/>
    <input>
      <name value="devReq"/>
      <type value="DeviceRequest"/>
      <mode value="source"/>
    </input>
    <input>
      <name value="entry"/>
      <mode value="target"/>
    </input>
    <rule>
      <name value="assignFullUrl"/>
      <source>
        <context value="devReq"/>
        <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/DeviceRequest/"/>
        </parameter>
        <parameter>
          <valueId value="id"/>
        </parameter>
      </target>
    </rule>
  </group>
</StructureMap>