FHIR to CDISC Joint Mapping Implementation Guide
1.0.0 - STU 1

FHIR to CDISC Joint Mapping Implementation Guide, published by HL7 International - BR&R Work Group. This is not an authorized publication; it is the continuous build for version 1.0.0). This version is based on the current content of https://github.com/HL7/fhir-cdisc-mapping/ and changes regularly. See the Directory of published versions

Procedures

Procedures, in FHIR, use the Procedure resource. However, like Observations, the notion of Procedure is quite broad. It includes counseling, education and physio-therapy as well as more traditional concepts such as surgery. One area of interest relevant to CDISC mapping that has not yet been decided in the FHIR standard is how best to handle the ordering and administration of non-drug therapies that involve the notion of 'dose' - for example radiation, light therapy, etc. Options being considered include expanding the scope of the Medication resources, adding dose elements or extensions to Procedure, or defining a separate set of resources. Because this area is not yet settled, no mappings are provided for the dose-relevant elements.

In some cases, procedure information may be captured only in document form (as DocumentReferences) or as the associated Encounter. Because of the limited metadata available in these, no mappings are provided.

PR Mappings

Guidance on interpreting the tables can be found here.

CDISC FHIR map (or gap) Comment
Label CDASH SDTM Element FHIRPath
Study Identifier STUDYID
Core: HR
Type: Char
STUDYID
Core: Req
Type: Char
ResearchStudy.identifier
0..* Identifier

ResearchSubject.where(subject=Observation.subject).study.resolve().partOf.resolve().identifier

Procedure.extension(workflow-researchstudy).valueReference.resolve().partOf.resolve().identifier

Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy.

The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage.
Study Site Identifier SITEID
Core: HR
Type: Char
DM.SITEID
Core: Req
Type: Char
ResearchStudy.site
0..* Reference

ResearchSubject.where(subject=Observation.subject).study.resolve().identifier

Procedure.extension(workflow-researchstudy).valueReference.resolve().identifier

Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy.

The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study.
Subject Identifier for the Study SUBJID
Core: HR
Type: Char
DM.SUBJID
Core: Req
Type: Char
ResearchSubject.identifier
0..* Identifier

ResearchSubject.where(individual=Procedure.subject).identifier

Study subject is found by finding the StudySubject that corresponds to the same Patient and ResearchStudy as the Procedure.

No standard way to decide which subject identifier to use
Any Procedures Performed PRYN
Core: O
Type: Char
In FHIR, this would be determined by searching for Procedures with a given subject (possibly also filtered by research study) and excluding those that were entered in error. It might also be necessary to search for education, massage, cognitive therapy and various other data to determine all procedures.
Procedure Category PRCAT
Core: O
Type: Char
PRCAT
Core: Perm
Type: Char
Procedure.category
0..1 CodeableConcept
Binding: ProcedureCategory example

Procedure.category

FHIR doesn't have 2 distinct category levels. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT. A standard extension will be needed to convey multiple repetitions in R4. (Procedure.category does repeat in the draft of R5) The SNOMED binding is an example, which means that any codes can be used. Even if the binding were stronger, alternate codes would be possible on other repetitions.
Procedure Subcategory PRSCAT
Core: O
Type: Char
PRSCAT
Core: Perm
Type: Char
Procedure.category
0..1 CodeableConcept
Binding: ProcedureCategory example

Procedure.category

FHIR doesn't have 2 distinct category levels. Instead, Procedure.category repeats. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT.
Procedure Sponsor-Defined Identifier PRSPID
Core: O
Type: Char
PRSPID
Core: Perm
Type: Char
Procedure.identifier
0..* Identifier

Procedure.identifier

Reported Name of Procedure PRTRT
Core: HR
Type: Char
PRTRT
Core: Req
Type: Char
Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code.coding.display | Procedure.code.text

The name as expressed by or displayed to the user goes in code.text. The name associated with the selected code goes in code.coding.display.
Standardized Procedure Name PRDECOD
Core: O
Type: Char
PRDECOD
Core: Perm
Type: Char
Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Translation of the source-system-determined procedure code to the study-defined value set may need to be performed by the sponsor.

