C-CDA on FHIR
1.2.0 - STU 1 United States of America flag

C-CDA on FHIR, published by HL7 International / Cross-Group Projects. This guide is not an authorized publication; it is the continuous build for version 1.2.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/ccda-on-fhir/ and changes regularly. See the Directory of published versions

C-CDA to FHIR Medications

This page provides a mapping from CDA to FHIR. For the FHIR to CDA mapping, please refer to Medications FHIR → CDA. For guidance on how to read the table below, see Reading the C-CDA ↔ FHIR Mapping Pages

Medications to MedicationRequest

Medications shown below represent the moodCode="INT" in CDA. For mapping histories of medication use from CDA, no consensus was established. We welcome feedback on this topic. For more information, please see chat.fhir.org and related stream

Medication Timing and Frequency

C-CDA represents both timing (start date / end date) and frequency (when and how often to take) using <effectiveTime> elements. The first (represented in XPath as /effectiveTime[1]) represents the timing. If it contains <low> and/or <high> timestamps, this represents the .timing.repeat.boundsPeriod information of MedicationRequest.dosageInstruction. If, instead, the first effectiveTime only contains a single @value attribute, it represents a .timing.event dateTime value.

The second <effectiveTime> represents the frequency and contains the attribute @operator="A" to indicate it is an intersection with the first effectiveTime. It must also have an @xsi:type attribute which identifies the type of frequency as PIVL_TS (Periodic Interval) or EIVL_TS (Episodic Interval). PIVL_TS is the most common and represents a frequency corresponding to .timing.repeat.frequency / .timing.repeat.period / .timing.repeat.periodUnit. These relationship of three fields is described in FHIR: “Event occurs frequency times per period”. For example: “Every 8 hours” would become 1 / 8 / h (one time every eight hours), while “TID” would become 3 / 1 / d (three times every one day).

EIVL_TS represents an event-based frequency, such as “1 hour after meal”. The CDA <event code="xx"> corresponds to FHIR’s .timing.when and the optional <offset> corresponds to .timing.offset.

The C-CDA Example Search site maintains a document of Common Medication Frequencies which can be cross-referenced with a similar table in FHIR’s Timing Data Type to properly map CDA frequencies to FHIR timing values.

C-CDA to FHIR

C-CDA¹
Medication Activity substanceAdministration
FHIR
MedicationRequest
Transform Steps
/@negationInd=”true” set .doNotPerform=true  
@moodCode .intent CDA coding ↔ FHIR CodeableConcept
Mood to intent
/id .identifier CDA id ↔ FHIR identifier
/statusCode .status Pay attention to the definitions of active and completed in the FHIR medicationrequest-status code system. C-CDA may list a medication state as “completed” (i.e. the prescription writing has been completed), but containing dates in the future. This may more align with a FHIR status of “active” than “completed” which indicates all actions implied by the prescription have been completed
CDA statusCode → FHIR status
/effectiveTime[1]/@value .dosageInstruction.timing.event Constraint: Use this when effectiveTime@value is populated
CDA ↔ FHIR Time/Dates
/effectiveTime[1]/low .dosageInstruction.timing.repeat.boundsPeriod.start Constraint: Use this when effectiveTime/@value is not populated
CDA ↔ FHIR Time/Dates
/effectiveTime[1]/high .dosageInstruction.timing.repeat.boundsPeriod.end Constraint: Use this when effectiveTime/@value is not populated
CDA ↔ FHIR Time/Dates
Periodic Frequency
/effectiveTime[operator=”A” and xsi:type=”PIVL_TS”]
…/@institutionSpecified
…/period/@value
…/period/@unit
.dosageInstruction.timing.repeat.frequency
.dosageInstruction.timing.repeat.period
.dosageInstruction.timing.repeat.periodUnit
Compare:
C-CDA Common Medication Frequencies and
FHIR Timing Data Type
Event-Based Timing
/effectiveTime[operator=”A” and xsi:type=”EIVL_TS”]
…/event/@code
…/offset
.dosageInstruction.timing.repeat.when
.dosageInstruction.timing.repeat.offset
@code vocabulary matches .when
CDA offset must be converted to minutes for FHIR
/routeCode .dosageInstruction.route CDA coding ↔ FHIR CodeableConcept
/doseQuantity .dosageInstruction.doseAndRate.doseQuantity CDA ↔ FHIR Quantity
/rateQuantity .dosageInstruction.doseAndRate.rateQuantity CDA ↔ FHIR Quantity
/consumable/manufacturedProduct/manufacturedMaterial/code .medicationCodeableConcept CDA coding ↔ FHIR CodeableConcept
/author .requester
&
Provenance
CDA ↔ FHIR Provenance
/author/time .authoredOn Earliest, if more than one.
CDA ↔ FHIR Time/Dates
/precondition .asNeededBoolean = true The presence of a precondition element indicates asNeededBoolean should be true.
More complex maps may be possible with .asNeededCodeableConcept.
Indication
/entryRelationship[@typeCode=”RSON”]/observation/value
.reasonCode CDA coding ↔ FHIR CodeableConcept
Free text sig
/entryRelationship/substanceAdministration[code/@code=”76662-6”]/text
.dosageInstruction.text  
Instruction Activity
/entryRelationship[@typeCode=”SUBJ” and @inversionInd=”true”]/act
.dosageInstruction.patientInstruction
.dosageInstruction.additionalInstruction
act/text or act/code/originalText can map to patientInstructions. If coded, can map to additionalInstruction.
Comment Activity
/entryRelationship/act[code/@code=”48767-8”]/text
Annotation
.note
 

1. XPath abbrievated for C-CDA Medication Activity as:
ClinicalDocument/component/structuredBody/component/section[code/@code=”10160-0”]/entry/substanceAdministration

Illustrative example

An illustrative example with highlighting is shown above based on the consensus of mapping and guidance. Not all possible elements in CDA or FHIR may be represented. To access the content for the above example, click on the links below.


The consensus mapping example developed through multiple vendors are available below:

Prior work and Expanded Spreadsheets

As reviewed in the methodology, a more comprehensive review was performed via spreadsheets. These spreadsheets have been consolidated and further revised in the tables above but are provided for reference here