Condition condition_occurrence implemented primary

One FHIR Condition maps to one condition_occurrence row. Status filtering drops entered-in-error, refuted, and inactive/resolved conditions. Onset is resolved via a priority chain (onsetDateTime > onsetPeriod.start > recordedDate); conditions with no resolvable start date are skipped. Category drives type_concept_id (problem-list-item vs encounter-diagnosis). Domain routing is not implemented -- all conditions go to condition_occurrence regardless of OMOP vocabulary domain_id.

Conversion profile omop-condition
A FHIR instance converts to condition_occurrence iff it validates against this profile.
Routing key Condition.code ∈ omop-condition-codes (OMOP domain Condition)
Path Card Type Binding / Fixed Comment
Condition.verificationStatus fhir/condition-ver-statusrequired
Condition.code 1..*MS omop-condition-codesrequired
Condition.subject 1..* Reference
Condition.onset[x] 1..*MS Required for condition_occurrence.condition_start_date.
ViewDefinition (Stage 1 flattener) omop-condition-condition-occurrence
16 columns · resource Condition
column name FHIRPath type
id Condition.id id
code_snomed Condition.code.coding.where(system='http://snomed.info/sct').first().code code
code_icd10cm Condition.code.coding.where(system='http://hl7.org/fhir/sid/icd-10-cm').first().code code
code_icd9cm Condition.code.coding.where(system='http://hl7.org/fhir/sid/icd-9-cm').first().code code
code_icd10 Condition.code.coding.where(system='http://hl7.org/fhir/sid/icd-10').first().code code
code_text Condition.code.text string
subject_id Condition.subject Reference(Patient)
condition_start_date Condition.onset[x] dateTime | Period | Age | Range | string
condition_start_datetime Condition.onset[x] dateTime | Period
condition_end_date Condition.abatement[x] dateTime | Period
condition_end_datetime Condition.abatement[x] dateTime | Period
condition_status Condition.clinicalStatus CodeableConcept
condition_status_text Condition.clinicalStatus.coding[0].code code
stop_reason Condition.abatementString string
performer_id Condition.asserter Reference(Practitioner)
encounter_id Condition.encounter Reference(Encounter)
Condition: clinicalStatus in (active, recurrence, relapse, absent) AND verificationStatus not in (entered-in-error, refuted) AND onset or recordedDate resolvable
Implementation: src/mapper/condition.ts

Fields (16)

Vocabularies

condition_type

Source Display Concept ID Concept Name
problem-list-item Problem List Item 32840 Problem list from EHR
encounter-diagnosis Encounter Diagnosis 32817 EHR
health-concern Health Concern 32817 EHR
(absent) Absent / other 32817 EHR

condition_status

Source Display Concept ID Concept Name
active Active 32902 Active condition
recurrence Recurrence 32902 Active condition
relapse Relapse 32902 Active condition
(absent) Absent 0 Unknown

condition_code_vocabularies

Source Display Concept ID Concept Name
http://snomed.info/sct SNOMED CT - SNOMED
http://hl7.org/fhir/sid/icd-10-cm ICD-10-CM - ICD10CM
http://hl7.org/fhir/sid/icd-10 ICD-10 - ICD10
http://fhir.de/CodeSystem/bfarm/icd-10-gm ICD-10-GM - ICD10GM
http://www.ama-assn.org/go/cpt CPT-4 - CPT4
http://www.orpha.net ORPHA - ORPHA

Edge Cases

Missing onset[x] + missing recordedDate
Skip -- no valid start date. condition_start_date is required in OMOP.
onsetAge (e.g. 45 years)
Not mapped by most. Requires patient birthDate for calculation.
onsetPeriod with start and end
start -> condition_start_date, end -> condition_end_date.
Multiple code.coding entries (e.g. ICD-10 + SNOMED)
Select best coding by vocabulary priority (SNOMED > ICD-10-CM > ICD-10 > CPT-4).
severity present
Dropped by most implementations.
bodySite present
Dropped by most implementations.
stage present
Dropped by most implementations.
verificationStatus = provisional
Mapped. Some implementations skip non-confirmed; this project maps provisional.
verificationStatus = entered-in-error
Skip always. Universal consensus across implementations.
SNOMED code with domain_id != Condition
Should route to observation/procedure/measurement. Requires vocabulary DB.
abatementString longer than 20 chars
Truncated to fit stop_reason varchar(20).
Missing Condition.code
Skip -- no concept to map.
Missing Condition.subject
Skip or error.
ICD-10-GM primary + secondary codes
Split into separate condition_occurrence rows.
Diagnostic confidence (ICD-10-GM extension)
Maps to condition_status_concept_id.

Reference Implementations