diff --git a/input/fsh/examples/ExampleSlotWithAppointmentType.fsh b/input/fsh/examples/ExampleSlotWithAppointmentType.fsh index c078004..32a722b 100644 --- a/input/fsh/examples/ExampleSlotWithAppointmentType.fsh +++ b/input/fsh/examples/ExampleSlotWithAppointmentType.fsh @@ -4,20 +4,26 @@ Usage: #example Title: "Slot Accepting New and Existing Patients" Description: "A slot that is accepting new and existing patients" -* appointmentType = http://terminology.hl7.org/CodeSystem/accepting-patients#newpt * schedule = Reference(ExampleSchedule) * status = #free * start = "2026-03-21T10:45:00-04:00" * end = "2026-03-21T11:15:00-04:00" +* extension[+].url = "http://hl7.org/fhir/uv/smart-scheduling-links/StructureDefinition/patient-type" +* extension[=].valueCoding.system = "http://terminology.hl7.org/CodeSystem/accepting-patients" +* extension[=].valueCoding.code = #newpt + Instance: AcceptOnlyExistingPatients InstanceOf: SmartSchedulingSlot Usage: #example Title: "Slot Accepting Only Existing Patients" Description: "A slot that is accepting only existing patients" -* appointmentType = http://terminology.hl7.org/CodeSystem/accepting-patients#existptonly * schedule = Reference(ExampleSchedule) * status = #free * start = "2026-03-21T10:45:00-04:00" * end = "2026-03-21T11:15:00-04:00" + +* extension[+].url = "http://hl7.org/fhir/uv/smart-scheduling-links/StructureDefinition/patient-type" +* extension[=].valueCoding.system = "http://terminology.hl7.org/CodeSystem/accepting-patients" +* extension[=].valueCoding.code = #existptonly diff --git a/input/fsh/extensions/patient-type.fsh b/input/fsh/extensions/patient-type.fsh new file mode 100644 index 0000000..531c95b --- /dev/null +++ b/input/fsh/extensions/patient-type.fsh @@ -0,0 +1,17 @@ +Extension: PatientType +Id: patient-type +Title: "Patient Type" +Description: """ +This extension enables SSL to represent new-patient acceptance policy and binding to +AcceptingPatientsVS. +""" + +* ^context.type = #element +* ^context.expression = "Slot" + +* value[x] only Coding +* valueCoding 1..1 +* valueCoding.system 1..1 +* valueCoding.system = "http://terminology.hl7.org/CodeSystem/accepting-patients" +* valueCoding.code 1..1 +* valueCoding.code from http://hl7.org/fhir/us/ndh/ValueSet/AcceptingPatientsVS (extensible) diff --git a/input/fsh/profiles/slot.fsh b/input/fsh/profiles/slot.fsh index b8864af..b66ddbd 100644 --- a/input/fsh/profiles/slot.fsh +++ b/input/fsh/profiles/slot.fsh @@ -19,18 +19,17 @@ timing (e.g., "between 9 a.m. and 5 p.m." or "between noon and five p.m."). // start 1..1 // end 1..1 +* id 1..1 MS * schedule MS * schedule only Reference(SmartSchedulingSchedule) * status MS * start MS * end MS -* appointmentType MS -* appointmentType from AppointmentTypeAndReasonsVS (preferred) -// * extension contains - BookingDeepLink named bookingDeepLink 0..1 and - BookingPhone named bookingPhone 0..1 + BookingDeepLink named bookingDeepLink 0..1 MS and + BookingPhone named bookingPhone 0..1 MS and + PatientType named patientType 1..1 MS // double check to see if we wanted to make this required. Instance: ExampleSlot InstanceOf: SmartSchedulingSlot @@ -43,6 +42,11 @@ Usage: #example * end = "2026-03-21T11:15:00-04:00" * extension[0].url = "http://hl7.org/fhir/uv/smart-scheduling-links/StructureDefinition/booking-deep-link" * extension[=].valueUrl = "https://ehr.example.org/booking/slots/123" + * extension[+].url = "http://hl7.org/fhir/uv/smart-scheduling-links/StructureDefinition/booking-phone" * extension[=].valueContactPoint.system = #phone * extension[=].valueContactPoint.value = "+1-555-123-4567" + +* extension[+].url = "http://hl7.org/fhir/uv/smart-scheduling-links/StructureDefinition/patient-type" +* extension[=].valueCoding.system = "http://terminology.hl7.org/CodeSystem/accepting-patients" +* extension[=].valueCoding.code = #newpt diff --git a/input/fsh/terminology/valuesets/slot-appointment-type-vs.fsh b/input/fsh/terminology/valuesets/slot-appointment-type-vs.fsh deleted file mode 100644 index 629255a..0000000 --- a/input/fsh/terminology/valuesets/slot-appointment-type-vs.fsh +++ /dev/null @@ -1,28 +0,0 @@ -ValueSet: AppointmentTypeAndReasonsVS -Id: appointment-type-and-reasons-vs -Title: "Appointment Type and Reasons" -Description: """ -A value set that combines the preferred and required codes from slot.appointmentType and NDH new patient extension, respectively -""" - -// required for hl7 auto publisher -* ^experimental = false -* ^extension[0].url = "http://hl7.org/fhir/StructureDefinition/structuredefinition-wg" -* ^extension[0].valueCode = #pa -* ^publisher = "HL7 International / Patient Administration" -* ^contact[0].name = "HL7 International / Patient Administration" -* ^contact[0].telecom[0].system = #url -* ^contact[0].telecom[0].value = "http://www.hl7.org/Special/committees/pafm" - -// this value set aligns with NDH & DaVinci -// Specifically, NDH's new patient extension: https://build.fhir.org/ig/HL7/fhir-us-ndh/StructureDefinition-base-ext-newpatients.html -// and DaVinci's modeling of accepting new patients: https://build.fhir.org/ig/HL7/davinci-pdex-plan-net/StructureDefinition-newpatients.html -* include codes from system http://terminology.hl7.org/CodeSystem/accepting-patients // this is what NDH uses in their New Patients extension https://build.fhir.org/ig/HL7/fhir-us-ndh/StructureDefinition-base-ext-newpatients.html - -// aligns with the preferred valueset binding for appointmentType in both appointment & slot: https://hl7.org/fhir/R4/v2/0276/index.html -* include codes from system http://terminology.hl7.org/CodeSystem/v2-0276 - -// note that there are -// multiple E&M codes that align with both of these 'billing' concepts - which would not be ideal to include here -// multiple SNOMED CT codes that align, but not ideally used - could investigate further. -// Overall, the value sets above likely represent the best option for modeling new vs. existing patients diff --git a/input/pagecontent/StructureDefinition-smart-scheduling-slot-intro.md b/input/pagecontent/StructureDefinition-smart-scheduling-slot-intro.md index 162a824..33f2d67 100644 --- a/input/pagecontent/StructureDefinition-smart-scheduling-slot-intro.md +++ b/input/pagecontent/StructureDefinition-smart-scheduling-slot-intro.md @@ -16,9 +16,9 @@ The following data elements must always be present or must be supported if the d - end **Each Slot Must Support:** -- appointmentType - booking deep link - booking phone number +- patient type **Profile Specific Implementation Guidance:** diff --git a/input/pagecontent/StructureDefinition-smart-scheduling-slot-notes.md b/input/pagecontent/StructureDefinition-smart-scheduling-slot-notes.md new file mode 100644 index 0000000..5b40a29 --- /dev/null +++ b/input/pagecontent/StructureDefinition-smart-scheduling-slot-notes.md @@ -0,0 +1,7 @@ +Discussed extensively in [February 2026 as captured in these confluence notes](https://confluence.hl7.org/spaces/PA/pages/413256942/New+vs.+Existing+Patients), but also during the 2026 CMS Connectathon in July. General options included: +- being very opionated about modeling patient type in a new extension that is required +- using an extension that is inspired by the 'characteristic' data element in R6/continuous build. This would function like a patient badge of sorts. We'd then slice on characteristic to model patient type. + +In all scenarios discussed, the group agreed that slot.appointmentType was not ideal given the 0..1 cardinality and the fact that patient type is orothogonal to appointmentType as it could represent a variety of other things. + +After [discussions on 8/3/2026](https://github.com/HL7/smart-scheduling-links/pull/46), we decided to use the simple extension for patient type. Opinions weren't overtly strong either way, but the fact that "patient type" was a concept used in a lot of places, we decided to keep our simple extension.