FHIR © HL7.org  |  FHIRsmith 4.0.1  |  Server Home  |  XIG Home  |  XIG Stats  | 

FHIR IG analytics

Packagesilfhirprofileig
Resource TypeStructureMap
IdStructureMap-ExtractInpatientProgressNote.json
FHIR VersionR5
Sourcehttps://build.fhir.org/ig/savannahghi/sil_fhir_profile_ig/StructureMap-ExtractInpatientProgressNote.html
URLhttps://fhir.slade360.co.ke/fhir/StructureMap/ExtractInpatientProgressNote
Version0.1.0
Statusactive
Date2026-09-11T12:18:36+00:00
NameExtractInpatientProgressNote
TitleInpatient Progress Note Extraction
DescriptionTurns a response to the inpatient progress note into a single Composition with one section per SOAP heading. Nothing here is a discrete clinical fact -- a progress note is a document -- so no Observation, Condition or Task is produced. The QuestionnaireResponse remains the signed record and the Composition points back at it through relatesTo.

Resources that use this resource

No resources found


Resources that this resource uses

No resources found


Narrative

Note: links and images are rebased to the (stated) source

Generated Narrative: StructureMap ExtractInpatientProgressNote

/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractInpatientProgressNote'
/// name = 'ExtractInpatientProgressNote'
/// title = 'Inpatient Progress Note Extraction'
/// status = 'active'
/// description = 'Turns a response to the inpatient progress note into a single Composition with one section per SOAP heading. Nothing here is a discrete clinical fact -- a progress note is a document -- so no Observation, Condition or Task is produced. The QuestionnaireResponse remains the signed record and the Composition points back at it through relatesTo.'

uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QR as source
uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target
uses "http://hl7.org/fhir/StructureDefinition/Composition" alias Composition as target

group ExtractInpatientProgressNote(source qr : QR, target bundle : Bundle) {
  qr -> bundle.type = 'transaction' "setBundleType";
  qr ->  bundle.entry as entry,  entry.resource = create('Composition') as comp then {
    qr ->  comp,  entry then BuildNoteBase(qr, comp, entry) "noteBase";
    qr -> comp.name = 'InpatientProgressNote' "noteName";
    qr -> comp.title = 'Progress note' "noteTitle";
    qr -> comp.type as ty then {
      qr -> ty.coding as sghi then {
        qr -> sghi.system = 'https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-document-type-codesystem' "sghiSystem";
        qr -> sghi.code = 'progress-note' "sghiCode";
        qr -> sghi.display = 'Progress note' "sghiDisplay";
      } "sghiCoding";
      qr -> ty.coding as loinc then {
        qr -> loinc.system = 'http://loinc.org' "loincSystem";
        qr -> loinc.code = '11506-3' "loincCode";
        qr -> loinc.display = 'Progress note' "loincDisplay";
      } "loincCoding";
      qr -> ty.text = 'Progress note' "typeText";
    } "noteType";
    // Sections in the order the form asks for them, so the printed note reads
    // the way it was written. The `answer.value.exists()` guard is not
    // decoration: a section with a title and no content breaks cmp-1, and an
    // unanswered optional item still arrives as an empty item.
    qr.item as it where ((linkId = 'subjective') and answer.value.exists()) -> comp.section as sec then {
      it -> sec.title = 'Subjective' "subjectiveTitle";
      it -> sec then AddSectionText(it, sec) "subjectiveText";
    } "subjectiveRule";
    qr.item as it where ((linkId = 'objective') and answer.value.exists()) -> comp.section as sec then {
      it -> sec.title = 'Objective' "objectiveTitle";
      it -> sec then AddSectionText(it, sec) "objectiveText";
    } "objectiveRule";
    qr.item as it where ((linkId = 'assessment') and answer.value.exists()) -> comp.section as sec then {
      it -> sec.title = 'Assessment' "assessmentTitle";
      it -> sec then AddSectionText(it, sec) "assessmentText";
    } "assessmentRule";
    qr.item as it where ((linkId = 'plan') and answer.value.exists()) -> comp.section as sec then {
      it -> sec.title = 'Plan' "planTitle";
      it -> sec then AddSectionText(it, sec) "planText";
    } "planRule";
  } "composition";
}