PRDECOD is the dictionary or the sponsor-defined standardized text description of PRTRT, or the modified topic variable (PRMODIFY), if applicable. This means it is the standardized term for the procedure.
Modified Procedure Name PRMODIFY
Core: O
Type: Char
PRMODIFY* Coding translations are conducted by the sponsor.

In FHIR, there's no need to modify the PRTERM. The text which was actually saw/typed (errors and all) is present and the various codes encoding it and the display names for those codes. If there was a need to capture a corrected text that was submitted to a post-coding process, that would be an extension
Procedure prespecified PRPRESP
Core: O
Type: Char
PRPRESP
Core: Perm
Type: Char
This likely to be a Questionnaire question than something that would directly be captured in a record. This could possibly be an extension on the Procedure/MedicationAdministration/MedicationStatement.
Procedure Occurrence PROCCUR
Core: O
Type: Char
PROCCUR
Core: Perm
Type: Char
Procedure.status
1..1 code
Binding: ProcedureStatus required

Procedure.status

Coding translations are left to the sponsor.

Status of 'not-done', 'entered-in-error' would indicate that it didn't happen, 'active', 'in-progress', 'on-hold', 'completed' would indicate that it did. 'stopped' would indicate that it started, but was abnormally terminated - where that should go depends on the study's definition of 'occur'.
Procedure Reason for Occur Value PRREASOC
Core: O
Type: Char
SUPPPR.QVAL Procedure.reasonCode
0..* CodeableConcept
Binding: ProcedureReason example

Procedure.reasonCode

Note that reasonReference would need to be turned into a code or string. Reason[x] indicates reason for doing the procedure; statusReason when status=not-done would be reason for non-occurrence
Procedure.reasonReference
0..* Reference

Procedure.reasonReference

Procedure.statusReason
0..1 CodeableConcept
Binding: ProcedureNegationReason example

Procedure.statusReason

Procedure Reason Not Done PRREASND
Core: O
Type: Char
PRREASND* Procedure.statusReason
0..1 CodeableConcept
Binding: ProcedureNegationReason example

Procedure.statusReason.where(%resource.status IN {'not-done'| 'stopped'})

Prior Procedure PRPRIOR
Core: O
Type: Char
PRSTRTPT
Core: Perm
Type: Char
values: AFTER, BEFORE, COINCIDENT, UPRSTRF*
Procedure.performedDateTime
0..1 dateTime

Procedure.performedDateTime.extension('cqf-relativeDateTime').extension(relationship).valueCode

Typically, this extension won't exist, or won't be expressed relative to the subjects participation in the study. In such cases, the value for this element will need to be derived by the sponsor through comparision of procedure dates with study participation dates. If available, then the codes 'before-start' and 'before' map to 'true' and the rest map to false.
Procedure Start Date PRSTDAT
Core: R/C
Type: Char
PRSTDTC
Core: Exp
Type: Char
values: ISO 8601
Procedure.performedDateTime
0..1 dateTime

Procedure.performedDateTime

FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific start time.
Procedure.performedPeriod
0..1 Period

Procedure.performedPeriod.start

Procedure.performedRange
0..1 Range

Procedure.performedRange.low

Ongoing Procedure PRONGO
Core: O
Type: Char
PRENRTPT
Core: Perm
Type: Char
values: AFTER, BEFORE, COINCIDENT, ONGOING, UPRENRF*
Procedure.status
1..1 code
Binding: ProcedureStatus required

Procedure.status

This supports the necessity of separating procedures and medication.

An example of ongoing procedure, "hemodialysis with frequency of three times a week". If the status is 'in-progress'/'active', then it's ongoing.
Procedure End Date PRENDAT
Core: R/C
Type: Char
PRENDTC
Core: Perm
Type: Char
values: ISO 8601
Procedure.performedDateTime
0..1 dateTime

Procedure.performedDateTime

FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific end time.
Procedure.performedPeriod
0..1 Period

Procedure.performedPeriod.end

Procedure.performedRange
0..1 Range

Procedure.performedRange.high

Procedure Indication PRINDC
Core: O
Type: Char
PRINDC
Core: Perm
Type: Char
Procedure.reasonCode
0..* CodeableConcept
Binding: ProcedureReason example

