<?xml version="1.0" encoding="UTF-8"?>

<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&#xD;&#xA;live on the response itself, so the whole of it is carried into the build group rather&#xD;&#xA;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&#xD;&#xA;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&#xD;&#xA;client sets the device there rather than answering a form item, so this reads exactly&#xD;&#xA;as the medication order map reads its medication concept. Assigning the whole&#xD;&#xA;CodeableConcept carries its codings and their systems, so nothing further is copied.&#xD;&#xA;`value`, not `valueCodeableConcept`: this engine resolves the choice element by its&#xD;&#xA;base name and rejects the typed one outright --&#xD;&#xA;&quot;Attempt to read invalid property 'valueCodeableConcept' on type Extension&quot; -- which&#xD;&#xA;fails the whole transform, not just this rule. Same accessor every answer below uses.&#xD;&#xA;The url is matched on its tail rather than in full: a map is published once at the&#xD;&#xA;production canonical while the extension url is built from each environment's own&#xD;&#xA;base, so an equality test would hold in production alone. Matching beats taking the&#xD;&#xA;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&#xD;&#xA;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:&#xD;&#xA;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&#xD;&#xA;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&#xD;&#xA;this rides a local extension rather than collapsing into note alongside the message&#xD;&#xA;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>