C-CDA on FHIR
2.0.0-ballot - STU 2 Ballot 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 2.0.0-ballot 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 Status

C-CDA may list a medication state (statusCode) 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. C-CDA also provides ambiguous guidance with respect to mood: completed and planned cases are well-defined, but active or ongoing cases are not addressed. We provide maps for both status and mood elements, but care is necessary to ensure C-CDA authors' intentions are understood.

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 (MedicationRequest)

C-CDA¹
Medication Activity substanceAdministration
FHIR
MedicationRequest
Transform Steps
/@negationInd="true" set .doNotPerform=true  
@moodCode .intent CDA coding ↔ FHIR CodeableConcept
Mood to intent
See note above on Medication Status
/id .identifier CDA id ↔ FHIR identifier
/statusCode .status See note above on Medication Status
Pay attention to the definitions of active and completed in the FHIR medicationrequest-status code system.
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 to determine whether frequency or period should be used.
If CDA period contains low and high (e.g. a range like 4-6 hours or 3-4 times a day), map low the same as @value (e.g. to repeat.period or repeat.frequency) and map high to repeat.periodMax or repeat.frequencyMax depending on whether it is a frequency or period.
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
/approachSiteCode .dosageInstruction.site CDA coding ↔ FHIR CodeableConcept
/doseQuantity .dosageInstruction.doseAndRate.doseQuantity CDA ↔ FHIR Quantity
/rateQuantity .dosageInstruction.doseAndRate.rateQuantity CDA ↔ FHIR Quantity
/maxDoseQuantity/numerator .dosageInstruction.maxDosePerPeriod.numerator CDA ↔ FHIR Quantity
/maxDoseQuantity/denominator .dosageInstruction.maxDosePerPeriod.denominator CDA ↔ FHIR Quantity
/administrationUnitCode Medication.form See below
/consumable/manufacturedProduct/manufacturedMaterial/code .medicationCodeableConcept
OR
.medicationReference
CDA coding ↔ FHIR CodeableConcept
Only one of these fields may be populated. When generating a Medication resource (see below), use the medicationReference field.
/consumable/manufacturedProduct/manufacturerOrganization Medication.manufacturer See below
/author .requester
&
Provenance
CDA ↔ FHIR Provenance
/author/time .authoredOn Earliest, if more than one.
CDA ↔ FHIR Time/Dates
Drug Vehicle
/participant[@typeCode="CSM"]/playingEntity/code
Medication.ingredient See below
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.
Supply Order
/entryRelationship[@typeCode="REFR"]/substanceAdministration[@moodCode="INT"]
  Note: moodCode=INT means supply, moodCode=EVN means dispense, which is not documented here.
../effectiveTime/high .dispenseRequest.validityPeriod.end CDA ↔ FHIR Time/Dates
low would similarly map to start, but only high is called out in C-CDA.
../repeatNumber .dispenseRequest.numberOfRepeatsAllowed Caution: in CDA, repeatNumber indicates total number of dispenses allowed. In FHIR, this field is exclusive of the original dispense. So the numberOfRepeatsAllowed will be one less than repeatNumber.
../quantity .dispenseRequest.quantity CDA ↔ FHIR Quantity
Comment Activity
/entryRelationship/act[code/@code="48767-8"]/text
Annotation
.note
See Comment → Annotation
/precondition .asNeededBoolean = true The presence of a precondition element indicates asNeededBoolean should be true.
More complex maps may be possible with .asNeededCodeableConcept.

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

C-CDA to FHIR (Medication)

MedicationRequest (and other resources) may represent the medication as a simple CodeableConcept. But when additional information about the medication needs to be conveyed, a Medication resource should be created instead and referenced by the MedicationRequest resource. Implementers may also opt to always create Medication resources.

C-CDA¹
Medication Activity substanceAdministration
FHIR
Medication
Transform Steps
/administrationUnitCode .form CDA coding ↔ FHIR CodeableConcept
/consumable/manufacturedProduct/manufacturedMaterial/code .code CDA coding ↔ FHIR CodeableConcept
/consumable/manufacturedProduct/manufacturerOrganization Organization
.manufacturer
 
Drug Vehicle
/participant[@typeCode="CSM"]/playingEntity/code
.ingredient.itemCodeableConcept Set .isActive = false
CDA coding ↔ FHIR CodeableConcept

Example

