Medication Statement Profile¶
| Canonical | ../StructureDefinition/nexus-emr-core-medicationstatement |
|---|---|
| Status | draft (experimental) · 1.26.0 |
| Base | MedicationStatement (constraint) |
| Source | FSH · JSON |
Nexus EMR profile for MedicationStatement -- patient-reported medication use, distinct from prescriptions. First pass: status, text-first medication concept, effective timing, free-text dosage. Closed to SMART apps pending an exposure decision.
FSH
The authored source of truth: resources/StructureDefinition-nexus-emr-core-medicationstatement.fsh (edit on GitHub). One FSH file may define several related artifacts.
// NexusEmrCoreMedicationStatement.fsh
// FIRST PASS (FHIR-29). What the patient SAYS they take -- distinct from what was prescribed.
//
// CONSUMER: the AI harness's read list names MedicationStatement among the Patient Summary
// Domains, and med-reconciliation extraction ("patient reports taking...") is
// statement-shaped, not request-shaped.
//
// FIRST-PASS SCOPE: status, the medication as a CodeableConcept (text-first, same posture as
// MedicationRequest), effective timing, free-text dosage. Deliberately NOT settled:
// medicationReference (no Medication catalog exists in the platform), derivedFrom/basedOn
// chains to the originating prescription, and adherence/statusReason vocabularies.
//
// SMART EXPOSURE: deliberately NOT declared -- closed to apps pending a decision (FHIR-28 policy).
Alias: $NexusEmrCoreMedicationStatement = ../StructureDefinition/nexus-emr-core-medicationstatement
Profile: NexusEmrCoreMedicationStatement
Parent: MedicationStatement
Id: nexus-emr-core-medicationstatement
Title: "Medication Statement Profile"
Description: "Nexus EMR profile for MedicationStatement -- patient-reported medication use, distinct from prescriptions. First pass: status, text-first medication concept, effective timing, free-text dosage. Closed to SMART apps pending an exposure decision."
* ^url = $NexusEmrCoreMedicationStatement
* ^status = #draft
* insert NoResourceNoteExtension
* ^experimental = true
* insert EffectiveDate([[effectiveDateTime | effectivePeriod.start | dateAsserted]])
// Salient fields -- the reader/render surface (see SalientField + the Salient RuleSet). Same shape
// as MedicationRequest, because the two answer the same question about a drug from two sources:
// a consumer reading a chart should not have to learn a second vocabulary for what the patient
// reports taking. `status` is the one to read first here -- `not-taken` inverts the statement.
* insert Salient(medication, [[medicationCodeableConcept.text | medicationCodeableConcept.coding.first().display]], string)
* insert SalientComment([[Text first, then the first coding's display. `medication[x]` is constrained to CodeableConcept on this profile, so there is no reference arm to fall back to.]])
* insert Salient(status, status, code)
* insert Salient(dosage, [[dosage.first().text]], string)
* insert SalientComment([[The FIRST dosage's free text. `dosage` is 0..*; a statement carrying more than one regimen surfaces only the first here, and the rest stay reachable through the typed collection.]])
* insert Salient(effective, [[effectiveDateTime | effectivePeriod.start]], dateTime)
* insert SalientComment([[When the reported use APPLIES -- the dateTime, or the start of the period. This is not when the statement was captured; that is `asserted`.]])
* insert Salient(asserted, [[dateAsserted]], dateTime)
* insert Salient(reason_code, reasonCode, coded)
* . ^short = "Nexus EMR Medication Statement Core"
* status 1..1 MS
* status ^short = "active | completed | entered-in-error | intended | stopped | on-hold | unknown | not-taken"
* status ^comment = "This is a modifier element; `not-taken` inverts the meaning of the whole statement and consumers must read it."
* medication[x] 1..1 MS
* medication[x] only CodeableConcept
* medication[x] ^short = "The medication the patient reports taking"
* medication[x] ^comment = "Text carries readability; product (DIN) and ingredient (CCDD/ATC) codings are optional. Where this code was mapped from a source system's own vocabulary, carry the raw coding alongside the mapped one, flagged `userSelected = true`. See [Carrying the raw code](../guide/patterns/raw-codes.md)."
* medication[x] ^definition = """
First pass constrains to CodeableConcept: the platform has no Medication catalog resource to reference, and patient-reported meds frequently arrive as free text.
Carry `text` for readability. Where the source has codes, carry them at both levels: an ingredient-level code (CCDD preferred, otherwise the Health Canada DPD active-ingredient group number, with ATC for class-level records) is what lets a patient-reported medication be compared against a prescription or against a recorded allergy, and a DIN says which marketed product the patient named. Both slices are optional -- a patient report often has neither -- and neither is to be synthesized from the text.
"""
// Drug identity at both levels, the same model MedicationRequest and MedicationDispense carry.
// See the MedicationCoding RuleSet for what each level answers.
* insert MedicationCoding(medicationCodeableConcept)
* subject 1..1 MS
* subject only Reference(NexusEmrCorePatient)
* subject ^short = "The patient"
* effective[x] 0..1 MS
* effective[x] ^short = "When the use applies (dateTime or period)"
* dateAsserted 0..1 MS
* dateAsserted ^short = "When the statement was captured"
* dosage 0..* MS
* dosage.text 0..1 MS
* dosage.text ^short = "Free-text dosage ('81 mg daily') -- the first-pass dosage surface"