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

: ExtractMedicationRequest - JSON Representation

Draft as of 2026-10-06

Raw json | Download

{
  "resourceType" : "StructureMap",
  "id" : "ExtractMedicationRequest",
  "text" : {
    "status" : "generated",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractMedicationRequest</b></p><a name=\"ExtractMedicationRequest\"> </a><a name=\"hcExtractMedicationRequest\"> </a><pre class=\"fml\">\r\n<span style=\"color: #cc00cc\">/// <b>url</b> = </span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractMedicationRequest'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractMedicationRequest'</span>\r\n<span style=\"color: #cc00cc\">/// <b>status</b> = </span><span style=\"color: blue\">'draft'</span>\r\n\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/questionnaireresponse.html\" title=\"QuestionnaireResponse\">http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse</a><span style=\"color: navy\">&quot; </span><b>alias </b>QR <b>as </b><b>source</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/bundle.html\" title=\"Bundle\">http://hl7.org/fhir/StructureDefinition/Bundle</a><span style=\"color: navy\">&quot; </span><b>alias </b>Bundle <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/medicationrequest.html\" title=\"MedicationRequest\">http://hl7.org/fhir/StructureDefinition/MedicationRequest</a><span style=\"color: navy\">&quot; </span><b>alias </b>MedicationRequest <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/medication.html\" title=\"Medication\">http://hl7.org/fhir/StructureDefinition/Medication</a><span style=\"color: navy\">&quot; </span><b>alias </b>Medication <b>as </b><b>target</b>\r\n\r\n<b>group </b>ExtractMedicationRequest<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">bundle</span><span style=\"color: navy\"> : </span>Bundle<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr<span style=\"color: navy\"><b> -&gt; </b></span>bundle.type = <span style=\"color: blue\">'transaction'</span> <i>&quot;setBundleType&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.item<b> as </b><span style=\"color: maroon\">prescriptionGroup</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'prescription-form'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    prescriptionGroup<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\">'MedicationRequest'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">medReq</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      qr<span style=\"color: navy\"><b> -&gt; </b></span>medReq<b> then </b>CopyResponseTags<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">medReq</span><span style=\"color: navy\">)</span> <i>&quot;responseTags&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span> medReq<span style=\"color: navy\">, </span> entry<b> then </b>BuildMedicationRequest<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">prescriptionGroup</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">medReq</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;buildMedReq&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;createMedReq&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findPrescriptionGroup&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>BuildMedicationRequest<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\">prescriptionGroup</span>, <b>target</b> <span style=\"color: maroon\">medReq</span><span style=\"color: navy\"> : </span>MedicationRequest, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  <span style=\"color: navy\">// </span><span style=\"color: green\">status will always be draft until medication has been signed off</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>medReq.status = <span style=\"color: blue\">'draft'</span> <i>&quot;setStatus&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>medReq.intent = <span style=\"color: blue\">'order'</span> <i>&quot;setIntent&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Subject from QuestionnaireResponse</span>\r\n  qr.subject<b> as </b><span style=\"color: maroon\">s</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.subject = <span style=\"color: maroon\">s</span> <i>&quot;setSubject&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Encounter from QuestionnaireResponse</span>\r\n  qr.encounter<b> as </b><span style=\"color: maroon\">enc</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.encounter = <span style=\"color: maroon\">enc</span> <i>&quot;setEncounter&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">AuthoredOn from QuestionnaireResponse.authored</span>\r\n  qr.authored<b> as </b><span style=\"color: maroon\">authored</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.authoredOn = <span style=\"color: maroon\">authored</span> <i>&quot;setAuthoredOn&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Requester from QuestionnaireResponse.source (the Organization)</span>\r\n  qr.source<b> as </b><span style=\"color: maroon\">src</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.requester = <span style=\"color: maroon\">src</span> <i>&quot;setRequester&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Performer from QuestionnaireResponse.source (the Organization)</span>\r\n  qr.source<b> as </b><span style=\"color: maroon\">src</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.performer = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Reference'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">perf</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    src.reference<b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\"><b> -&gt; </b></span>perf.reference = <span style=\"color: maroon\">ref</span> <i>&quot;perfRef&quot;</i><span style=\"color: navy\">;</span>\r\n    src.display<b> as </b><span style=\"color: maroon\">disp</span><span style=\"color: navy\"><b> -&gt; </b></span>perf.display = <span style=\"color: maroon\">disp</span> <i>&quot;perfDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;performer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Copy identifier from QuestionnaireResponse to MedicationRequest, unless its</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">assigner is something an identifier cannot be assigned by.</span>\r\n  qr.identifier first<b> as </b><span style=\"color: maroon\">qrIdent</span><b> where </b><span style=\"color: navy\">(</span>assigner.empty() or assigner.where(((reference.exists() and (reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization'))))).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.identifier = <span style=\"color: maroon\">qrIdent</span> <i>&quot;copyIdentifier&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Medication as CodeableReference from the medication-reference extension, which</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">the platform writes under either canonical. Assigning the whole CodeableConcept</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">carries its codings and their systems, so there is nothing further to copy.</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">R5's engine reads a choice as `value`: `valueCodeableConcept`, and every</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">`valueX` below, is an invalid property here and failed the whole extraction.</span>\r\n  qr.extension<b> as </b><span style=\"color: maroon\">ext</span><b> where </b><span style=\"color: navy\">(</span>url.endsWith('/StructureDefinition/medication-reference')<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    ext.value<b> as </b><span style=\"color: maroon\">medCC</span><b> where </b><span style=\"color: navy\">(</span>$this is CodeableConcept<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.medication<b> as </b><span style=\"color: maroon\">med</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      medCC<span style=\"color: navy\"><b> -&gt; </b></span>med.concept = <span style=\"color: maroon\">medCC</span> <i>&quot;setMedConcept&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;accessMedication&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findMedicationExt&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Priority</span>\r\n  prescriptionGroup.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\"> {\r\n</span>    priorityItem.answer first<b> as </b><span style=\"color: maroon\">priorityAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      <span style=\"color: navy\">// </span><span style=\"color: green\">MedicationRequest.priority is a code, not a Coding: it holds the code</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">alone and has nowhere to put the system it came from.</span>\r\n      priorityAns.value<b> as </b><span style=\"color: maroon\">priorityCoding</span><b> where </b><span style=\"color: navy\">(</span>$this is Coding<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        priorityCoding.code<b> as </b><span style=\"color: maroon\">pCode</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.priority = <span style=\"color: maroon\">pCode</span> <i>&quot;setPriorityCode&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;extractPriorityCode&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractPriority&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findPriority&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Dosage Instruction</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>medReq.dosageInstruction = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Dosage'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">dosage</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    prescriptionGroup<span style=\"color: navy\"><b> -&gt; </b></span>dosage<b> then </b>BuildDosage<span style=\"color: navy\">(</span><span style=\"color: maroon\">prescriptionGroup</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">dosage</span><span style=\"color: navy\">)</span> <i>&quot;buildDosage&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;createDosage&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Substitution</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">substItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'substitutable'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    substItem.answer first<b> as </b><span style=\"color: maroon\">substAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      substAns.value<b> as </b><span style=\"color: maroon\">substBool</span><b> where </b><span style=\"color: navy\">(</span>$this is boolean<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>medReq.substitution<b> as </b><span style=\"color: maroon\">subst</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        <span style=\"color: navy\">// </span><span style=\"color: green\">allowed[x] is written as `allowed`; the engine picks the type from the value.</span>\r\n        substBool<span style=\"color: navy\"><b> -&gt; </b></span>subst.allowed = <span style=\"color: maroon\">substBool</span> <i>&quot;setSubstValue&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;createSubst&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractSubst&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findSubst&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Dispense Request</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>medReq.dispenseRequest<b> as </b><span style=\"color: maroon\">dispReq</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    prescriptionGroup<span style=\"color: navy\"><b> -&gt; </b></span>dispReq<b> then </b>BuildDispenseRequest<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">prescriptionGroup</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">dispReq</span><span style=\"color: navy\">)</span> <i>&quot;buildDispReq&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;createDispReq&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Set ID and FullUrl</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>medReq.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetMedicationRequestFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">medReq</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;setMedReqIdAndFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Entry request for transaction bundle</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>&quot;reqMethod&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.url = <span style=\"color: blue\">'MedicationRequest'</span> <i>&quot;reqUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;entryRequest&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>BuildDosage<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">prescriptionGroup</span>, <b>target</b> <span style=\"color: maroon\">dosage</span><span style=\"color: navy\"> : </span>Dosage<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  prescriptionGroup<span style=\"color: navy\"><b> -&gt; </b></span>dosage.timing<b> as </b><span style=\"color: maroon\">timing</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    prescriptionGroup<span style=\"color: navy\"><b> -&gt; </b></span>timing.repeat<b> as </b><span style=\"color: maroon\">repeat</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      <span style=\"color: navy\">// </span><span style=\"color: green\">Frequency (OD, BD, TID, QID). A positiveInt, which an integer is not converted</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">to, so each is cast.</span>\r\n      prescriptionGroup.item<b> as </b><span style=\"color: maroon\">freqItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'frequency'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        freqItem.answer first<b> as </b><span style=\"color: maroon\">freqAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          freqAns.value<b> as </b><span style=\"color: maroon\">freqCoding</span><b> where </b><span style=\"color: navy\">(</span>($this is Coding) and (code = 'OD')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.frequency = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'1'</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'positiveInt'</span><span style=\"color: navy\">)</span> <i>&quot;setFreqOD&quot;</i><span style=\"color: navy\">;</span>\r\n          freqAns.value<b> as </b><span style=\"color: maroon\">freqCoding</span><b> where </b><span style=\"color: navy\">(</span>($this is Coding) and (code = 'BD')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.frequency = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'2'</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'positiveInt'</span><span style=\"color: navy\">)</span> <i>&quot;setFreqBD&quot;</i><span style=\"color: navy\">;</span>\r\n          freqAns.value<b> as </b><span style=\"color: maroon\">freqCoding</span><b> where </b><span style=\"color: navy\">(</span>($this is Coding) and (code = 'TID')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.frequency = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'3'</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'positiveInt'</span><span style=\"color: navy\">)</span> <i>&quot;setFreqTID&quot;</i><span style=\"color: navy\">;</span>\r\n          freqAns.value<b> as </b><span style=\"color: maroon\">freqCoding</span><b> where </b><span style=\"color: navy\">(</span>($this is Coding) and (code = 'QID')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.frequency = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'4'</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'positiveInt'</span><span style=\"color: navy\">)</span> <i>&quot;setFreqQID&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;extractFreq&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;findFreq&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">Period (1 day)</span>\r\n      prescriptionGroup<span style=\"color: navy\"><b> -&gt; </b></span>repeat.period = <span style=\"color: blue\">1</span> <i>&quot;setPeriod&quot;</i><span style=\"color: navy\">;</span>\r\n      prescriptionGroup<span style=\"color: navy\"><b> -&gt; </b></span>repeat.periodUnit = <span style=\"color: blue\">'d'</span> <i>&quot;setPeriodUnit&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">Duration</span>\r\n      prescriptionGroup.item<b> as </b><span style=\"color: maroon\">durItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'duration'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        durItem.answer first<b> as </b><span style=\"color: maroon\">durAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          durAns.value<b> as </b><span style=\"color: maroon\">durValue</span><b> where </b><span style=\"color: navy\">(</span>$this is integer<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.duration = <span style=\"color: maroon\">durValue</span> <i>&quot;setDuration&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;extractDuration&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;findDuration&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">Duration UOM - directly use the code from unitsofmeasure.org (h, d, wk, mo, a)</span>\r\n      prescriptionGroup.item<b> as </b><span style=\"color: maroon\">durUomItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'duration-uom'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        durUomItem.answer first<b> as </b><span style=\"color: maroon\">durUomAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          durUomAns.value<b> as </b><span style=\"color: maroon\">durUomCoding</span><b> where </b><span style=\"color: navy\">(</span>$this is Coding<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            durUomCoding.code<b> as </b><span style=\"color: maroon\">durUomCode</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.durationUnit = <span style=\"color: maroon\">durUomCode</span> <i>&quot;setDurationUnit&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;extractDurUomCode&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;extractDurUom&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;findDurUom&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">When to take - directly use the code (AC, PC, ACM, ACD, ACV, PCM, PCD, PCV, etc.)</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">Handles both single answer and array of answers</span>\r\n      prescriptionGroup.item<b> as </b><span style=\"color: maroon\">whenItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'when-to-take'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        whenItem.answer<b> as </b><span style=\"color: maroon\">whenAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          whenAns.value<b> as </b><span style=\"color: maroon\">whenCoding</span><b> where </b><span style=\"color: navy\">(</span>$this is Coding<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            whenCoding.code<b> as </b><span style=\"color: maroon\">whenCode</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.when = <span style=\"color: maroon\">whenCode</span> <i>&quot;setWhenCode&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;extractWhenCode&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;extractWhen&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;findWhen&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">// </span><span style=\"color: green\">Bounds Period from start-date and end-date</span>\r\n      prescriptionGroup.item<b> as </b><span style=\"color: maroon\">startItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'start-date'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        startItem.answer first<b> as </b><span style=\"color: maroon\">startAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          startAns.value<b> as </b><span style=\"color: maroon\">startDate</span><b> where </b><span style=\"color: navy\">(</span>$this is date<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>repeat.bounds = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Period'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">boundsPeriod</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            startDate<span style=\"color: navy\"><b> -&gt; </b></span>boundsPeriod.start = <span style=\"color: maroon\">startDate</span> <i>&quot;setBoundsStart&quot;</i><span style=\"color: navy\">;</span>\r\n            prescriptionGroup.item<b> as </b><span style=\"color: maroon\">endItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'end-date'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>              endItem.answer first<b> as </b><span style=\"color: maroon\">endAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>                endAns.value<b> as </b><span style=\"color: maroon\">endDate</span><b> where </b><span style=\"color: navy\">(</span>$this is date<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>boundsPeriod.end = <span style=\"color: maroon\">endDate</span> <i>&quot;setBoundsEnd&quot;</i><span style=\"color: navy\">;</span>\r\n              <span style=\"color: navy\">}</span> <i>&quot;extractEndDate&quot;</i><span style=\"color: navy\">;</span>\r\n            <span style=\"color: navy\">}</span> <i>&quot;findEndDate&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;createBoundsPeriod&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;extractStartDate&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;findStartDate&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;accessRepeat&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;accessTiming&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Route</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">routeItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'route'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    routeItem.answer first<b> as </b><span style=\"color: maroon\">routeAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      routeAns.value<b> as </b><span style=\"color: maroon\">routeCoding</span><b> where </b><span style=\"color: navy\">(</span>$this is Coding<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dosage.route = <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\">routeCC</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        routeCoding<span style=\"color: navy\"><b> -&gt; </b></span>routeCC.coding = <span style=\"color: maroon\">routeCoding</span> <i>&quot;setRouteCoding&quot;</i><span style=\"color: navy\">;</span>\r\n        routeCoding.display<b> as </b><span style=\"color: maroon\">disp</span><span style=\"color: navy\"><b> -&gt; </b></span>routeCC.text = <span style=\"color: maroon\">disp</span> <i>&quot;setRouteText&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;setRouteCC&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractRoute&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findRoute&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Dose and Rate. A dose can be a fraction (half a tablet, 2.5 ml), so a decimal</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">answer is read as well as the integer ones already stored.</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">doseItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'dose'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    doseItem.answer first<b> as </b><span style=\"color: maroon\">doseAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      doseAns.value<b> as </b><span style=\"color: maroon\">doseValue</span><b> where </b><span style=\"color: navy\">(</span>($this is integer) or ($this is decimal)<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> dosage.doseAndRate<b> as </b><span style=\"color: maroon\">doseRate</span><span style=\"color: navy\">, </span> doseRate.dose = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Quantity'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">doseQty</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        doseValue<span style=\"color: navy\"><b> -&gt; </b></span>doseQty.value = <span style=\"color: maroon\">doseValue</span> <i>&quot;setDoseValue&quot;</i><span style=\"color: navy\">;</span>\r\n        prescriptionGroup.item<b> as </b><span style=\"color: maroon\">doseUnitItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'dosage-unit'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          doseUnitItem.answer first<b> as </b><span style=\"color: maroon\">doseUnitAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            doseUnitAns.value<b> as </b><span style=\"color: maroon\">unitCoding</span><b> where </b><span style=\"color: navy\">(</span>$this is Coding<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>              unitCoding.display<b> as </b><span style=\"color: maroon\">unitDisp</span><span style=\"color: navy\"><b> -&gt; </b></span>doseQty.unit = <span style=\"color: maroon\">unitDisp</span> <i>&quot;setDoseUnit&quot;</i><span style=\"color: navy\">;</span>\r\n              unitCoding.code<b> as </b><span style=\"color: maroon\">unitCode</span><span style=\"color: navy\"><b> -&gt; </b></span>doseQty.code = <span style=\"color: maroon\">unitCode</span> <i>&quot;setDoseCode&quot;</i><span style=\"color: navy\">;</span>\r\n              unitCoding.system<b> as </b><span style=\"color: maroon\">unitSys</span><span style=\"color: navy\"><b> -&gt; </b></span>doseQty.system = <span style=\"color: maroon\">unitSys</span> <i>&quot;setDoseSystem&quot;</i><span style=\"color: navy\">;</span>\r\n            <span style=\"color: navy\">}</span> <i>&quot;extractUnitCoding&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;extractDoseUnitAns&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;findDoseUnit&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;createDoseAndRate&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractDoseAns&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findDose&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Dosage Instructions (patient instruction)</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">instrItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'dosage-instructions'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    instrItem.answer first<b> as </b><span style=\"color: maroon\">instrAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      instrAns.value<b> as </b><span style=\"color: maroon\">instrText</span><b> where </b><span style=\"color: navy\">(</span>$this is string<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dosage.patientInstruction = <span style=\"color: maroon\">instrText</span> <i>&quot;setPatientInstruction&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractInstr&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findDosageInstr&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Additional Instructions (text)</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">addInstrItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'additional-instructions'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    addInstrItem.answer first<b> as </b><span style=\"color: maroon\">addInstrAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      addInstrAns.value<b> as </b><span style=\"color: maroon\">addInstrText</span><b> where </b><span style=\"color: navy\">(</span>$this is string<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dosage.text = <span style=\"color: maroon\">addInstrText</span> <i>&quot;setDosageText&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractAddInstr&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findAddInstr&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>BuildDispenseRequest<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\">prescriptionGroup</span>, <b>target</b> <span style=\"color: maroon\">dispReq</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  <span style=\"color: navy\">// </span><span style=\"color: green\">Refills</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">refillsItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'refills'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    refillsItem.answer first<b> as </b><span style=\"color: maroon\">refillsAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      <span style=\"color: navy\">// </span><span style=\"color: green\">An unsignedInt, which an integer is not converted to: cast, and only from zero up.</span>\r\n      refillsAns.value<b> as </b><span style=\"color: maroon\">refillsValue</span><b> where </b><span style=\"color: navy\">(</span>($this is integer) and ($this &gt;= 0)<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dispReq.numberOfRepeatsAllowed = <b>cast</b><span style=\"color: navy\">(</span><span style=\"color: maroon\">refillsValue</span><span style=\"color: navy\">, </span><span style=\"color: blue\">'unsignedInt'</span><span style=\"color: navy\">)</span> <i>&quot;setRefills&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractRefills&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findRefills&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Validity Period from start-date and end-date</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">startItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'start-date'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    startItem.answer first<b> as </b><span style=\"color: maroon\">startAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      startAns.value<b> as </b><span style=\"color: maroon\">startDate</span><b> where </b><span style=\"color: navy\">(</span>$this is date<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dispReq.validityPeriod<b> as </b><span style=\"color: maroon\">validPeriod</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        startDate<span style=\"color: navy\"><b> -&gt; </b></span>validPeriod.start = <span style=\"color: maroon\">startDate</span> <i>&quot;setValidityStart&quot;</i><span style=\"color: navy\">;</span>\r\n        prescriptionGroup.item<b> as </b><span style=\"color: maroon\">endItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'end-date'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          endItem.answer first<b> as </b><span style=\"color: maroon\">endAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            endAns.value<b> as </b><span style=\"color: maroon\">endDate</span><b> where </b><span style=\"color: navy\">(</span>$this is date<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>validPeriod.end = <span style=\"color: maroon\">endDate</span> <i>&quot;setValidityEnd&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;extractValidityEnd&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;findValidityEnd&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;createValidityPeriod&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractValidityStart&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findValidityStart&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Expected Supply Duration</span>\r\n  prescriptionGroup.item<b> as </b><span style=\"color: maroon\">durItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'duration'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    durItem.answer first<b> as </b><span style=\"color: maroon\">durAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      durAns.value<b> as </b><span style=\"color: maroon\">durValue</span><b> where </b><span style=\"color: navy\">(</span>$this is integer<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dispReq.expectedSupplyDuration<b> as </b><span style=\"color: maroon\">supplyDur</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        durValue<span style=\"color: navy\"><b> -&gt; </b></span>supplyDur.value = <span style=\"color: maroon\">durValue</span> <i>&quot;setSupplyDurValue&quot;</i><span style=\"color: navy\">;</span>\r\n        prescriptionGroup.item<b> as </b><span style=\"color: maroon\">durUomItem</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'duration-uom'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          durUomItem.answer first<b> as </b><span style=\"color: maroon\">durUomAns</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            durUomAns.value<b> as </b><span style=\"color: maroon\">durUomCoding</span><b> where </b><span style=\"color: navy\">(</span>$this is Coding<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>              durUomCoding.code<b> as </b><span style=\"color: maroon\">uomCode</span><span style=\"color: navy\"><b> -&gt; </b></span>supplyDur.code = <span style=\"color: maroon\">uomCode</span> <i>&quot;setSupplyDurCode&quot;</i><span style=\"color: navy\">;</span>\r\n              durUomCoding.display<b> as </b><span style=\"color: maroon\">uomDisplay</span><span style=\"color: navy\"><b> -&gt; </b></span>supplyDur.unit = <span style=\"color: maroon\">uomDisplay</span> <i>&quot;setSupplyDurUnit&quot;</i><span style=\"color: navy\">;</span>\r\n              durUomCoding.system<b> as </b><span style=\"color: maroon\">uomSystem</span><span style=\"color: navy\"><b> -&gt; </b></span>supplyDur.system = <span style=\"color: maroon\">uomSystem</span> <i>&quot;setSupplyDurSystem&quot;</i><span style=\"color: navy\">;</span>\r\n            <span style=\"color: navy\">}</span> <i>&quot;extractSupplyDurUom&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;extractSupplyDurUomAns&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;findSupplyDurUom&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;createSupplyDuration&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;extractSupplyDuration&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;findSupplyDuration&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Dispenser - from QuestionnaireResponse.source (Organization)</span>\r\n  qr.source<b> as </b><span style=\"color: maroon\">src</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>dispReq.dispenser = <span style=\"color: maroon\">src</span> <i>&quot;setDispenser&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetMedicationRequestFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">medReq</span><span style=\"color: navy\"> : </span>MedicationRequest, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  medReq.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/MedicationRequest/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>&quot;assignFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">── Tenancy ──────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Whose this is. The platform says which tenant a response belongs to with a</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">tag on the response, and every tag the response carries is copied onto</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">everything this map creates, as it is. Copied rather than named here, so the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">map never has to know which tenant it is running for, nor which system the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">tag is under: that system has moved more than once.</span>\r\n<b>group </b>CopyResponseTags<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">r</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr.meta<b> as </b><span style=\"color: maroon\">qm</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qm.tag<b> as </b><span style=\"color: maroon\">qt</span><span style=\"color: navy\"><b> -&gt; </b></span> r.meta<b> as </b><span style=\"color: maroon\">m</span><span style=\"color: navy\">, </span> m.tag = <span style=\"color: maroon\">qt</span> <i>&quot;copyTag&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;tenantTags&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span></pre></div>"
  },
  "url" : "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractMedicationRequest",
  "version" : "0.1.0",
  "name" : "ExtractMedicationRequest",
  "status" : "draft",
  "date" : "2026-10-06T18:48:22+00:00",
  "publisher" : "Kathurima Kimathi",
  "contact" : [
    {
      "name" : "Kathurima Kimathi",
      "telecom" : [
        {
          "system" : "url",
          "value" : "https://www.linkedin.com/in/kathurima-kimathi/"
        },
        {
          "system" : "email",
          "value" : "kathurimakimathi415@gmail.com"
        }
      ]
    },
    {
      "name" : "Oscar John",
      "telecom" : [
        {
          "system" : "email",
          "value" : "oscarjohnotieno@gmail.com",
          "use" : "work"
        }
      ]
    },
    {
      "name" : "Kennedy Omondi",
      "telecom" : [
        {
          "system" : "email",
          "value" : "kennankole@gmail.com",
          "use" : "work"
        }
      ]
    }
  ],
  "structure" : [
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
      "mode" : "source",
      "alias" : "QR"
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/Bundle",
      "mode" : "target",
      "alias" : "Bundle"
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/MedicationRequest",
      "mode" : "target",
      "alias" : "MedicationRequest"
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/Medication",
      "mode" : "target",
      "alias" : "Medication"
    }
  ],
  "group" : [
    {
      "name" : "ExtractMedicationRequest",
      "input" : [
        {
          "name" : "qr",
          "type" : "QR",
          "mode" : "source"
        },
        {
          "name" : "bundle",
          "type" : "Bundle",
          "mode" : "target"
        }
      ],
      "rule" : [
        {
          "name" : "setBundleType",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "bundle",
              "element" : "type",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueString" : "transaction"
                }
              ]
            }
          ]
        },
        {
          "name" : "findPrescriptionGroup",
          "source" : [
            {
              "context" : "qr",
              "element" : "item",
              "variable" : "prescriptionGroup",
              "condition" : "linkId = 'prescription-form'"
            }
          ],
          "rule" : [
            {
              "name" : "createMedReq",
              "source" : [
                {
                  "context" : "prescriptionGroup"
                }
              ],
              "target" : [
                {
                  "context" : "bundle",
                  "element" : "entry",
                  "variable" : "entry"
                },
                {
                  "context" : "entry",
                  "element" : "resource",
                  "variable" : "medReq",
                  "transform" : "create",
                  "parameter" : [
                    {
                      "valueString" : "MedicationRequest"
                    }
                  ]
                }
              ],
              "rule" : [
                {
                  "name" : "responseTags",
                  "source" : [
                    {
                      "context" : "qr"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "medReq"
                    }
                  ],
                  "dependent" : [
                    {
                      "name" : "CopyResponseTags",
                      "parameter" : [
                        {
                          "valueId" : "qr"
                        },
                        {
                          "valueId" : "medReq"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name" : "buildMedReq",
                  "source" : [
                    {
                      "context" : "qr"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "medReq"
                    },
                    {
                      "context" : "entry"
                    }
                  ],
                  "dependent" : [
                    {
                      "name" : "BuildMedicationRequest",
                      "parameter" : [
                        {
                          "valueId" : "qr"
                        },
                        {
                          "valueId" : "prescriptionGroup"
                        },
                        {
                          "valueId" : "medReq"
                        },
                        {
                          "valueId" : "entry"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name" : "BuildMedicationRequest",
      "input" : [
        {
          "name" : "qr",
          "type" : "QR",
          "mode" : "source"
        },
        {
          "name" : "prescriptionGroup",
          "mode" : "source"
        },
        {
          "name" : "medReq",
          "type" : "MedicationRequest",
          "mode" : "target"
        },
        {
          "name" : "entry",
          "mode" : "target"
        }
      ],
      "rule" : [
        {
          "name" : "setStatus",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "status",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueString" : "draft"
                }
              ]
            }
          ],
          "documentation" : "status will always be draft until medication has been signed off"
        },
        {
          "name" : "setIntent",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "intent",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueString" : "order"
                }
              ]
            }
          ]
        },
        {
          "name" : "setSubject",
          "source" : [
            {
              "context" : "qr",
              "element" : "subject",
              "variable" : "s",
              "condition" : "(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "subject",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueId" : "s"
                }
              ]
            }
          ],
          "documentation" : "Subject from QuestionnaireResponse"
        },
        {
          "name" : "setEncounter",
          "source" : [
            {
              "context" : "qr",
              "element" : "encounter",
              "variable" : "enc",
              "condition" : "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "encounter",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueId" : "enc"
                }
              ]
            }
          ],
          "documentation" : "Encounter from QuestionnaireResponse"
        },
        {
          "name" : "setAuthoredOn",
          "source" : [
            {
              "context" : "qr",
              "element" : "authored",
              "variable" : "authored"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "authoredOn",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueId" : "authored"
                }
              ]
            }
          ],
          "documentation" : "AuthoredOn from QuestionnaireResponse.authored"
        },
        {
          "name" : "setRequester",
          "source" : [
            {
              "context" : "qr",
              "element" : "source",
              "variable" : "src",
              "condition" : "(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "requester",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueId" : "src"
                }
              ]
            }
          ],
          "documentation" : "Requester from QuestionnaireResponse.source (the Organization)"
        },
        {
          "name" : "performer",
          "source" : [
            {
              "context" : "qr",
              "element" : "source",
              "variable" : "src",
              "condition" : "(reference.exists() and (reference.startsWith('Patient/') or reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/Organization')))"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "performer",
              "variable" : "perf",
              "transform" : "create",
              "parameter" : [
                {
                  "valueString" : "Reference"
                }
              ]
            }
          ],
          "rule" : [
            {
              "name" : "perfRef",
              "source" : [
                {
                  "context" : "src",
                  "element" : "reference",
                  "variable" : "ref"
                }
              ],
              "target" : [
                {
                  "context" : "perf",
                  "element" : "reference",
                  "transform" : "copy",
                  "parameter" : [
                    {
                      "valueId" : "ref"
                    }
                  ]
                }
              ]
            },
            {
              "name" : "perfDisplay",
              "source" : [
                {
                  "context" : "src",
                  "element" : "display",
                  "variable" : "disp"
                }
              ],
              "target" : [
                {
                  "context" : "perf",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [
                    {
                      "valueId" : "disp"
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Performer from QuestionnaireResponse.source (the Organization)"
        },
        {
          "name" : "copyIdentifier",
          "source" : [
            {
              "context" : "qr",
              "element" : "identifier",
              "listMode" : "first",
              "variable" : "qrIdent",
              "condition" : "assigner.empty() or assigner.where(((reference.exists() and (reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization'))))).exists()"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "identifier",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueId" : "qrIdent"
                }
              ]
            }
          ],
          "documentation" : "Copy identifier from QuestionnaireResponse to MedicationRequest, unless its\r\nassigner is something an identifier cannot be assigned by."
        },
        {
          "name" : "findMedicationExt",
          "source" : [
            {
              "context" : "qr",
              "element" : "extension",
              "variable" : "ext",
              "condition" : "url.endsWith('/StructureDefinition/medication-reference')"
            }
          ],
          "rule" : [
            {
              "name" : "accessMedication",
              "source" : [
                {
                  "context" : "ext",
                  "element" : "value",
                  "variable" : "medCC",
                  "condition" : "$this is CodeableConcept"
                }
              ],
              "target" : [
                {
                  "context" : "medReq",
                  "element" : "medication",
                  "variable" : "med"
                }
              ],
              "rule" : [
                {
                  "name" : "setMedConcept",
                  "source" : [
                    {
                      "context" : "medCC"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "med",
                      "element" : "concept",
                      "transform" : "copy",
                      "parameter" : [
                        {
                          "valueId" : "medCC"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Medication as CodeableReference from the medication-reference extension, which\r\nthe platform writes under either canonical. Assigning the whole CodeableConcept\r\ncarries its codings and their systems, so there is nothing further to copy.\r\nR5's engine reads a choice as `value`: `valueCodeableConcept`, and every\r\n`valueX` below, is an invalid property here and failed the whole extraction."
        },
        {
          "name" : "findPriority",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "priorityItem",
              "condition" : "linkId = 'priority'"
            }
          ],
          "rule" : [
            {
              "name" : "extractPriority",
              "source" : [
                {
                  "context" : "priorityItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "priorityAns"
                }
              ],
              "rule" : [
                {
                  "name" : "extractPriorityCode",
                  "source" : [
                    {
                      "context" : "priorityAns",
                      "element" : "value",
                      "variable" : "priorityCoding",
                      "condition" : "$this is Coding"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "setPriorityCode",
                      "source" : [
                        {
                          "context" : "priorityCoding",
                          "element" : "code",
                          "variable" : "pCode"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "medReq",
                          "element" : "priority",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "pCode"
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "documentation" : "MedicationRequest.priority is a code, not a Coding: it holds the code\r\nalone and has nowhere to put the system it came from."
                }
              ]
            }
          ],
          "documentation" : "Priority"
        },
        {
          "name" : "createDosage",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "dosageInstruction",
              "variable" : "dosage",
              "transform" : "create",
              "parameter" : [
                {
                  "valueString" : "Dosage"
                }
              ]
            }
          ],
          "rule" : [
            {
              "name" : "buildDosage",
              "source" : [
                {
                  "context" : "prescriptionGroup"
                }
              ],
              "target" : [
                {
                  "context" : "dosage"
                }
              ],
              "dependent" : [
                {
                  "name" : "BuildDosage",
                  "parameter" : [
                    {
                      "valueId" : "prescriptionGroup"
                    },
                    {
                      "valueId" : "dosage"
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Dosage Instruction"
        },
        {
          "name" : "findSubst",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "substItem",
              "condition" : "linkId = 'substitutable'"
            }
          ],
          "rule" : [
            {
              "name" : "extractSubst",
              "source" : [
                {
                  "context" : "substItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "substAns"
                }
              ],
              "rule" : [
                {
                  "name" : "createSubst",
                  "source" : [
                    {
                      "context" : "substAns",
                      "element" : "value",
                      "variable" : "substBool",
                      "condition" : "$this is boolean"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "medReq",
                      "element" : "substitution",
                      "variable" : "subst"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "setSubstValue",
                      "source" : [
                        {
                          "context" : "substBool"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "subst",
                          "element" : "allowed",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "substBool"
                            }
                          ]
                        }
                      ],
                      "documentation" : "allowed[x] is written as `allowed`; the engine picks the type from the value."
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Substitution"
        },
        {
          "name" : "createDispReq",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "dispenseRequest",
              "variable" : "dispReq"
            }
          ],
          "rule" : [
            {
              "name" : "buildDispReq",
              "source" : [
                {
                  "context" : "prescriptionGroup"
                }
              ],
              "target" : [
                {
                  "context" : "dispReq"
                }
              ],
              "dependent" : [
                {
                  "name" : "BuildDispenseRequest",
                  "parameter" : [
                    {
                      "valueId" : "qr"
                    },
                    {
                      "valueId" : "prescriptionGroup"
                    },
                    {
                      "valueId" : "dispReq"
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Dispense Request"
        },
        {
          "name" : "setMedReqIdAndFullUrl",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "medReq",
              "element" : "id",
              "transform" : "uuid"
            }
          ],
          "dependent" : [
            {
              "name" : "SetMedicationRequestFullUrl",
              "parameter" : [
                {
                  "valueId" : "medReq"
                },
                {
                  "valueId" : "entry"
                }
              ]
            }
          ],
          "documentation" : "Set ID and FullUrl"
        },
        {
          "name" : "entryRequest",
          "source" : [
            {
              "context" : "qr"
            }
          ],
          "target" : [
            {
              "context" : "entry",
              "element" : "request",
              "variable" : "request"
            }
          ],
          "rule" : [
            {
              "name" : "reqMethod",
              "source" : [
                {
                  "context" : "qr"
                }
              ],
              "target" : [
                {
                  "context" : "request",
                  "element" : "method",
                  "transform" : "copy",
                  "parameter" : [
                    {
                      "valueString" : "POST"
                    }
                  ]
                }
              ]
            },
            {
              "name" : "reqUrl",
              "source" : [
                {
                  "context" : "qr"
                }
              ],
              "target" : [
                {
                  "context" : "request",
                  "element" : "url",
                  "transform" : "copy",
                  "parameter" : [
                    {
                      "valueString" : "MedicationRequest"
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Entry request for transaction bundle"
        }
      ]
    },
    {
      "name" : "BuildDosage",
      "input" : [
        {
          "name" : "prescriptionGroup",
          "mode" : "source"
        },
        {
          "name" : "dosage",
          "type" : "Dosage",
          "mode" : "target"
        }
      ],
      "rule" : [
        {
          "name" : "accessTiming",
          "source" : [
            {
              "context" : "prescriptionGroup"
            }
          ],
          "target" : [
            {
              "context" : "dosage",
              "element" : "timing",
              "variable" : "timing"
            }
          ],
          "rule" : [
            {
              "name" : "accessRepeat",
              "source" : [
                {
                  "context" : "prescriptionGroup"
                }
              ],
              "target" : [
                {
                  "context" : "timing",
                  "element" : "repeat",
                  "variable" : "repeat"
                }
              ],
              "rule" : [
                {
                  "name" : "findFreq",
                  "source" : [
                    {
                      "context" : "prescriptionGroup",
                      "element" : "item",
                      "variable" : "freqItem",
                      "condition" : "linkId = 'frequency'"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "extractFreq",
                      "source" : [
                        {
                          "context" : "freqItem",
                          "element" : "answer",
                          "listMode" : "first",
                          "variable" : "freqAns"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "setFreqOD",
                          "source" : [
                            {
                              "context" : "freqAns",
                              "element" : "value",
                              "variable" : "freqCoding",
                              "condition" : "($this is Coding) and (code = 'OD')"
                            }
                          ],
                          "target" : [
                            {
                              "context" : "repeat",
                              "element" : "frequency",
                              "transform" : "cast",
                              "parameter" : [
                                {
                                  "valueString" : "1"
                                },
                                {
                                  "valueString" : "positiveInt"
                                }
                              ]
                            }
                          ]
                        },
                        {
                          "name" : "setFreqBD",
                          "source" : [
                            {
                              "context" : "freqAns",
                              "element" : "value",
                              "variable" : "freqCoding",
                              "condition" : "($this is Coding) and (code = 'BD')"
                            }
                          ],
                          "target" : [
                            {
                              "context" : "repeat",
                              "element" : "frequency",
                              "transform" : "cast",
                              "parameter" : [
                                {
                                  "valueString" : "2"
                                },
                                {
                                  "valueString" : "positiveInt"
                                }
                              ]
                            }
                          ]
                        },
                        {
                          "name" : "setFreqTID",
                          "source" : [
                            {
                              "context" : "freqAns",
                              "element" : "value",
                              "variable" : "freqCoding",
                              "condition" : "($this is Coding) and (code = 'TID')"
                            }
                          ],
                          "target" : [
                            {
                              "context" : "repeat",
                              "element" : "frequency",
                              "transform" : "cast",
                              "parameter" : [
                                {
                                  "valueString" : "3"
                                },
                                {
                                  "valueString" : "positiveInt"
                                }
                              ]
                            }
                          ]
                        },
                        {
                          "name" : "setFreqQID",
                          "source" : [
                            {
                              "context" : "freqAns",
                              "element" : "value",
                              "variable" : "freqCoding",
                              "condition" : "($this is Coding) and (code = 'QID')"
                            }
                          ],
                          "target" : [
                            {
                              "context" : "repeat",
                              "element" : "frequency",
                              "transform" : "cast",
                              "parameter" : [
                                {
                                  "valueString" : "4"
                                },
                                {
                                  "valueString" : "positiveInt"
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "documentation" : "Frequency (OD, BD, TID, QID). A positiveInt, which an integer is not converted\r\nto, so each is cast."
                },
                {
                  "name" : "setPeriod",
                  "source" : [
                    {
                      "context" : "prescriptionGroup"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "repeat",
                      "element" : "period",
                      "transform" : "copy",
                      "parameter" : [
                        {
                          "valueInteger" : 1
                        }
                      ]
                    }
                  ],
                  "documentation" : "Period (1 day)"
                },
                {
                  "name" : "setPeriodUnit",
                  "source" : [
                    {
                      "context" : "prescriptionGroup"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "repeat",
                      "element" : "periodUnit",
                      "transform" : "copy",
                      "parameter" : [
                        {
                          "valueString" : "d"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name" : "findDuration",
                  "source" : [
                    {
                      "context" : "prescriptionGroup",
                      "element" : "item",
                      "variable" : "durItem",
                      "condition" : "linkId = 'duration'"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "extractDuration",
                      "source" : [
                        {
                          "context" : "durItem",
                          "element" : "answer",
                          "listMode" : "first",
                          "variable" : "durAns"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "setDuration",
                          "source" : [
                            {
                              "context" : "durAns",
                              "element" : "value",
                              "variable" : "durValue",
                              "condition" : "$this is integer"
                            }
                          ],
                          "target" : [
                            {
                              "context" : "repeat",
                              "element" : "duration",
                              "transform" : "copy",
                              "parameter" : [
                                {
                                  "valueId" : "durValue"
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "documentation" : "Duration"
                },
                {
                  "name" : "findDurUom",
                  "source" : [
                    {
                      "context" : "prescriptionGroup",
                      "element" : "item",
                      "variable" : "durUomItem",
                      "condition" : "linkId = 'duration-uom'"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "extractDurUom",
                      "source" : [
                        {
                          "context" : "durUomItem",
                          "element" : "answer",
                          "listMode" : "first",
                          "variable" : "durUomAns"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "extractDurUomCode",
                          "source" : [
                            {
                              "context" : "durUomAns",
                              "element" : "value",
                              "variable" : "durUomCoding",
                              "condition" : "$this is Coding"
                            }
                          ],
                          "rule" : [
                            {
                              "name" : "setDurationUnit",
                              "source" : [
                                {
                                  "context" : "durUomCoding",
                                  "element" : "code",
                                  "variable" : "durUomCode"
                                }
                              ],
                              "target" : [
                                {
                                  "context" : "repeat",
                                  "element" : "durationUnit",
                                  "transform" : "copy",
                                  "parameter" : [
                                    {
                                      "valueId" : "durUomCode"
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "documentation" : "Duration UOM - directly use the code from unitsofmeasure.org (h, d, wk, mo, a)"
                },
                {
                  "name" : "findWhen",
                  "source" : [
                    {
                      "context" : "prescriptionGroup",
                      "element" : "item",
                      "variable" : "whenItem",
                      "condition" : "linkId = 'when-to-take'"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "extractWhen",
                      "source" : [
                        {
                          "context" : "whenItem",
                          "element" : "answer",
                          "variable" : "whenAns"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "extractWhenCode",
                          "source" : [
                            {
                              "context" : "whenAns",
                              "element" : "value",
                              "variable" : "whenCoding",
                              "condition" : "$this is Coding"
                            }
                          ],
                          "rule" : [
                            {
                              "name" : "setWhenCode",
                              "source" : [
                                {
                                  "context" : "whenCoding",
                                  "element" : "code",
                                  "variable" : "whenCode"
                                }
                              ],
                              "target" : [
                                {
                                  "context" : "repeat",
                                  "element" : "when",
                                  "transform" : "copy",
                                  "parameter" : [
                                    {
                                      "valueId" : "whenCode"
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "documentation" : "When to take - directly use the code (AC, PC, ACM, ACD, ACV, PCM, PCD, PCV, etc.)\r\nHandles both single answer and array of answers"
                },
                {
                  "name" : "findStartDate",
                  "source" : [
                    {
                      "context" : "prescriptionGroup",
                      "element" : "item",
                      "variable" : "startItem",
                      "condition" : "linkId = 'start-date'"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "extractStartDate",
                      "source" : [
                        {
                          "context" : "startItem",
                          "element" : "answer",
                          "listMode" : "first",
                          "variable" : "startAns"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "createBoundsPeriod",
                          "source" : [
                            {
                              "context" : "startAns",
                              "element" : "value",
                              "variable" : "startDate",
                              "condition" : "$this is date"
                            }
                          ],
                          "target" : [
                            {
                              "context" : "repeat",
                              "element" : "bounds",
                              "variable" : "boundsPeriod",
                              "transform" : "create",
                              "parameter" : [
                                {
                                  "valueString" : "Period"
                                }
                              ]
                            }
                          ],
                          "rule" : [
                            {
                              "name" : "setBoundsStart",
                              "source" : [
                                {
                                  "context" : "startDate"
                                }
                              ],
                              "target" : [
                                {
                                  "context" : "boundsPeriod",
                                  "element" : "start",
                                  "transform" : "copy",
                                  "parameter" : [
                                    {
                                      "valueId" : "startDate"
                                    }
                                  ]
                                }
                              ]
                            },
                            {
                              "name" : "findEndDate",
                              "source" : [
                                {
                                  "context" : "prescriptionGroup",
                                  "element" : "item",
                                  "variable" : "endItem",
                                  "condition" : "linkId = 'end-date'"
                                }
                              ],
                              "rule" : [
                                {
                                  "name" : "extractEndDate",
                                  "source" : [
                                    {
                                      "context" : "endItem",
                                      "element" : "answer",
                                      "listMode" : "first",
                                      "variable" : "endAns"
                                    }
                                  ],
                                  "rule" : [
                                    {
                                      "name" : "setBoundsEnd",
                                      "source" : [
                                        {
                                          "context" : "endAns",
                                          "element" : "value",
                                          "variable" : "endDate",
                                          "condition" : "$this is date"
                                        }
                                      ],
                                      "target" : [
                                        {
                                          "context" : "boundsPeriod",
                                          "element" : "end",
                                          "transform" : "copy",
                                          "parameter" : [
                                            {
                                              "valueId" : "endDate"
                                            }
                                          ]
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ],
                  "documentation" : "Bounds Period from start-date and end-date"
                }
              ]
            }
          ]
        },
        {
          "name" : "findRoute",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "routeItem",
              "condition" : "linkId = 'route'"
            }
          ],
          "rule" : [
            {
              "name" : "extractRoute",
              "source" : [
                {
                  "context" : "routeItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "routeAns"
                }
              ],
              "rule" : [
                {
                  "name" : "setRouteCC",
                  "source" : [
                    {
                      "context" : "routeAns",
                      "element" : "value",
                      "variable" : "routeCoding",
                      "condition" : "$this is Coding"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dosage",
                      "element" : "route",
                      "variable" : "routeCC",
                      "transform" : "create",
                      "parameter" : [
                        {
                          "valueString" : "CodeableConcept"
                        }
                      ]
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "setRouteCoding",
                      "source" : [
                        {
                          "context" : "routeCoding"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "routeCC",
                          "element" : "coding",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "routeCoding"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name" : "setRouteText",
                      "source" : [
                        {
                          "context" : "routeCoding",
                          "element" : "display",
                          "variable" : "disp"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "routeCC",
                          "element" : "text",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "disp"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Route"
        },
        {
          "name" : "findDose",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "doseItem",
              "condition" : "linkId = 'dose'"
            }
          ],
          "rule" : [
            {
              "name" : "extractDoseAns",
              "source" : [
                {
                  "context" : "doseItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "doseAns"
                }
              ],
              "rule" : [
                {
                  "name" : "createDoseAndRate",
                  "source" : [
                    {
                      "context" : "doseAns",
                      "element" : "value",
                      "variable" : "doseValue",
                      "condition" : "($this is integer) or ($this is decimal)"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dosage",
                      "element" : "doseAndRate",
                      "variable" : "doseRate"
                    },
                    {
                      "context" : "doseRate",
                      "element" : "dose",
                      "variable" : "doseQty",
                      "transform" : "create",
                      "parameter" : [
                        {
                          "valueString" : "Quantity"
                        }
                      ]
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "setDoseValue",
                      "source" : [
                        {
                          "context" : "doseValue"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "doseQty",
                          "element" : "value",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "doseValue"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name" : "findDoseUnit",
                      "source" : [
                        {
                          "context" : "prescriptionGroup",
                          "element" : "item",
                          "variable" : "doseUnitItem",
                          "condition" : "linkId = 'dosage-unit'"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "extractDoseUnitAns",
                          "source" : [
                            {
                              "context" : "doseUnitItem",
                              "element" : "answer",
                              "listMode" : "first",
                              "variable" : "doseUnitAns"
                            }
                          ],
                          "rule" : [
                            {
                              "name" : "extractUnitCoding",
                              "source" : [
                                {
                                  "context" : "doseUnitAns",
                                  "element" : "value",
                                  "variable" : "unitCoding",
                                  "condition" : "$this is Coding"
                                }
                              ],
                              "rule" : [
                                {
                                  "name" : "setDoseUnit",
                                  "source" : [
                                    {
                                      "context" : "unitCoding",
                                      "element" : "display",
                                      "variable" : "unitDisp"
                                    }
                                  ],
                                  "target" : [
                                    {
                                      "context" : "doseQty",
                                      "element" : "unit",
                                      "transform" : "copy",
                                      "parameter" : [
                                        {
                                          "valueId" : "unitDisp"
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "name" : "setDoseCode",
                                  "source" : [
                                    {
                                      "context" : "unitCoding",
                                      "element" : "code",
                                      "variable" : "unitCode"
                                    }
                                  ],
                                  "target" : [
                                    {
                                      "context" : "doseQty",
                                      "element" : "code",
                                      "transform" : "copy",
                                      "parameter" : [
                                        {
                                          "valueId" : "unitCode"
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "name" : "setDoseSystem",
                                  "source" : [
                                    {
                                      "context" : "unitCoding",
                                      "element" : "system",
                                      "variable" : "unitSys"
                                    }
                                  ],
                                  "target" : [
                                    {
                                      "context" : "doseQty",
                                      "element" : "system",
                                      "transform" : "copy",
                                      "parameter" : [
                                        {
                                          "valueId" : "unitSys"
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Dose and Rate. A dose can be a fraction (half a tablet, 2.5 ml), so a decimal\r\nanswer is read as well as the integer ones already stored."
        },
        {
          "name" : "findDosageInstr",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "instrItem",
              "condition" : "linkId = 'dosage-instructions'"
            }
          ],
          "rule" : [
            {
              "name" : "extractInstr",
              "source" : [
                {
                  "context" : "instrItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "instrAns"
                }
              ],
              "rule" : [
                {
                  "name" : "setPatientInstruction",
                  "source" : [
                    {
                      "context" : "instrAns",
                      "element" : "value",
                      "variable" : "instrText",
                      "condition" : "$this is string"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dosage",
                      "element" : "patientInstruction",
                      "transform" : "copy",
                      "parameter" : [
                        {
                          "valueId" : "instrText"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Dosage Instructions (patient instruction)"
        },
        {
          "name" : "findAddInstr",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "addInstrItem",
              "condition" : "linkId = 'additional-instructions'"
            }
          ],
          "rule" : [
            {
              "name" : "extractAddInstr",
              "source" : [
                {
                  "context" : "addInstrItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "addInstrAns"
                }
              ],
              "rule" : [
                {
                  "name" : "setDosageText",
                  "source" : [
                    {
                      "context" : "addInstrAns",
                      "element" : "value",
                      "variable" : "addInstrText",
                      "condition" : "$this is string"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dosage",
                      "element" : "text",
                      "transform" : "copy",
                      "parameter" : [
                        {
                          "valueId" : "addInstrText"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Additional Instructions (text)"
        }
      ]
    },
    {
      "name" : "BuildDispenseRequest",
      "input" : [
        {
          "name" : "qr",
          "type" : "QR",
          "mode" : "source"
        },
        {
          "name" : "prescriptionGroup",
          "mode" : "source"
        },
        {
          "name" : "dispReq",
          "mode" : "target"
        }
      ],
      "rule" : [
        {
          "name" : "findRefills",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "refillsItem",
              "condition" : "linkId = 'refills'"
            }
          ],
          "rule" : [
            {
              "name" : "extractRefills",
              "source" : [
                {
                  "context" : "refillsItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "refillsAns"
                }
              ],
              "rule" : [
                {
                  "name" : "setRefills",
                  "source" : [
                    {
                      "context" : "refillsAns",
                      "element" : "value",
                      "variable" : "refillsValue",
                      "condition" : "($this is integer) and ($this >= 0)"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dispReq",
                      "element" : "numberOfRepeatsAllowed",
                      "transform" : "cast",
                      "parameter" : [
                        {
                          "valueId" : "refillsValue"
                        },
                        {
                          "valueString" : "unsignedInt"
                        }
                      ]
                    }
                  ],
                  "documentation" : "An unsignedInt, which an integer is not converted to: cast, and only from zero up."
                }
              ]
            }
          ],
          "documentation" : "Refills"
        },
        {
          "name" : "findValidityStart",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "startItem",
              "condition" : "linkId = 'start-date'"
            }
          ],
          "rule" : [
            {
              "name" : "extractValidityStart",
              "source" : [
                {
                  "context" : "startItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "startAns"
                }
              ],
              "rule" : [
                {
                  "name" : "createValidityPeriod",
                  "source" : [
                    {
                      "context" : "startAns",
                      "element" : "value",
                      "variable" : "startDate",
                      "condition" : "$this is date"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dispReq",
                      "element" : "validityPeriod",
                      "variable" : "validPeriod"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "setValidityStart",
                      "source" : [
                        {
                          "context" : "startDate"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "validPeriod",
                          "element" : "start",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "startDate"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name" : "findValidityEnd",
                      "source" : [
                        {
                          "context" : "prescriptionGroup",
                          "element" : "item",
                          "variable" : "endItem",
                          "condition" : "linkId = 'end-date'"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "extractValidityEnd",
                          "source" : [
                            {
                              "context" : "endItem",
                              "element" : "answer",
                              "listMode" : "first",
                              "variable" : "endAns"
                            }
                          ],
                          "rule" : [
                            {
                              "name" : "setValidityEnd",
                              "source" : [
                                {
                                  "context" : "endAns",
                                  "element" : "value",
                                  "variable" : "endDate",
                                  "condition" : "$this is date"
                                }
                              ],
                              "target" : [
                                {
                                  "context" : "validPeriod",
                                  "element" : "end",
                                  "transform" : "copy",
                                  "parameter" : [
                                    {
                                      "valueId" : "endDate"
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Validity Period from start-date and end-date"
        },
        {
          "name" : "findSupplyDuration",
          "source" : [
            {
              "context" : "prescriptionGroup",
              "element" : "item",
              "variable" : "durItem",
              "condition" : "linkId = 'duration'"
            }
          ],
          "rule" : [
            {
              "name" : "extractSupplyDuration",
              "source" : [
                {
                  "context" : "durItem",
                  "element" : "answer",
                  "listMode" : "first",
                  "variable" : "durAns"
                }
              ],
              "rule" : [
                {
                  "name" : "createSupplyDuration",
                  "source" : [
                    {
                      "context" : "durAns",
                      "element" : "value",
                      "variable" : "durValue",
                      "condition" : "$this is integer"
                    }
                  ],
                  "target" : [
                    {
                      "context" : "dispReq",
                      "element" : "expectedSupplyDuration",
                      "variable" : "supplyDur"
                    }
                  ],
                  "rule" : [
                    {
                      "name" : "setSupplyDurValue",
                      "source" : [
                        {
                          "context" : "durValue"
                        }
                      ],
                      "target" : [
                        {
                          "context" : "supplyDur",
                          "element" : "value",
                          "transform" : "copy",
                          "parameter" : [
                            {
                              "valueId" : "durValue"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name" : "findSupplyDurUom",
                      "source" : [
                        {
                          "context" : "prescriptionGroup",
                          "element" : "item",
                          "variable" : "durUomItem",
                          "condition" : "linkId = 'duration-uom'"
                        }
                      ],
                      "rule" : [
                        {
                          "name" : "extractSupplyDurUomAns",
                          "source" : [
                            {
                              "context" : "durUomItem",
                              "element" : "answer",
                              "listMode" : "first",
                              "variable" : "durUomAns"
                            }
                          ],
                          "rule" : [
                            {
                              "name" : "extractSupplyDurUom",
                              "source" : [
                                {
                                  "context" : "durUomAns",
                                  "element" : "value",
                                  "variable" : "durUomCoding",
                                  "condition" : "$this is Coding"
                                }
                              ],
                              "rule" : [
                                {
                                  "name" : "setSupplyDurCode",
                                  "source" : [
                                    {
                                      "context" : "durUomCoding",
                                      "element" : "code",
                                      "variable" : "uomCode"
                                    }
                                  ],
                                  "target" : [
                                    {
                                      "context" : "supplyDur",
                                      "element" : "code",
                                      "transform" : "copy",
                                      "parameter" : [
                                        {
                                          "valueId" : "uomCode"
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "name" : "setSupplyDurUnit",
                                  "source" : [
                                    {
                                      "context" : "durUomCoding",
                                      "element" : "display",
                                      "variable" : "uomDisplay"
                                    }
                                  ],
                                  "target" : [
                                    {
                                      "context" : "supplyDur",
                                      "element" : "unit",
                                      "transform" : "copy",
                                      "parameter" : [
                                        {
                                          "valueId" : "uomDisplay"
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "name" : "setSupplyDurSystem",
                                  "source" : [
                                    {
                                      "context" : "durUomCoding",
                                      "element" : "system",
                                      "variable" : "uomSystem"
                                    }
                                  ],
                                  "target" : [
                                    {
                                      "context" : "supplyDur",
                                      "element" : "system",
                                      "transform" : "copy",
                                      "parameter" : [
                                        {
                                          "valueId" : "uomSystem"
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "documentation" : "Expected Supply Duration"
        },
        {
          "name" : "setDispenser",
          "source" : [
            {
              "context" : "qr",
              "element" : "source",
              "variable" : "src",
              "condition" : "(reference.exists() and (reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization')))"
            }
          ],
          "target" : [
            {
              "context" : "dispReq",
              "element" : "dispenser",
              "transform" : "copy",
              "parameter" : [
                {
                  "valueId" : "src"
                }
              ]
            }
          ],
          "documentation" : "Dispenser - from QuestionnaireResponse.source (Organization)"
        }
      ]
    },
    {
      "name" : "SetMedicationRequestFullUrl",
      "input" : [
        {
          "name" : "medReq",
          "type" : "MedicationRequest",
          "mode" : "source"
        },
        {
          "name" : "entry",
          "mode" : "target"
        }
      ],
      "rule" : [
        {
          "name" : "assignFullUrl",
          "source" : [
            {
              "context" : "medReq",
              "element" : "id",
              "variable" : "id"
            }
          ],
          "target" : [
            {
              "context" : "entry",
              "element" : "fullUrl",
              "transform" : "append",
              "parameter" : [
                {
                  "valueString" : "https://fhir.slade360.co.ke/fhir/MedicationRequest/"
                },
                {
                  "valueId" : "id"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name" : "CopyResponseTags",
      "documentation" : "── Tenancy ──────────────────────────────────────────────────────────────────\r\nWhose this is. The platform says which tenant a response belongs to with a\r\ntag on the response, and every tag the response carries is copied onto\r\neverything this map creates, as it is. Copied rather than named here, so the\r\nmap never has to know which tenant it is running for, nor which system the\r\ntag is under: that system has moved more than once.",
      "input" : [
        {
          "name" : "qr",
          "type" : "QR",
          "mode" : "source"
        },
        {
          "name" : "r",
          "mode" : "target"
        }
      ],
      "rule" : [
        {
          "name" : "tenantTags",
          "source" : [
            {
              "context" : "qr",
              "element" : "meta",
              "variable" : "qm"
            }
          ],
          "rule" : [
            {
              "name" : "copyTag",
              "source" : [
                {
                  "context" : "qm",
                  "element" : "tag",
                  "variable" : "qt"
                }
              ],
              "target" : [
                {
                  "context" : "r",
                  "element" : "meta",
                  "variable" : "m"
                },
                {
                  "context" : "m",
                  "element" : "tag",
                  "transform" : "copy",
                  "parameter" : [
                    {
                      "valueId" : "qt"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}