PractitionerRole
→
provider
documented
primary
PractitionerRole enrichment of existing provider row. PractitionerRole does NOT create a new provider row; it adds specialty_concept_id, specialty_source_value, and care_site_id to the row created from the underlying Practitioner resource. One provider row per Practitioner; if multiple PractitionerRoles exist, choose the most recent or most specific.
Conversion profile
omop-practitionerrole-provider
A FHIR instance converts to provider iff it validates against this profile.
| Path | Card | Type | Binding / Fixed | Comment |
|---|---|---|---|---|
| PractitionerRole.practitioner | 1..1MS | Reference | Resolves to the existing provider row enriched by this PractitionerRole. | |
| PractitionerRole.specialty | 1..*MS | At least one specialty CodeableConcept. First coding maps to provider.specialty_concept_id (SNOMED or NUCC). | ||
| PractitionerRole.specialty.coding | 1..*MS | |||
| PractitionerRole.organization | MS | Optional. Becomes provider.care_site_id. |
ViewDefinition (Stage 1 flattener)
omop-practitionerrole-provider
4 columns · resource PractitionerRole
| column name | FHIRPath | type |
|---|---|---|
| id | PractitionerRole.id | id |
| specialty | PractitionerRole.specialty[0].coding[0] | CodeableConcept |
| specialty_text | PractitionerRole.specialty[0].coding[0].code | string |
| managing_organization_id | PractitionerRole.organization | Reference(Organization) |
Condition: PractitionerRole.practitioner references an existing Practitioner with a provider row
Fields (4)
-
specialty_concept_id←PractitionerRole.specialty[0].coding[0]integer · CodeableConceptFK→CONCEPTmap:specialtySNOMED or NUCC specialty mapped to OMOP concept. Represents the most common or most specific specialty. 0 if unmapped. fhir-to-omop-demo extracts from PractitionerRole.specialty[0].coding[0] (lines 10-23, 44).3 sources ▾
-
Extracts from specialty[0].coding[0] with multi-coding warning; merges into provider row
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/PractitionerRole.jq:10-53 — specialty extraction lines 10-23; merge lines 31-53; result at line 44
-
Does not process PractitionerRole; specialty left unmapped
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopPractitioner.java — Only Practitioner resource is mapped; no PractitionerRole handling
-
Falls back to Practitioner.qualification[0].code when no PractitionerRole
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:31-31
-
-
specialty_source_value←PractitionerRole.specialty[0].coding[0].codevarchar(50) · stringRaw specialty code as it appears in source data. Includes physician specialties (internal medicine, emergency medicine) and allied health professionals. fhir-to-omop-demo uses specialty.concept_code (line 49).2 sources ▾
-
Uses specialty.concept_code after OMOP lookup (post-translation value)
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/PractitionerRole.jq:49-49
-
Uses qualification[0].code.coding[0].code from Practitioner (no PractitionerRole processing)
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:31-31
-
-
specialty_source_concept_id← constant integer · integer=0Often zero as many sites use proprietary codes to store physician specialty. -
care_site_id←PractitionerRole.organizationinteger · Reference(Organization)FK→CARE_SITEOrganization affiliation from PractitionerRole. This is the location that the provider primarily practices in. fhir-to-omop-demo uses location_ids[0] (line 45). omoponfhir creates a CareSite from the Practitioner's address if no PractitionerRole link exists.2 sources ▾
-
location_ids[0] resolved from PractitionerRole.location (not .organization directly)
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/PractitionerRole.jq:45-45
-
Derived from Practitioner.address via AddressUtil — no PractitionerRole.organization used
-
Vocabularies
specialty
| Source | Display | Concept ID | Concept Name |
|---|---|---|---|
| 207Q00000X | Family Medicine | 38004459 | Family Medicine |
| 207R00000X | Internal Medicine | 38004456 | Internal Medicine |
| 207V00000X | Obstetrics & Gynecology | 38004461 | Obstetrics/Gynecology |
| 208D00000X | General Practice | 38004446 | General Practice |
| 208600000X | Surgery | 38004447 | Surgery |
| (unmapped) | Unmapped specialty | 0 | No matching concept |
Edge Cases
Multiple PractitionerRoles for same Practitioner
Single provider row. Use first/most-recent role (by period.end) for specialty and care_site. Log if multiple roles found.
PractitionerRole without Practitioner reference
Cannot create or enrich provider row (no identity). Log and skip.
Specialty system not recognized (not NUCC, not SNOMED)
specialty_concept_id = 0, specialty_source_value = raw code.
PractitionerRole.organization references Organization not in bundle
Deferred resolution. Stub care_site_id; resolve when Organization arrives.
Reference Implementations
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/PractitionerRole.jq:1-80 — Specialty extraction with multi-coding warning (lines 10-23), merge-based approach where PractitionerRole enriches the provider row (lines 31-53), care_site_id from location_ids[0] (line 45), specialty.concept_code -> specialty_source_value (line 49).
- fhir-omop-ig(fsh) refs/refs/fhir-omop-ig/input/fsh/Provider.fsh — All 13 provider fields defined including specialty_concept_id and care_site_id.
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopPractitioner.java — Does NOT process PractitionerRole as a separate resource; only the Practitioner resource is mapped. Specialty is not populated. care_site_id is derived from Practitioner.address instead.
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py — No dedicated PractitionerRole mapper. Falls back to Practitioner.qualification[0].code for specialty_source_value.