Primary Care Attachment Extension¶
| Canonical | ../StructureDefinition/nexus-emr-primary-care-attachment |
|---|---|
| Status | draft · 1.26.0 |
| Base | Extension (constraint) |
| Context | Patient (element) |
| Source | FSH · JSON |
A patient's current formal primary-care roster/enrollment/attachment. Distinct from Patient.generalPractitioner (local clinical responsibility / MRP): this captures the provider(s) to whom the patient is formally rostered/enrolled/attached, who may be local or remote. At most one attachment per patient per clinic/EMR tenant.
FSH
The authored source of truth: extensions/PrimaryCareAttachmentExtension.fsh (edit on GitHub). One FSH file may define several related artifacts.
// PrimaryCareAttachmentExtension.fsh
// Patient-level primary-care roster/enrollment/attachment model. Supersedes the
// removed Group-based RosterPanel. Design of record:
// docs/guide/features/rostering/primary-care-attachment.md
Alias: $NexusEmrPrimaryCareAttachment = ../StructureDefinition/nexus-emr-primary-care-attachment
// ===========================================================================
// Attachment status terminology
// ===========================================================================
CodeSystem: NexusEmrAttachmentStatusCS
Id: nexus-emr-attachment-status
Title: "Primary Care Attachment Status CodeSystem"
Description: "Status of a patient's formal primary-care attachment/enrollment."
* ^status = #draft
* ^experimental = false
* ^caseSensitive = true
* ^content = #complete
* ^url = "../CodeSystem/nexus-emr-attachment-status"
* #pending "Pending" "Attachment proposed/requested, not yet confirmed."
* #enrolled "Enrolled" "Patient is formally enrolled/rostered to the provider."
* #attached "Attached" "Patient is attached to the provider (e.g. an Alberta shared panel) without a distinct enrollment act."
* #terminated "Terminated" "The attachment has ended."
* #not-enrolled "Not Enrolled" "Patient is deliberately not enrolled/rostered ('don't bother'). A decided negative -- distinct from #pending (enrolment in progress) and from an absent attachment (unknown / not recorded). Abbrev: NE."
* #fee-for-service "Fee for Service" "Patient is seen on a fee-for-service basis: not attached, and not due to termination or a failed attachment (e.g. high outside use, or otherwise not desirable to roster). Abbrev: FS."
ValueSet: NexusEmrAttachmentStatus
Id: nexus-emr-attachment-status
Title: "Primary Care Attachment Status"
Description: "Status codes for a patient's primary-care attachment."
* ^status = #draft
* ^url = "../ValueSet/nexus-emr-attachment-status"
* include codes from system ../CodeSystem/nexus-emr-attachment-status
// ===========================================================================
// Primary Care Attachment extension (on Patient)
// ===========================================================================
Extension: NexusEmrPrimaryCareAttachment
Id: nexus-emr-primary-care-attachment
Title: "Primary Care Attachment"
Description: """
A patient's current formal primary-care roster/enrollment/attachment. Distinct from
Patient.generalPractitioner (local clinical responsibility / MRP): this captures the
provider(s) to whom the patient is formally rostered/enrolled/attached, who may be
local or remote. At most one attachment per patient per clinic/EMR tenant.
Modeled as a Patient extension (not EpisodeOfCare or Coverage) deliberately: at most one
current attachment per tenant, it must travel with the Patient, and Ontario's HALO FHIR
guide models enrolment as a Patient operation. No published pan-Canadian FHIR
enrolment-status value set exists yet (CIHI's PHC Minimum Data Set was retired 2026-04-01,
folded into CACDI / the Pan-Canadian Health Data Content Framework); NexusEmrAttachmentStatus
is the local layer and will be mapped to CACDI and to Ontario PCAR reporting codes when those
publish. externalIdentifier / jurisdictionalStatus are the seams for that round-trip.
"""
* ^url = $NexusEmrPrimaryCareAttachment
* ^context[0].type = #element
* ^context[0].expression = "Patient"
* ^status = #draft
* . ^short = "Patient's current primary-care attachment/enrollment"
* extension contains
providers 0..* MS and
status 1..1 MS and
effectivePeriod 0..1 MS and
consentStatus 0..1 and
terminationReason 0..1 and
externalIdentifier 0..1 and
jurisdictionalStatus 0..1
// providers: the enrolled/attached provider(s). Normally one; >1 for Alberta
// shared-panel / multiple-confirmed-provider cases. confirmedAt is per-provider.
* extension[providers] ^short = "Enrolled/attached provider(s) (normally one; >1 for Alberta shared panels)"
* extension[providers].extension contains
provider 1..1 MS and
confirmedAt 0..1 MS
* extension[providers].extension[provider].value[x] only Reference(NexusEmrCorePractitionerRole or NexusEmrCorePractitioner)
* extension[providers].extension[provider] ^short = "Provider to whom the patient is formally attached (may be local or remote)"
* extension[providers].extension[confirmedAt].value[x] only dateTime
* extension[providers].extension[confirmedAt] ^short = "Date this patient-provider relationship was confirmed (not a generic audit timestamp)"
* extension[status].value[x] only code
* extension[status].value[x] from NexusEmrAttachmentStatus (extensible)
* extension[status] ^short = "pending | enrolled | attached | terminated | not-enrolled | fee-for-service"
* extension[status] ^comment = "Binding is extensible (not required): where none of the standard codes fit (e.g. an OSCAR clinic-custom status), a source system MAY carry its own status code value directly. The status element is a single code, not a CodeableConcept."
* extension[effectivePeriod].value[x] only Period
* extension[effectivePeriod] ^short = "When the attachment is/was effective"
* extension[consentStatus].value[x] only CodeableConcept
* extension[consentStatus] ^short = "Consent status for the attachment (text or code)"
* extension[terminationReason].value[x] only CodeableConcept
* extension[terminationReason].valueCodeableConcept from RosterTerminationReasonVS (extensible)
* extension[terminationReason] ^short = "Why the attachment ended (text or code)"
* extension[externalIdentifier].value[x] only Identifier
* extension[externalIdentifier] ^short = "External/provincial attachment identifier, if any"
* extension[jurisdictionalStatus].value[x] only CodeableConcept
* extension[jurisdictionalStatus] ^short = "Provincial/jurisdictional attachment status, if tracked (text or code)"