Skip to content

Patient Profile

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

Generic Nexus EMR core profile for patient demographic and administrative information, based on CA Core+. Designed to support a broad range of integration needs.

TypedFhir API / Pydantic schema

The typed accessor surface Patient exposes for Patient — 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 PatientSchemamodel_json_schema() is a structured-output / tool definition; instantiating validates an extraction. Generated source.

class PatientSchema(BaseModel):
    """AI-facing shape of the Patient 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 patient record is in active use. Indicates whether this patient record "
            "is in active use. Many systems use this property to mark as non-active patients who "
            "have not been seen for a period of time, died, or left the practice. When absent, "
            "the patient record is assumed to be active. Note: If a record is inactive, and "
            "linked to an active record, then future patient/record updates should occur on the "
            "other patient. Patient.active — 0..1"
        ),
    )
    name: dict | None = Field(
        None,
        description=(
            "A name associated with the patient. The patient's name(s). At least one name must be "
            "provided with either a family or given name. Multiple names can be recorded to "
            "capture legal names, preferred names, previous names, and aliases. Note: A patient "
            "may have multiple names with different uses or applicable periods. For animals, the "
            "name is a \"HumanName\" in the sense that is assigned and used by humans and has the "
            "same patterns. Patient.name — 1..*"
        ),
    )
    telecom: dict | None = Field(
        None,
        description=(
            "Contact details for the patient. Contact details (telephone, email, etc.) for the "
            "patient. May include phone numbers, email addresses, and other electronic "
            "communication methods. Systems should capture the use (home, work, mobile) and "
            "preference ranking when available. Note: A Patient may have multiple ways to be "
            "contacted with different uses or applicable periods. May need to have options for "
            "contacting the person urgently and also to help with identification. The address "
            "might not go directly to the individual, but may reach another party that is able to "
            "proxy for the patient (i.e. home phone, or pet owner's phone). Patient.telecom — "
            "0..*"
        ),
    )
    gender: Literal["female", "male", "other", "unknown"] | None = Field(
        None,
        description=(
            "Administrative gender (male | female | other | unknown). Administrative gender used "
            "for identification and administrative purposes. When absent, gender is unknown. Note "
            "that this may cause challenges with patient matching algorithms. This is distinct "
            "from birth sex and clinical sex parameters which may be captured in extensions. "
            "Note: The gender might not match the biological sex as determined by genetics or the "
            "individual's preferred identification. Note that for both humans and particularly "
            "animals, there are other legitimate possibilities than male and female, though the "
            "vast majority of systems and contexts only support male and female. Systems "
            "providing decision support or enforcing business rules should ideally do this on the "
            "basis of Observations dealing with the specific sex or gender aspect of interest "
            "(anatomical, chromosomal, social, etc.) However, because these observations are "
            "infrequently recorded, defaulting to the administrative gender is common practice. "
            "Where such defaulting occurs, rule enforcement should allow for the variation "
            "between administrative and biological, chromosomal and other gender aspects. For "
            "example, an alert about a hysterectomy on a male should be handled as a warning or "
            "overridable error, not a \"hard\" error. See the Patient Gender and Sex section for "
            "additional information about communicating patient gender and sex. Patient.gender — "
            "0..1"
        ),
    )
    birth_date: FuzzyDate | None = Field(
        None,
        description=(
            "The date of birth for the patient. The date of birth for the patient. When absent, "
            "birth date is unknown. Note that missing birth dates may impact patient matching "
            "accuracy and age-based clinical decision support. Partial dates (year or year-month "
            "only) are permitted when full date is unknown. Note: At least an estimated year "
            "should be provided as a guess if the real DOB is unknown There is a standard "
            "extension \"patient-birthTime\" available that should be used where Time is required "
            "(such as in maternity/infant care systems). Patient.birthDate — 0..1"
        ),
    )
    address: dict | None = Field(
        None,
        description=(
            "Addresses for the patient. Patient addresses including home, temporary, billing "
            "addresses. Should follow Canadian address formatting standards including valid "
            "province codes and postal codes in A1A 1A1 format. Multiple addresses can be "
            "recorded with different uses (home, work, temp, billing). Note: Patient may have "
            "multiple addresses with different uses or applicable periods. Patient.address — 0..*"
        ),
    )
    marital_status: Concept | None = Field(
        None,
        description=(
            "Marital status with raw code support. The patient's most recent marital (civil) "
            "status. RECOMMENDED: Standard terminology codes (v3 Marital Status) when available "
            "OPTIONAL: Raw EMR codes for source system preservation Used for administrative and "
            "billing purposes, may impact insurance coverage and next-of-kin determinations. "
            "Patient.maritalStatus — 0..1. codes (extensible): A | D | I | L | M | P | S | T | …"
        ),
    )
    communication: dict | None = Field(
        None,
        description=(
            "Language communication capabilities. Languages which may be used to communicate with "
            "the patient about their health. Important for ensuring effective communication, "
            "interpreter services, and meeting Canadian bilingual healthcare requirements. Note: "
            "If no language is specified, this *implies* that the default local language is "
            "spoken. If you need to convey proficiency for multiple modes, then you need multiple "
            "Patient.Communication associations. For animals, language is not a relevant field, "
            "and should be absent from the instance. If the Patient does not speak the default "
            "local language, then the Interpreter Required Standard can be used to explicitly "
            "declare that an interpreter is required. Patient.communication — 0..*"
        ),
    )
    general_practitioner: Reference | None = Field(
        None,
        description=(
            "Patient's primary care provider(s). Reference to the patient's primary care "
            "provider(s), typically their family physician or primary care team. References a "
            "Practitioner -- the primary provider identity in this IG -- or a PractitionerRole "
            "where the role/organization binding is part of the assertion. Multiple providers can "
            "be listed for team-based care models. Note: This may be the primary care provider "
            "(in a GP context), or it may be a patient nominated care manager in a "
            "community/disability setting, or even organization that will provide people to "
            "perform the care provider roles. It is not to be used to record Care Teams, these "
            "should be in a CareTeam resource that may be linked to the CarePlan or EpisodeOfCare "
            "resources. Multiple GPs may be recorded against the patient for various reasons, "
            "such as a student that has his home GP listed along with the GP at university during "
            "the school semesters, or a \"fly-in/fly-out\" worker that has the onsite GP also "
            "included with his home GP to remain aware of medical issues. Jurisdictions may "
            "decide that they can profile this down to 1 if desired, or 1 per type. "
            "Patient.generalPractitioner — 0..*"
        ),
    )
    managing_organization: Reference | None = Field(
        None,
        description=(
            "Organization that maintains the patient record. The organization that has primary "
            "responsibility for maintaining this patient record in their EMR system. This is "
            "typically the primary care clinic or practice where the patient is rostered. "
            "Required to establish data ownership and governance. Note: There is only one "
            "managing organization for a specific patient record. Other organizations will have "
            "their own Patient record, and may use the Link property to join the records together "
            "(or a Person resource which can include confidence ratings for the association). "
            "Patient.managingOrganization — 1..1"
        ),
    )
    given_name: str | None = Field(
        None,
        description=(
            "Given names (not always 'first'). Given name(s) including first name, middle names, "
            "initials. The first given name is typically used as the primary given name. Note: If "
            "only initials are recorded, they may be used in place of the full name parts. "
            "Initials may be separated into multiple given names but often aren't due to "
            "paractical limitations. This element is not called \"first name\" since given names do "
            "not always come first. Salient field — name.first().given.first()"
        ),
    )
    middle_name: str | None = Field(
        None,
        description=(
            "Given names (not always 'first'). Given name(s) including first name, middle names, "
            "initials. The first given name is typically used as the primary given name. Note: If "
            "only initials are recorded, they may be used in place of the full name parts. "
            "Initials may be separated into multiple given names but often aren't due to "
            "paractical limitations. This element is not called \"first name\" since given names do "
            "not always come first. Salient field — name.first().given.tail().join(' ')"
        ),
    )
    family_name: str | None = Field(
        None,
        description=(
            "Family name (often called 'Surname'). The part of a name that links to the "
            "genealogy. In some cultures (e.g. Eritrea) the family name of a child is the given "
            "name of their father. Note: Family Name may be decomposed into specific parts using "
            "extensions (de, nl, es related cultures). Salient field — name.first().family"
        ),
    )
    phone: str | None = Field(
        None,
        description=(
            "Contact details for the patient. Contact details (telephone, email, etc.) for the "
            "patient. May include phone numbers, email addresses, and other electronic "
            "communication methods. Systems should capture the use (home, work, mobile) and "
            "preference ranking when available. Note: A Patient may have multiple ways to be "
            "contacted with different uses or applicable periods. May need to have options for "
            "contacting the person urgently and also to help with identification. The address "
            "might not go directly to the individual, but may reach another party that is able to "
            "proxy for the patient (i.e. home phone, or pet owner's phone). Salient field — "
            "telecom.where(system='phone').first().value"
        ),
    )
    email: str | None = Field(
        None,
        description=(
            "Contact details for the patient. Contact details (telephone, email, etc.) for the "
            "patient. May include phone numbers, email addresses, and other electronic "
            "communication methods. Systems should capture the use (home, work, mobile) and "
            "preference ranking when available. Note: A Patient may have multiple ways to be "
            "contacted with different uses or applicable periods. May need to have options for "
            "contacting the person urgently and also to help with identification. The address "
            "might not go directly to the individual, but may reach another party that is able to "
            "proxy for the patient (i.e. home phone, or pet owner's phone). Salient field — "
            "telecom.where(system='email').first().value"
        ),
    )