// ─────────────────────────────────────────────────────────────────────────────
// Shared note scaffolding. Repeated in each note map rather than imported: the
// transform engine resolves `imports` against whatever StructureMaps happen to
// be on the server, and a note 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.
// Untyped, it says only that it cannot check the paths.
// `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 BuildNoteBase(source qr : QR, target comp : Composition, target entry) {
  qr -> comp.id = uuid() then SetCompositionFullUrl(comp, entry) "idAndFullUrl";
  qr -> entry.request as request then {
    qr -> request.method = 'POST' "requestMethod";
    qr -> request.url = 'Composition' "requestUrl";
  } "entryRequest";
  qr -> comp.status = 'final' "status";
  qr.subject as s -> comp.subject = s;
  qr.encounter as e -> comp.encounter = e;
  // Composition.date is 1..1. `authored` is only 0..1 on the response, so when a
  // client sends none the extraction time stands in. It is a poor substitute for
  // when the note was written, but a document with no date at all is worse, and
  // extraction happens moments after submission in practice.
  qr.authored as t -> comp.date = t "date";
  qr where (authored.exists().not()) then {
    qr -> comp.date = evaluate(qr, now()) "dateFromExtractionTime";
  } "dateFallback";
  // Composition.author is 1..1 minimum. R5 QuestionnaireResponse carries both
  // `author` (who recorded the answers) and `source` (who supplied them); the
  // author is the one who wrote the note, so it wins, and `source` only stands
  // in when the client did not send an author. If the response carries neither,
  // the note comes out unauthored -- there is nothing on a QuestionnaireResponse
  // to invent one from, and guessing at who wrote a clinical note is not a thing
  // a map should do.
  qr.author as a -> comp.author = a "authorFromAuthor";
  qr where (author.exists().not()) then {
    qr.source as src -> comp.author = src "authorFromSource";
  } "authorFallback";
  // The note is derived from the response, not a copy of it. relatesTo is the
  // only element on R5 Composition that can say so.
  qr -> comp.relatesTo as rel then {
    qr -> rel.type = 'derived-from' "relatesToType";
    qr -> rel.resourceReference = create('Reference') as ref then {
      // `qr.id` already resolves to the type-qualified relative reference under
      // this engine, so it is used unprefixed.
      qr.id as qid -> ref.reference = qid "relatesToRef";
    } "relatesToTarget";
  } "linkQuestionnaireResponse";
}

// The narrative half of a section. The title stays with the caller because a
// group can only be invoked with variables, not string literals.
// Two things here are deliberate. `create('xhtml')` rather than assigning the
// string straight to `div`: the engine hard-casts whatever it is given to
// XhtmlType, so a plain string fails with a ClassCastException. And
// `escape('html')` on the answer: a nurse writing "sats < 92% & falling" would
// otherwise produce a div the server refuses to parse.
group AddSectionText(source it, target sec) {
  it.answer first as a then {
    a.value as v -> sec.text as narrative then {
      v -> narrative.status = 'generated' "narrativeStatus";
      v -> narrative.div = create('xhtml') as xhtml then {
        v -> xhtml.value = evaluate(a, '<div xmlns="http://www.w3.org/1999/xhtml"><p>' + value.toString().escape('html') + '</p></div>') "narrativeDiv";
      } "narrativeXhtml";
    } "sectionText";
  } "sectionAnswer";
}

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


Source1

