Procedure procedure_occurrence documented primary

One FHIR Procedure maps to one procedure_occurrence row. Domain routing may redirect codes with non-Procedure domain_id to drug_exposure, device_exposure, measurement, or observation. Only completed procedures should produce rows. performed[x] is polymorphic (dateTime or Period) and at least procedure_date is required -- skip the resource if no date is available.

A FHIR instance converts to procedure_occurrence iff it validates against this profile.
Routing key Procedure.code ∈ omop-procedure-codes (OMOP domain Procedure)
Path Card Type Binding / Fixed Comment
Procedure.status fhir/event-statusrequired Skip not-done, entered-in-error, stopped, preparation.
Procedure.code 1..*MS omop-procedure-codesrequired
Procedure.subject 1..* Reference Required for procedure_occurrence.person_id.
Procedure.performed[x] 1..*MS Required for procedure_occurrence.procedure_date. Accepts dateTime, Period, string, Age, Range.
ViewDefinition (Stage 1 flattener) omop-procedure-procedure-occurrence
16 columns · resource Procedure
column name FHIRPath type
id Procedure.id id
code_cpt Procedure.code.coding.where(system='http://www.ama-assn.org/go/cpt').first().code code
code_hcpcs Procedure.code.coding.where(system='https://www.cms.gov/Medicare/Coding/HCPCSReleaseCodeSets').first().code code
code_snomed Procedure.code.coding.where(system='http://snomed.info/sct').first().code code
code_icd10pcs Procedure.code.coding.where(system='http://www.cms.gov/Medicare/Coding/ICD10').first().code code
code_icd9cm Procedure.code.coding.where(system='http://hl7.org/fhir/sid/icd-9-cm').first().code code
code_text Procedure.code.text string
subject_id Procedure.subject Reference(Patient)
procedure_date Procedure.performedDateTime dateTime
procedure_datetime Procedure.performedDateTime dateTime
procedure_end_date Procedure.performedPeriod.end dateTime
procedure_end_datetime Procedure.performedPeriod.end dateTime
modifier Procedure.bodySite[0] CodeableConcept
modifier_text Procedure.bodySite[0].coding[0].code code
performer_id Procedure.performer[0].actor Reference(Practitioner)
encounter_id Procedure.encounter Reference(Encounter)
Condition: status is completed (recommended); code domain_id is Procedure

Fields (16)

Vocabularies

procedure_code

Source Display Concept ID Concept Name
http://snomed.info/sct SNOMED CT - SNOMED vocabulary_id
http://www.ama-assn.org/go/cpt CPT-4 - CPT4 vocabulary_id
http://hl7.org/fhir/sid/icd-10-pcs ICD-10-PCS - ICD10PCS vocabulary_id
http://hl7.org/fhir/sid/icd-9-cm ICD-9-CM (Vol 3) - ICD9Proc vocabulary_id
https://www.cms.gov/Medicare/Coding/HCPCSReleaseCodeSets HCPCS - HCPCS vocabulary_id
http://fhir.de/CodeSystem/bfarm/ops OPS - OPS vocabulary_id

procedure_type

Source Display Concept ID Concept Name
EHR EHR 32817 EHR
Primary Procedure Primary Procedure (legacy) 44786630 Primary Procedure

body_site

Source Display Concept ID Concept Name
http://snomed.info/sct SNOMED CT (Body Structure) - SNOMED body site concept

status_filter

Source Display Concept ID Concept Name
completed Completed - Map
in-progress In Progress - Skip or Map
not-done Not Done - Skip
entered-in-error Entered in Error - Skip
stopped Stopped - Skip
preparation Preparation - Skip

Edge Cases

Multiple bodySite entries
Take first bodySite[0] for modifier_concept_id. ETL-German filters to SNOMED codings only. Remaining body sites are lost.
Multiple performer entries
Iterate and take first Practitioner-typed actor for provider_id. Non-Practitioner performers (Organization, Device) are ignored.
Multiple code.coding entries
Select best coding by vocabulary priority (SNOMED > CPT > ICD-10-PCS). ETL-German uses OPS > DICOM > SNOMED priority. FhirToCdm creates one row per coding. HL7 IG takes first coding only.
Code with non-Procedure domain
Route to appropriate OMOP table (drug_exposure, observation, measurement) based on standard concept's domain_id.
Missing performed[x] (no date)
Skip resource. procedure_date is required. ETL-German logs warning and returns null.
Missing subject reference
Skip resource. person_id is required. omoponfhir throws FHIRException. ETL-German logs and returns null.
Missing code
Skip resource. procedure_concept_id is required (0 is acceptable). ETL-German logs and skips.
status = entered-in-error
Skip resource. For incremental loads, delete any previously mapped record.
Extremely long procedure_source_value
OMOP field is varchar(50). Truncate code string to 50 characters. No implementation explicitly handles this.
usedCode (device codes) present
ETL-German creates device_exposure rows from Procedure.usedCode codings. Other implementations ignore this field.
focalDevice present
Could create device_exposure row. ETL-German handles usedCode (not focalDevice) for device exposure. No standard mapping for focalDevice.
reasonReference to Condition
Could populate fact_relationship to link procedure and condition. Not implemented in any reference.
performedDateTime (not Period)
Date part goes to procedure_date/procedure_datetime. procedure_end_date: ETL-German leaves null, NACHC sets end = start.
Procedure.category present
Could inform procedure_type_concept_id, but no implementation uses it. omoponfhir has commented-out code for this.

Reference Implementations