Procedure.reasonCode

Note that reasonReference would need to be turned into a code or string.
Procedure.reasonReference
0..* Reference

Procedure.reasonReference

Related Adverse Event ID PRAENO
Core: O
Type: Char
AdverseEvent.identifier
0..1 Identifier

Procedure.reasonReference.resolve().where(type='AdverseEvent').identifier

Related Medical History Event ID PRMHNO
Core: O
Type: Char
If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping.
Dose Description PRDOSTXT
Core: Perm
Type: Char
If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping.
Procedure Dose Unit PRDOSU
Core: O
Type: Char
PRDOSU
Core: Perm
Type: Char
If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping.
Procedure Frequency per Interval PRDOSFRQ
Core: O
Type: Char
Procedure.extension
0..* Extension

Procedure.extension('R5/occurrenceTiming').repeat.frequency

Procedure Route of Administration PRROUTE
Core: O
Type: Char
PRROUTE
Core: Perm
Type: Char
This is a known gap. Procedure Route of Administration interval does NOT exist for 'Procedure'.
Location of Procedure PRLOC
Core: O
Type: Char
PRLOC
Core: Perm
Type: Char
Procedure.bodySite
0..* CodeableConcept
Binding: BodySite example

Procedure.bodySite

Procedure Laterality PRLAT
Core: O
Type: Char
PRLAT
Core: Perm
Type: Char
BodyStructure.locationQualifier
0..* CodeableConcept
Binding: BodyStructureQualifier example

Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier

This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Laterality will need to be recognized by code and/or system
Procedure Directionality PRDIR
Core: O
Type: Char
PRDIR
Core: Perm
Type: Char
BodyStructure.locationQualifier
0..* CodeableConcept
Binding: BodyStructureQualifier example

Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier

This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Directionality will need to be recognized by code and/or system
Procedure Portion or Totality PRPORTOT
Core: O
Type: Char
PRPORTOT
Core: Perm
Type: Char
Typically this would be pre-coordinated into Procedure.code and would be captured in dosage instructions text for medications. If captured as a separate element, if would need to be an extension.
Procedure Fasting Status PRFAST
Core: O
Type: Char
PRFAST* This would be handled as an extension. Could propose as standard extension.
Procedure Intended Dose Regimen PRDOSRGM
Core: O
Type: Char
PRDOSRGM
Core: Perm
Type: Char
An administration could be based on more than one thing (recommendation, plan, order) and in theory the intended dose would be different for each.
Procedure Adjusted PRDOSADJ
Core: O
Type: Char
This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension.
Reason for Procedure Adjustment PRADJ
Core: O
Type: Char
PRADJ* This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension.
Completed Procedure PRTRTCMP
Core: O
Type: Char
SUPPPR.QVAL Not all potential mapping/FHIR resources/attributes will be addressed in this implementation guide. All data requires review and analysis to ensure the data is relevant and understood.
Procedure Interrupted PRITRPYN
Core: O
Type: Char
Procedure.status
1..1 code
Binding: ProcedureStatus required

Procedure.status

If something is currently interrupted, the status would either be on-hold or stopped. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history.
Reason Procedure Interrupted PRITRPRS
Core: O
Type: Char
SUPPPR.QVAL Procedure.statusReason
0..1 CodeableConcept
Binding: ProcedureNegationReason example

Procedure.statusReason

If the status is on-hold or stopped, statusReason would convey the reason. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history.
Procedure Interruption Duration PRCINTD
Core: O
Type: Char
SUPPPR.QVAL This would have to be an extension. Typically, you'd just look at history to see when something was suspended, then resumed.
Procedure Interruption Duration Units PRCINTDU
Core: O
Type: Char
SUPPPR.QVAL This would have to be part of the previous extension. Typically, reviewing the history of the procedure will indicate if it was suspended and then resumed.
Procedure Lowest Level Term PRLLT
Core: O
Type: Char
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR source data.

