Organization
→
care_site
documented
primary
Each FHIR Organization maps to one OMOP care_site row representing a healthcare facility or department. Organization.name becomes care_site_name, Organization.type maps to place_of_service_concept_id via OrganizationType vocabulary, and Organization.address resolves to a location row linked via location_id. FHIR Location can also contribute care_site rows in some implementations (see Location__care_site edge). FHIR Organization.partOf hierarchy is flattened -- each level becomes a separate care_site row with no parent linkage.
Conversion profile
omop-organization-care-site
A FHIR instance converts to care_site iff it validates against this profile.
| Path | Card | Type | Binding / Fixed | Comment |
|---|---|---|---|---|
| Organization.identifier | 1..*MS | At least one identifier required. Used as care_site.care_site_source_value. | ||
| Organization.name | 1..1MS | Required. Becomes care_site.care_site_name. | ||
| Organization.type | MS | Optional. First coding maps to care_site.place_of_service_concept_id via OMOP Place of Service vocabulary. | ||
| Organization.address | MS | Optional. Drives care_site.location_id via the location table. |
ViewDefinition (Stage 1 flattener)
omop-organization-care-site
6 columns · resource Organization
| column name | FHIRPath | type |
|---|---|---|
| id | Organization.id | id |
| care_site_name | Organization.name | string |
| place_of_service | Organization.type[0].coding[0] | CodeableConcept |
| address_id | Organization.address | Address |
| managing_organization_identifier | Organization.identifier[0].value | string |
| place_of_service_text | Organization.type[0] | string |
Fields (6)
-
care_site_id←(generated)integer · idPKrequiredSurrogate key. omoponfhir uses IdMapping (FHIR ID <-> OMOP ID). fhir-to-omop-demo uses Organization.id directly. ETL-German pre-loads sequential IDs from CSV.4 sources ▾
-
Bidirectional IdMapping table (FHIR ID <-> OMOP integer ID) with deduplication by careSiteSourceValue
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopOrganization.java:117-137 — IdMapping lookup then dedup by careSiteSourceValue (lines 122-137)
-
Uses Organization.id verbatim as the integer care_site_id
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Organization.jq:14-14 — care_site_id = .id
-
Pre-loads sequential IDs from static CSV at job startup; no Organization resource processing
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/java/org/miracum/etl/fhirtoomop/listeners/FhirToOmopJobListener.java:398-432 — CARE_SITE.csv with sequential IDs and German FAB dept codes
-
Fixed id=1 single dummy record for all unresolved references
- NACHC-fhir-to-omop(sql) refs/refs/NACHC-fhir-to-omop/src/main/resources/sqlserver/omop/5.4/location/create-location-and-caresite-dummy-records.sql — Single dummy care_site (id=1, 'Not Available')
-
-
care_site_name←Organization.namevarchar(255) · stringThe name of the care site. Truncate to 255 characters if needed.3 sources ▾
-
Sets care_site_name directly from Organization.getName()
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopOrganization.java:246-246 — careSite.setCareSiteName(myOrganization.getName())
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Organization.jq:15-15 — care_site_name = .name
-
Pre-loaded German department names from static CSV (e.g., 'Innere Medizin', 'Kardiologie'); not sourced from Organization resource
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/resources/CARE_SITE.csv — 487-row CSV with German FAB department names
-
Fixed 'Not Available' for all dummy records
-
-
place_of_service_concept_id←Organization.type[0].coding[0]integer · CodeableConceptFK→CONCEPTmap:organization_typeHigh-level characterization of the care site. Should be a concept from the Visit domain. omoponfhir maps via OmopConceptMapping enum (12 codes). 0 if unmapped.3 sources ▾
-
Maps HL7 OrganizationType codes (prov/dept/team/govt/ins/edu/reli/crs/cg/bus/other) to Visit domain concept_ids via OmopConceptMapping enum; defaults to 8844 (Other Place of Service)
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopOrganization.java:249-264 — OmopConceptMapping.omopForOrganizationTypeCode()
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopConceptMapping.java:107-147 — Switch statement for 12 OrganizationType codes
-
Always null — Organization.type not mapped
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Organization.jq:16-16 — place_of_service_concept_id = null
-
Pre-loaded from CSV using German FAB specialty concepts (e.g., 45765841 = Internal Medicine) — deviates from OMOP CDM recommendation to use Visit domain
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/resources/CARE_SITE.csv — 487-row CSV with German FAB codes mapped to Specialty domain concepts
-
-
location_id←Organization.addressinteger · AddressFK→LOCATIONResolved from Organization.address[0] via address lookup-or-create pattern (omoponfhir AddressUtil). fhir-to-omop-demo sets null from Organization; relies on Location resource to populate via a second care_site row. OMOP supports one location per care_site.3 sources ▾
-
Resolves Organization.address[0] to a location row via AddressUtil.searchAndUpdate() (lookup-or-create); breaks after first address
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopOrganization.java:240-275 — AddressUtil.searchAndUpdate() at line 240 and in loop lines 267-275
-
Always null from Organization mapper; location_id is supplied instead by a second care_site row from the Location resource
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Organization.jq:17-17 — location_id = null on Organization-derived row
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Location.jq:31-39 — location_id set on the second care_site row from Location
-
Not set — ETL-German does not populate location_id on care_site rows
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/java/org/miracum/etl/fhirtoomop/listeners/FhirToOmopJobListener.java:398-432 — CSV-loaded care_site rows omit location_id
-
-
care_site_source_value←Organization.identifier[0].valuevarchar(50) · stringIdentifier for traceability and deduplication. Falls back to Organization.name or Organization.id if no identifier present.3 sources ▾
-
Uses identifierFirstRep.value; also used as deduplication key (searches by careSiteSourceValue before creating)
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopOrganization.java:122-238 — Dedup by careSiteSourceValue (122-137); identifier → source_value (234-238)
-
Uses .identifier[0].value via synthea_id helper variable
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Organization.jq:6-18 — synthea_id = .identifier[0].value; used on line 18
-
Uses German FAB department code (e.g., '0100', '0300') as source value
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/resources/CARE_SITE.csv — FAB department codes used as care_site_source_value
-
-
place_of_service_source_value←Organization.type[0]varchar(50) · stringRaw organization type code or text before vocabulary mapping.
Vocabularies
organization_type
| Source | Display | Concept ID | Concept Name |
|---|---|---|---|
| prov | Healthcare Provider | 4107295 | Healthcare Provider |
| dept | Hospital Department | 4318944 | Department |
| team | Organizational Team | 4217012 | Team |
| govt | Government | 4195901 | Government |
| ins | Insurance Company | 8844 | Other Place of Service |
| edu | Educational Institute | 4030303 | Educational Institution |
| reli | Religious Institution | 8844 | Other Place of Service |
| crs | Clinical Research Sponsor | 8844 | Other Place of Service |
| cg | Community Group | 4127377 | Community Health Care |
| bus | Non-Healthcare Business | 8844 | Other Place of Service |
| other | Other | 8844 | Other Place of Service |
| (absent) | Absent | 8844 | Other Place of Service |
Edge Cases
Missing Organization.name
care_site_name = null. OMOP allows null. Use care_site_source_value (identifier) for traceability.
No Organization.type
place_of_service_concept_id = 0, place_of_service_source_value = null. omoponfhir catches FHIRException silently, leaving field unset.
Organization.partOf hierarchy
Flat mapping -- each level becomes a separate care_site row. No parent linkage preserved in OMOP.
Duplicate organizations (same identifier, different resources)
Deduplicate by care_site_source_value. omoponfhir searches by careSiteSourceValue before creating new rows. fhir-to-omop-demo does not deduplicate.
Multiple Organization.type[] entries
OMOP supports only one place_of_service_concept_id per care_site. Pick the most specific or first entry.
Organization referenced but not in bundle
Deferred resolution. Create a stub care_site row with care_site_source_value = reference string. NACHC creates a single dummy care_site (id=1) for all unresolved references.
Organization.address has multiple addresses
OMOP supports one location per care_site. Pick the primary/first address. omoponfhir breaks after the first address.
Organization.identifier absent
care_site_source_value may be null. Use Organization.name or Organization.id as fallback to avoid NullPointerException.
Organization.active = false
Most implementations ignore this flag and map inactive organizations. OMOP has no 'active' concept for care_site. Consider filtering in ETL preprocessing.
Very long care_site_name (>255 chars)
Truncate to 255 characters. care_site_name is varchar(255).
FHIR Location resource references Organization
Some implementations create an additional care_site row from the Location resource. Reconciliation needed. See Location__care_site edge.
Reference Implementations
- fhir-omop-ig(fsh) refs/refs/fhir-omop-ig/input/fsh/CareSite.fsh — All 6 care_site fields defined: lines 1-13
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopOrganization.java:1-279 — Bidirectional Organization <-> care_site. Most complete. Dedup by careSiteSourceValue, address -> location via AddressUtil, OrganizationType -> concept via OmopConceptMapping.
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopConceptMapping.java:1-250 — OrganizationType enum (12 codes) and omopForOrganizationTypeCode() switch (lines 107-147)
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Organization.jq — Minimal care_site output: care_site_id=.id, care_site_name=.name, place_of_service_concept_id=null
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/java/org/miracum/etl/fhirtoomop/listeners/FhirToOmopJobListener.java:398-432 — Pre-loads care_site from static CSV at job startup. No Organization resource processing.
- NACHC-fhir-to-omop(sql) refs/refs/NACHC-fhir-to-omop/src/main/resources/sqlserver/omop/5.4/location/create-location-and-caresite-dummy-records.sql — Creates single dummy care_site (id=1, 'Not Available') for all unresolved references