MedicationRequest drug_exposure implemented primary

Prescription/order stage of the medication lifecycle. One FHIR MedicationRequest maps to one OMOP drug_exposure row. MedicationRequest is the richest of the four FHIR medication-event resources for OMOP purposes because it carries dispense, refill, and supply-duration metadata that the other three lack. Type concept 38000177 (Prescription written).

A FHIR instance converts to drug_exposure iff it validates against this profile.
Path Card Type Binding / Fixed Comment
MedicationRequest.status 1..*MS fhir/medicationrequest-statusrequired
MedicationRequest.intent 1..*MS Should be order | original-order | reflex-order | filler-order | instance-order. Proposals/plans do not produce drug_exposure rows.
MedicationRequest.medication[x] 1..*MS CodeableConcept omop-drug-codesrequired
MedicationRequest.subject 1..* Reference Required for drug_exposure.person_id.
MedicationRequest.authoredOn 1..1MS Required for drug_exposure.drug_exposure_start_date / _start_datetime.
ViewDefinition (Stage 1 flattener) omop-medicationrequest-drug-exposure
21 columns · resource MedicationRequest
column name FHIRPath type
id MedicationRequest.id id
drug_rxnorm MedicationRequest.medicationCodeableConcept.coding.where(system='http://www.nlm.nih.gov/research/umls/rxnorm').first().code code
drug_ndc MedicationRequest.medicationCodeableConcept.coding.where(system='http://hl7.org/fhir/sid/ndc').first().code code
drug_atc MedicationRequest.medicationCodeableConcept.coding.where(system='http://www.whocc.no/atc').first().code code
drug_snomed MedicationRequest.medicationCodeableConcept.coding.where(system='http://snomed.info/sct').first().code code
drug_text MedicationRequest.medicationCodeableConcept.text string
subject_id MedicationRequest.subject Reference(Patient)
drug_exposure_start_date MedicationRequest.authoredOn dateTime
drug_exposure_start_datetime MedicationRequest.authoredOn dateTime
drug_exposure_end_date MedicationRequest.dispenseRequest.validityPeriod.end dateTime
drug_exposure_end_datetime MedicationRequest.dispenseRequest.validityPeriod.end dateTime
stop_reason MedicationRequest.statusReason CodeableConcept
refills MedicationRequest.dispenseRequest.numberOfRepeatsAllowed integer
quantity MedicationRequest.dosageInstruction[0].doseAndRate[0].doseQuantity.value decimal
days_supply MedicationRequest.dispenseRequest.expectedSupplyDuration Duration
sig MedicationRequest.dosageInstruction[0].text string
route MedicationRequest.dosageInstruction[0].route CodeableConcept
route_text MedicationRequest.dosageInstruction[0].route.text string
performer_id MedicationRequest.requester Reference(Practitioner)
encounter_id MedicationRequest.encounter Reference(Encounter)
dose_unit_text MedicationRequest.dosageInstruction[0].doseAndRate[0].doseQuantity.unit string
Condition: status in {active, completed} AND intent in {order, original-order, reflex-order, filler-order, instance-order}
Implementation: src/mapper/medication.ts

Fields (23)

Vocabularies

drug_type

Source Display Concept ID Concept Name
MedicationRequest Prescription written 38000177 Prescription written
MedicationRequest (alt: fhir-to-omop-demo) EHR prescription 32838 EHR prescription
MedicationRequest (alt: FhirToCdm/ETL-German) EHR 32817 EHR

drug

Source Display Concept ID Concept Name
RxNorm (http://www.nlm.nih.gov/research/umls/rxnorm) RxNorm - Standard OMOP drug vocabulary (US). Maps directly to drug_concept_id.
ATC (http://www.whocc.no/atc) ATC - Maps via concept_relationship to RxNorm.
NDC (http://hl7.org/fhir/sid/ndc) NDC - National Drug Code (US). Maps to RxNorm via concept_relationship.
SNOMED (http://snomed.info/sct) SNOMED CT product codes - Require mapping to RxNorm via OMOP concept tables.

route

Source Display Concept ID Concept Name
26643006 Oral route 4132161 Oral
47625008 Intravenous route 4171047 Intravenous
78421000 Intramuscular route 4302612 Intramuscular
34206005 Subcutaneous route 4142048 Subcutaneous
46713006 Nasal route 4262099 Nasal
6064005 Topical route 4263689 Topical
37161004 Rectal route 4115462 Rectal
45890007 Transdermal route 4262914 Transdermal

Edge Cases

medicationReference to contained Medication
omoponfhir iterates contained[] to find matching Medication by ID fragment. This project skips (returns null).
medicationReference to external Medication
Requires Bundle-level or server-side resolution. fhir-to-omop-demo merges in post-processing. Most implementations skip.
Multiple dosageInstruction entries
Take first for route and dose. omoponfhir iterates all entries but breaks after first match.
status = entered-in-error
Skip -- do not create drug_exposure row. All implementations agree.
status = stopped
omoponfhir populates stop_reason from statusReason and still creates the row. This project skips.
status = on-hold / draft / unknown
This project skips (only maps active and completed). omoponfhir maps all statuses except entered-in-error.
intent = proposal / plan
This project skips -- only maps order, original-order, reflex-order, filler-order, instance-order. omoponfhir maps all intents.
No end date available
Use start date as end date. Consensus across all implementations.
dispenseRequest absent
No validityPeriod.end, no expectedSupplyDuration, no numberOfRepeatsAllowed available. Fall back to start = end and null days_supply/refills.
expectedSupplyDuration UCUM units
This project converts h, d, wk, mo, a to days. Other UCUM duration codes are not supported.
authoredOn null
NACHC falls back to encounter start date. FhirToCdm derives from VisitOccurrence. This project leaves null.
Multiple codings in medication[x]
This project uses selectBestCoding() by vocabulary priority (RxNorm > ATC > NDC > first). fhir-to-omop-demo warns. omoponfhir iterates all codings against OMOP concept table.
No medication code found
This project returns null (skips). omoponfhir throws FHIRException.
drug_source_value exceeds 50 chars
omoponfhir truncates medicationCodeableConcept.getText() to 50 chars: .substring(0, 50). OMOP CDM field is varchar(50).
stop_reason exceeds 20 chars
omoponfhir truncates: .substring(0, 20). OMOP CDM field is varchar(20).

Reference Implementations