CDA Medication ExampleFHIR MedicationRequest and Medication Resources
<substanceAdministration classCode="SBADM" moodCode="INT"> <templateId root="2.16.840.1.113883.10.20.22.4.16" extension="2014-06-09"/> <templateId root="2.16.840.1.113883.10.20.22.4.16"/> <id root="cdbd33f0-6cde-11db-9fe1-0800200c9a66"/> <statusCode code="active"/> <effectiveTime xsi:type="IVL_TS"> <low value="20120806"/> <high nullFlavor="UNK"/> </effectiveTime> <effectiveTime xsi:type="PIVL_TS" operator="A"> <period xsi:type="IVL_PQ"> <low value="4" unit="h"/> <high value="6" unit="h"/> </period> </effectiveTime> <repeatNumber value="1"/> <routeCode code="C38288" codeSystem="2.16.840.1.113883.3.26.1.1" codeSystemName="NCI Thesaurus" displayName="Oral Route of Administration"/> <doseQuantity value="1"/> <maxDoseQuantity > <numerator value="6" unit="{spray}" /> <denominator value="1" unit="{day}" /> </maxDoseQuantity> <administrationUnitCode code="C48501" codeSystem="2.16.840.1.113883.3.26.1.1" codeSystemName="National Cancer Institute (NCI) Thesaurus" displayName="Inhalation dosing unit"/> <consumable> <manufacturedProduct classCode="MANU"> <templateId root="2.16.840.1.113883.10.20.22.4.23" extension="2014-06-09"/> <templateId root="2.16.840.1.113883.10.20.22.4.23"/> <manufacturedMaterial> <code code="1190220" codeSystem="2.16.840.1.113883.6.88" codeSystemName="RxNorm" displayName="ACTUAT albuterol 0.1 MG/ACTUAT ... Spray"/> </manufacturedMaterial> <manufacturerOrganization> <name>Good Vaccines Inc</name> </manufacturerOrganization> </manufacturedProduct> </consumable> <author> <!-- Time the author noted that patient is on medication --> <templateId root="2.16.840.1.113883.10.20.22.4.119"/> <time value="201309111603-0700"/> <assignedAuthor> <!-- Author maps to Provenance not included in this example --> </assignedAuthor> </author> <participant typeCode="CSM"> <participantRole classCode="MANU"> <templateId root="2.16.840.1.113883.10.20.22.4.24"/> <code code="412307009" displayName="Drug vehicle" codeSystem="2.16.840.1.113883.6.96"/> <playingEntity classCode="MMAT"> <code code="387390002" displayName="sodium chloride" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED"/> <name>sodium chloride</name> </playingEntity> </participantRole> </participant> <entryRelationship typeCode="COMP"> <!-- Medication Free Text SIG --> <substanceAdministration classCode="SBADM" moodCode="EVN"> <templateId root="2.16.840.1.113883.10.20.22.4.147"/> <code code="76662-6" codeSystem="2.16.840.1.113883.6.1"/> <text> <!-- Resolves to: 2 puffs every 4-6 hours as needed --> <reference value="#MedicationSig_PRN_222222"/> </text> <consumable> <manufacturedProduct> <manufacturedLabeledDrug nullFlavor="NA"/> </manufacturedProduct> </consumable> </substanceAdministration> </entryRelationship> <entryRelationship typeCode="RSON"> <observation classCode="OBS" moodCode="EVN"> <!-- Indication (V2) --> <templateId root="2.16.840.1.113883.10.20.22.4.19" extension="2014-06-09"/> <templateId root="2.16.840.1.113883.10.20.22.4.19"/> <id extension="44" root="1.3.6.1.4.1.22812.3.99930.3.4.1.3"/> <code codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" code="404684003" displayName="Clinical finding"/> <statusCode code="completed"/> <effectiveTime> <low nullFlavor="NI"/> </effectiveTime> <value xsi:type="CD" code="56018004" codeSystem="2.16.840.1.113883.6.96" displayName="wheezing" /> </observation> </entryRelationship> <entryRelationship typeCode="SUBJ" inversionInd="true"> <act classCode="ACT" moodCode="INT"> <!-- Instruction (V2) --> <templateId root="2.16.840.1.113883.10.20.22.4.20" extension="2014-06-09"/> <templateId root="2.16.840.1.113883.10.20.22.4.20"/> <code code="1153465004" displayName="Education about overdosing" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT"/> <text>Do not overtake</text> <statusCode code="completed"/> </act> </entryRelationship> <entryRelationship typeCode="REFR"> <supply classCode="SPLY" moodCode="EVN"> <templateId root="2.16.840.1.113883.10.20.22.4.18" extension="2014-06-09" /> <templateId root="2.16.840.1.113883.10.20.22.4.18"/> <id root="1.2.3.4.56789.1" extension="cb734647-fc99-424c-a864-7e3cda82e704" /> <statusCode code="completed" /> <effectiveTime> <high value="20121106" /> </effectiveTime> <!-- Note in FHIR this is one less, so: 1 --> <repeatNumber value="2" /> <quantity value="3" /> <product> <manufacturedProduct classCode="MANU"> <templateId root="2.16.840.1.113883.10.20.22.4.23" extension="2014-06-09"/> <templateId root="2.16.840.1.113883.10.20.22.4.23"/> <id root="2a620155-9d11-439e-92b3-5d9815ff4ee8"/> <manufacturedMaterial> <code code="1190220" codeSystem="2.16.840.1.113883.6.88" codeSystemName="RxNorm" displayName="ACTUAT albuterol 0.1 MG/ACTUAT ... Spray"/> </manufacturedMaterial> </manufacturedProduct> </product> </supply> </entryRelationship> <precondition typeCode="PRCN"> <criterion> <templateId root="2.16.840.1.113883.10.20.22.4.25" extension="2014-06-09" /> <templateId root="2.16.840.1.113883.10.20.22.4.25"/> <code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4" /> <value xsi:type="CD" code="56018004" codeSystem="2.16.840.1.113883.6.96" displayName="Wheezing" /> </criterion> </precondition> </substanceAdministration>
Note: The following shows a MedicationRequest resource with a Medication resource embedded in its contained property. This was done for ease of creating a single, visual, highlighted example, but implementers may choose to create separate, external resources according to their own policy.
{ "resourceType": "MedicationRequest", "id": "7fc60296-0667-4a44-86e5-4c432403532e", "identifier": [ { "system": "urn:ietf:rfc:3986", "value": "urn:uuid:cdbd33f0-6cde-11db-9fe1-0800200c9a66" } ], "status": "active", "intent": "plan", "medicationReference": { "reference": "#containedMed" }, /* Only one of these can be sent. If not including a Medication resource the code can just be sent in codeableConcept "medicationCodeableConcept": { "coding": [ { "system": "http://www.nlm.nih.gov/research/umls/rxnorm", "code": "1190220", "display": "ACTUAT albuterol 0.1 MG/ACTUAT ... Spray" } ] }, */ "subject": { "reference": "Patient/18025725" }, "authoredOn": "2013-09-11T16:03:00-07:00", "reasonCode": [ { "coding": [ { "system": "http://snomed.info/sct", "code": "56018004", "display": "wheezing" } ] } ], "dosageInstruction": [ { "text": "2 puffs every 4-6 hours as needed", "patientInstruction": "Do not overtake", "additionalInstruction": [ { "coding": [ { "system": "http://snomed.info/sct", "code": "1153465004", "display": "Education about overdosing" } ] } ], "timing": { "period": 4, "periodMax": 6, "periodUnit": "h" }, "asNeededCodeableConcept": { "coding": [ { "system": "http://snomed.info/sct", "code": "56018004", "display": "wheezing" } ] }, "route": { "coding": [ { "system": "http://ncithesaurus-stage.nci.nih.gov", "code": "C38288", "display": "Oral Route of Administration" } ] }, "doseAndRate": [ { "doseQuantity": { "value": 1 } } ], "maxDosePerPeriod": { "numerator": { "value": 6, "unit": "{spray}", "code": "{spray}", "system": "http://unitsofmeasure.org" }, "denominator": { "value": 1, "unit": "{day}", "code": "{day}", "system": "http://unitsofmeasure.org" } } } ], "dispenseRequest": { "numberOfRepeatsAllowed": 1, "validityPeriod": { "end": "2012-11-06" }, "quantity": { "value": 3 } }, "contained": [{ "resourceType": "Medication", "id": "containedMed", "code": { "coding": [{ "system": "http://www.nlm.nih.gov/research/umls/rxnorm", "code": "1190220", "display": "ACTUAT albuterol 0.1 MG/ACTUAT ... Spray" }] }, "form": { "coding": [ { "system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl", "code": "C48501", "display": "Inhalation dosing unit" } ] }, "manufacturer": { // If more details exist, would map to Organization resource "display": "Good Vaccines Inc" }, "ingredient": [{ "itemCodeableConcept": { "coding": [ { "system": "http://snomed.info/sct", "code": "387390002", "display": "sodium chloride" } ] } }] }] }

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