Procedure.code can contain many codings and at various levels of granularity. Granularity will be determined by reviewing the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure Lowest Level Term Code PRLLTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR soure data.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities) Note: Not clear how many of these would be populated for a procedure.
Procedure Preferred Term Code PRPTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Term PRHLT
Core: O
Type: Char
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Term Code PRHLTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Group Term PRHLGT
Core: O
Type: Char
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Group Term Code PRHLGTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
PR Primary System Organ Class PRSOC
Core: O
Type: Char
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
PR Primary System Organ Class Code PRSOCCD
Core: O
Type: Num
SUPPPR.QVAL Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
FHIR map (or gap) CDISC Comment
Label Element FHIRPath CDASH SDTM
Study Identifier ResearchStudy.identifier
0..* Identifier

ResearchSubject.where(subject=Observation.subject).study.resolve().partOf.resolve().identifier

Procedure.extension(workflow-researchstudy).valueReference.resolve().partOf.resolve().identifier

STUDYID
Core: HR
Type: Char
STUDYID
Core: Req
Type: Char
Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy.

The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage.
Study Site Identifier ResearchStudy.site
0..* Reference

ResearchSubject.where(subject=Observation.subject).study.resolve().identifier

Procedure.extension(workflow-researchstudy).valueReference.resolve().identifier

SITEID
Core: HR
Type: Char
DM.SITEID
Core: Req
Type: Char
Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy.

The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study.
Subject Identifier for the Study ResearchSubject.identifier
0..* Identifier

ResearchSubject.where(individual=Procedure.subject).identifier

SUBJID
Core: HR
Type: Char
DM.SUBJID
Core: Req
Type: Char
Study subject is found by finding the StudySubject that corresponds to the same Patient and ResearchStudy as the Procedure.

No standard way to decide which subject identifier to use
Any Procedures Performed In FHIR, this would be determined by searching for Procedures with a given subject (possibly also filtered by research study) and excluding those that were entered in error. It might also be necessary to search for education, massage, cognitive therapy and various other data to determine all procedures. PRYN
Core: O
Type: Char
Procedure Category Procedure.category
0..1 CodeableConcept
Binding: ProcedureCategory example

Procedure.category

PRCAT
Core: O
Type: Char
PRCAT
Core: Perm
Type: Char
FHIR doesn't have 2 distinct category levels. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT. A standard extension will be needed to convey multiple repetitions in R4. (Procedure.category does repeat in the draft of R5) The SNOMED binding is an example, which means that any codes can be used. Even if the binding were stronger, alternate codes would be possible on other repetitions.
Procedure Subcategory Procedure.category
0..1 CodeableConcept
Binding: ProcedureCategory example

Procedure.category

PRSCAT
Core: O
Type: Char
PRSCAT
Core: Perm
Type: Char
FHIR doesn't have 2 distinct category levels. Instead, Procedure.category repeats. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT.
Procedure Sponsor-Defined Identifier Procedure.identifier
0..* Identifier

Procedure.identifier

PRSPID
Core: O
Type: Char
PRSPID
Core: Perm
Type: Char
Reported Name of Procedure Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code.coding.display | Procedure.code.text

PRTRT
Core: HR
Type: Char
PRTRT
Core: Req
Type: Char
The name as expressed by or displayed to the user goes in code.text. The name associated with the selected code goes in code.coding.display.
Standardized Procedure Name Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRDECOD
Core: O
Type: Char
PRDECOD
Core: Perm
Type: Char
Translation of the source-system-determined procedure code to the study-defined value set may need to be performed by the sponsor.

PRDECOD is the dictionary or the sponsor-defined standardized text description of PRTRT, or the modified topic variable (PRMODIFY), if applicable. This means it is the standardized term for the procedure.
Modified Procedure Name Coding translations are conducted by the sponsor.

In FHIR, there's no need to modify the PRTERM. The text which was actually saw/typed (errors and all) is present and the various codes encoding it and the display names for those codes. If there was a need to capture a corrected text that was submitted to a post-coding process, that would be an extension
PRMODIFY
Core: O
Type: Char
PRMODIFY*
Procedure prespecified This likely to be a Questionnaire question than something that would directly be captured in a record. This could possibly be an extension on the Procedure/MedicationAdministration/MedicationStatement. PRPRESP
Core: O
Type: Char
PRPRESP
Core: Perm
Type: Char
Procedure Occurrence Procedure.status
1..1 code
Binding: ProcedureStatus required

