Patient Profile¶
| Canonical | ../StructureDefinition/nexus-emr-core-patient |
|---|---|
| Status | draft · 1.26.0 |
| Base | Patient (constraint) |
| Source | FSH · 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 PatientSchema — model_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"
),
)