Skip to content

Practitioner Profile

Canonical../StructureDefinition/nexus-emr-core-practitioner
Statusdraft · 1.26.0
BasePractitioner (constraint)
SourceFSH · JSON

Represents a human that practices medicine -- the stable clinical identity that an EMR user login resolves to. Practitioner holds identity, demographics, and qualifications, and carries the EMR user-account identifier. The person's role(s) at organizations/locations are represented by PractitionerRole (0..*), which is the tenant-scoped role binding -- NOT the EMR user. A person may work at multiple organizations, each represented by a PractitionerRole.

TypedFhir API / Pydantic schema

The typed accessor surface Practitioner exposes for Practitioner — generated from this IG's compiled profile; each typed accessor has a validating raw-FHIR twin (xRaw) where marked. The three ports are parity-enforced.

The AI-facing shape: from typed_fhir.facade.generated.schemas import PractitionerSchemamodel_json_schema() is a structured-output / tool definition; instantiating validates an extraction. Generated source.

class PractitionerSchema(BaseModel):
    """AI-facing shape of the Practitioner profile: the facade's typed accessor
    surface (curated + salient fields) as a pydantic model. `model_json_schema()` is a
    structured-output / tool schema; instantiating validates an extraction."""

    model_config = ConfigDict(extra="forbid")

    active: bool | None = Field(
        None,
        description=(
            "Whether this practitioner's record is in active use: defaults to true. If the "
            "practitioner is not in active use, the active element should be false. Default is "
            "true if not specified. Note: Set to false for retired, deceased, or otherwise "
            "inactive practitioners. Practitioner.active — 0..1"
        ),
    )
    name: dict | None = Field(
        None,
        description=(
            "Practitioner name(s). The name(s) associated with the practitioner. At least one "
            "official name is required. Note: Practitioners may have multiple names (official, "
            "maiden, nickname). The official name should be used for display. Practitioner.name — "
            "1..1"
        ),
    )
    gender: Literal["female", "male", "other", "unknown"] | None = Field(
        None,
        description=(
            "male | female | other | unknown. Administrative Gender - the gender that the person "
            "is considered to have for administration and record keeping purposes. "
            "Practitioner.gender — 0..1"
        ),
    )
    qualification: dict | None = Field(
        None,
        description=(
            "Regulatory-college registrations held by this practitioner. A registration the "
            "practitioner holds with a regulatory college: the licence number, what it is a "
            "registration for, and when it lapses. This is the structured home for licensure that "
            "`name.suffix` is not. Absence is ordinary and not an error. Administrative users, "
            "medical office assistants and external referral targets held as directory entries "
            "hold no registration, and a Practitioner with none is complete and conformant. **The "
            "list is not guaranteed to be complete.** The EMR manages the registrations it "
            "provisions and leaves any others untouched, so a qualification written by another "
            "system survives alongside them. Treat what you find as the registrations this record "
            "knows about, not as an exhaustive statement of what the practitioner holds. "
            "Practitioner.qualification — 0..*"
        ),
    )
    communication: Concept | None = Field(
        None,
        description=(
            "A language the practitioner can use in patient communication. A language the "
            "practitioner can use in patient communication. Note: The structure aa-BB with this "
            "exact casing is one the most widely used notations for locale. However not all "
            "systems code this but instead have it as free text. Hence CodeableConcept instead of "
            "code as the data type. Practitioner.communication — 0..*. codes (preferred): ar | bn "
            "| cs | da | de | de-AT | de-CH | de-DE | …"
        ),
    )