SGHI FHIR Profile Implementation Guide
0.1.0 - ci-build

SGHI FHIR Profile Implementation Guide, published by Kathurima Kimathi. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/savannahghi/sil_fhir_profile_ig/ and changes regularly. See the Directory of published versions

StructureMap: Glasgow Coma Scale Extraction (Experimental)

Official URL: https://fhir.slade360.co.ke/fhir/StructureMap/GlasgowCommaScaleExtract Version: 0.1.0
Active as of 2025-09-17 Computable Name: GlasgowCommaScaleExtract

Extracts three Observation resources, one per GCS subscore, from a QuestionnaireResponse to the GCS questionnaire.

/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/GlasgowCommaScaleExtract'
/// name = 'GlasgowCommaScaleExtract'
/// title = 'Glasgow Coma Scale Extraction'
/// status = 'active'

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

group GlasgowCommaScaleExtract(source qr : QR, target bundle : Bundle) {
  qr -> bundle.type = 'transaction' "setBundleType";
  qr.item as itV where linkId = 'verbal-response' ->  bundle.entry as eV,  eV.resource = create('Observation') as oV then {
    qr -> oV.id then BuildBaseObs(qr, oV, eV) "baseV";
    qr -> oV.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'survey', 'Survey') "catVSystem";
    qr -> oV.code = cc('http://loinc.org', '9270-0', 'Glasgow coma score verbal') "codeVCode";
    qr -> oV.id then SetValueFromItem(itV, oV) "valV";
  } "verbalResponseObs"; // Verbal
  qr.item as itM where linkId = 'motor-response' ->  bundle.entry as eM,  eM.resource = create('Observation') as oM then {
    qr -> oM.id then BuildBaseObs(qr, oM, eM) "baseM";
    qr -> oM.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'survey', 'Survey') "catMSystem";
    qr -> oM.code = cc('http://loinc.org', '9268-4', 'Glasgow coma score motor') "catMCode";
    qr -> oM.id then SetValueFromItem(itM, oM) "valM";
  } "motorResponseObs"; // Motor
  qr.item as itE where linkId = 'eye-opening' ->  bundle.entry as eE,  eE.resource = create('Observation') as oE then {
    qr -> oE.id then BuildBaseObs(qr, oE, eE) "baseE";
    qr -> oE.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'survey', 'Survey') "catESystem";
    qr -> oE.code = cc('http://loinc.org', '9267-6', 'Glasgow coma score eye opening') "catECode";
    qr -> oE.id then SetValueFromItem(itE, oE) "valE";
  } "eyeResponseObs"; // Eye
}

group BuildBaseObs(source qr : QR, target obs : Observation, target entry) {
  qr -> entry.request as req then {
    qr -> req.method = 'POST' "reqMethod";
    qr -> req.url = 'Observation' "reqUrl";
  } "entryRequest";
  qr -> obs.id = uuid() then SetFullUrl(obs, entry) "setIdAndFullUrl";
  qr -> obs.status = 'final' "setStatus";
  qr.subject as s -> obs.subject = create('Reference') as r then {
    s.reference as ref -> r.reference = ref "subRef";
    s.display as disp -> r.display = disp "subDisp";
  } "setSubject";
  qr.authored as t -> obs.effective = t "setEffective";
  qr.authored as t -> obs.issued = t "setIssued";
  qr -> obs.derivedFrom = create('Reference') as dr then {
    qr.id as id -> dr.reference = append('QuestionnaireResponse/', id) "derRef";
  } "setDerivedFrom";
}

group SetValueFromItem(source it : Element, target obs : Observation) {
  it.answer as a -> obs.value = create('CodeableConcept') as c then {
    a.value as coding -> c.coding = coding as nc "copyCoding";
  } "setValueCC";
}

group SetFullUrl(source obs : Observation, target entry) {
  obs.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Observation/', id) "assignFullUrl";
}