refs/refs/fhir-x-omop/fhir_x_omop/to_omop/visit_occurrence.py

lines 41–46 56 lines · py
1from fhir.resources.encounter import Encounter
2from omop_pydantic import VisitOccurrence
4from chidian import DataMapping, Mapper
5import chidian.partials as p
7def get_attending_provider_id(participants):
8 if not participants:
9 return None
10 for participant in participants:
11 if (participant.type and
12 participant.type[0].coding and
13 participant.type[0].coding[0].code == 'ATND' and
14 participant.individual and
15 participant.individual.reference):
16 return int(participant.individual.reference.split('/')[1])
17 return None
19visit_occurrence_mapper = Mapper(
20 lambda src: {
21 "visit_occurrence_id": (p.get("id") | p.int())(src),
22 "person_id": p.get("subject.reference", getter=lambda x: int(x.split('/')[1]) if x else None)(src),
23 "visit_concept_id": p.case(p.get("class.code")(src), {
24 "IMP": 9201, # Inpatient Visit
25 "AMB": 9202, # Outpatient Visit
26 "EMER": 9203, # Emergency Room Visit
27 "HH": 581379, # Home Health
28 "VR": 32036, # Virtual
29 }, default=9202), # Default to Outpatient
30 "visit_start_date": p.get("period.start", getter=lambda x: x.split('T')[0] if x else None)(src),
31 "visit_start_datetime": p.get("period.start")(src),
32 "visit_end_date": p.get("period.end", getter=lambda x: x.split('T')[0] if x else None)(src),
33 "visit_end_datetime": p.get("period.end")(src),
34 "visit_type_concept_id": 44818518, # Visit derived from EHR
35 "provider_id": p.get("participant", getter=get_attending_provider_id)(src),
36 "care_site_id": p.get("serviceProvider.reference", getter=lambda x: int(x.split('/')[1]) if x else None)(src),
37 "visit_source_value": p.get("type[0].coding[0].code")(src),
38 "visit_source_concept_id": 0,
39 "admitted_from_concept_id": 0,
40 "admitted_from_source_value": p.get("hospitalization.admitSource.coding[0].code")(src),
41 "discharge_to_concept_id": p.case(p.get("hospitalization.dischargeDisposition.coding[0].code")(src), {
42 "home": 8536,
43 "snf": 8676,
44 "rehab": 8615,
45 "exp": 4216643,
46 }, default=0),
47 "discharge_to_source_value": p.get("hospitalization.dischargeDisposition.coding[0].display")(src),
48 "preceding_visit_occurrence_id": None,
49 }
52to_omop_visit_occurrence = DataMapping(
53 mapper=visit_occurrence_mapper,
54 input_schema=Encounter,
55 output_schema=VisitOccurrence,