FHIR IG analytics| Package | silfhirprofileig |
| Resource Type | StructureMap |
| Id | StructureMap-ExtractBloodRequisition.json |
| FHIR Version | R5 |
| Source | https://build.fhir.org/ig/savannahghi/sil_fhir_profile_ig/StructureMap-ExtractBloodRequisition.html |
| URL | https://fhir.slade360.co.ke/fhir/StructureMap/ExtractBloodRequisition |
| Version | 0.1.0 |
| Status | active |
| Date | 2026-09-11T12:18:36+00:00 |
| Name | ExtractBloodRequisition |
| Title | Blood Requisition Extraction |
| Description | The requisition is the whole transfusion chain on one sheet, and it extracts as the chain: a ServiceRequest per product asked for, coded SNOMED 116859006 and carrying its own quantity and urgency, so two units of packed cells and one of platelets are two orders and not one; a Consent recording that the patient agreed; Observations for the recipient's ABO and Rh under LOINC 883-9 and 10331-7 and for each issued unit's group under the blood-product-unit codes 14578-9 and 14907-0, with the bag number as the specimen identity; the cross-match result per unit, interpreted abnormal when incompatible; and any transfusion reaction as an Observation coded SNOMED 82545002 and flagged abnormal. The two abnormal flags are the point: an incompatible cross-match and a reaction are the two findings on this form that have to be impossible to miss. |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
Generated Narrative: StructureMap ExtractBloodRequisition
/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractBloodRequisition' /// name = 'ExtractBloodRequisition' /// title = 'Blood Requisition Extraction' /// status = 'active' /// description = 'The requisition is the whole transfusion chain on one sheet, and it extracts as the chain: a ServiceRequest per product asked for, coded SNOMED 116859006 and carrying its own quantity and urgency, so two units of packed cells and one of platelets are two orders and not one; a Consent recording that the patient agreed; Observations for the recipient\'s ABO and Rh under LOINC 883-9 and 10331-7 and for each issued unit\'s group under the blood-product-unit codes 14578-9 and 14907-0, with the bag number as the specimen identity; the cross-match result per unit, interpreted abnormal when incompatible; and any transfusion reaction as an Observation coded SNOMED 82545002 and flagged abnormal. The two abnormal flags are the point: an incompatible cross-match and a reaction are the two findings on this form that have to be impossible to miss.' 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/Observation" alias Observation as target uses "http://hl7.org/fhir/StructureDefinition/ServiceRequest" alias ServiceRequest as target uses "http://hl7.org/fhir/StructureDefinition/Consent" alias Consent as target group ExtractBloodRequisition(source qr : QR, target bundle : Bundle) { qr -> bundle.type = 'transaction' "setBundleType"; // ── One order per product ─────────────────────────────────────────────── // Per product row and not one order for the sheet. The units, the urgency // and the date required differ by product, and a single order could only // carry one set of them. qr.item as p where ((linkId = 'product') and item.where(linkId = 'product/type').answer.value.exists()) -> bundle.entry as entry, entry.resource = create('ServiceRequest') as sr then { qr -> sr, entry then BuildServiceRequestBase(qr, sr, entry) "base"; p -> sr.status = 'active' "status"; p -> sr.intent = 'order' "intent"; qr.encounter as e -> sr.encounter = e; qr.authored as t -> sr.authoredOn = t "authoredOn"; p -> sr.category as cat then { p -> cat.coding as cg then { p -> cg.system = 'http://snomed.info/sct' "sys"; p -> cg.code = '116859006' "cd"; p -> cg.display = 'Transfusion of blood product' "dsp"; } "coding"; } "category"; // The product's own coding travels, so a request for fresh frozen plasma // is coded as that and not as "blood". p.item as it where (linkId = 'product/type') then { it.answer first as a then { a.value as cv -> sr.code as cr, cr.concept as cc then { cv -> cc.coding = cv "coding"; cv.display as d -> cc.text = d "text"; } "codeFromAnswer"; }; } "productTypeRule"; // Units as the order quantity. A SimpleQuantity, and the unit is 'unit' // in the sense the blood bank means -- one bag -- not a UCUM measure. p.item as it where ((linkId = 'product/units') and answer.value.exists()) then { it.answer first as a then { a.value as v -> sr.quantity = create('Quantity') as q then { v -> q.value = v "qValue"; v -> q.unit = 'unit of blood product' "qUnit"; } "quantity"; }; } "unitsRule"; p.item as it where ((linkId = 'product/date-required') and answer.value.exists()) then { it.answer first as a then { a.value as v -> sr.occurrence = cast(v, 'dateTime') "occurrence"; }; } "dateRequiredRule"; qr -> sr then SetBloodRequestCommon(qr, sr) "common"; } "productRequest"; // ── Consent to transfusion ────────────────────────────────────────────── // decision follows the answer: 'permit' when the patient agreed, 'deny' // when they did not. A refused transfusion recorded as an absent consent // would be indistinguishable from one nobody asked about. qr.item as g where (linkId = 'consent') then { g.item as it where ((linkId = 'consent/given') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('Consent') as con then { qr -> con, entry then BuildConsentBase(qr, con, entry) "base"; it -> con.status = 'active' "status"; it -> con.category as cat then { it -> cat.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '64293-4' "cd"; it -> cg.display = 'Procedure consent Document' "dsp"; } "coding"; } "category"; qr.authored as t -> con.period as per, per.start = t "periodStart"; it.answer first as a then { a.value as cv where (code = 'Y') -> con.decision = 'permit' "permit"; } "permitRule"; it.answer first as a then { a.value as cv where (code = 'N') -> con.decision = 'deny' "deny"; } "denyRule"; it -> con.provision as prov then { it -> prov.code as pc then { it -> pc.coding as cg then { it -> cg.system = 'http://snomed.info/sct' "sys"; it -> cg.code = '116859006' "cd"; it -> cg.display = 'Transfusion of blood product' "dsp"; } "coding"; it -> pc.text = 'Transfusion of the blood products requested on this form' "provText"; } "provCode"; } "provision"; } "transfusionConsent"; } "consentGroup"; qr.item as it where ((linkId = 'reason-for-transfusion') 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 = 'transfusion-indication-for-transfusion' "cd"; it -> cg.display = 'Indication for transfusion' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "narr_transfusion_indication_for_transfusion"; // ── The recipient's group ─────────────────────────────────────────────── qr.item as g where (linkId = 'recipient-group') then { g.item as it where ((linkId = 'recipient-group/abo') 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 SetLaboratoryCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '883-9' "cd"; it -> cg.display = 'ABO group [Type] in Blood' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; }; } "coded_883_9"; g.item as it where ((linkId = 'recipient-group/rhesus') 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 SetLaboratoryCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '10331-7' "cd"; it -> cg.display = 'Rh [Type] in Blood' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; }; } "coded_10331_7"; } "recipientGroupGroup"; // ── Each issued unit ──────────────────────────────────────────────────── // Per bag. The bag number is the identity a look-back investigation starts // from, so it rides on every Observation about that unit rather than only on // the row -- an Observation that says "incompatible" and cannot say which bag // is not usable evidence. qr.item as u where ((linkId = 'issued-unit') and item.where(linkId = 'issued-unit/bag-number').answer.value.exists()) then { u.item as it where ((linkId = 'issued-unit/donor-abo') 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 SetLaboratoryCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '14578-9' "cd"; it -> cg.display = 'ABO group [Type] in Blood from Blood product unit' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; }; u -> obs then SetUnitIdentity(u, obs) "bagIdentity"; } "unit_donor_abo"; u.item as it where ((linkId = 'issued-unit/donor-rhesus') 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 SetLaboratoryCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '14907-0' "cd"; it -> cg.display = 'Rh [Type] in Blood from Blood product unit' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; }; u -> obs then SetUnitIdentity(u, obs) "bagIdentity"; } "unit_donor_rhesus"; // ── The cross-match result ──────────────────────────────────────────── // Interpreted, not just recorded. An incompatible cross-match is the one // result on this sheet that must stop a transfusion, and leaving a reader // to notice the word is not good enough. u.item as it where ((linkId = 'issued-unit/cross-match-result') 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 SetLaboratoryCategory(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 = 'transfusion-cross-match-result' "cd"; it -> cg.display = 'Cross-match result' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as cv -> obs.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; }; it.answer first as a then { a.value as cv where (code = 'xmatch-incompatible') -> 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"; } "incompatibleInterp"; } "interpretationRule"; u -> obs then SetUnitIdentity(u, obs) "bagIdentity"; u.item as cb where ((linkId = 'issued-unit/collected-by') and answer.value.exists()) then { cb.answer first as a then { a.value as ref -> obs.performer = ref "collectedBy"; }; } "collectedByRule"; qr.item as lab where (linkId = 'laboratory') then { lab.item as xb where ((linkId = 'laboratory/cross-match-done-by') and answer.value.exists()) then { xb.answer first as a then { a.value as ref -> obs.performer = ref "crossMatchedBy"; }; } "doneByRule"; lab.item as xa where ((linkId = 'laboratory/cross-match-done-at') and answer.value.exists()) then { xa.answer first as a then { a.value as v -> obs.effective = v "crossMatchedAt"; }; } "doneAtRule"; } "labGroup"; } "crossMatchObservation"; } "issuedUnitGroup"; // ── A transfusion reaction ────────────────────────────────────────────── // Flagged abnormal whenever one was observed. This is a haemovigilance // record: it has to be findable by anyone querying reactions across the // hospital, not only by whoever opens this form. qr.item as g where (linkId = 'reaction') then { g.item as it where ((linkId = 'reaction/observed') 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 SetExamCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'http://snomed.info/sct' "sys"; it -> cg.code = '82545002' "cd"; it -> cg.display = 'Blood transfusion reaction' "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 = 'Y') -> 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"; } "reactionInterp"; } "interpretationRule"; g.item as oa where ((linkId = 'reaction/observed-at') and answer.value.exists()) then { oa.answer first as a then { a.value as v -> obs.effective = v "observedAt"; }; } "observedAtRule"; g.item as ob where ((linkId = 'reaction/observed-by') and answer.value.exists()) then { ob.answer first as a then { a.value as ref -> obs.performer = ref "observedBy"; }; } "observedByRule"; g.item as it where (linkId = 'reaction/description') then { it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "note"; } "reactionObservation"; } "reactionGroup"; } // The bag number, and how long the unit is good for, as identifiers and a note // on every Observation about that unit. Factored out because it is identical // for the ABO, the Rh and the cross-match, and a look-back investigation that // finds two of the three tagged is a look-back that failed. group SetUnitIdentity(source u, target obs : Observation) { u.item as it where ((linkId = 'issued-unit/bag-number') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> obs.identifier as ident then { txt -> ident.system = 'https://fhir.slade360.co.ke/fhir/identifier/blood-bag-number' "identSystem"; txt -> ident.value = txt "identValue"; } "bagIdentifier"; a.value as txt -> obs.specimen = create('Reference') as sref, sref.display = txt "specimenDisplay"; }; } "bagNumberRule"; u.item as it where ((linkId = 'issued-unit/expiry-date') and answer.value.exists()) then { it.answer first as a then { a.value as v -> obs.note as n, n.text = 'Unit expiry date recorded on the requisition' "expiryNote"; }; } "expiryRule"; } // Everything every product order on the sheet shares: who asked, from where, // how urgently, and when the blood is reserved until. group SetBloodRequestCommon(source qr : QR, target sr : ServiceRequest) { qr.item as g where (linkId = 'request') then { g.item as it where ((linkId = 'request/requester') and answer.value.exists()) then { it.answer first as a then { a.value as ref -> sr.requester = ref "requester"; }; } "requesterRule"; // Priority is a code, not a Coding. The form's urgency codes are local -- // desperate, urgent, elective, as printed -- so they are mapped onto the // three request-priority codes rather than passed through. g.item as it where ((linkId = 'request/urgency') and answer.value.exists()) then { it.answer first as a then { a.value as cv where (code = 'urgency-desperate') -> sr.priority = 'stat' "stat"; } "desperateRule"; it.answer first as a then { a.value as cv where (code = 'urgency-urgent') -> sr.priority = 'urgent' "urgent"; } "urgentRule"; it.answer first as a then { a.value as cv where (code = 'urgency-elective') -> sr.priority = 'routine' "routine"; } "electiveRule"; } "urgencyRule"; g.item as it where ((linkId = 'request/department') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> sr.note as n, n.text = txt "departmentNote"; }; } "departmentRule"; g.item as it where ((linkId = 'request/room-number') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> sr.note as n, n.text = txt "roomNote"; }; } "roomRule"; g.item as it where ((linkId = 'request/bed-number') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> sr.note as n, n.text = txt "bedNote"; }; } "bedRule"; } "requestGroup"; qr.item as lab where (linkId = 'laboratory') then { lab.item as it where ((linkId = 'laboratory/lab-registration-number') and answer.value.exists()) then { it.answer first as a then { a.value as txt -> sr.identifier as ident then { txt -> ident.system = 'https://fhir.slade360.co.ke/fhir/identifier/blood-bank-registration' "identSystem"; txt -> ident.value = txt "identValue"; } "labIdentifier"; }; } "labRegRule"; } "labGroup"; } // ───────────────────────────────────────────────────────────────────────────── // 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 SetLaboratoryCategory(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 = 'laboratory' "categoryCode"; qr -> coding.display = 'Laboratory' "categoryDisplay"; } "categoryCoding"; } "category"; } group SetExamCategory(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 = 'exam' "categoryCode"; qr -> coding.display = 'Exam' "categoryDisplay"; } "categoryCoding"; } "category"; } 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"; } group BuildConsentBase(source qr : QR, target r : Consent, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetConsentFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Consent' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetConsentFullUrl(source r : Consent, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Consent/', 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 = 'blood-requisition' "provenanceCode"; qr -> t.display = 'Blood requisition form' "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": "ExtractBloodRequisition",
"text": {
"status": "generated",
"div": "<!-- snip (see above) -->"
},
"url": "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractBloodRequisition",
"version": "0.1.0",
"name": "ExtractBloodRequisition",
"title": "Blood Requisition 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 requisition is the whole transfusion chain on one sheet, and it extracts as the chain: a ServiceRequest per product asked for, coded SNOMED 116859006 and carrying its own quantity and urgency, so two units of packed cells and one of platelets are two orders and not one; a Consent recording that the patient agreed; Observations for the recipient's ABO and Rh under LOINC 883-9 and 10331-7 and for each issued unit's group under the blood-product-unit codes 14578-9 and 14907-0, with the bag number as the specimen identity; the cross-match result per unit, interpreted abnormal when incompatible; and any transfusion reaction as an Observation coded SNOMED 82545002 and flagged abnormal. The two abnormal flags are the point: an incompatible cross-match and a reaction are the two findings on this form that have to be impossible to miss.",
"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/Observation",
"mode": "target",
"alias": "Observation"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/ServiceRequest",
"mode": "target",
"alias": "ServiceRequest"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Consent",
"mode": "target",
"alias": "Consent"
}
],
"group": [
{
"name": "ExtractBloodRequisition",
"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": "productRequest",
"source": [
{
"context": "qr",
"element": "item",
"variable": "p",
"condition": "(linkId = 'product') and item.where(linkId = 'product/type').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": "p"
}
],
"target": [
{
"context": "sr",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "intent",
"source": [
{
"context": "p"
}
],
"target": [
{
"context": "sr",
"element": "intent",
"transform": "copy",
"parameter": [
{
"valueString": "order"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "sr",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "authoredOn",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "sr",
"element": "authoredOn",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "p"
}
],
"target": [
{
"context": "sr",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "p"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "p"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://snomed.info/sct"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "p"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "116859006"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "p"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Transfusion of blood product"
}
]
}
]
}
]
}
]
},
{
"name": "productTypeRule",
"source": [
{
"context": "p",
"element": "item",
"variable": "it",
"condition": "linkId = 'product/type'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codeFromAnswer",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "sr",
"element": "code",
"variable": "cr"
},
{
"context": "cr",
"element": "concept",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "text",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
}
],
"documentation": "The product's own coding travels, so a request for fresh frozen plasma\r\nis coded as that and not as \"blood\"."
},
{
"name": "unitsRule",
"source": [
{
"context": "p",
"element": "item",
"variable": "it",
"condition": "(linkId = 'product/units') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "quantity",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "sr",
"element": "quantity",
"variable": "q",
"transform": "create",
"parameter": [
{
"valueString": "Quantity"
}
]
}
],
"rule": [
{
"name": "qValue",
"source": [
{
"context": "v"
}
],
"target": [
{
"context": "q",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
},
{
"name": "qUnit",
"source": [
{
"context": "v"
}
],
"target": [
{
"context": "q",
"element": "unit",
"transform": "copy",
"parameter": [
{
"valueString": "unit of blood product"
}
]
}
]
}
]
}
]
}
],
"documentation": "Units as the order quantity. A SimpleQuantity, and the unit is 'unit'\r\nin the sense the blood bank means -- one bag -- not a UCUM measure."
},
{
"name": "dateRequiredRule",
"source": [
{
"context": "p",
"element": "item",
"variable": "it",
"condition": "(linkId = 'product/date-required') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "occurrence",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "sr",
"element": "occurrence",
"transform": "cast",
"parameter": [
{
"valueId": "v"
},
{
"valueString": "dateTime"
}
]
}
]
}
]
}
]
},
{
"name": "common",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sr"
}
],
"dependent": [
{
"name": "SetBloodRequestCommon",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sr"
}
]
}
]
}
],
"documentation": "── One order per product ───────────────────────────────────────────────\r\nPer product row and not one order for the sheet. The units, the urgency\r\nand the date required differ by product, and a single order could only\r\ncarry one set of them."
},
{
"name": "consentGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'consent'"
}
],
"rule": [
{
"name": "transfusionConsent",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'consent/given') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "con",
"transform": "create",
"parameter": [
{
"valueString": "Consent"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "con"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildConsentBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "con"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "con",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "con",
"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://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "64293-4"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Procedure consent Document"
}
]
}
]
}
]
}
]
},
{
"name": "periodStart",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "con",
"element": "period",
"variable": "per"
},
{
"context": "per",
"element": "start",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "permitRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "permit",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'Y'"
}
],
"target": [
{
"context": "con",
"element": "decision",
"transform": "copy",
"parameter": [
{
"valueString": "permit"
}
]
}
]
}
]
},
{
"name": "denyRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "deny",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'N'"
}
],
"target": [
{
"context": "con",
"element": "decision",
"transform": "copy",
"parameter": [
{
"valueString": "deny"
}
]
}
]
}
]
},
{
"name": "provision",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "con",
"element": "provision",
"variable": "prov"
}
],
"rule": [
{
"name": "provCode",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "prov",
"element": "code",
"variable": "pc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "pc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://snomed.info/sct"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "116859006"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Transfusion of blood product"
}
]
}
]
}
]
},
{
"name": "provText",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "pc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueString": "Transfusion of the blood products requested on this form"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── Consent to transfusion ──────────────────────────────────────────────\r\ndecision follows the answer: 'permit' when the patient agreed, 'deny'\r\nwhen they did not. A refused transfusion recorded as an absent consent\r\nwould be indistinguishable from one nobody asked about."
},
{
"name": "narr_transfusion_indication_for_transfusion",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'reason-for-transfusion') 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": "transfusion-indication-for-transfusion"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Indication for transfusion"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "recipientGroupGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'recipient-group'"
}
],
"rule": [
{
"name": "coded_883_9",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'recipient-group/abo') 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": "SetLaboratoryCategory",
"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": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "883-9"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "ABO group [Type] in Blood"
}
]
}
]
}
]
}
]
},
{
"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": "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": "coded_10331_7",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'recipient-group/rhesus') 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": "SetLaboratoryCategory",
"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": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "10331-7"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Rh [Type] in Blood"
}
]
}
]
}
]
}
]
},
{
"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": "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"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── The recipient's group ───────────────────────────────────────────────"
},
{
"name": "issuedUnitGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "u",
"condition": "(linkId = 'issued-unit') and item.where(linkId = 'issued-unit/bag-number').answer.value.exists()"
}
],
"rule": [
{
"name": "unit_donor_abo",
"source": [
{
"context": "u",
"element": "item",
"variable": "it",
"condition": "(linkId = 'issued-unit/donor-abo') 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": "SetLaboratoryCategory",
"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": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "14578-9"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "ABO group [Type] in Blood from Blood product unit"
}
]
}
]
}
]
}
]
},
{
"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": "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": "bagIdentity",
"source": [
{
"context": "u"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetUnitIdentity",
"parameter": [
{
"valueId": "u"
},
{
"valueId": "obs"
}
]
}
]
}
]
},
{
"name": "unit_donor_rhesus",
"source": [
{
"context": "u",
"element": "item",
"variable": "it",
"condition": "(linkId = 'issued-unit/donor-rhesus') 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": "SetLaboratoryCategory",
"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": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "14907-0"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Rh [Type] in Blood from Blood product unit"
}
]
}
]
}
]
}
]
},
{
"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": "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": "bagIdentity",
"source": [
{
"context": "u"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetUnitIdentity",
"parameter": [
{
"valueId": "u"
},
{
"valueId": "obs"
}
]
}
]
}
]
},
{
"name": "crossMatchObservation",
"source": [
{
"context": "u",
"element": "item",
"variable": "it",
"condition": "(linkId = 'issued-unit/cross-match-result') 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": "SetLaboratoryCategory",
"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": "transfusion-cross-match-result"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Cross-match result"
}
]
}
]
}
]
}
]
},
{
"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": "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": "interpretationRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "incompatibleInterp",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'xmatch-incompatible'"
}
],
"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": "bagIdentity",
"source": [
{
"context": "u"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetUnitIdentity",
"parameter": [
{
"valueId": "u"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "collectedByRule",
"source": [
{
"context": "u",
"element": "item",
"variable": "cb",
"condition": "(linkId = 'issued-unit/collected-by') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "cb",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "collectedBy",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
},
{
"name": "labGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "lab",
"condition": "linkId = 'laboratory'"
}
],
"rule": [
{
"name": "doneByRule",
"source": [
{
"context": "lab",
"element": "item",
"variable": "xb",
"condition": "(linkId = 'laboratory/cross-match-done-by') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "xb",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "crossMatchedBy",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
},
{
"name": "doneAtRule",
"source": [
{
"context": "lab",
"element": "item",
"variable": "xa",
"condition": "(linkId = 'laboratory/cross-match-done-at') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "xa",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "crossMatchedAt",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "effective",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── The cross-match result ────────────────────────────────────────────\r\nInterpreted, not just recorded. An incompatible cross-match is the one\r\nresult on this sheet that must stop a transfusion, and leaving a reader\r\nto notice the word is not good enough."
}
],
"documentation": "── Each issued unit ────────────────────────────────────────────────────\r\nPer bag. The bag number is the identity a look-back investigation starts\r\nfrom, so it rides on every Observation about that unit rather than only on\r\nthe row -- an Observation that says \"incompatible\" and cannot say which bag\r\nis not usable evidence."
},
{
"name": "reactionGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'reaction'"
}
],
"rule": [
{
"name": "reactionObservation",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'reaction/observed') 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": "SetExamCategory",
"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": "http://snomed.info/sct"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "82545002"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Blood transfusion reaction"
}
]
}
]
}
]
}
]
},
{
"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": "interpretationRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "reactionInterp",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'Y'"
}
],
"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": "observedAtRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "oa",
"condition": "(linkId = 'reaction/observed-at') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "oa",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "observedAt",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "effective",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
}
]
},
{
"name": "observedByRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "ob",
"condition": "(linkId = 'reaction/observed-by') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "ob",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "observedBy",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
},
{
"name": "note",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "linkId = 'reaction/description'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "── A transfusion reaction ──────────────────────────────────────────────\r\nFlagged abnormal whenever one was observed. This is a haemovigilance\r\nrecord: it has to be findable by anyone querying reactions across the\r\nhospital, not only by whoever opens this form."
}
]
},
{
"name": "SetUnitIdentity",
"documentation": "The bag number, and how long the unit is good for, as identifiers and a note\r\non every Observation about that unit. Factored out because it is identical\r\nfor the ABO, the Rh and the cross-match, and a look-back investigation that\r\nfinds two of the three tagged is a look-back that failed.",
"input": [
{
"name": "u",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
}
],
"rule": [
{
"name": "bagNumberRule",
"source": [
{
"context": "u",
"element": "item",
"variable": "it",
"condition": "(linkId = 'issued-unit/bag-number') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "bagIdentifier",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "identifier",
"variable": "ident"
}
],
"rule": [
{
"name": "identSystem",
"source": [
{
"context": "txt"
}
],
"target": [
{
"context": "ident",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/identifier/blood-bag-number"
}
]
}
]
},
{
"name": "identValue",
"source": [
{
"context": "txt"
}
],
"target": [
{
"context": "ident",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
},
{
"name": "specimenDisplay",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "specimen",
"variable": "sref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "sref",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "expiryRule",
"source": [
{
"context": "u",
"element": "item",
"variable": "it",
"condition": "(linkId = 'issued-unit/expiry-date') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "expiryNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueString": "Unit expiry date recorded on the requisition"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "SetBloodRequestCommon",
"documentation": "Everything every product order on the sheet shares: who asked, from where,\r\nhow urgently, and when the blood is reserved until.",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "sr",
"type": "ServiceRequest",
"mode": "target"
}
],
"rule": [
{
"name": "requestGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'request'"
}
],
"rule": [
{
"name": "requesterRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'request/requester') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "requester",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "sr",
"element": "requester",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
},
{
"name": "urgencyRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'request/urgency') and answer.value.exists()"
}
],
"rule": [
{
"name": "desperateRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "stat",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'urgency-desperate'"
}
],
"target": [
{
"context": "sr",
"element": "priority",
"transform": "copy",
"parameter": [
{
"valueString": "stat"
}
]
}
]
}
]
},
{
"name": "urgentRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "urgent",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'urgency-urgent'"
}
],
"target": [
{
"context": "sr",
"element": "priority",
"transform": "copy",
"parameter": [
{
"valueString": "urgent"
}
]
}
]
}
]
},
{
"name": "electiveRule",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "routine",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv",
"condition": "code = 'urgency-elective'"
}
],
"target": [
{
"context": "sr",
"element": "priority",
"transform": "copy",
"parameter": [
{
"valueString": "routine"
}
]
}
]
}
]
}
],
"documentation": "Priority is a code, not a Coding. The form's urgency codes are local --\r\ndesperate, urgent, elective, as printed -- so they are mapped onto the\r\nthree request-priority codes rather than passed through."
},
{
"name": "departmentRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'request/department') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "departmentNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "roomRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'request/room-number') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "roomNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "bedRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "it",
"condition": "(linkId = 'request/bed-number') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "bedNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "labGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "lab",
"condition": "linkId = 'laboratory'"
}
],
"rule": [
{
"name": "labRegRule",
"source": [
{
"context": "lab",
"element": "item",
"variable": "it",
"condition": "(linkId = 'laboratory/lab-registration-number') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "labIdentifier",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "identifier",
"variable": "ident"
}
],
"rule": [
{
"name": "identSystem",
"source": [
{
"context": "txt"
}
],
"target": [
{
"context": "ident",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/identifier/blood-bank-registration"
}
]
}
]
},
{
"name": "identValue",
"source": [
{
"context": "txt"
}
],
"target": [
{
"context": "ident",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
}
]
}
]
},
{
"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": "SetLaboratoryCategory",
"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": "laboratory"
}
]
}
]
},
{
"name": "categoryDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Laboratory"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "SetExamCategory",
"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": "exam"
}
]
}
]
},
{
"name": "categoryDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Exam"
}
]
}
]
}
]
}
]
}
]
},
{
"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": "BuildConsentBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "Consent",
"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": "SetConsentFullUrl",
"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": "Consent"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetConsentFullUrl",
"input": [
{
"name": "r",
"type": "Consent",
"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/Consent/"
},
{
"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": "blood-requisition"
}
]
}
]
},
{
"name": "provenanceDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Blood requisition form"
}
]
}
]
}
]
}
]
},
{
"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."
}
]
}
]
}