Procedure.status

PROCCUR
Core: O
Type: Char
PROCCUR
Core: Perm
Type: Char
Coding translations are left to the sponsor.

Status of 'not-done', 'entered-in-error' would indicate that it didn't happen, 'active', 'in-progress', 'on-hold', 'completed' would indicate that it did. 'stopped' would indicate that it started, but was abnormally terminated - where that should go depends on the study's definition of 'occur'.
Procedure Reason for Occur Value Procedure.reasonCode
0..* CodeableConcept
Binding: ProcedureReason example

Procedure.reasonCode

PRREASOC
Core: O
Type: Char
SUPPPR.QVAL Note that reasonReference would need to be turned into a code or string. Reason[x] indicates reason for doing the procedure; statusReason when status=not-done would be reason for non-occurrence
Procedure.reasonReference
0..* Reference

Procedure.reasonReference

Procedure.statusReason
0..1 CodeableConcept
Binding: ProcedureNegationReason example

Procedure.statusReason

Procedure Reason Not Done Procedure.statusReason
0..1 CodeableConcept
Binding: ProcedureNegationReason example

Procedure.statusReason.where(%resource.status IN {'not-done'| 'stopped'})

PRREASND
Core: O
Type: Char
PRREASND*
Prior Procedure Procedure.performedDateTime
0..1 dateTime

Procedure.performedDateTime.extension('cqf-relativeDateTime').extension(relationship).valueCode

PRPRIOR
Core: O
Type: Char
PRSTRTPT
Core: Perm
Type: Char
values: AFTER, BEFORE, COINCIDENT, UPRSTRF*
Typically, this extension won't exist, or won't be expressed relative to the subjects participation in the study. In such cases, the value for this element will need to be derived by the sponsor through comparision of procedure dates with study participation dates. If available, then the codes 'before-start' and 'before' map to 'true' and the rest map to false.
Procedure Start Date Procedure.performedDateTime
0..1 dateTime

Procedure.performedDateTime

PRSTDAT
Core: R/C
Type: Char
PRSTDTC
Core: Exp
Type: Char
values: ISO 8601
FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific start time.
Procedure.performedPeriod
0..1 Period

Procedure.performedPeriod.start

Procedure.performedRange
0..1 Range

Procedure.performedRange.low

Ongoing Procedure Procedure.status
1..1 code
Binding: ProcedureStatus required

Procedure.status

PRONGO
Core: O
Type: Char
PRENRTPT
Core: Perm
Type: Char
values: AFTER, BEFORE, COINCIDENT, ONGOING, UPRENRF*
This supports the necessity of separating procedures and medication.

An example of ongoing procedure, "hemodialysis with frequency of three times a week". If the status is 'in-progress'/'active', then it's ongoing.
Procedure End Date Procedure.performedDateTime
0..1 dateTime

Procedure.performedDateTime

PRENDAT
Core: R/C
Type: Char
PRENDTC
Core: Perm
Type: Char
values: ISO 8601
FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific end time.
Procedure.performedPeriod
0..1 Period

Procedure.performedPeriod.end

Procedure.performedRange
0..1 Range

Procedure.performedRange.high

Procedure Indication Procedure.reasonCode
0..* CodeableConcept
Binding: ProcedureReason example

Procedure.reasonCode

PRINDC
Core: O
Type: Char
PRINDC
Core: Perm
Type: Char
Note that reasonReference would need to be turned into a code or string.
Procedure.reasonReference
0..* Reference

Procedure.reasonReference

Related Adverse Event ID AdverseEvent.identifier
0..1 Identifier

Procedure.reasonReference.resolve().where(type='AdverseEvent').identifier

PRAENO
Core: O
Type: Char
Related Medical History Event ID If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. PRMHNO
Core: O
Type: Char
Dose Description If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. PRDOSTXT
Core: Perm
Type: Char
Procedure Dose Unit If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. PRDOSU
Core: O
Type: Char
PRDOSU
Core: Perm
Type: Char
Procedure Frequency per Interval Procedure.extension
0..* Extension

