FHIR IG analytics| Package | silfhirprofileig |
| Resource Type | StructureMap |
| Id | StructureMap-ExtractHormonalTherapyTreatmentPlan.json |
| FHIR Version | R5 |
| Source | https://build.fhir.org/ig/savannahghi/sil_fhir_profile_ig/StructureMap-ExtractHormonalTherapyTreatmentPlan.html |
| URL | https://fhir.slade360.co.ke/fhir/StructureMap/ExtractHormonalTherapyTreatmentPlan |
| Version | 0.1.0 |
| Status | active |
| Date | 2026-10-06T18:48:22+00:00 |
| Name | ExtractHormonalTherapyTreatmentPlan |
| Title | Hormonal Therapy Treatment Plan Extraction |
| Description | Each cycle on the hormonal therapy sheet out as: a MedicationAdministration for the drug given, as written, on the cycle's date; laboratory Observations for the PSA, serum calcium and alkaline phosphatase; an Observation for the cycle number, so the next cycle can see which one this was; the remarks as a note; and a ServiceRequest for the date to come again. Everything takes the cycle's own date rather than the form's, because the sheet exists to be read as a series. |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
Generated Narrative: StructureMap ExtractHormonalTherapyTreatmentPlan
/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractHormonalTherapyTreatmentPlan' /// name = 'ExtractHormonalTherapyTreatmentPlan' /// title = 'Hormonal Therapy Treatment Plan Extraction' /// status = 'active' /// description = 'Each cycle on the hormonal therapy sheet out as: a MedicationAdministration for the drug given, as written, on the cycle\'s date; laboratory Observations for the PSA, serum calcium and alkaline phosphatase; an Observation for the cycle number, so the next cycle can see which one this was; the remarks as a note; and a ServiceRequest for the date to come again. Everything takes the cycle\'s own date rather than the form\'s, because the sheet exists to be read as a series.' 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/MedicationAdministration" alias MedicationAdministration as target uses "http://hl7.org/fhir/StructureDefinition/ServiceRequest" alias ServiceRequest as target group ExtractHormonalTherapyTreatmentPlan(source qr : QR, target bundle : Bundle) { qr -> bundle.type = 'transaction' "setBundleType"; // ── One cycle at a time ───────────────────────────────────────────────── qr.item as c where (linkId = 'cycle') then { // The drug given. A MedicationAdministration, because the sheet records // what was given at that cycle, not what was ordered. The drug travels as // written: the hospital's formulary is not coded, and the strength is part // of what the clinician wrote. c where (item.where(linkId = 'cycle/drug').answer.value.exists()) -> bundle.entry as entry, entry.resource = create('MedicationAdministration') as ma then { qr -> ma, entry then BuildMedicationAdministrationBase(qr, ma, entry) "base"; c -> ma.status = 'completed' "status"; qr.encounter as e where ((reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))) -> ma.encounter = e; c.item as it where (linkId = 'cycle/drug') then { it.answer first as a then { a.value as txt -> ma.medication as med, med.concept as mc, mc.text = txt "medicationText"; a.value as txt -> ma.dosage as dos, dos.text = txt "dosageAsWritten"; }; } "drugRule"; c.item as it where ((linkId = 'cycle/date') and answer.value.exists()) then { it.answer first as a then { a.value as d -> ma.occurence = cast(d, 'dateTime') "occurrence"; }; } "dateRule"; c.item as it where ((linkId = 'cycle/number') and answer.value.exists()) then { it.answer first as a then { a.value as n -> ma.note as note then { n -> note.text = evaluate(n, 'Hormonal therapy cycle ' & $this.toString()) "cycleText"; qr.authored as noteTime -> note.time = noteTime "cycleTime"; } "cycleNote"; }; } "cycleRule"; } "hormonalDrug"; // The cycle number as an Observation of its own. It is what tells the // next cycle which one this was, and a number inside a note cannot be // read back as one. c.item as it where ((linkId = 'cycle/number') 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 = 'hormonal-therapy-cycle-number' "cd"; it -> cg.display = 'Hormonal therapy cycle number' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as v -> obs.value = v; }; c -> obs then SetHormonalCycleContext(c, obs) "cycleContext"; } "cycleNumber"; c.item as it where ((linkId = 'cycle/psa') and answer.value.ofType(Quantity).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 = '2857-1' "cd"; it -> cg.display = 'Prostate specific Ag [Mass/volume] in Serum or Plasma' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as v -> obs.value = v; }; c -> obs then SetHormonalCycleContext(c, obs) "cycleContext"; } "cyclePsa"; // "CA2+" on the paper. Read as serum calcium in mmol/L, the routine // measure on a patient with bone disease; an ionised calcium would need a // blood gas analyser and its own code, 1995-0. c.item as it where ((linkId = 'cycle/calcium') and answer.value.ofType(Quantity).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 = '2000-8' "cd"; it -> cg.display = 'Calcium [Moles/volume] in Serum or Plasma' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as v -> obs.value = v; }; c -> obs then SetHormonalCycleContext(c, obs) "cycleContext"; } "cycleCalcium"; c.item as it where ((linkId = 'cycle/alp') and answer.value.ofType(Quantity).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 = '6768-6' "cd"; it -> cg.display = 'Alkaline phosphatase [Enzymatic activity/volume] in Serum or Plasma' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as v -> obs.value = v; }; c -> obs then SetHormonalCycleContext(c, obs) "cycleContext"; } "cycleAlp"; c.item as it where ((linkId = 'cycle/remarks') 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 = 'hormonal-therapy-remarks' "cd"; it -> cg.display = 'Remarks on a hormonal therapy cycle' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; c -> obs then SetHormonalCycleContext(c, obs) "cycleContext"; } "cycleRemarks"; // TCA, "to come again". A ServiceRequest, not an Appointment, for the // reason the discharge summary gives: a date with no clinic, clinician or // slot is a request for a follow-up, and an Appointment built from it // would claim a booking that does not exist. c.item as it where ((linkId = 'cycle/next-visit') 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/concept-codesystem' "sys"; it -> cg.code = 'hormonal-therapy-next-review' "cd"; it -> cg.display = 'Next hormonal therapy review' "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 where ((reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))) -> sr.encounter = e; it -> sr.note as n, n.text = 'Date to come again, written on the hormonal therapy treatment plan. Not a booked appointment: the sheet names no clinic, clinician or slot.' "provenanceNote"; } "nextVisit"; } "cycleRows"; } // The cycle's own date on every Observation from that cycle. It overrides the // response's authored time: several rows keyed in at one sitting would // otherwise collapse onto one instant and the series would be gone. group SetHormonalCycleContext(source c, target obs : Observation) { c.item as it where ((linkId = 'cycle/date') and answer.value.exists()) then { it.answer first as a then { a.value as v where ($this.toString().length() = 10) -> evaluate(v, $this.toString() + 'T00:00:00+03:00') as midnight, obs.effective = cast(midnight, 'instant') "effectiveFromCycle"; }; } "cycleDateRule"; } // ───────────────────────────────────────────────────────────────────────────── // 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. // ───────────────────────────────────────────────────────────────────────────── 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 where ((reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))) -> obs.subject = s; qr.encounter as e where ((reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))) -> obs.encounter = e; // 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"; qr -> obs then ConformObservation(qr, obs) "profileConformance"; } group SetObservationFullUrl(source obs : Observation, target entry) { obs.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Observation/', id) "assignFullUrl"; } 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 BuildMedicationAdministrationBase(source qr : QR, target r : MedicationAdministration, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetMedicationAdministrationFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'MedicationAdministration' "requestUrl"; } "entryRequest"; qr.subject as s where ((reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))) -> r.subject = s; // The response's own time, as a floor. A row that names its date overwrites // this; without it a row missing its date would produce an administration // with no time at all, which is not a record of an administration. qr.authored as t -> r.occurence = t "occurrenceFallback"; qr -> r then ConformMedicationAdministration(qr, r) "profileConformance"; } group SetMedicationAdministrationFullUrl(source r : MedicationAdministration, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/MedicationAdministration/', 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 where ((reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))) -> r.subject = s; qr -> r then ConformServiceRequest(qr, r) "profileConformance"; } 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 response's // identifier is copied the same way. // 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 = 'hormonal-therapy-treatment-plan' "provenanceCode"; qr -> t.display = 'Hormonal therapy treatment plan' "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"; // The response's identifiers, as they are. Every profile wants one, and it is // the response's to give: nothing here mints one, so a response without an // identifier extracts resources without one. One whose assigner is not of a // type the profiles allow there is left behind whole, not altered. qr.identifier as qid where (assigner.empty() or assigner.where(((reference.exists() and (reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization'))))).exists()) -> r.identifier = qid; } // ── Conformance to the IG profiles ─────────────────────────────────────────── // What the IG's profiles require that the response itself can supply. Called at // the end of each base group. The encounter and every who-element are the // response's own; see mapmeta.py for what is and is not here. // ── Conformance to the IG profiles ─────────────────────────────────────────── group ConformObservation(source qr : QR, target r) { qr.authored as t where ($this.toString().length() >= 20) -> r.issued = cast(t, 'instant') "issued"; qr.authored as t where ($this.toString().length() >= 20) -> r.effective = cast(t, 'instant') "effective"; qr.author as au where ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))) -> r.performer = au "performerFromAuthor"; qr where (author.where(((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))).exists().not()) then { qr.source as src where ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))) -> r.performer = src "performerFromSource"; } "performerFallback"; } group ConformMedicationAdministration(source qr : QR, target r) { qr.encounter as e where ((reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))) -> r.encounter = e; qr.author as au where ((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/') or reference.startsWith('Patient/') or reference.startsWith('RelatedPerson/') or reference.startsWith('Device/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole') or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/RelatedPerson') or ('/' + type).endsWith('/Device')))) -> r.performer as p, p.actor = create('CodeableReference') as cr, cr.reference = au "performerFromAuthor"; qr where (author.where(((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/') or reference.startsWith('Patient/') or reference.startsWith('RelatedPerson/') or reference.startsWith('Device/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole') or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/RelatedPerson') or ('/' + type).endsWith('/Device'))))).exists().not()) then { qr.source as src where ((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/') or reference.startsWith('Patient/') or reference.startsWith('RelatedPerson/') or reference.startsWith('Device/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole') or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/RelatedPerson') or ('/' + type).endsWith('/Device')))) -> r.performer as p, p.actor = create('CodeableReference') as cr, cr.reference = src "performerFromSource"; } "performerFallback"; } group ConformServiceRequest(source qr : QR, target r) { qr.encounter as e where ((reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))) -> r.encounter = e; qr.authored as t -> r.authoredOn = t "authoredOn"; qr -> r.priority = 'routine' "priority"; qr.author as au where ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))) -> r.requester = au "requesterFromAuthor"; qr where (author.where(((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))).exists().not()) then { qr.source as src where ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))) -> r.requester = src "requesterFromSource"; } "requesterFallback"; }
{
"resourceType": "StructureMap",
"id": "ExtractHormonalTherapyTreatmentPlan",
"text": {
"status": "generated",
"div": "<!-- snip (see above) -->"
},
"url": "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractHormonalTherapyTreatmentPlan",
"version": "0.1.0",
"name": "ExtractHormonalTherapyTreatmentPlan",
"title": "Hormonal Therapy Treatment Plan Extraction",
"status": "active",
"date": "2026-10-06T18:48:22+00:00",
"publisher": "Kathurima Kimathi",
"contact": [
{
"name": "Kathurima Kimathi",
"telecom": [
{
"system": "url",
"value": "https://www.linkedin.com/in/kathurima-kimathi/"
},
{
"system": "email",
"value": "kathurimakimathi415@gmail.com"
}
]
},
{
"name": "Oscar John",
"telecom": [
{
"system": "email",
"value": "oscarjohnotieno@gmail.com",
"use": "work"
}
]
},
{
"name": "Kennedy Omondi",
"telecom": [
{
"system": "email",
"value": "kennankole@gmail.com",
"use": "work"
}
]
}
],
"description": "Each cycle on the hormonal therapy sheet out as: a MedicationAdministration for the drug given, as written, on the cycle's date; laboratory Observations for the PSA, serum calcium and alkaline phosphatase; an Observation for the cycle number, so the next cycle can see which one this was; the remarks as a note; and a ServiceRequest for the date to come again. Everything takes the cycle's own date rather than the form's, because the sheet exists to be read as a series.",
"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/MedicationAdministration",
"mode": "target",
"alias": "MedicationAdministration"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/ServiceRequest",
"mode": "target",
"alias": "ServiceRequest"
}
],
"group": [
{
"name": "ExtractHormonalTherapyTreatmentPlan",
"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": "cycleRows",
"source": [
{
"context": "qr",
"element": "item",
"variable": "c",
"condition": "linkId = 'cycle'"
}
],
"rule": [
{
"name": "hormonalDrug",
"source": [
{
"context": "c",
"condition": "item.where(linkId = 'cycle/drug').answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "ma",
"transform": "create",
"parameter": [
{
"valueString": "MedicationAdministration"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "ma"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildMedicationAdministrationBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "ma"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "c"
}
],
"target": [
{
"context": "ma",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "completed"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e",
"condition": "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
}
],
"target": [
{
"context": "ma",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "drugRule",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "linkId = 'cycle/drug'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "medicationText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "ma",
"element": "medication",
"variable": "med"
},
{
"context": "med",
"element": "concept",
"variable": "mc"
},
{
"context": "mc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
},
{
"name": "dosageAsWritten",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "ma",
"element": "dosage",
"variable": "dos"
},
{
"context": "dos",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "dateRule",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/date') 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": "d"
}
],
"target": [
{
"context": "ma",
"element": "occurence",
"transform": "cast",
"parameter": [
{
"valueId": "d"
},
{
"valueString": "dateTime"
}
]
}
]
}
]
}
]
},
{
"name": "cycleRule",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/number') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "cycleNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "n"
}
],
"target": [
{
"context": "ma",
"element": "note",
"variable": "note"
}
],
"rule": [
{
"name": "cycleText",
"source": [
{
"context": "n"
}
],
"target": [
{
"context": "note",
"element": "text",
"transform": "evaluate",
"parameter": [
{
"valueId": "n"
},
{
"valueString": "'Hormonal therapy cycle ' & $this.toString()"
}
]
}
]
},
{
"name": "cycleTime",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "noteTime"
}
],
"target": [
{
"context": "note",
"element": "time",
"transform": "copy",
"parameter": [
{
"valueId": "noteTime"
}
]
}
]
}
]
}
]
}
]
}
],
"documentation": "The drug given. A MedicationAdministration, because the sheet records\r\nwhat was given at that cycle, not what was ordered. The drug travels as\r\nwritten: the hospital's formulary is not coded, and the strength is part\r\nof what the clinician wrote."
},
{
"name": "cycleNumber",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/number') 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": "hormonal-therapy-cycle-number"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hormonal therapy cycle number"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "value",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
},
{
"name": "cycleContext",
"source": [
{
"context": "c"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetHormonalCycleContext",
"parameter": [
{
"valueId": "c"
},
{
"valueId": "obs"
}
]
}
]
}
],
"documentation": "The cycle number as an Observation of its own. It is what tells the\r\nnext cycle which one this was, and a number inside a note cannot be\r\nread back as one."
},
{
"name": "cyclePsa",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/psa') and answer.value.ofType(Quantity).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": "2857-1"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Prostate specific Ag [Mass/volume] in Serum or Plasma"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "value",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
},
{
"name": "cycleContext",
"source": [
{
"context": "c"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetHormonalCycleContext",
"parameter": [
{
"valueId": "c"
},
{
"valueId": "obs"
}
]
}
]
}
]
},
{
"name": "cycleCalcium",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/calcium') and answer.value.ofType(Quantity).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": "2000-8"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Calcium [Moles/volume] in Serum or Plasma"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "value",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
},
{
"name": "cycleContext",
"source": [
{
"context": "c"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetHormonalCycleContext",
"parameter": [
{
"valueId": "c"
},
{
"valueId": "obs"
}
]
}
]
}
],
"documentation": "\"CA2+\" on the paper. Read as serum calcium in mmol/L, the routine\r\nmeasure on a patient with bone disease; an ionised calcium would need a\r\nblood gas analyser and its own code, 1995-0."
},
{
"name": "cycleAlp",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/alp') and answer.value.ofType(Quantity).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": "6768-6"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Alkaline phosphatase [Enzymatic activity/volume] in Serum or Plasma"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "value",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
},
{
"name": "cycleContext",
"source": [
{
"context": "c"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetHormonalCycleContext",
"parameter": [
{
"valueId": "c"
},
{
"valueId": "obs"
}
]
}
]
}
]
},
{
"name": "cycleRemarks",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/remarks') 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": "hormonal-therapy-remarks"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Remarks on a hormonal therapy cycle"
}
]
}
]
}
]
}
]
},
{
"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": "cycleContext",
"source": [
{
"context": "c"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetHormonalCycleContext",
"parameter": [
{
"valueId": "c"
},
{
"valueId": "obs"
}
]
}
]
}
]
},
{
"name": "nextVisit",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/next-visit') 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/concept-codesystem"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "hormonal-therapy-next-review"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Next hormonal therapy review"
}
]
}
]
}
]
}
]
},
{
"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",
"condition": "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
}
],
"target": [
{
"context": "sr",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "provenanceNote",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueString": "Date to come again, written on the hormonal therapy treatment plan. Not a booked appointment: the sheet names no clinic, clinician or slot."
}
]
}
]
}
],
"documentation": "TCA, \"to come again\". A ServiceRequest, not an Appointment, for the\r\nreason the discharge summary gives: a date with no clinic, clinician or\r\nslot is a request for a follow-up, and an Appointment built from it\r\nwould claim a booking that does not exist."
}
],
"documentation": "── One cycle at a time ─────────────────────────────────────────────────"
}
]
},
{
"name": "SetHormonalCycleContext",
"documentation": "The cycle's own date on every Observation from that cycle. It overrides the\r\nresponse's authored time: several rows keyed in at one sitting would\r\notherwise collapse onto one instant and the series would be gone.",
"input": [
{
"name": "c",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
}
],
"rule": [
{
"name": "cycleDateRule",
"source": [
{
"context": "c",
"element": "item",
"variable": "it",
"condition": "(linkId = 'cycle/date') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "effectiveFromCycle",
"source": [
{
"context": "a",
"element": "value",
"variable": "v",
"condition": "$this.toString().length() = 10"
}
],
"target": [
{
"variable": "midnight",
"transform": "evaluate",
"parameter": [
{
"valueId": "v"
},
{
"valueString": "$this.toString() + 'T00:00:00+03:00'"
}
]
},
{
"context": "obs",
"element": "effective",
"transform": "cast",
"parameter": [
{
"valueId": "midnight"
},
{
"valueString": "instant"
}
]
}
]
}
]
}
]
}
]
},
{
"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\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",
"condition": "(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "obs",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e",
"condition": "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
}
],
"target": [
{
"context": "obs",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"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": "profileConformance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "ConformObservation",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
}
]
},
{
"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": "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": "BuildMedicationAdministrationBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "MedicationAdministration",
"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": "SetMedicationAdministrationFullUrl",
"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": "MedicationAdministration"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s",
"condition": "(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
},
{
"name": "occurrenceFallback",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "r",
"element": "occurence",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
],
"documentation": "The response's own time, as a floor. A row that names its date overwrites\r\nthis; without it a row missing its date would produce an administration\r\nwith no time at all, which is not a record of an administration."
},
{
"name": "profileConformance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "ConformMedicationAdministration",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
}
]
},
{
"name": "SetMedicationAdministrationFullUrl",
"input": [
{
"name": "r",
"type": "MedicationAdministration",
"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/MedicationAdministration/"
},
{
"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",
"condition": "(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
},
{
"name": "profileConformance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "ConformServiceRequest",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
}
]
},
{
"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. The response's\r\nidentifier is copied the same way.\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": "hormonal-therapy-treatment-plan"
}
]
}
]
},
{
"name": "provenanceDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Hormonal therapy treatment plan"
}
]
}
]
}
]
}
]
},
{
"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."
},
{
"name": "identifier",
"source": [
{
"context": "qr",
"element": "identifier",
"variable": "qid",
"condition": "assigner.empty() or assigner.where(((reference.exists() and (reference.startsWith('Organization/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization'))))).exists()"
}
],
"target": [
{
"context": "r",
"element": "identifier",
"transform": "copy",
"parameter": [
{
"valueId": "qid"
}
]
}
],
"documentation": "The response's identifiers, as they are. Every profile wants one, and it is\r\nthe response's to give: nothing here mints one, so a response without an\r\nidentifier extracts resources without one. One whose assigner is not of a\r\ntype the profiles allow there is left behind whole, not altered."
}
]
},
{
"name": "ConformObservation",
"documentation": "── Conformance to the IG profiles ───────────────────────────────────────────\r\nWhat the IG's profiles require that the response itself can supply. Called at\r\nthe end of each base group. The encounter and every who-element are the\r\nresponse's own; see mapmeta.py for what is and is not here.\r\n── Conformance to the IG profiles ───────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"mode": "target"
}
],
"rule": [
{
"name": "issued",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t",
"condition": "$this.toString().length() >= 20"
}
],
"target": [
{
"context": "r",
"element": "issued",
"transform": "cast",
"parameter": [
{
"valueId": "t"
},
{
"valueString": "instant"
}
]
}
]
},
{
"name": "effective",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t",
"condition": "$this.toString().length() >= 20"
}
],
"target": [
{
"context": "r",
"element": "effective",
"transform": "cast",
"parameter": [
{
"valueId": "t"
},
{
"valueString": "instant"
}
]
}
]
},
{
"name": "performerFromAuthor",
"source": [
{
"context": "qr",
"element": "author",
"variable": "au",
"condition": "(reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "r",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "au"
}
]
}
]
},
{
"name": "performerFallback",
"source": [
{
"context": "qr",
"condition": "author.where(((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))).exists().not()"
}
],
"rule": [
{
"name": "performerFromSource",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src",
"condition": "(reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "r",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
}
]
}
]
},
{
"name": "ConformMedicationAdministration",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"mode": "target"
}
],
"rule": [
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e",
"condition": "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
}
],
"target": [
{
"context": "r",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "performerFromAuthor",
"source": [
{
"context": "qr",
"element": "author",
"variable": "au",
"condition": "(reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/') or reference.startsWith('Patient/') or reference.startsWith('RelatedPerson/') or reference.startsWith('Device/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole') or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/RelatedPerson') or ('/' + type).endsWith('/Device')))"
}
],
"target": [
{
"context": "r",
"element": "performer",
"variable": "p"
},
{
"context": "p",
"element": "actor",
"variable": "cr",
"transform": "create",
"parameter": [
{
"valueString": "CodeableReference"
}
]
},
{
"context": "cr",
"element": "reference",
"transform": "copy",
"parameter": [
{
"valueId": "au"
}
]
}
]
},
{
"name": "performerFallback",
"source": [
{
"context": "qr",
"condition": "author.where(((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/') or reference.startsWith('Patient/') or reference.startsWith('RelatedPerson/') or reference.startsWith('Device/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole') or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/RelatedPerson') or ('/' + type).endsWith('/Device'))))).exists().not()"
}
],
"rule": [
{
"name": "performerFromSource",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src",
"condition": "(reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/') or reference.startsWith('Patient/') or reference.startsWith('RelatedPerson/') or reference.startsWith('Device/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole') or ('/' + type).endsWith('/Patient') or ('/' + type).endsWith('/RelatedPerson') or ('/' + type).endsWith('/Device')))"
}
],
"target": [
{
"context": "r",
"element": "performer",
"variable": "p"
},
{
"context": "p",
"element": "actor",
"variable": "cr",
"transform": "create",
"parameter": [
{
"valueString": "CodeableReference"
}
]
},
{
"context": "cr",
"element": "reference",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
}
]
}
]
},
{
"name": "ConformServiceRequest",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"mode": "target"
}
],
"rule": [
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e",
"condition": "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
}
],
"target": [
{
"context": "r",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "authoredOn",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "r",
"element": "authoredOn",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "priority",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "priority",
"transform": "copy",
"parameter": [
{
"valueString": "routine"
}
]
}
]
},
{
"name": "requesterFromAuthor",
"source": [
{
"context": "qr",
"element": "author",
"variable": "au",
"condition": "(reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "r",
"element": "requester",
"transform": "copy",
"parameter": [
{
"valueId": "au"
}
]
}
]
},
{
"name": "requesterFallback",
"source": [
{
"context": "qr",
"condition": "author.where(((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))).exists().not()"
}
],
"rule": [
{
"name": "requesterFromSource",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src",
"condition": "(reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient')))"
}
],
"target": [
{
"context": "r",
"element": "requester",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
}
]
}
]
}
]
}