FHIR IG analytics| Package | silfhirprofileig |
| Resource Type | StructureMap |
| Id | StructureMap-ExtractDischargeSummary.json |
| FHIR Version | R5 |
| Source | https://build.fhir.org/ig/savannahghi/sil_fhir_profile_ig/StructureMap-ExtractDischargeSummary.html |
| URL | https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDischargeSummary |
| Version | 0.1.0 |
| Status | active |
| Date | 2026-09-11T12:18:36+00:00 |
| Name | ExtractDischargeSummary |
| Title | Discharge Summary Extraction |
| Description | The discharge summary out as: a Composition coded to LOINC 18842-5, with the clinical summary, the management and the discharge instructions as its sections, because a discharge summary is a document and this is the resource for one; a Condition per discharge diagnosis, reconciled against the problem list where the clinician picked an existing one; a MedicationRequest per line of discharge medication, which is what the pharmacy dispenses against; a ServiceRequest for the follow-up; and an Observation for the ward clearance sign-off, because whether the medication was actually issued is an auditable fact and not a formality. |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
Generated Narrative: StructureMap ExtractDischargeSummary
/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDischargeSummary' /// name = 'ExtractDischargeSummary' /// title = 'Discharge Summary Extraction' /// status = 'active' /// description = 'The discharge summary out as: a Composition coded to LOINC 18842-5, with the clinical summary, the management and the discharge instructions as its sections, because a discharge summary is a document and this is the resource for one; a Condition per discharge diagnosis, reconciled against the problem list where the clinician picked an existing one; a MedicationRequest per line of discharge medication, which is what the pharmacy dispenses against; a ServiceRequest for the follow-up; and an Observation for the ward clearance sign-off, because whether the medication was actually issued is an auditable fact and not a formality.' uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QR as source uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target uses "http://hl7.org/fhir/StructureDefinition/Composition" alias Composition as target uses "http://hl7.org/fhir/StructureDefinition/Condition" alias Condition as target uses "http://hl7.org/fhir/StructureDefinition/MedicationRequest" alias MedicationRequest as target uses "http://hl7.org/fhir/StructureDefinition/ServiceRequest" alias ServiceRequest as target uses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as target group ExtractDischargeSummary(source qr : QR, target bundle : Bundle) { qr -> bundle.type = 'transaction' "setBundleType"; // ── The document itself ───────────────────────────────────────────────── // A Composition, not a bundle of Observations carrying paragraphs. The // narrative sections of a discharge summary are a document: they are written // once, read as a whole, and given to the patient. Each section's text goes // into `section.text.div` as XHTML, which is where a Composition holds // narrative, with `section.title` naming it. qr -> bundle.entry as entry, entry.resource = create('Composition') as comp then { qr -> comp, entry then BuildCompositionBase(qr, comp, entry) "base"; qr -> comp.status = 'final' "status"; qr -> comp.title = 'Discharge summary' "title"; qr.authored as t -> comp.date = t "date"; qr.encounter as e -> comp.encounter = e; qr.source as src -> comp.author = src "author"; qr -> comp.type as tp then { qr -> tp.coding as cg then { qr -> cg.system = 'http://loinc.org' "sys"; qr -> cg.code = '18842-5' "cd"; qr -> cg.display = 'Discharge summary' "dsp"; } "coding"; } "type"; qr -> comp.category as cat then { qr -> cat.coding as cg then { qr -> cg.system = 'https://fhir.slade360.co.ke/fhir/CodeSystem/document-type-codesystem' "sys"; qr -> cg.code = 'discharge-summary' "cd"; qr -> cg.display = 'Discharge summary' "dsp"; } "coding"; } "category"; qr.item as it where ((linkId = 'clinical-summary') and answer.value.exists()) -> comp.section as sec then { it -> sec.title = 'Clinical summary' "title"; it -> sec.code as sc then { it -> sc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '11493-4' "cd"; it -> cg.display = 'Hospital discharge studies summary Narrative' "dsp"; } "coding"; } "code"; it -> bundle.entry as sentry, sentry.resource = create('Observation') as sobs then { qr -> sobs, sentry then BuildObsBase(qr, sobs, sentry) "base"; qr -> sobs then SetSurveyCategory(qr, sobs) "category"; it -> sobs.code as scc then { it -> scc.coding as scg then { it -> scg.system = 'http://loinc.org' "sys"; it -> scg.code = '11493-4' "cd"; it -> scg.display = 'Hospital discharge studies summary Narrative' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as txt -> sobs.note as n, n.text = txt "text"; }; it -> sec.entry = create('Reference') as sref, sref.reference = reference(sobs) "sectionEntry"; } "sectionObservation"; } "section_clinical_summary"; qr.item as it where ((linkId = 'management') and answer.value.exists()) -> comp.section as sec then { it -> sec.title = 'Management' "title"; it -> sec.code as sc then { it -> sc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '8648-8' "cd"; it -> cg.display = 'Hospital course note' "dsp"; } "coding"; } "code"; it -> bundle.entry as sentry, sentry.resource = create('Observation') as sobs then { qr -> sobs, sentry then BuildObsBase(qr, sobs, sentry) "base"; qr -> sobs then SetSurveyCategory(qr, sobs) "category"; it -> sobs.code as scc then { it -> scc.coding as scg then { it -> scg.system = 'http://loinc.org' "sys"; it -> scg.code = '8648-8' "cd"; it -> scg.display = 'Hospital course note' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as txt -> sobs.note as n, n.text = txt "text"; }; it -> sec.entry = create('Reference') as sref, sref.reference = reference(sobs) "sectionEntry"; } "sectionObservation"; } "section_management"; qr.item as it where ((linkId = 'discharge-instructions') and answer.value.exists()) -> comp.section as sec then { it -> sec.title = 'Discharge instructions' "title"; it -> sec.code as sc then { it -> sc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '8653-8' "cd"; it -> cg.display = 'Hospital Discharge instructions' "dsp"; } "coding"; } "code"; it -> bundle.entry as sentry, sentry.resource = create('Observation') as sobs then { qr -> sobs, sentry then BuildObsBase(qr, sobs, sentry) "base"; qr -> sobs then SetSurveyCategory(qr, sobs) "category"; it -> sobs.code as scc then { it -> scc.coding as scg then { it -> scg.system = 'http://loinc.org' "sys"; it -> scg.code = '8653-8' "cd"; it -> scg.display = 'Hospital Discharge instructions' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as txt -> sobs.note as n, n.text = txt "text"; }; it -> sec.entry = create('Reference') as sref, sref.reference = reference(sobs) "sectionEntry"; } "sectionObservation"; } "section_discharge_instructions"; } "dischargeComposition"; // ── Discharge diagnoses ───────────────────────────────────────────────── // A Condition per line, `category = encounter-diagnosis` because these are // the diagnoses for this stay. Where the clinician picked an existing // Condition off the problem list, its reference travels as evidence rather // than a duplicate being created -- reconciling the problem list is the point // of asking, and duplicating it defeats it. qr.item as dg where (linkId = 'diagnoses') then { dg.item as g where (linkId = 'diagnoses/diagnosis') then { g.item as it where ((linkId = 'diagnoses/diagnosis/text') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('Condition') as cond then { qr -> cond, entry then BuildConditionBase(qr, cond, entry) "base"; it -> cond.clinicalStatus as cs then { it -> cs.coding as cg then { it -> cg.system = 'http://terminology.hl7.org/CodeSystem/condition-clinical' "sys"; it -> cg.code = 'active' "cd"; it -> cg.display = 'Active' "dsp"; } "coding"; } "clinicalStatus"; it -> cond.verificationStatus as vs then { it -> vs.coding as cg then { it -> cg.system = 'http://terminology.hl7.org/CodeSystem/condition-ver-status' "sys"; it -> cg.code = 'confirmed' "cd"; it -> cg.display = 'Confirmed' "dsp"; } "coding"; } "verificationStatus"; it -> cond.category as cat then { it -> cat.coding as cg then { it -> cg.system = 'http://terminology.hl7.org/CodeSystem/condition-category' "sys"; it -> cg.code = 'encounter-diagnosis' "cd"; it -> cg.display = 'Encounter Diagnosis' "dsp"; } "coding"; } "category"; it.answer first as a then { a.value as txt -> cond.code as cc, cc.text = txt "codeText"; }; qr.authored as t -> cond.recordedDate = t "recordedDate"; qr.encounter as e -> cond.encounter = e; g.item as ex where ((linkId = 'diagnoses/diagnosis/condition') and answer.value.exists()) then { ex.answer first as ea then { ea.value as existing -> cond.evidence as ev, ev.reference = existing "evidenceReference"; }; } "existingRule"; } "dischargeCondition"; } "diagnosisRows"; } "diagnosesGroup"; // ── Discharge medication ──────────────────────────────────────────────── // A MedicationRequest per line. `status = 'active'` and `intent = 'order'`: // the patient walks out with these and the pharmacy dispenses against them. // Dose, frequency and route are three separate boxes on the sheet, and they // go into one Dosage: `di.text` for the human-readable instruction the // patient reads, `di.route` for the route, and the duration as // `dispenseRequest.expectedSupplyDuration`, which is what tells the pharmacy // how much to give out. qr.item as mg where (linkId = 'discharge-medication') then { mg.item as g where ((linkId = 'discharge-medication/medication') and item.where(linkId = 'discharge-medication/medication/name').answer.value.exists()) -> bundle.entry as entry, entry.resource = create('MedicationRequest') as mr then { qr -> mr, entry then BuildMedicationRequestBase(qr, mr, entry) "base"; g -> mr.status = 'active' "status"; g -> mr.intent = 'order' "intent"; qr.authored as t -> mr.authoredOn = t "authoredOn"; qr.encounter as e -> mr.encounter = e; qr.source as src -> mr.requester = src "requester"; g.item as it where (linkId = 'discharge-medication/medication/name') then { it.answer first as a then { a.value as txt -> mr.medication as med, med.concept as mc, mc.text = txt "medicationText"; }; } "nameRule"; g.item as it where ((linkId = 'discharge-medication/medication/dose') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> mr.dosageInstruction as di, di.text = txt "doseText"; }; } "doseRule"; g.item as it where ((linkId = 'discharge-medication/medication/frequency') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> mr.dosageInstruction as di, di.text = txt "frequencyText"; }; } "frequencyRule"; g.item as it where ((linkId = 'discharge-medication/medication/route') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> mr.dosageInstruction as di, di.route as rt, rt.text = txt "routeText"; }; } "routeRule"; g.item as it where ((linkId = 'discharge-medication/medication/instructions') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> mr.dosageInstruction as di, di.patientInstruction = txt "patientInstruction"; }; } "instructionsRule"; // Guarded on the answer actually being a Quantity, not merely present. // This is the one rule in the whole set that navigates *into* an answer // rather than assigning it across, so it is the one that a client sending // the wrong type can break -- and it broke: the questionnaire tester // renders a `quantity` item as a plain text box and submits // valueString "5", which made this rule fail with "Attempt to read // invalid property 'unit' on type string" and took the whole discharge // summary down with it. `$validate` on that response says plainly that // the client is wrong ("Answer value must be of the type Quantity not // string"), but one non-conformant optional field should cost that field // and not the other eight resources. g.item as it where ((linkId = 'discharge-medication/medication/duration') and answer.value.ofType(Quantity).exists()) then { it.answer first as a then { // expectedSupplyDuration is a Duration and the answer is a plain // Quantity. HAPI will not take one for the other, and `cast` refuses // the conversion too, so the Duration is built field by field. The // two datatypes have identical fields, which is why this works and // why it is tedious rather than difficult. a.value as v -> mr.dispenseRequest as dq, dq.expectedSupplyDuration = create('Duration') as dur then { v.value as dval -> dur.value = dval "durValue"; v.unit as dunit -> dur.unit = dunit "durUnit"; v.system as dsys -> dur.system = dsys "durSystem"; v.code as dcode -> dur.code = dcode "durCode"; } "supplyDuration"; }; } "durationRule"; // Where the clinician marked this as a continuation of an existing order, // the new request says so through priorPrescription rather than silently // becoming a second live order for the same drug. g.item as it where ((linkId = 'discharge-medication/medication/existing') and answer.value.exists()) then { it.answer first as a then { a.value as existing -> mr.priorPrescription = existing "priorPrescription"; }; } "existingRule"; } "dischargeMedication"; } "dischargeMedicationGroup"; // ── Follow-up ─────────────────────────────────────────────────────────── // A ServiceRequest, not an Appointment. The sheet gives a date but no clinic, // no clinician and no slot, and an Appointment built from a bare date claims // a booking that does not exist. qr.item as it where ((linkId = 'follow-up-on') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('ServiceRequest') as sr then { qr -> sr, entry then BuildServiceRequestBase(qr, sr, entry) "base"; it -> sr.status = 'active' "status"; it -> sr.intent = 'plan' "intent"; it -> sr.code as cr, cr.concept as cc then { it -> cc.coding as cg then { it -> cg.system = 'https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem' "sys"; it -> cg.code = 'discharge-follow-up' "cd"; it -> cg.display = 'Follow-up arranged on discharge' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as d -> sr.occurrence = cast(d, 'dateTime') "occurrence"; }; qr.authored as t -> sr.authoredOn = t "authoredOn"; qr.encounter as e -> sr.encounter = e; qr.source as src -> sr.requester = src "requester"; it -> sr.note as n, n.text = 'Follow-up date written on the discharge summary. Not a booked appointment: the sheet names no clinic or clinician.' "provenanceNote"; } "followUpRequest"; // ── Ward clearance ────────────────────────────────────────────────────── // An Observation, because "was the medication actually issued" is a fact // somebody attested to and a discharge audit filters on it. A patient sent // home without their drugs is a readmission waiting to happen, and that is // exactly what this box exists to catch. qr.item as g where (linkId = 'ward-clearance') then { g.item as it where ((linkId = 'ward-clearance/medication-issued') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('Observation') as obs then { qr -> obs, entry then BuildObsBase(qr, obs, entry) "base"; qr -> obs then SetSurveyCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem' "sys"; it -> cg.code = 'ward-clearance' "cd"; it -> cg.display = 'Ward clearance' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as vc then { cv -> vc.coding = cv "valueCoding"; cv.display as d -> vc.text = d "valueText"; } "codedValue"; }; it.answer first as a then { a.value as cv where (code = 'N') -> obs.interpretation as interp then { cv -> interp.coding as icg then { cv -> icg.system = 'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation' "sys"; cv -> icg.code = 'A' "cd"; cv -> icg.display = 'Abnormal' "dsp"; } "coding"; } "notIssuedInterp"; } "clearanceInterpretation"; g.item as cb where ((linkId = 'ward-clearance/cleared-at') and answer.value.exists()) then { cb.answer first as a then { a.value as t -> obs.effective = t "clearedAt"; }; } "clearedAtRule"; g.item as ib where ((linkId = 'ward-clearance/medication-issued-by') and answer.value.exists()) then { ib.answer first as a then { a.value as ref -> obs.performer = ref "issuedBy"; }; } "issuedByRule"; } "wardClearanceObservation"; } "wardClearanceGroup"; } // ───────────────────────────────────────────────────────────────────────────── // Shared scaffolding. Repeated in each map rather than imported: the transform // engine resolves `imports` against whatever StructureMaps happen to be on the // server, and a form that stops extracting because a shared map was not // uploaded is a worse failure than a duplicated group. // Two notes on what the publisher's StructureMap validator says about this file. // Source parameters below are left untyped on purpose. Writing `: Element` makes // the validator compare QuestionnaireResponse.item against the literal 'Element' // and report them as incompatible with each other, which is noise, not a finding. // `evaluate(context, expression)` is flagged as "takes 1 parameter but 2 were // found". Leave it. The FML parser in the same jar refuses the one-argument form // outright -- it wants a parameter, a comma, then the FHIRPath -- so the // publisher is objecting to what its own compiler emits. Two arguments is the // only form that compiles, and it is what the R5 transform engine executes. // ───────────────────────────────────────────────────────────────────────────── group BuildObsBase(source qr : QR, target obs : Observation, target entry) { qr -> obs then SetResponseProvenance(qr, obs) "responseProvenance"; qr -> obs.id = uuid() then SetObservationFullUrl(obs, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Observation' "requestUrl"; } "entryRequest"; qr -> obs.status = 'final' "status"; qr.subject as s -> obs.subject = s; qr.encounter as e -> obs.encounter = e; qr.authored as t -> obs.effective = t "effective"; qr.source as src -> obs.performer = src "performerFromSource"; qr where (source.exists().not()) then { qr.author as a -> obs.performer = a "performerFromAuthor"; } "performerFallback"; // A stored response's id already reads "QuestionnaireResponse/<id>", so it is // a relative reference as it stands. The hasValue() guard is what stops an // unsaved response -- one posted straight to $extract rather than saved first // -- from writing "QuestionnaireResponse/null" into the record. qr.id as qid where ($this.hasValue()) -> obs.derivedFrom = create('Reference') as ref, ref.reference = qid "linkQuestionnaireResponse"; } group SetObservationFullUrl(source obs : Observation, target entry) { obs.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Observation/', id) "assignFullUrl"; } // The two answer shapes a component can carry. Both read the answer through the // untyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its // typed property name fails at transform time on HAPI R5 with "Attempt to read // invalid property ... on QuestionnaireResponse.item.answer". group SetComponentCodedValue(source it, target comp) { it.answer first as a then { a.value as cv -> comp.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; } "componentAnswer"; } group SetComponentValue(source it, target comp) { it.answer first as a then { a.value as v -> comp.value = v "plainValue"; } "componentAnswer"; } group SetSurveyCategory(source qr : QR, target obs : Observation) { qr -> obs.category as cat then { qr -> cat.coding as coding then { qr -> coding.system = 'http://terminology.hl7.org/CodeSystem/observation-category' "categorySystem"; qr -> coding.code = 'survey' "categoryCode"; qr -> coding.display = 'Survey' "categoryDisplay"; } "categoryCoding"; } "category"; } group BuildCompositionBase(source qr : QR, target r : Composition, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetCompositionFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Composition' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetCompositionFullUrl(source r : Composition, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Composition/', id) "assignFullUrl"; } group BuildConditionBase(source qr : QR, target r : Condition, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetConditionFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Condition' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetConditionFullUrl(source r : Condition, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Condition/', id) "assignFullUrl"; } group BuildMedicationRequestBase(source qr : QR, target r : MedicationRequest, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetMedicationRequestFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'MedicationRequest' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetMedicationRequestFullUrl(source r : MedicationRequest, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/MedicationRequest/', id) "assignFullUrl"; } group BuildServiceRequestBase(source qr : QR, target r : ServiceRequest, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetServiceRequestFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'ServiceRequest' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetServiceRequestFullUrl(source r : ServiceRequest, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/ServiceRequest/', id) "assignFullUrl"; } // ── Provenance and tenancy ─────────────────────────────────────────────────── // Two tags on everything this map creates. The first says which questionnaire // produced it, so a form that reopens mid-admission recalls its own earlier // entries and not another form's. The second copies the tenant tags off the // response, because nothing else on the path puts them there. // The code is the form's document type, not the questionnaire's id: every // environment mints its own ids, and there is only one set of maps, so an id // here would tie the tag to whichever environment stamped it. // ── Provenance and tenancy ─────────────────────────────────────────────────── group SetResponseProvenance(source qr : QR, target r) { qr -> r.meta as m then { qr -> m.tag as t then { qr -> t.system = 'http://slade360edi.com/questionnaire-provenance' "provenanceSystem"; qr -> t.code = 'discharge-summary' "provenanceCode"; qr -> t.display = 'Discharge summary' "provenanceDisplay"; } "provenanceTag"; } "provenanceMeta"; // Every tag the response carries, onto the resource. `meta` is 0..1, so this // lands on the same meta the rule above created rather than a second one. qr.meta as qm then { qm.tag as qt -> r.meta as m, m.tag = qt "copyTag"; } "tenantTags"; }
{
"resourceType": "StructureMap",
"id": "ExtractDischargeSummary",
"text": {
"status": "generated",
"div": "<!-- snip (see above) -->"
},
"url": "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractDischargeSummary",
"version": "0.1.0",
"name": "ExtractDischargeSummary",
"title": "Discharge Summary Extraction",
"status": "active",
"date": "2026-09-11T12:18:36+00:00",
"publisher": "Kathurima Kimathi",
"contact": [
{
"name": "Kathurima Kimathi",
"telecom": [
{
"system": "url",
"value": "https://www.linkedin.com/in/kathurima-kimathi/"
},
{
"system": "email",
"value": "kathurimakimathi415@gmail.com"
}
]
},
{
"name": "Oscar John",
"telecom": [
{
"system": "email",
"value": "oscarjohnotieno@gmail.com",
"use": "work"
}
]
},
{
"name": "Kennedy Omondi",
"telecom": [
{
"system": "email",
"value": "kennankole@gmail.com",
"use": "work"
}
]
}
],
"description": "The discharge summary out as: a Composition coded to LOINC 18842-5, with the clinical summary, the management and the discharge instructions as its sections, because a discharge summary is a document and this is the resource for one; a Condition per discharge diagnosis, reconciled against the problem list where the clinician picked an existing one; a MedicationRequest per line of discharge medication, which is what the pharmacy dispenses against; a ServiceRequest for the follow-up; and an Observation for the ward clearance sign-off, because whether the medication was actually issued is an auditable fact and not a formality.",
"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/Composition",
"mode": "target",
"alias": "Composition"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Condition",
"mode": "target",
"alias": "Condition"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/MedicationRequest",
"mode": "target",
"alias": "MedicationRequest"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/ServiceRequest",
"mode": "target",
"alias": "ServiceRequest"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Observation",
"mode": "target",
"alias": "Observation"
}
],
"group": [
{
"name": "ExtractDischargeSummary",
"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": "dischargeComposition",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "comp",
"transform": "create",
"parameter": [
{
"valueString": "Composition"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "comp"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildCompositionBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "comp"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "comp",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "final"
}
]
}
]
},
{
"name": "title",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "comp",
"element": "title",
"transform": "copy",
"parameter": [
{
"valueString": "Discharge summary"
}
]
}
]
},
{
"name": "date",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "comp",
"element": "date",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "comp",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "author",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src"
}
],
"target": [
{
"context": "comp",
"element": "author",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
},
{
"name": "type",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "comp",
"element": "type",
"variable": "tp"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "tp",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "18842-5"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Discharge summary"
}
]
}
]
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "comp",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/CodeSystem/document-type-codesystem"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "discharge-summary"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Discharge summary"
}
]
}
]
}
]
}
]
},
{
"name": "section_clinical_summary",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'clinical-summary') and answer.value.exists()"
}
],
"target": [
{
"context": "comp",
"element": "section",
"variable": "sec"
}
],
"rule": [
{
"name": "title",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "title",
"transform": "copy",
"parameter": [
{
"valueString": "Clinical summary"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "code",
"variable": "sc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "11493-4"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hospital discharge studies summary Narrative"
}
]
}
]
}
]
}
]
},
{
"name": "sectionObservation",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "sentry"
},
{
"context": "sentry",
"element": "resource",
"variable": "sobs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sobs"
},
{
"context": "sentry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sobs"
},
{
"valueId": "sentry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sobs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sobs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sobs",
"element": "code",
"variable": "scc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scc",
"element": "coding",
"variable": "scg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "11493-4"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hospital discharge studies summary Narrative"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sobs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
},
{
"name": "sectionEntry",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "entry",
"variable": "sref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "sref",
"element": "reference",
"transform": "reference",
"parameter": [
{
"valueId": "sobs"
}
]
}
]
}
]
}
]
},
{
"name": "section_management",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'management') and answer.value.exists()"
}
],
"target": [
{
"context": "comp",
"element": "section",
"variable": "sec"
}
],
"rule": [
{
"name": "title",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "title",
"transform": "copy",
"parameter": [
{
"valueString": "Management"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "code",
"variable": "sc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "8648-8"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hospital course note"
}
]
}
]
}
]
}
]
},
{
"name": "sectionObservation",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "sentry"
},
{
"context": "sentry",
"element": "resource",
"variable": "sobs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sobs"
},
{
"context": "sentry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sobs"
},
{
"valueId": "sentry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sobs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sobs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sobs",
"element": "code",
"variable": "scc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scc",
"element": "coding",
"variable": "scg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "8648-8"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hospital course note"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sobs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
},
{
"name": "sectionEntry",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "entry",
"variable": "sref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "sref",
"element": "reference",
"transform": "reference",
"parameter": [
{
"valueId": "sobs"
}
]
}
]
}
]
}
]
},
{
"name": "section_discharge_instructions",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-instructions') and answer.value.exists()"
}
],
"target": [
{
"context": "comp",
"element": "section",
"variable": "sec"
}
],
"rule": [
{
"name": "title",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "title",
"transform": "copy",
"parameter": [
{
"valueString": "Discharge instructions"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "code",
"variable": "sc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "8653-8"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hospital Discharge instructions"
}
]
}
]
}
]
}
]
},
{
"name": "sectionObservation",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "sentry"
},
{
"context": "sentry",
"element": "resource",
"variable": "sobs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sobs"
},
{
"context": "sentry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sobs"
},
{
"valueId": "sentry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sobs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sobs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sobs",
"element": "code",
"variable": "scc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scc",
"element": "coding",
"variable": "scg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "8653-8"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "scg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hospital Discharge instructions"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sobs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
},
{
"name": "sectionEntry",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sec",
"element": "entry",
"variable": "sref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "sref",
"element": "reference",
"transform": "reference",
"parameter": [
{
"valueId": "sobs"
}
]
}
]
}
]
}
]
}
],
"documentation": "── The document itself ─────────────────────────────────────────────────\r\nA Composition, not a bundle of Observations carrying paragraphs. The\r\nnarrative sections of a discharge summary are a document: they are written\r\nonce, read as a whole, and given to the patient. Each section's text goes\r\ninto `section.text.div` as XHTML, which is where a Composition holds\r\nnarrative, with `section.title` naming it."
},
{
"name": "diagnosesGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "dg",
"condition": "linkId = 'diagnoses'"
}
],
"rule": [
{
"name": "diagnosisRows",
"source": [
{
"context": "dg",
"element": "item",
"variable": "g",
"condition": "linkId = 'diagnoses/diagnosis'"
}
],
"rule": [
{
"name": "dischargeCondition",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'diagnoses/diagnosis/text') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "cond",
"transform": "create",
"parameter": [
{
"valueString": "Condition"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cond"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildConditionBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "cond"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "clinicalStatus",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cond",
"element": "clinicalStatus",
"variable": "cs"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cs",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/condition-clinical"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Active"
}
]
}
]
}
]
}
]
},
{
"name": "verificationStatus",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cond",
"element": "verificationStatus",
"variable": "vs"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "vs",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "confirmed"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Confirmed"
}
]
}
]
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cond",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/condition-category"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "encounter-diagnosis"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Encounter Diagnosis"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codeText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "cond",
"element": "code",
"variable": "cc"
},
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
},
{
"name": "recordedDate",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "cond",
"element": "recordedDate",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "cond",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "existingRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "ex",
"condition": "(linkId = 'diagnoses/diagnosis/condition') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "ex",
"element": "answer",
"listMode": "first",
"variable": "ea"
}
],
"rule": [
{
"name": "evidenceReference",
"source": [
{
"context": "ea",
"element": "value",
"variable": "existing"
}
],
"target": [
{
"context": "cond",
"element": "evidence",
"variable": "ev"
},
{
"context": "ev",
"element": "reference",
"transform": "copy",
"parameter": [
{
"valueId": "existing"
}
]
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── Discharge diagnoses ─────────────────────────────────────────────────\r\nA Condition per line, `category = encounter-diagnosis` because these are\r\nthe diagnoses for this stay. Where the clinician picked an existing\r\nCondition off the problem list, its reference travels as evidence rather\r\nthan a duplicate being created -- reconciling the problem list is the point\r\nof asking, and duplicating it defeats it."
},
{
"name": "dischargeMedicationGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "mg",
"condition": "linkId = 'discharge-medication'"
}
],
"rule": [
{
"name": "dischargeMedication",
"source": [
{
"context": "mg",
"element": "item",
"variable": "g",
"condition": "(linkId = 'discharge-medication/medication') and item.where(linkId = 'discharge-medication/medication/name').answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "mr",
"transform": "create",
"parameter": [
{
"valueString": "MedicationRequest"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "mr"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildMedicationRequestBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "mr"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "g"
}
],
"target": [
{
"context": "mr",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "intent",
"source": [
{
"context": "g"
}
],
"target": [
{
"context": "mr",
"element": "intent",
"transform": "copy",
"parameter": [
{
"valueString": "order"
}
]
}
]
},
{
"name": "authoredOn",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "mr",
"element": "authoredOn",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "mr",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "requester",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src"
}
],
"target": [
{
"context": "mr",
"element": "requester",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
},
{
"name": "nameRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "linkId = 'discharge-medication/medication/name'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "medicationText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "mr",
"element": "medication",
"variable": "med"
},
{
"context": "med",
"element": "concept",
"variable": "mc"
},
{
"context": "mc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "doseRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-medication/medication/dose') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "doseText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "mr",
"element": "dosageInstruction",
"variable": "di"
},
{
"context": "di",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "frequencyRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-medication/medication/frequency') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "frequencyText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "mr",
"element": "dosageInstruction",
"variable": "di"
},
{
"context": "di",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "routeRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-medication/medication/route') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "routeText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "mr",
"element": "dosageInstruction",
"variable": "di"
},
{
"context": "di",
"element": "route",
"variable": "rt"
},
{
"context": "rt",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "instructionsRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-medication/medication/instructions') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "patientInstruction",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "mr",
"element": "dosageInstruction",
"variable": "di"
},
{
"context": "di",
"element": "patientInstruction",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "durationRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-medication/medication/duration') and answer.value.ofType(Quantity).exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "supplyDuration",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "mr",
"element": "dispenseRequest",
"variable": "dq"
},
{
"context": "dq",
"element": "expectedSupplyDuration",
"variable": "dur",
"transform": "create",
"parameter": [
{
"valueString": "Duration"
}
]
}
],
"rule": [
{
"name": "durValue",
"source": [
{
"context": "v",
"element": "value",
"variable": "dval"
}
],
"target": [
{
"context": "dur",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "dval"
}
]
}
]
},
{
"name": "durUnit",
"source": [
{
"context": "v",
"element": "unit",
"variable": "dunit"
}
],
"target": [
{
"context": "dur",
"element": "unit",
"transform": "copy",
"parameter": [
{
"valueId": "dunit"
}
]
}
]
},
{
"name": "durSystem",
"source": [
{
"context": "v",
"element": "system",
"variable": "dsys"
}
],
"target": [
{
"context": "dur",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueId": "dsys"
}
]
}
]
},
{
"name": "durCode",
"source": [
{
"context": "v",
"element": "code",
"variable": "dcode"
}
],
"target": [
{
"context": "dur",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueId": "dcode"
}
]
}
]
}
],
"documentation": "expectedSupplyDuration is a Duration and the answer is a plain\r\nQuantity. HAPI will not take one for the other, and `cast` refuses\r\nthe conversion too, so the Duration is built field by field. The\r\ntwo datatypes have identical fields, which is why this works and\r\nwhy it is tedious rather than difficult."
}
]
}
],
"documentation": "Guarded on the answer actually being a Quantity, not merely present.\r\nThis is the one rule in the whole set that navigates *into* an answer\r\nrather than assigning it across, so it is the one that a client sending\r\nthe wrong type can break -- and it broke: the questionnaire tester\r\nrenders a `quantity` item as a plain text box and submits\r\nvalueString \"5\", which made this rule fail with \"Attempt to read\r\ninvalid property 'unit' on type string\" and took the whole discharge\r\nsummary down with it. `$validate` on that response says plainly that\r\nthe client is wrong (\"Answer value must be of the type Quantity not\r\nstring\"), but one non-conformant optional field should cost that field\r\nand not the other eight resources."
},
{
"name": "existingRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'discharge-medication/medication/existing') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "priorPrescription",
"source": [
{
"context": "a",
"element": "value",
"variable": "existing"
}
],
"target": [
{
"context": "mr",
"element": "priorPrescription",
"transform": "copy",
"parameter": [
{
"valueId": "existing"
}
]
}
]
}
]
}
],
"documentation": "Where the clinician marked this as a continuation of an existing order,\r\nthe new request says so through priorPrescription rather than silently\r\nbecoming a second live order for the same drug."
}
]
}
],
"documentation": "── Discharge medication ────────────────────────────────────────────────\r\nA MedicationRequest per line. `status = 'active'` and `intent = 'order'`:\r\nthe patient walks out with these and the pharmacy dispenses against them.\r\nDose, frequency and route are three separate boxes on the sheet, and they\r\ngo into one Dosage: `di.text` for the human-readable instruction the\r\npatient reads, `di.route` for the route, and the duration as\r\n`dispenseRequest.expectedSupplyDuration`, which is what tells the pharmacy\r\nhow much to give out."
},
{
"name": "followUpRequest",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'follow-up-on') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "sr",
"transform": "create",
"parameter": [
{
"valueString": "ServiceRequest"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sr"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildServiceRequestBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sr"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "intent",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "intent",
"transform": "copy",
"parameter": [
{
"valueString": "plan"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "code",
"variable": "cr"
},
{
"context": "cr",
"element": "concept",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-clinical-concept-codesystem"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "discharge-follow-up"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Follow-up arranged on discharge"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "occurrence",
"source": [
{
"context": "a",
"element": "value",
"variable": "d"
}
],
"target": [
{
"context": "sr",
"element": "occurrence",
"transform": "cast",
"parameter": [
{
"valueId": "d"
},
{
"valueString": "dateTime"
}
]
}
]
}
]
},
{
"name": "authoredOn",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "sr",
"element": "authoredOn",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "sr",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "requester",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src"
}
],
"target": [
{
"context": "sr",
"element": "requester",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
},
{
"name": "provenanceNote",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueString": "Follow-up date written on the discharge summary. Not a booked appointment: the sheet names no clinic or clinician."
}
]
}
]
}
],
"documentation": "── Follow-up ───────────────────────────────────────────────────────────\r\nA ServiceRequest, not an Appointment. The sheet gives a date but no clinic,\r\nno clinician and no slot, and an Appointment built from a bare date claims\r\na booking that does not exist."
},
{
"name": "wardClearanceGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'ward-clearance'"
}
],
"rule": [
{
"name": "wardClearanceObservation",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'ward-clearance/medication-issued') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "obs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "obs",
"element": "code",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "ward-clearance"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Ward clearance"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codedValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "obs",
"element": "value",
"variable": "vc",
"transform": "create",
"parameter": [
{
"valueString": "CodeableConcept"
}
]
}
],
"rule": [
{
"name": "valueCoding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "vc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "valueText",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "vc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
},
{
"name": "clearanceInterpretation",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "notIssuedInterp",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'N'"
}
],
"target": [
{
"context": "obs",
"element": "interpretation",
"variable": "interp"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "interp",
"element": "coding",
"variable": "icg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "icg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "icg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "A"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "icg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Abnormal"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "clearedAtRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "cb",
"condition": "(linkId = 'ward-clearance/cleared-at') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "cb",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "clearedAt",
"source": [
{
"context": "a",
"element": "value",
"variable": "t"
}
],
"target": [
{
"context": "obs",
"element": "effective",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
}
]
}
]
},
{
"name": "issuedByRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "ib",
"condition": "(linkId = 'ward-clearance/medication-issued-by') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "ib",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "issuedBy",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── Ward clearance ──────────────────────────────────────────────────────\r\nAn Observation, because \"was the medication actually issued\" is a fact\r\nsomebody attested to and a discharge audit filters on it. A patient sent\r\nhome without their drugs is a readmission waiting to happen, and that is\r\nexactly what this box exists to catch."
}
]
},
{
"name": "BuildObsBase",
"documentation": "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each map rather than imported: the transform\r\nengine resolves `imports` against whatever StructureMaps happen to be on the\r\nserver, and a form that stops extracting because a shared map was not\r\nuploaded is a worse failure than a duplicated group.\r\nTwo notes on what the publisher's StructureMap validator says about this file.\r\nSource parameters below are left untyped on purpose. Writing `: Element` makes\r\nthe validator compare QuestionnaireResponse.item against the literal 'Element'\r\nand report them as incompatible with each other, which is noise, not a finding.\r\n`evaluate(context, expression)` is flagged as \"takes 1 parameter but 2 were\r\nfound\". Leave it. The FML parser in the same jar refuses the one-argument form\r\noutright -- it wants a parameter, a comma, then the FHIRPath -- so the\r\npublisher is objecting to what its own compiler emits. Two arguments is the\r\nonly form that compiles, and it is what the R5 transform engine executes.\r\n─────────────────────────────────────────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetObservationFullUrl",
"parameter": [
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "Observation"
}
]
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "final"
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "obs",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "obs",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "effective",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "obs",
"element": "effective",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "performerFromSource",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
},
{
"name": "performerFallback",
"source": [
{
"context": "qr",
"condition": "source.exists().not()"
}
],
"rule": [
{
"name": "performerFromAuthor",
"source": [
{
"context": "qr",
"element": "author",
"variable": "a"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "a"
}
]
}
]
}
]
},
{
"name": "linkQuestionnaireResponse",
"source": [
{
"context": "qr",
"element": "id",
"variable": "qid",
"condition": "$this.hasValue()"
}
],
"target": [
{
"context": "obs",
"element": "derivedFrom",
"variable": "ref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "ref",
"element": "reference",
"transform": "copy",
"parameter": [
{
"valueId": "qid"
}
]
}
],
"documentation": "A stored response's id already reads \"QuestionnaireResponse/<id>\", so it is\r\na relative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first\r\n-- from writing \"QuestionnaireResponse/null\" into the record."
}
]
},
{
"name": "SetObservationFullUrl",
"input": [
{
"name": "obs",
"type": "Observation",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "obs",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/Observation/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "SetComponentCodedValue",
"documentation": "The two answer shapes a component can carry. Both read the answer through the\r\nuntyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its\r\ntyped property name fails at transform time on HAPI R5 with \"Attempt to read\r\ninvalid property ... on QuestionnaireResponse.item.answer\".",
"input": [
{
"name": "it",
"mode": "source"
},
{
"name": "comp",
"mode": "target"
}
],
"rule": [
{
"name": "componentAnswer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codedValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "comp",
"element": "value",
"variable": "cc",
"transform": "create",
"parameter": [
{
"valueString": "CodeableConcept"
}
]
}
],
"rule": [
{
"name": "valueCoding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "valueText",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "SetComponentValue",
"input": [
{
"name": "it",
"mode": "source"
},
{
"name": "comp",
"mode": "target"
}
],
"rule": [
{
"name": "componentAnswer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "plainValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "comp",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
}
]
},
{
"name": "SetSurveyCategory",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
}
],
"rule": [
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "categoryCoding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "coding"
}
],
"rule": [
{
"name": "categorySystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name": "categoryCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "survey"
}
]
}
]
},
{
"name": "categoryDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Survey"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "BuildCompositionBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "Composition",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetCompositionFullUrl",
"parameter": [
{
"valueId": "r"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "Composition"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetCompositionFullUrl",
"input": [
{
"name": "r",
"type": "Composition",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "r",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/Composition/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "BuildConditionBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "Condition",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetConditionFullUrl",
"parameter": [
{
"valueId": "r"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "Condition"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetConditionFullUrl",
"input": [
{
"name": "r",
"type": "Condition",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "r",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/Condition/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "BuildMedicationRequestBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "MedicationRequest",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetMedicationRequestFullUrl",
"parameter": [
{
"valueId": "r"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "MedicationRequest"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetMedicationRequestFullUrl",
"input": [
{
"name": "r",
"type": "MedicationRequest",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "r",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/MedicationRequest/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "BuildServiceRequestBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "ServiceRequest",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetServiceRequestFullUrl",
"parameter": [
{
"valueId": "r"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "ServiceRequest"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetServiceRequestFullUrl",
"input": [
{
"name": "r",
"type": "ServiceRequest",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "r",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/ServiceRequest/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "SetResponseProvenance",
"documentation": "── Provenance and tenancy ───────────────────────────────────────────────────\r\nTwo tags on everything this map creates. The first says which questionnaire\r\nproduced it, so a form that reopens mid-admission recalls its own earlier\r\nentries and not another form's. The second copies the tenant tags off the\r\nresponse, because nothing else on the path puts them there.\r\nThe code is the form's document type, not the questionnaire's id: every\r\nenvironment mints its own ids, and there is only one set of maps, so an id\r\nhere would tie the tag to whichever environment stamped it.\r\n── Provenance and tenancy ───────────────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"mode": "target"
}
],
"rule": [
{
"name": "provenanceMeta",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "meta",
"variable": "m"
}
],
"rule": [
{
"name": "provenanceTag",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "m",
"element": "tag",
"variable": "t"
}
],
"rule": [
{
"name": "provenanceSystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://slade360edi.com/questionnaire-provenance"
}
]
}
]
},
{
"name": "provenanceCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "discharge-summary"
}
]
}
]
},
{
"name": "provenanceDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Discharge summary"
}
]
}
]
}
]
}
]
},
{
"name": "tenantTags",
"source": [
{
"context": "qr",
"element": "meta",
"variable": "qm"
}
],
"rule": [
{
"name": "copyTag",
"source": [
{
"context": "qm",
"element": "tag",
"variable": "qt"
}
],
"target": [
{
"context": "r",
"element": "meta",
"variable": "m"
},
{
"context": "m",
"element": "tag",
"transform": "copy",
"parameter": [
{
"valueId": "qt"
}
]
}
]
}
],
"documentation": "Every tag the response carries, onto the resource. `meta` is 0..1, so this\r\nlands on the same meta the rule above created rather than a second one."
}
]
}
]
}