Procedure.extension('R5/occurrenceTiming').repeat.frequency

PRDOSFRQ
Core: O
Type: Char
Procedure Route of Administration This is a known gap. Procedure Route of Administration interval does NOT exist for 'Procedure'. PRROUTE
Core: O
Type: Char
PRROUTE
Core: Perm
Type: Char
Location of Procedure Procedure.bodySite
0..* CodeableConcept
Binding: BodySite example

Procedure.bodySite

PRLOC
Core: O
Type: Char
PRLOC
Core: Perm
Type: Char
Procedure Laterality BodyStructure.locationQualifier
0..* CodeableConcept
Binding: BodyStructureQualifier example

Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier

PRLAT
Core: O
Type: Char
PRLAT
Core: Perm
Type: Char
This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Laterality will need to be recognized by code and/or system
Procedure Directionality BodyStructure.locationQualifier
0..* CodeableConcept
Binding: BodyStructureQualifier example

Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier

PRDIR
Core: O
Type: Char
PRDIR
Core: Perm
Type: Char
This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Directionality will need to be recognized by code and/or system
Procedure Portion or Totality Typically this would be pre-coordinated into Procedure.code and would be captured in dosage instructions text for medications. If captured as a separate element, if would need to be an extension. PRPORTOT
Core: O
Type: Char
PRPORTOT
Core: Perm
Type: Char
Procedure Fasting Status This would be handled as an extension. Could propose as standard extension. PRFAST
Core: O
Type: Char
PRFAST*
Procedure Intended Dose Regimen An administration could be based on more than one thing (recommendation, plan, order) and in theory the intended dose would be different for each. PRDOSRGM
Core: O
Type: Char
PRDOSRGM
Core: Perm
Type: Char
Procedure Adjusted This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension. PRDOSADJ
Core: O
Type: Char
Reason for Procedure Adjustment This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension. PRADJ
Core: O
Type: Char
PRADJ*
Completed Procedure Not all potential mapping/FHIR resources/attributes will be addressed in this implementation guide. All data requires review and analysis to ensure the data is relevant and understood. PRTRTCMP
Core: O
Type: Char
SUPPPR.QVAL
Procedure Interrupted Procedure.status
1..1 code
Binding: ProcedureStatus required

Procedure.status

PRITRPYN
Core: O
Type: Char
If something is currently interrupted, the status would either be on-hold or stopped. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history.
Reason Procedure Interrupted Procedure.statusReason
0..1 CodeableConcept
Binding: ProcedureNegationReason example

Procedure.statusReason

PRITRPRS
Core: O
Type: Char
SUPPPR.QVAL If the status is on-hold or stopped, statusReason would convey the reason. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history.
Procedure Interruption Duration This would have to be an extension. Typically, you'd just look at history to see when something was suspended, then resumed. PRCINTD
Core: O
Type: Char
SUPPPR.QVAL
Procedure Interruption Duration Units This would have to be part of the previous extension. Typically, reviewing the history of the procedure will indicate if it was suspended and then resumed. PRCINTDU
Core: O
Type: Char
SUPPPR.QVAL
Procedure Lowest Level Term Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRLLT
Core: O
Type: Char
SUPPPR.QVAL Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR source data.

Procedure.code can contain many codings and at various levels of granularity. Granularity will be determined by reviewing the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure Lowest Level Term Code Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRLLTCD
Core: O
Type: Num
SUPPPR.QVAL Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR soure data.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities) Note: Not clear how many of these would be populated for a procedure.
Procedure Preferred Term Code Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRPTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Term Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRHLT
Core: O
Type: Char
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Term Code Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRHLTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Group Term Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRHLGT
Core: O
Type: Char
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
Procedure High Level Group Term Code Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRHLGTCD
Core: O
Type: Num
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
PR Primary System Organ Class Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRSOC
Core: O
Type: Char
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).
PR Primary System Organ Class Code Procedure.code
0..1 CodeableConcept
Binding: ProcedureCode example

Procedure.code

PRSOCCD
Core: O
Type: Num
SUPPPR.QVAL Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR.

Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities).