Practitioner
→
provider
documented
primary
Individual healthcare provider. One FHIR Practitioner maps to one OMOP provider row. The provider table stores identity (name, NPI, gender, year_of_birth) from Practitioner; specialty and care_site are enriched by PractitionerRole. Clinical event tables carry provider_id FK back to this row.
Conversion profile
omop-practitioner-provider
A FHIR instance converts to provider iff it validates against this profile.
| Path | Card | Type | Binding / Fixed | Comment |
|---|---|---|---|---|
| Practitioner.identifier | 1..*MS | At least one identifier required. NPI (system http://hl7.org/fhir/sid/us-npi) is preferred for provider.npi. | ||
| Practitioner.name | 1..*MS | At least one name. First entry becomes provider.provider_name. | ||
| Practitioner.gender | MS | fhir/administrative-genderrequired | ||
| Practitioner.birthDate | MS | Year portion becomes provider.year_of_birth. |
ViewDefinition (Stage 1 flattener)
omop-practitioner-provider
10 columns · resource Practitioner
| column name | FHIRPath | type |
|---|---|---|
| id | Practitioner.id | id |
| provider_name | Practitioner.name[0] | HumanName |
| npi | Practitioner.identifier.where(system='http://hl7.org/fhir/sid/us-npi').value | string |
| specialty | Practitioner.qualification[0].code | CodeableConcept |
| managing_organization_id | Practitioner.address[0] | Address |
| year_of_birth | Practitioner.birthDate | date |
| gender | Practitioner.gender | code |
| gender_code | Practitioner.gender | code |
| specialty_text | Practitioner.qualification[0].code.coding[0].code | string |
| performer_identifier | Practitioner.identifier (best: NPI > first) | string |
Fields (13)
-
provider_id←Practitioner.idinteger · idPKrequiredSurrogate key. Hash/sequence/lookup of Practitioner.id. Every provider with a different unique identifier is a different person.3 sources ▾
-
IdMapping bidirectional lookup table (FHIR id ↔ OMOP integer)
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopPractitioner.java — deduplication by providerSourceValue lines 151-168
-
Verbatim Practitioner.id cast to integer
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Practitioner.jq:16-31
-
Auto-incrementing sequence
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:1-38
-
-
provider_name←Practitioner.name[0]varchar(255) · HumanNametransform:format("{family}, {given}")omoponfhir uses "family, given" (lines 337-354). fhir-x-omop uses "{given} {family}" (line 13). Pick one convention and document.2 sources ▾
-
"family, given" format
-
"given family" format (space-separated)
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:7-13
-
-
npi←Practitioner.identifier.where(system='http://hl7.org/fhir/sid/us-npi').valuevarchar(20) · stringNational Provider Identifier issued by CMS. fhir-x-omop filters identifiers by NPI system (lines 15-21).3 sources ▾
-
Filter identifiers by NPI system URI
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:15-21
-
Pre-extracted .npi field from structured input
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Practitioner.jq:16-31
-
identifierFirstRep.value (no NPI system filter)
-
-
dea← — varchar(20) · stringDEA identifier for controlled substance prescriptions. No standard FHIR R4 element. Could be extracted from Practitioner.identifier with a DEA system URI or from qualification entries. -
specialty_concept_id←Practitioner.qualification[0].codeinteger · CodeableConceptFK→CONCEPTFallback only. Primary source is PractitionerRole.specialty[0] (see PractitionerRole__provider edge). fhir-x-omop falls back to qualification[0].code.coding[0].code (line 31). Default 0 when no PractitionerRole exists. -
care_site_id←Practitioner.address[0]integer · AddressFK→CARE_SITEFallback only when no PractitionerRole.organization link exists. omoponfhir creates a care_site from Practitioner.address (lines 358-375). Primary source is PractitionerRole.organization (see PractitionerRole__provider edge). -
year_of_birth←Practitioner.birthDateinteger · datetransform:year(Practitioner.birthDate)Year component only. fhir-x-omop extracts via int(x.split('-')[0]) (line 30). -
gender_concept_id←Practitioner.genderinteger · codeFK→CONCEPTmap:genderSame mapping as Patient: male->8507, female->8532, other->8521, unknown->8551, absent->0.3 sources ▾
-
OmopConceptMapping enum — null maps to 8551 (UNKNOWN), not 0
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopPractitioner.java:378-386
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopConceptMapping.java:86-105
-
Pre-computed gender_concept_id passed as field value
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Practitioner.jq:16-31
-
gender.upper() for source_value only; concept_id not computed
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:29-29
-
-
gender_source_value←Practitioner.gendervarchar(50) · codeVerbatim gender code as it appears in source data. fhir-x-omop uppercases the value (line 29). -
gender_source_concept_id← constant integer · code=0Often zero as many sites use proprietary codes to store provider gender. -
specialty_source_value←Practitioner.qualification[0].code.coding[0].codevarchar(50) · stringFallback only when no PractitionerRole exists. Primary source is PractitionerRole.specialty[0] (see PractitionerRole__provider edge). fhir-x-omop falls back to qualification[0].code (line 31). -
specialty_source_concept_id← constant integer · integer=0Often zero as many sites use proprietary codes to store physician specialty. -
provider_source_value←Practitioner.identifier (best: NPI > first)varchar(50) · stringNPI or first identifier value. Use this field to link back to providers in the source data for ETL error checking. omoponfhir uses identifierFirstRep.value (lines 388-392). fhir-x-omop uses Practitioner.id (line 26).2 sources ▾
-
identifierFirstRep.value (first identifier, regardless of system)
-
Practitioner.id used verbatim as source value
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:26-26
-
Vocabularies
gender
| Source | Display | Concept ID | Concept Name |
|---|---|---|---|
| male | Male | 8507 | MALE |
| female | Female | 8532 | FEMALE |
| other | Other | 8521 | OTHER |
| unknown | Unknown | 8551 | UNKNOWN |
| (absent) | Absent | 0 | No matching concept |
Edge Cases
Missing name
provider_name = null. OMOP allows null. Use provider_source_value (identifier) for downstream traceability.
No NPI identifier
npi = null. Non-US providers or systems without NPI. Use first available identifier for provider_source_value.
Multiple identifiers
Pick NPI first (system = http://hl7.org/fhir/sid/us-npi), then first identifier. omoponfhir uses identifierFirstRep (line 388).
No PractitionerRole for Practitioner
specialty_concept_id = 0, care_site_id = null. Provider row is valid but sparse. fhir-x-omop falls back to Practitioner.qualification[0].code for specialty (line 31).
Practitioner.gender absent
gender_concept_id = 0, gender_source_value = null. Per OMOP Themis convention, absent gender should be 0, not 8551.
Practitioner referenced but not in bundle
Deferred resolution. Create stub provider with provider_source_value = reference string, populate later. NACHC defaults provider_id to 1.
Duplicate Practitioner (same identifier, different resources)
Deduplicate by identifier value. omoponfhir searches providerSourceValue column to find existing provider (lines 153-168).
Name formatting inconsistency
Different implementations use different formats: omoponfhir = "family, given", fhir-x-omop = "given family". Pick one and document.
DEA number needed
No standard FHIR element. Check Practitioner.identifier for a DEA system URI or qualification entries.
Reference Implementations
- fhir-omop-ig(fsh) refs/refs/fhir-omop-ig/input/fsh/Provider.fsh — All 13 provider fields defined: lines 1-20
- omoponfhir-v54(java) refs/refs/omoponfhir-v54-r4/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopPractitioner.java:1-396 — Bidirectional. Name formatting (337-354), address->care_site (358-375), gender mapping (378-386), identifier->provider_source_value (388-392), deduplication by providerSourceValue (151-168).
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Practitioner.jq — Provider row with NPI, gender_concept_id (lines 16-31). Also creates a person row (unusual, lines 33-52).
- fhir-x-omop(python) refs/refs/fhir-x-omop/fhir_x_omop/to_omop/provider.py:1-38 — Name formatting (7-13), NPI extraction by system (15-21), gender source uppercased (29), year_of_birth (30), specialty fallback to qualification (31).
- 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 a single dummy provider (id=1). All references default to this fixed ID. No FHIR Practitioner mapping.