{
  "resourceType": "StructureMap",
  "id": "ExtractInpatientProgressNote",
  "text": {
    "status": "generated",
    "div": "<!-- snip (see above) -->"
  },
  "url": "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractInpatientProgressNote",
  "version": "0.1.0",
  "name": "ExtractInpatientProgressNote",
  "title": "Inpatient Progress Note 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": "Turns a response to the inpatient progress note into a single Composition with one section per SOAP heading. Nothing here is a discrete clinical fact -- a progress note is a document -- so no Observation, Condition or Task is produced. The QuestionnaireResponse remains the signed record and the Composition points back at it through relatesTo.",
  "structure": [
    {
      "url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
      "mode": "source",
      "alias": "QR"
    },
    {
      "url": "http://hl7.org/fhir/StructureDefinition/Bundle",
      "mode": "target",
      "alias": "Bundle"
    },
    {
      "url": "http://hl7.org/fhir/StructureDefinition/Composition",
      "mode": "target",
      "alias": "Composition"
    }
  ],
  "group": [
    {
      "name": "ExtractInpatientProgressNote",
      "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": "composition",
          "source": [
            {
              "context": "qr"
            }
          ],
          "target": [
            {
              "context": "bundle",
              "element": "entry",
              "variable": "entry"
            },
            {
              "context": "entry",
              "element": "resource",
              "variable": "comp",
              "transform": "create",
              "parameter": [
                {
                  "valueString": "Composition"
                }
              ]
            }
          ],
          "rule": [
            {
              "name": "noteBase",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "comp"
                },
                {
                  "context": "entry"
                }
              ],
              "dependent": [
                {
                  "name": "BuildNoteBase",
                  "parameter": [
                    {
                      "valueId": "qr"
                    },
                    {
                      "valueId": "comp"
                    },
                    {
                      "valueId": "entry"
                    }
                  ]
                }
              ]
            },
            {
              "name": "noteName",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "name",
                  "transform": "copy",
                  "parameter": [
                    {
                      "valueString": "InpatientProgressNote"
                    }
                  ]
                }
              ]
            },
            {
              "name": "noteTitle",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "title",
                  "transform": "copy",
                  "parameter": [
                    {
                      "valueString": "Progress note"
                    }
                  ]
                }
              ]
            },
            {
              "name": "noteType",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "type",
                  "variable": "ty"
                }
              ],
              "rule": [
                {
                  "name": "sghiCoding",
                  "source": [
                    {
                      "context": "qr"
                    }
                  ],
                  "target": [
                    {
                      "context": "ty",
                      "element": "coding",
                      "variable": "sghi"
                    }
                  ],
                  "rule": [
                    {
                      "name": "sghiSystem",
                      "source": [
                        {
                          "context": "qr"
                        }
                      ],
                      "target": [
                        {
                          "context": "sghi",
                          "element": "system",
                          "transform": "copy",
                          "parameter": [
                            {
                              "valueString": "https://fhir.slade360.co.ke/fhir/CodeSystem/inpatient-document-type-codesystem"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name": "sghiCode",
                      "source": [
                        {
                          "context": "qr"
                        }
                      ],
                      "target": [
                        {
                          "context": "sghi",
                          "element": "code",
                          "transform": "copy",
                          "parameter": [
                            {
                              "valueString": "progress-note"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name": "sghiDisplay",
                      "source": [
                        {
                          "context": "qr"
                        }
                      ],
                      "target": [
                        {
                          "context": "sghi",
                          "element": "display",
                          "transform": "copy",
                          "parameter": [
                            {
                              "valueString": "Progress note"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "loincCoding",
                  "source": [
                    {
                      "context": "qr"
                    }
                  ],
                  "target": [
                    {
                      "context": "ty",
                      "element": "coding",
                      "variable": "loinc"
                    }
                  ],
                  "rule": [
                    {
                      "name": "loincSystem",
                      "source": [
                        {
                          "context": "qr"
                        }
                      ],
                      "target": [
                        {
                          "context": "loinc",
                          "element": "system",
                          "transform": "copy",
                          "parameter": [
                            {
                              "valueString": "http://loinc.org"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name": "loincCode",
                      "source": [
                        {
                          "context": "qr"
                        }
                      ],
                      "target": [
                        {
                          "context": "loinc",
                          "element": "code",
                          "transform": "copy",
                          "parameter": [
                            {
                              "valueString": "11506-3"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name": "loincDisplay",
                      "source": [
                        {
                          "context": "qr"
                        }
                      ],
                      "target": [
                        {
                          "context": "loinc",
                          "element": "display",
                          "transform": "copy",
                          "parameter": [
                            {
                              "valueString": "Progress note"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "typeText",
                  "source": [
                    {
                      "context": "qr"
                    }
                  ],
                  "target": [
                    {
                      "context": "ty",
                      "element": "text",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueString": "Progress note"
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "name": "subjectiveRule",
              "source": [
                {
                  "context": "qr",
                  "element": "item",
                  "variable": "it",
                  "condition": "(linkId = 'subjective') and answer.value.exists()"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "section",
                  "variable": "sec"
                }
              ],
              "rule": [
                {
                  "name": "subjectiveTitle",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec",
                      "element": "title",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueString": "Subjective"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "subjectiveText",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec"
                    }
                  ],
                  "dependent": [
                    {
                      "name": "AddSectionText",
                      "parameter": [
                        {
                          "valueId": "it"
                        },
                        {
                          "valueId": "sec"
                        }
                      ]
                    }
                  ]
                }
              ],
              "documentation": "Sections in the order the form asks for them, so the printed note reads\r\nthe way it was written. The `answer.value.exists()` guard is not\r\ndecoration: a section with a title and no content breaks cmp-1, and an\r\nunanswered optional item still arrives as an empty item."
            },
            {
              "name": "objectiveRule",
              "source": [
                {
                  "context": "qr",
                  "element": "item",
                  "variable": "it",
                  "condition": "(linkId = 'objective') and answer.value.exists()"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "section",
                  "variable": "sec"
                }
              ],
              "rule": [
                {
                  "name": "objectiveTitle",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec",
                      "element": "title",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueString": "Objective"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "objectiveText",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec"
                    }
                  ],
                  "dependent": [
                    {
                      "name": "AddSectionText",
                      "parameter": [
                        {
                          "valueId": "it"
                        },
                        {
                          "valueId": "sec"
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "name": "assessmentRule",
              "source": [
                {
                  "context": "qr",
                  "element": "item",
                  "variable": "it",
                  "condition": "(linkId = 'assessment') and answer.value.exists()"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "section",
                  "variable": "sec"
                }
              ],
              "rule": [
                {
                  "name": "assessmentTitle",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec",
                      "element": "title",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueString": "Assessment"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "assessmentText",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec"
                    }
                  ],
                  "dependent": [
                    {
                      "name": "AddSectionText",
                      "parameter": [
                        {
                          "valueId": "it"
                        },
                        {
                          "valueId": "sec"
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "name": "planRule",
              "source": [
                {
                  "context": "qr",
                  "element": "item",
                  "variable": "it",
                  "condition": "(linkId = 'plan') and answer.value.exists()"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "section",
                  "variable": "sec"
                }
              ],
              "rule": [
                {
                  "name": "planTitle",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec",
                      "element": "title",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueString": "Plan"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "planText",
                  "source": [
                    {
                      "context": "it"
                    }
                  ],
                  "target": [
                    {
                      "context": "sec"
                    }
                  ],
                  "dependent": [
                    {
                      "name": "AddSectionText",
                      "parameter": [
                        {
                          "valueId": "it"
                        },
                        {
                          "valueId": "sec"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "BuildNoteBase",
      "documentation": "─────────────────────────────────────────────────────────────────────────────\r\nShared note scaffolding. Repeated in each note map rather than imported: the\r\ntransform engine resolves `imports` against whatever StructureMaps happen to\r\nbe on the server, and a note that stops extracting because a shared map was\r\nnot uploaded is a worse failure than a duplicated group.\r\n─────────────────────────────────────────────────────────────────────────────\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\nUntyped, it says only that it cannot check the paths.\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 publisher\r\nis objecting to what its own compiler emits. Two arguments is the only form that\r\ncompiles, and it is what the R5 transform engine executes.",
      "input": [
        {
          "name": "qr",
          "type": "QR",
          "mode": "source"
        },
        {
          "name": "comp",
          "type": "Composition",
          "mode": "target"
        },
        {
          "name": "entry",
          "mode": "target"
        }
      ],
      "rule": [
        {
          "name": "idAndFullUrl",
          "source": [
            {
              "context": "qr"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "id",
              "transform": "uuid"
            }
          ],
          "dependent": [
            {
              "name": "SetCompositionFullUrl",
              "parameter": [
                {
                  "valueId": "comp"
                },
                {
                  "valueId": "entry"
                }
              ]
            }
          ]
        },
        {
          "name": "entryRequest",
          "source": [
            {
              "context": "qr"
            }
          ],
          "target": [
            {
              "context": "entry",
              "element": "request",
              "variable": "request"
            }
          ],
          "rule": [
            {
              "name": "requestMethod",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "request",
                  "element": "method",
                  "transform": "copy",
                  "parameter": [
                    {
                      "valueString": "POST"
                    }
                  ]
                }
              ]
            },
            {
              "name": "requestUrl",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "request",
                  "element": "url",
                  "transform": "copy",
                  "parameter": [
                    {
                      "valueString": "Composition"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "status",
          "source": [
            {
              "context": "qr"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "status",
              "transform": "copy",
              "parameter": [
                {
                  "valueString": "final"
                }
              ]
            }
          ]
        },
        {
          "name": "subject",
          "source": [
            {
              "context": "qr",
              "element": "subject",
              "variable": "s"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "subject",
              "transform": "copy",
              "parameter": [
                {
                  "valueId": "s"
                }
              ]
            }
          ]
        },
        {
          "name": "encounter",
          "source": [
            {
              "context": "qr",
              "element": "encounter",
              "variable": "e"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "encounter",
              "transform": "copy",
              "parameter": [
                {
                  "valueId": "e"
                }
              ]
            }
          ]
        },
        {
          "name": "date",
          "source": [
            {
              "context": "qr",
              "element": "authored",
              "variable": "t"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "date",
              "transform": "copy",
              "parameter": [
                {
                  "valueId": "t"
                }
              ]
            }
          ],
          "documentation": "Composition.date is 1..1. `authored` is only 0..1 on the response, so when a\r\nclient sends none the extraction time stands in. It is a poor substitute for\r\nwhen the note was written, but a document with no date at all is worse, and\r\nextraction happens moments after submission in practice."
        },
        {
          "name": "dateFallback",
          "source": [
            {
              "context": "qr",
              "condition": "authored.exists().not()"
            }
          ],
          "rule": [
            {
              "name": "dateFromExtractionTime",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "date",
                  "transform": "evaluate",
                  "parameter": [
                    {
                      "valueId": "qr"
                    },
                    {
                      "valueString": "now()"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "authorFromAuthor",
          "source": [
            {
              "context": "qr",
              "element": "author",
              "variable": "a"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "author",
              "transform": "copy",
              "parameter": [
                {
                  "valueId": "a"
                }
              ]
            }
          ],
          "documentation": "Composition.author is 1..1 minimum. R5 QuestionnaireResponse carries both\r\n`author` (who recorded the answers) and `source` (who supplied them); the\r\nauthor is the one who wrote the note, so it wins, and `source` only stands\r\nin when the client did not send an author. If the response carries neither,\r\nthe note comes out unauthored -- there is nothing on a QuestionnaireResponse\r\nto invent one from, and guessing at who wrote a clinical note is not a thing\r\na map should do."
        },
        {
          "name": "authorFallback",
          "source": [
            {
              "context": "qr",
              "condition": "author.exists().not()"
            }
          ],
          "rule": [
            {
              "name": "authorFromSource",
              "source": [
                {
                  "context": "qr",
                  "element": "source",
                  "variable": "src"
                }
              ],
              "target": [
                {
                  "context": "comp",
                  "element": "author",
                  "transform": "copy",
                  "parameter": [
                    {
                      "valueId": "src"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "linkQuestionnaireResponse",
          "source": [
            {
              "context": "qr"
            }
          ],
          "target": [
            {
              "context": "comp",
              "element": "relatesTo",
              "variable": "rel"
            }
          ],
          "rule": [
            {
              "name": "relatesToType",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "rel",
                  "element": "type",
                  "transform": "copy",
                  "parameter": [
                    {
                      "valueString": "derived-from"
                    }
                  ]
                }
              ]
            },
            {
              "name": "relatesToTarget",
              "source": [
                {
                  "context": "qr"
                }
              ],
              "target": [
                {
                  "context": "rel",
                  "element": "resourceReference",
                  "variable": "ref",
                  "transform": "create",
                  "parameter": [
                    {
                      "valueString": "Reference"
                    }
                  ]
                }
              ],
              "rule": [
                {
                  "name": "relatesToRef",
                  "source": [
                    {
                      "context": "qr",
                      "element": "id",
                      "variable": "qid"
                    }
                  ],
                  "target": [
                    {
                      "context": "ref",
                      "element": "reference",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueId": "qid"
                        }
                      ]
                    }
                  ],
                  "documentation": "`qr.id` already resolves to the type-qualified relative reference under\r\nthis engine, so it is used unprefixed."
                }
              ]
            }
          ],
          "documentation": "The note is derived from the response, not a copy of it. relatesTo is the\r\nonly element on R5 Composition that can say so."
        }
      ]
    },
    {
      "name": "AddSectionText",
      "documentation": "The narrative half of a section. The title stays with the caller because a\r\ngroup can only be invoked with variables, not string literals.\r\nTwo things here are deliberate. `create('xhtml')` rather than assigning the\r\nstring straight to `div`: the engine hard-casts whatever it is given to\r\nXhtmlType, so a plain string fails with a ClassCastException. And\r\n`escape('html')` on the answer: a nurse writing \"sats < 92% & falling\" would\r\notherwise produce a div the server refuses to parse.",
      "input": [
        {
          "name": "it",
          "mode": "source"
        },
        {
          "name": "sec",
          "mode": "target"
        }
      ],
      "rule": [
        {
          "name": "sectionAnswer",
          "source": [
            {
              "context": "it",
              "element": "answer",
              "listMode": "first",
              "variable": "a"
            }
          ],
          "rule": [
            {
              "name": "sectionText",
              "source": [
                {
                  "context": "a",
                  "element": "value",
                  "variable": "v"
                }
              ],
              "target": [
                {
                  "context": "sec",
                  "element": "text",
                  "variable": "narrative"
                }
              ],
              "rule": [
                {
                  "name": "narrativeStatus",
                  "source": [
                    {
                      "context": "v"
                    }
                  ],
                  "target": [
                    {
                      "context": "narrative",
                      "element": "status",
                      "transform": "copy",
                      "parameter": [
                        {
                          "valueString": "generated"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "narrativeXhtml",
                  "source": [
                    {
                      "context": "v"
                    }
                  ],
                  "target": [
                    {
                      "context": "narrative",
                      "element": "div",
                      "variable": "xhtml",
                      "transform": "create",
                      "parameter": [
                        {
                          "valueString": "xhtml"
                        }
                      ]
                    }
                  ],
                  "rule": [
                    {
                      "name": "narrativeDiv",
                      "source": [
                        {
                          "context": "v"
                        }
                      ],
                      "target": [
                        {
                          "context": "xhtml",
                          "element": "value",
                          "transform": "evaluate",
                          "parameter": [
                            {
                              "valueId": "a"
                            },
                            {
                              "valueString": "'<div xmlns=\"http://www.w3.org/1999/xhtml\"><p>' + value.toString().escape('html') + '</p></div>'"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "SetCompositionFullUrl",
      "input": [
        {
          "name": "comp",
          "type": "Composition",
          "mode": "source"
        },
        {
          "name": "entry",
          "mode": "target"
        }
      ],
      "rule": [
        {
          "name": "assignFullUrl",
          "source": [
            {
              "context": "comp",
              "element": "id",
              "variable": "id"
            }
          ],
          "target": [
            {
              "context": "entry",
              "element": "fullUrl",
              "transform": "append",
              "parameter": [
                {
                  "valueString": "https://fhir.slade360.co.ke/fhir/Composition/"
                },
                {
                  "valueId": "id"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}