From a63f51a7567b186d33e48a8e020c09b7425cfe47 Mon Sep 17 00:00:00 2001 From: Vassil Peytchev Date: Wed, 30 Oct 2024 16:07:49 -0500 Subject: [PATCH 1/6] Fix use case description --- input/pagecontent/volume-1.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/input/pagecontent/volume-1.md b/input/pagecontent/volume-1.md index 4c43a93..2eefb49 100644 --- a/input/pagecontent/volume-1.md +++ b/input/pagecontent/volume-1.md @@ -160,6 +160,9 @@ The overall functionality covered by this profile is as follows: ##### 1:55.4.2.1.1 Post-discharge PCP Visit +###### 1:55.4.2.1.1.1 Post-discharge PCP Visit Use Case Description +Ms. Philips is being discharged from Green Valley General Hospital. As + ##### 1:55.4.2.1.2 Specialty Visit Scheduling ###### 1:55.4.2.1.2.1 Specialty Visit Scheduling Use Case Description From f7af6f9c2e455f7dd4857ce388d6f04b57bd35e6 Mon Sep 17 00:00:00 2001 From: Vassil Peytchev Date: Thu, 31 Oct 2024 16:16:19 -0500 Subject: [PATCH 2/6] Captions --- input/images-source/uc1-flow.plantuml | 12 ++------ input/images-source/uc2-flow.plantuml | 19 +++++------- input/images-source/uc3-flow.plantuml | 43 +++++++++++++++++++++++++++ input/pagecontent/ITI-115.md | 17 ++++++----- input/pagecontent/ITI-116.md | 16 +++++----- input/pagecontent/ITI-117.md | 13 ++++---- input/pagecontent/ITI-118.md | 27 +++++++---------- input/pagecontent/volume-1.md | 42 +++++++++++++++----------- 8 files changed, 112 insertions(+), 77 deletions(-) create mode 100644 input/images-source/uc3-flow.plantuml diff --git a/input/images-source/uc1-flow.plantuml b/input/images-source/uc1-flow.plantuml index 60ddc41..0375c52 100644 --- a/input/images-source/uc1-flow.plantuml +++ b/input/images-source/uc1-flow.plantuml @@ -3,21 +3,15 @@ skinparam responseMessageBelowArrow true skinparam svgDimensionStyle false hide footbox -actor "Dr. Brown" as User #FFFFFF -participant "Clinical Information Systen \n (Scheduling Client)" as RequestingActor -participant "Scheduling Server \n" as RespondingActor +actor "Hospital User" as User #FFFFFF +participant "Hospital Discharge Systen \n (Scheduling Client)" as RequestingActor +participant "Practice Scheduling System \n (Scheduling Server)" as RespondingActor autonumber 1 1 "[00]" activate "RequestingActor" User --> RequestingActor: Open view -||| -RequestingActor -> RespondingActor: Find Existing Appointments Query Request [ITI-118] -activate "RespondingActor" -RespondingActor --> RequestingActor: Find Existing Appointments Query Response [ITI-118] -deactivate "RespondingActor" - ||| RequestingActor -> RespondingActor: Find Potential Appointments Query Request [ITI-115] activate "RespondingActor" diff --git a/input/images-source/uc2-flow.plantuml b/input/images-source/uc2-flow.plantuml index 19d5db3..60ddc41 100644 --- a/input/images-source/uc2-flow.plantuml +++ b/input/images-source/uc2-flow.plantuml @@ -3,9 +3,8 @@ skinparam responseMessageBelowArrow true skinparam svgDimensionStyle false hide footbox -actor "Mr. White" as User #FFFFFF -participant "Patient Portal \n (Scheduling Client)" as RequestingActor -participant "Care Services Selective Supplier \n" as Provider #FFFFFF +actor "Dr. Brown" as User #FFFFFF +participant "Clinical Information Systen \n (Scheduling Client)" as RequestingActor participant "Scheduling Server \n" as RespondingActor autonumber 1 1 "[00]" @@ -14,17 +13,15 @@ activate "RequestingActor" User --> RequestingActor: Open view ||| -RequestingActor -> Provider: Find Matching Care Services Request [ITI-90] -activate "Provider" -Provider --> RequestingActor: Find Matching Care Services Response [ITI-90] -deactivate "Provider" - -User --> RequestingActor: Open view +RequestingActor -> RespondingActor: Find Existing Appointments Query Request [ITI-118] +activate "RespondingActor" +RespondingActor --> RequestingActor: Find Existing Appointments Query Response [ITI-118] +deactivate "RespondingActor" ||| -RequestingActor -> RespondingActor: Find Appointments Query Request [ITI-115] +RequestingActor -> RespondingActor: Find Potential Appointments Query Request [ITI-115] activate "RespondingActor" -RespondingActor --> RequestingActor: Find Appointments Query Response [ITI-115] +RespondingActor --> RequestingActor: Find Potential Appointments Query Response [ITI-115] deactivate "RespondingActor" ||| diff --git a/input/images-source/uc3-flow.plantuml b/input/images-source/uc3-flow.plantuml new file mode 100644 index 0000000..19d5db3 --- /dev/null +++ b/input/images-source/uc3-flow.plantuml @@ -0,0 +1,43 @@ +@startuml +skinparam responseMessageBelowArrow true +skinparam svgDimensionStyle false +hide footbox + +actor "Mr. White" as User #FFFFFF +participant "Patient Portal \n (Scheduling Client)" as RequestingActor +participant "Care Services Selective Supplier \n" as Provider #FFFFFF +participant "Scheduling Server \n" as RespondingActor + +autonumber 1 1 "[00]" + +activate "RequestingActor" +User --> RequestingActor: Open view + +||| +RequestingActor -> Provider: Find Matching Care Services Request [ITI-90] +activate "Provider" +Provider --> RequestingActor: Find Matching Care Services Response [ITI-90] +deactivate "Provider" + +User --> RequestingActor: Open view + +||| +RequestingActor -> RespondingActor: Find Appointments Query Request [ITI-115] +activate "RespondingActor" +RespondingActor --> RequestingActor: Find Appointments Query Response [ITI-115] +deactivate "RespondingActor" + +||| +User --> RequestingActor: Select Appointment +User --> RequestingActor: Add additional data +User --> RequestingActor: Confirm booking + +||| +RequestingActor -> RespondingActor: Book Appointment Request [ITI-117] +activate "RespondingActor" +RespondingActor --> RequestingActor: Book Appointment Response [ITI-117] +deactivate "RespondingActor" + +autonumber stop + +@enduml diff --git a/input/pagecontent/ITI-115.md b/input/pagecontent/ITI-115.md index ea1f17b..b7c32c6 100644 --- a/input/pagecontent/ITI-115.md +++ b/input/pagecontent/ITI-115.md @@ -6,7 +6,7 @@ The Find Potential Appointments \[ITI-115\] transaction allows a Scheduling Clie ### 2:3.115.2 Actors Roles -**Table 2:3.115.2-1: Actor Roles** +

Table 2:3.115.2-1: Actor Roles

|Actor | Role | |-------------------|--------------------------| @@ -19,22 +19,22 @@ The Find Potential Appointments \[ITI-115\] transaction allows a Scheduling Clie - [HL7 FHIR Release 4]({{site.data.fhir.path}}) ### 2:3.115.4 Messages -
+
{%include ITI-115-seq.svg%} -
+
Figure 2:3.115.4-1: Find Potential Appointments Interactions
+
-**Figure 2:3.115.4-1: Find Potential Appointments Interactions** #### 2:3.115.4.1 Find Potential Appointments Request -This transaction uses the `$find` operation as defined in the [Operation Definition](./OperationDefinition-appointment-find.html). +This transaction uses the `$find` operation as defined in the [Find Potential Appointments Operation Definition](./OperationDefinition-appointment-find.html). ##### 2:3.115.4.1.1 Trigger Events When a Scheduling Client needs to find potential slot to book a new appointment it issues a "Find Potential Appointments" request. ##### 2:3.115.4.1.2 Message Semantics -The Find Potential Appointment request is defined as a [FHIR Operation]({{site.data.fhir.path}}operations.html). Please see the corresponding [Operation Definition](./OperationDefinition-appointment-find.html). +The Find Potential Appointment request is defined as a [FHIR Operation]({{site.data.fhir.path}}operations.html). Please see the corresponding [Find Potential Appointments Operation Definition](./OperationDefinition-appointment-find.html). ###### 2:3.115.4.1.2.1 Request Parameters @@ -105,7 +105,7 @@ In the absence of any processing errors a http 200 (OK) error code is returned. In case security or other constraints prevent a Scheduling Server from returning a response to the Scheduling Client a http 4xx error code is returned. -**Table 2:3.115.4.2.4-1: Error Codes** +

Table 2:3.115.4.2.4-1: Error Codes

|Error Code | Description | Explanation | |-----------|-------------|-------------| @@ -116,7 +116,8 @@ In case security or other constraints prevent a Scheduling Server from returning The Scheduling Server MAY include an OperationOutcome to the response where it uses the values from the Error Codes table. -**Table 2:3.115.4.2.4-1: OperationOutcome Attributes** + +

Table 2:3.115.4.2.4-2: OperationOutcome Attributes

|Attribute | Value | |----------|------| diff --git a/input/pagecontent/ITI-116.md b/input/pagecontent/ITI-116.md index 2772855..41a26c2 100644 --- a/input/pagecontent/ITI-116.md +++ b/input/pagecontent/ITI-116.md @@ -6,7 +6,7 @@ The Hold Appointment \[ITI-116\] transaction is used by a Scheduling Client to r ### 2:3.116.2 Actor Roles -**Table 2:3.116.2-1: Actor Roles** +

Table 2:3.116.2-1: Actor Roles

|Actor | Role | |-------------------+--------------------------| @@ -20,16 +20,14 @@ The Hold Appointment \[ITI-116\] transaction is used by a Scheduling Client to r ### 2:3.116.4 Messages -
+
{%include ITI-116-seq.svg%} -
+
Figure 2:3.116.4-1: Hold Appointment Interactions
+
-**Figure 2:3.116.4-1: Hold Appointment Interactions** - - #### 2:3.116.4.1 Hold Appointment Request -This transaction uses the `$hold` operation as defined in the [Operation Definition](./OperationDefinition-appointment-hold.html). +This transaction uses the `$hold` operation as defined in the [Hold Appointment Operation Definition](./OperationDefinition-appointment-hold.html). ##### 2:3.116.4.1.1 Trigger Events @@ -37,13 +35,13 @@ This is an optional transaction in the ITI Scheduling Profile. and in cases whe ##### 2:3.116.4.1.2 Message Semantics -The Hold Appointment request is defined as a [FHIR Operation]({{site.data.fhir.path}}operations.html). Please see the corresponding [Operation Definition](./OperationDefinition-appointment-hold.html). +The Hold Appointment request is defined as a [FHIR Operation]({{site.data.fhir.path}}operations.html). Please see the corresponding [Hold Appointment Operation Definition](./OperationDefinition-appointment-hold.html). ##### 2:3.116.4.1.3 Expected Actions The Scheduling Server is expected to hold the necessary time slots and resources for the potential appointment to take place at the given time and for the given duration. -Note that it is possible that between the time the Find Potential Appointments \[ITI-115\] response was received, and the time the Hold Appointment \[ITI-116\] request is issued, the requested appointment is no longer available. In such case, the server SHALL respond with an OperationOutcome that describes the issue. +Note that it is possible that between the time the Find Potential Appointments [\[ITI-115\]](./ITI-115.html) response was received, and the time the Hold Appointment \[ITI-116\] request is issued, the requested appointment is no longer available. In such case, the server SHALL respond with an OperationOutcome that describes the issue. #### 2:3.116.4.2 Hold Appointment Response Message diff --git a/input/pagecontent/ITI-117.md b/input/pagecontent/ITI-117.md index d47d99a..b8e3f1d 100644 --- a/input/pagecontent/ITI-117.md +++ b/input/pagecontent/ITI-117.md @@ -6,7 +6,7 @@ The Client [ITI-117] transaction passes a go Request from a Client to a Server. ### 2:3.117.2 Actor Roles -**Table 2:3.117.2-1: Actor Roles** +

Table 2:3.117.2-1: Actor Roles

|Actor | Role | |-------------------+--------------------------| @@ -20,16 +20,15 @@ The Client [ITI-117] transaction passes a go Request from a Client to a Server. ### 2:3.117.4 Messages -
+
{%include ITI-117-seq.svg%} -
+
Figure 2:3.117.4-1: Book Appointment Interactions
+
-**Figure 2:3.117.4-1: Book Appointment Interactions** - #### 2:3.117.4.1 Book Appointment Request -This transaction uses the `$book` operation as defined in the [Operation Definition](./OperationDefinition-appointment-book.html). +This transaction uses the `$book` operation as defined in the [Book Appointment Operation Definition](./OperationDefinition-appointment-book.html). ##### 2:3.117.4.1.1 Trigger Events This transaction can be triggered by: @@ -38,7 +37,7 @@ This transaction can be triggered by: - canceling an already booked or held appointment ##### 2:3.117.4.1.2 Message Semantics -The Book Appointment request is defined as a [FHIR Operation]({{site.data.fhir.path}}operations.html). Please see the corresponding [Operation Definition](./OperationDefinition-appointment-book.html). +The Book Appointment request is defined as a [FHIR Operation]({{site.data.fhir.path}}operations.html). Please see the corresponding [Book Appointment Operation Definition](./OperationDefinition-appointment-book.html). ##### 2:3.117.4.1.3 Expected Actions diff --git a/input/pagecontent/ITI-118.md b/input/pagecontent/ITI-118.md index de00cab..45b3041 100644 --- a/input/pagecontent/ITI-118.md +++ b/input/pagecontent/ITI-118.md @@ -6,8 +6,7 @@ The Client [ITI-118] transaction requests a list of existing appointments from a ### 2:3.118.2 Actor Roles -**Table 2:3.118.2-1: Actor Roles** - +

Table 2:3.118.2-1: Actor Roles

|Actor | Role | |-------------------------------------------| | [Client](volume-1.html#client) | Requests a list of appointments matching the supplied set of criteria (example: status, patient, service location, etc.) from the Scheduling Server. The Scheduling Client MAY choose to persist the information received, and/or render it for viewing | @@ -20,13 +19,12 @@ The Client [ITI-118] transaction requests a list of existing appointments from a ### 2:3.118.4 Messages -
+
{%include ITI-118-seq.svg%} -
+
Figure 2:3.118.4-1: Find Existing Appointments Interactions
+
-**Figure 2:3.118.4-1: Find Existing Appointments Interactions** - #### 2:3.118.4.1 Find Existing Appointments Query Request This message uses the FHIR Search operation on the target Server endpoint to search for Appointment resources. @@ -44,8 +42,7 @@ The Scheduling Client MAY use a GET or POST based search. The Scheduling Server ##### 2:3.118.4.1.3 Search Parameters See the Server and Client Capability Statements for the search parameters applicable to the \[ITI-18\] transaction. -**Table 2:3.118.4.1.2-1: Search Parameters** - +

Table 2:3.118.4.1.3-1: Search Parameters

| Parameter | Type | Definition | |---------------------------------------------| | patient | ```reference``` | This parameter identifies the patient actor participating in this appointment either by its fhir resource id (if known to the Scheduling Client), or by a business identifier known for this patient. In case of a business identifier it is strongly recommended to use both the identifying system and value (i.e. patient.identifier=\\|\). If no \ is supplied the Scheduling Server MAY use internal logic to interpret the \ | @@ -63,19 +60,19 @@ For example, search appointments for patient (identifier 12345), after October 2 ###### 2:3.118.4.1.3.1 Patient Identifiers Patient identifier SHALL be fully qualified and consist of an identifier value and system (a.k.a. assigning authority or patient identity domain). Preferably identifier systems are identified with an OID value (e.g. urn:oid:1.2.3.4.5). Alternatively a URI value MAY be used (e.g. http://hl7.org/fhir/sid/us-ssn or http://hospital-1.org). -In the case when the Scheduling Server is not able to process a identifier system in a Find Existing Appointments Query transaction it SHALL return a FHIR bundle of type ```searchset``` with 0 entries. +In the case when the Scheduling Server is not able to process a identifier system in a Find Existing Appointments Query transaction it SHALL return a FHIR bundle of type `searchset` with 0 entries. The case where the Scheduling Client mey need to provided multiple patient.identifiers, all belonging to the same patient as known to the client, is considered out of scope for the ITI Scheduling Profile. ###### 2:3.118.4.1.3.2 _count -A Scheduling Client MAY add a ```_count``` parameter to the Find Appointment Query request to limit the number of responses. +A Scheduling Client MAY add a `_count` parameter to the Find Appointment Query request to limit the number of responses. ###### 2:3.118.4.1.3.3 _include -A Scheduling Client MAY add a ```_include``` parameter to request a Scheduling Server to include participation actors (Practitioner, PractitionerRole, RelatedPerson, Device, HealthcareService, or Location) in the response +A Scheduling Client MAY add a `_include` parameter to request a Scheduling Server to include participation actors (Practitioner, PractitionerRole, RelatedPerson, Device, HealthcareService, or Location) in the response ##### 2:3.118.4.1.4 Expected Actions -**Table 2:3.118.4.1.4-1: Search parameter optionality** +

Table 2:3.118.4.1.4-1: Search parameter optionality

| Parameter | Client | Server | |-------------------| @@ -116,8 +113,7 @@ In the absence of any processing errors a http 200 (OK) error code is returned. In case security constraints prevent a Scheduling Server from returning a response to the Scheduling Client a http 4xx error code is returned as described in Volume 2, Appendix Z. -**Table 2:3.118.4.2.4-1: Error Codes** - +

Table 2:3.118.4.2.4-1: Error Codes

|Error Code | Description | Explanation | |----------------------| |400 | Bad Request | The server cannot or will not process the request due to an apparent client error | @@ -127,8 +123,7 @@ In case security constraints prevent a Scheduling Server from returning a respon The Scheduling Server MAY include an OperationOutcome to the response where it uses the values from the Error Codes table. -**Table 2:3.118.4.2.4-2: OperationOutcome Attributes** - +

Table 2:3.118.4.2.4-2: OperationOutcome Attributes

| Attribute | Value | |---------| | severity | Fatal | diff --git a/input/pagecontent/volume-1.md b/input/pagecontent/volume-1.md index 2eefb49..2e2bc4b 100644 --- a/input/pagecontent/volume-1.md +++ b/input/pagecontent/volume-1.md @@ -41,12 +41,12 @@ Both appendices are located at . The figure below shows the actors directly involved in the Scheduling Profile and the relevant transactions between them. -
+
{%include ActorsAndTransactions.svg%} -
+
Figure 1:55.1-1: Scheduling Actor Diagram
+
-**Figure 1:55.1-1: Scheduling Actor Diagram** Table 1:55.1-1: Profile Acronym Profile - Actors and Transactions @@ -145,7 +145,7 @@ The FHIR specification defines several resources to describe scheduling-related There is wide variety of appointments that pertain to the healthcare domain. A core assumption of this profile is that the Scheduling Server actor is responsible for all the business logic for determining the type, duration, sequencing, and all other attributes an appointment may have. This is the reason that the response to the search for potential appointments only contains Appointment resources. The management of Schedule and Slot resources is out of scope for this profile. -For example, the Scheduling server may modify existing appointments in order to free up time for an urgent appointment. While this may change the existing ```Schedule``` and ```Slot``` resources on the server, the Scheduling Client that is attempting to book the urgent appointment only needs to know that a new appointment can be booked. Any changes to existing appointments can be detected using [\[ITI-118\]](./ITI-118.html), or, if the ITI Scheduling profile is implemented in an environment with an existing FHIR Subscription infrastructure, via a ```SubscriptionNotification``` for the changed appointment(s). +For example, the Scheduling server may modify existing appointments in order to free up time for an urgent appointment. While this may change the existing `Schedule` and `Slot` resources on the server, the Scheduling Client that is attempting to book the urgent appointment only needs to know that a new appointment can be booked. Any changes to existing appointments can be detected using the [\[ITI-118\]](./ITI-118.html) transaction, or, if the ITI Scheduling profile is implemented in an environment with an existing FHIR Subscription infrastructure, via a `SubscriptionNotification` for the changed appointment(s). The overall functionality covered by this profile is as follows: 1. The Scheduling Client identifies the patient or patients for whom the appointment will be scheduled @@ -161,9 +161,19 @@ The overall functionality covered by this profile is as follows: ##### 1:55.4.2.1.1 Post-discharge PCP Visit ###### 1:55.4.2.1.1.1 Post-discharge PCP Visit Use Case Description -Ms. Philips is being discharged from Green Valley General Hospital. As +Ms. Philips is being discharged from Green Valley General Hospital. One of the steps of the discharge process incudes scheduling a follow-up appointment with Dr. Spears, Ms. Philip's primary care provider. Dr. Spears' practice is part of a different healthcare organization, which necessitates cross-organizational scheduling of the follow-up appointment. -##### 1:55.4.2.1.2 Specialty Visit Scheduling +Without the availability of the ITI Scheduling functionality, the hospital staff would have to contact Dr. Spears' practice to negotiate an appointment for the patient, or leave it to Ms. Philips to schedule the appointment by herself. This makes it likely that the follow-up appointment may not occur in a timely manner, or at all. + +The ITI Scheduling profile would allow the two systems to communicate the request for an appointment, get a list of possible times, coordinate with the patient the best time for the appointment, and book the appointment with Dr. Spears. This will ensure the follow-up visit will happen on time, and that Ms. Philips will get the proper care. + +###### 1:55.4.2.1.1.2 Specialty Visit Scheduling Process Flow + +
+{%include uc1-flow.svg%} +
1:55.4.2.1.2 Specialty Visit Scheduling
+
+
###### 1:55.4.2.1.2.1 Specialty Visit Scheduling Use Case Description Dr. Brown detects that a radiology examination is recommended to proceed with the @@ -178,15 +188,14 @@ booking details dialog of the clinical information system. Dr. Brown confirms the records and books the examination in the confirm dialog in her clinical information system. -###### 1:55.4.2.1.2.2 Provider-facing Scheduling Client Process Flow +###### 1:55.4.2.1.2.2 Specialty Visit Scheduling Process Flow -
-{%include uc1-flow.svg%} -
+
+{%include uc2-flow.svg%} +
Figure 1:55.4.2.1-1: Specialty Visit Scheduling Process Flow
+

-Figure 1:55.4.2.1-1: Provider-facing Scheduling Client Process Flow - #### 1:55.4.2.2 Use Case \#2: Patient-facing Scheduling Client ##### 1:55.4.2.2.1 Foreign Visitor Urgent Visit @@ -208,13 +217,12 @@ dialog of the patient portal. ###### 1:55.4.2.2.1.2 Foreign Visitor Urgent Visitor Process Flow -
-{%include uc2-flow.svg%} -
+
+{%include uc3-flow.svg%} +
Figure 1:55.4.2.2-1: Patient-facing scheduling client Process Flow
+

-Figure 1:55.4.2.2-1: Patient-facing scheduling client Process Flow - ## 1:55.5 Scheduling Security Considerations From 45fba9e07b18559f38575af5528f8754c5ef6d8e Mon Sep 17 00:00:00 2001 From: Vassil Peytchev Date: Tue, 19 Nov 2024 18:51:06 -0600 Subject: [PATCH 3/6] Update references to IPA --- input/fsh/capability.fsh | 168 +----------------- .../StructureDefinition-iti-sched-appt.xml | 9 +- 2 files changed, 8 insertions(+), 169 deletions(-) diff --git a/input/fsh/capability.fsh b/input/fsh/capability.fsh index d7f58cb..2ba4c33 100644 --- a/input/fsh/capability.fsh +++ b/input/fsh/capability.fsh @@ -37,7 +37,7 @@ Usage: #definition * implementationGuide[=].extension.valueCode = #SHOULD * rest.mode = #client * rest.documentation = "IHE Scheduling client will -1. query for Patient resources matching the IPA Patient resource query parameters, +1. query for Patient resources matching the Patient resource query parameters, 1. query for Appointment resources matching the IHE Scheduling Appointment resource query parameters, 1. use the operations defined for the Appointment resource" * rest.security.cors = false @@ -113,92 +113,6 @@ Usage: #definition * rest.resource[=].operation[=].name = "hold" * rest.resource[=].operation[=].definition = "https://profiles.ihe.net/ITI/Scheduling/OperationDefinition/appointment-hold" * rest.resource[=].operation[=].documentation = "Document the hold operation" -* rest.resource[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].valueCode = #SHALL -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "family" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "gender" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "birthdate" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "family" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "birthdate" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "name" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "gender" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "name" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].type = #Patient -* rest.resource[=].profile = "http://hl7.org/fhir/uv/ipa/StructureDefinition/ipa-patient" -* rest.resource[=].profile.extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].profile.extension.valueCode = #SHALL -* rest.resource[=].documentation = "Client applications SHALL be able to access the patient record using the following API call:\n\n`GET [url]/Patient/[id]`\n\nClient application MAY use these search parameters that servers are required to support to access the patient record:\n\n - `_id`\n - `identifier`\n\nServers are not required to support any additional search parameters, and clients SHOULD not expect servers to do so.\n\nAdditional rules and guidance for supporting `Patient.link`:\n\n- The server:\n - SHALL have no more than one Patient with a status of active = \"true\" *from the server being queried* \n - MAY include inactive patients on the *same server*\n - MAY include inactive or active patients from a *different server*\n - When returning a [search Bundle](http://hl7.org/fhir/bundle.html) that contains more than one Patient record for the same patient, the Patient record(s) SHALL use the `Patient.link` attribute to cross-link the Patient resources.\n- The client:\n - SHALL be able to follow the link(s) to the other Patient resource(s) and understand the direction of the link (in other words, which Patient is linked to which other Patient)\n - SHALL understand the `Patient.link.type` code which defines the type of link between this Patient resource and another Patient resource\n - SHALL be aware of the linked Patient `active` flag and that inactive patients could have relevant information" -* rest.resource[=].interaction[0].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].interaction[=].extension.valueCode = #SHALL -* rest.resource[=].interaction[=].code = #read -* rest.resource[=].interaction[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].interaction[=].extension.valueCode = #SHALL -* rest.resource[=].interaction[=].code = #search-type -* rest.resource[=].updateCreate = false -* rest.resource[=].conditionalCreate = false -* rest.resource[=].conditionalUpdate = false -* rest.resource[=].conditionalDelete = #not-supported -* rest.resource[=].referencePolicy = #resolves -* rest.resource[=].searchRevInclude = "Provenance:target" -* rest.resource[=].searchParam[0].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHALL -* rest.resource[=].searchParam[=].name = "_id" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/Resource-id" -* rest.resource[=].searchParam[=].type = #token -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "birthdate" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-birthdate" -* rest.resource[=].searchParam[=].type = #date -* rest.resource[=].searchParam[=].documentation = "A client **SHALL** provide a value precise to the *day*." -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "family" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-family" -* rest.resource[=].searchParam[=].type = #string -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "gender" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-gender" -* rest.resource[=].searchParam[=].type = #token -* rest.resource[=].searchParam[=].documentation = "The client **SHALL** provide at least a code value and **MAY** provide both the system and code values. The server **SHALL** support both." -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "given" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-given" -* rest.resource[=].searchParam[=].type = #string -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHALL -* rest.resource[=].searchParam[=].name = "identifier" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/Patient-identifier" -* rest.resource[=].searchParam[=].type = #token -* rest.resource[=].searchParam[=].documentation = "The client **SHALL** provide both the system and code values." -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "name" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/Patient-name" -* rest.resource[=].searchParam[=].type = #string - * rest.interaction.code = #search-system Instance: IHE.Scheduling.server @@ -238,7 +152,7 @@ Usage: #definition * implementationGuide[=].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" * implementationGuide[=].extension.valueCode = #SHOULD * rest.mode = #server -* rest.documentation = "FooBar server provides capability to query for Patient resources matching a sub-set of the FHIR core Patient resource query parameters" +* rest.documentation = "Scheduling server provides capability to query for Patient resources matching a sub-set of the FHIR core Patient resource query parameters" * rest.security.cors = false * rest.security.description = "None mandated by IHE, encouraged IHE-IUA or SMART-on-FHIR" * rest.resource[0].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" @@ -318,82 +232,4 @@ Usage: #definition * rest.resource[=].profile = "https://profiles.ihe.net/ITI/Scheduling/StructureDefinition/ihe-sched-avail-bundle" * rest.resource[=].profile.extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" * rest.resource[=].profile.extension.valueCode = #SHALL -* rest.resource[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].valueCode = #SHALL -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "family" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "gender" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "birthdate" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "family" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "birthdate" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "name" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].extension[+].extension[0].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].extension[=].extension[=].valueCode = #SHOULD -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "gender" -* rest.resource[=].extension[=].extension[+].url = "required" -* rest.resource[=].extension[=].extension[=].valueString = "name" -* rest.resource[=].extension[=].url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination" -* rest.resource[=].type = #Patient -* rest.resource[=].profile = "http://hl7.org/fhir/uv/ipa/StructureDefinition/ipa-patient" -* rest.resource[=].profile.extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].profile.extension.valueCode = #SHALL -* rest.resource[=].interaction[0].code = #read -* rest.resource[=].interaction[+].code = #search-type -* rest.resource[=].searchParam[0].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHALL -* rest.resource[=].searchParam[=].name = "_id" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/Resource-id" -* rest.resource[=].searchParam[=].type = #token -* rest.resource[=].searchParam[=].documentation = "Logical id of this artifact" -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHALL -* rest.resource[=].searchParam[=].name = "idenitfier" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/Patient-identifier" -* rest.resource[=].searchParam[=].type = #token -* rest.resource[=].searchParam[=].documentation = "The server *SHALL NOT* support only code values." -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "birthdate" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-birthdate" -* rest.resource[=].searchParam[=].type = #date -* rest.resource[=].searchParam[=].documentation = "A server **SHALL** support a value precise to the *day*." -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "family" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-family" -* rest.resource[=].searchParam[=].type = #string -* rest.resource[=].searchParam[=].documentation = "A portion of the family name of the patient" -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "gender" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-gender" -* rest.resource[=].searchParam[=].type = #token -* rest.resource[=].searchParam[=].documentation = "Gender of the patient" -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "given" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/individual-given" -* rest.resource[=].searchParam[=].type = #string -* rest.resource[=].searchParam[=].documentation = "A portion of the given name of the patient" -* rest.resource[=].searchParam[+].extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" -* rest.resource[=].searchParam[=].extension.valueCode = #SHOULD -* rest.resource[=].searchParam[=].name = "name" -* rest.resource[=].searchParam[=].definition = "http://hl7.org/fhir/SearchParameter/Patient-name" -* rest.resource[=].searchParam[=].type = #string -* rest.resource[=].searchParam[=].documentation = "The full name of the patient or part of it" * rest.interaction.code = #search-system \ No newline at end of file diff --git a/input/resources/StructureDefinition-iti-sched-appt.xml b/input/resources/StructureDefinition-iti-sched-appt.xml index b3bf717..b7b9019 100644 --- a/input/resources/StructureDefinition-iti-sched-appt.xml +++ b/input/resources/StructureDefinition-iti-sched-appt.xml @@ -105,6 +105,7 @@ + - + @@ -129,8 +131,9 @@ - - + + + @@ -118,6 +106,7 @@ --> + From dc6ea88c05d0a84311d30752013ee4b6e8826789 Mon Sep 17 00:00:00 2001 From: Vassil Peytchev Date: Thu, 5 Dec 2024 17:48:32 -0600 Subject: [PATCH 5/6] First audit example --- input/fsh/audit-118.fsh | 50 ------------------------------ input/fsh/ex-audit-117.fsh | 59 ++++++++++++++++++++++++++++++++++++ input/pagecontent/ITI-115.md | 14 ++++++--- input/pagecontent/ITI-116.md | 10 ++++-- input/pagecontent/ITI-117.md | 4 +++ input/pagecontent/ITI-118.md | 16 +++++++--- 6 files changed, 90 insertions(+), 63 deletions(-) delete mode 100644 input/fsh/audit-118.fsh create mode 100644 input/fsh/ex-audit-117.fsh diff --git a/input/fsh/audit-118.fsh b/input/fsh/audit-118.fsh deleted file mode 100644 index d31905f..0000000 --- a/input/fsh/audit-118.fsh +++ /dev/null @@ -1,50 +0,0 @@ -Profile: AuditSchedulingServer -Parent: IHE.BasicAudit.PatientCreate -Id: IHE.Scheduling.FindExisting.Audit.Recipient -Title: "Audit Event for the Find Existing Appointments Transaction at Recipient" -Description: """ -Defines constraints on the AuditEvent Resource to record when a Find Existing Appointments \[ITI-118\] Transaction happens at the Recipient. -- Build off of the IHE Basic Audit Patient Create event -- add the ITI-118 as a subtype -- client is the Scheduling Client -- Server is the Scheduling Server -- may have user, app, organization agent(s) -- shall have a patient entity -- shall have an appointment identity entity -""" -* modifierExtension 0..0 -* subtype 2.. -* subtype contains iti118 1..1 -* subtype[iti118] = urn:ihe:event-type-code#ITI-118 "Find Existing Appointments" -* agent[server] obeys val-audit-source -* agent[client] ^short = "Scheduling Client" -* agent[server] ^short = "Scheduling Server" -* entity[patient] ^short = "Patient" -* entity[data] ^short = "Appointment" -* entity[data].what only Reference(Appointment) - - -Profile: AuditSchedulingClient -Parent: IHE.BasicAudit.PatientCreate -Id: IHE.Scheduling.FindExisting.Audit.Source -Title: "Audit Event for the Find Existing Appointments Transaction at Source" -Description: """ -Defines constraints on the AuditEvent Resource to record when a Find Existing Appointments \[ITI-118\] Transaction happens at the Source. -- Build off of the IHE Basic Audit Patient Create event -- add the ITI-118 as a subtype -- client is the Scheduling Client -- Server is the Scheduling Server -- may have user, app, organization agent(s) -- shall have a patient entity -- shall have an appointment identity entity -""" -* modifierExtension 0..0 -* subtype 2.. -* subtype contains iti118 1..1 -* subtype[iti118] = urn:ihe:event-type-code#ITI-118 "Find Existing Appointments" -* agent[client] obeys val-audit-source -* agent[client] ^short = "Scheduling Client" -* agent[server] ^short = "Scheduling Server" -* entity[patient] ^short = "Patient" -* entity[data] ^short = "Appointment" -* entity[data].what only Reference(Appointment) diff --git a/input/fsh/ex-audit-117.fsh b/input/fsh/ex-audit-117.fsh new file mode 100644 index 0000000..5fa4672 --- /dev/null +++ b/input/fsh/ex-audit-117.fsh @@ -0,0 +1,59 @@ +Instance: ex-auditSchedulingBook-recipient +InstanceOf: IHE.Scheduling.Book.Audit.Recipient +Title: "Audit Example of ITI-117 at recipient" +Description: "Audit Example for a Book Appointment Transaction as recorded at the recipient" +Usage: #example +* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST +* recorded = 2024-04-29T09:49:00.000Z +* outcome = http://terminology.hl7.org/CodeSystem/audit-event-outcome#0 "Success" +* source.site = "server.example.com" +* source.observer = Reference(Device/ex-device) +* source.type = http://terminology.hl7.org/CodeSystem/security-source-type#4 "Application Server" +* agent[client].type = DCM#110153 "Source Role ID" +* agent[client].requestor = false +* agent[client].who.display = "schedServer.example.org" +* agent[client].network.address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" +* agent[client].network.type = http://hl7.org/fhir/network-type#2 "IP Address" +* agent[server].type = DCM#110152 "Destination Role ID" +* agent[server].who = Reference(Device/ex-device) +* agent[server].requestor = false +* agent[server].network.address = "http://server.example.com/fhir" +* agent[server].network.type = http://hl7.org/fhir/network-type#5 "URI" +* entity[patient].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#1 "Person" +* entity[patient].role = http://terminology.hl7.org/CodeSystem/object-role#1 "Patient" +* entity[patient].what = Reference(Patient/ex-patient) +* entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +* entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +* entity[data].what = Reference(Appointment/appt1-1) +//* entity[2].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +//* entity[2].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +//* entity[2].what = Reference(DocumentReference/ex-DocumentReferenceSimplifiedPublish) + +Instance: ex-auditSchedulingBook-source +InstanceOf: IHE.Scheduling.Book.Audit.Source +Title: "Audit Example of ITI-105 at source" +Description: "Audit Example for a Simplified Publish Transaction from source perspective" +Usage: #example +* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST +* recorded = 2024-04-29T09:49:00.000Z +* outcome = http://terminology.hl7.org/CodeSystem/audit-event-outcome#0 "Success" +* source.site = "mobile app scheduling client" +* source.observer.display = "model number ABC, serial number 1234" +* source.type = http://terminology.hl7.org/CodeSystem/security-source-type#1 "User Device" +* agent[server].type = DCM#110152 "Destination Role ID" +* agent[server].who = Reference(Device/ex-device) +* agent[server].requestor = false +* agent[server].network.address = "http://server.example.com/fhir" +* agent[server].network.type = http://hl7.org/fhir/network-type#5 "URI" +* agent[client].type = DCM#110153 "Source Role ID" +* agent[client].requestor = false +* agent[client].who.display = "model number ABC, serial number 1234" +* agent[client].network.address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" +* agent[client].network.type = http://hl7.org/fhir/network-type#2 "IP Address" +* entity[patient].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#1 "Person" +* entity[patient].role = http://terminology.hl7.org/CodeSystem/object-role#1 "Patient" +* entity[patient].what = Reference(Patient/ex-patient) +* entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +* entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +* entity[data].what = Reference(Appointment/appt1-1) + diff --git a/input/pagecontent/ITI-115.md b/input/pagecontent/ITI-115.md index b7c32c6..ddb9ed4 100644 --- a/input/pagecontent/ITI-115.md +++ b/input/pagecontent/ITI-115.md @@ -138,12 +138,16 @@ See [IHE Scheduling Security Considerations](volume-1.html#security-consideratio #### 2:3.115.6.1 Security Audit Considerations -''TODO: The security audit criteria '' +The Find Potential Appointments Transaction, when it contains a Patient resource or reference as one of the parameters, is a Patient Record event as defined in [Table 3.20.4.1.1.1-1](https://profiles.ihe.net/ITI/TF/Volume2/ITI-20.html#3.20.4.1.1.1). The actors involved SHALL record audit events according to the following: -##### 2:3.115.6.2 Client Audit +##### 2:3.115.6.1.1 Client Audit -''TODO: the specifics'' +The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Find Potential Appointments Source AuditEvent](./StructureDefinition-IHE.Scheduling.FindPotential.Audit.Source.html). [Audit Example]() for a Find Potential Appointments transaction from the client perspective. -##### 2:3.115.6.3 Server Audit +##### 2:3.115.6.1.2 Server Audit -''TODO: the specifics'' +The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Potential Appointments Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.FindPotential.Audit.Recipient.html). [Audit Example]() for a Find Potential Appointments transaction from the server perspective. + +### 2:3.115.7 Other Profile Groupings + +Both the Scheduling Client and Scheduling Server MAY be grouped with their respective [Internet User Authentication (IUA)](https://profiles.ihe.net/ITI/IUA/index.html) Actors. \ No newline at end of file diff --git a/input/pagecontent/ITI-116.md b/input/pagecontent/ITI-116.md index 41a26c2..6d45d4b 100644 --- a/input/pagecontent/ITI-116.md +++ b/input/pagecontent/ITI-116.md @@ -73,12 +73,16 @@ See [IHE Scheduling Security Considerations](volume-1.html#security-consideratio #### 2:3.116.6.1 Security Audit Considerations -''TODO: The security audit criteria '' +The Hold Appointment Transaction is a Patient Record event as defined in [Table 3.20.4.1.1.1-1](https://profiles.ihe.net/ITI/TF/Volume2/ITI-20.html#3.20.4.1.1.1). The actors involved SHALL record audit events according to the following: ##### 2:3.116.6.1.1 Client Audit -''TODO: the specifics'' +The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Hold Appointment Source AuditEvent](./StructureDefinition-IHE.Scheduling.Hold.Audit.Source.html). [Audit Example]() for a Hold Appointment transaction from the client perspective. ##### 2:3.116.6.1.2 Server Audit -''TODO: the specifics'' +The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Hold Appointment Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.Hold.Audit.Recipient.html). [Audit Example]() for a Hold Appointment transaction from the server perspective. + +### 2:3.116.7 Other Profile Groupings + +Both the Scheduling Client and Scheduling Server MAY be grouped with their respective [Internet User Authentication (IUA)](https://profiles.ihe.net/ITI/IUA/index.html) Actors. \ No newline at end of file diff --git a/input/pagecontent/ITI-117.md b/input/pagecontent/ITI-117.md index b8e3f1d..70f7354 100644 --- a/input/pagecontent/ITI-117.md +++ b/input/pagecontent/ITI-117.md @@ -79,3 +79,7 @@ The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Applica ##### 2:3.117.6.1.2 Server Audit The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Appointment Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.Book.Audit.Recipient.html). [Audit Example]() for a Book Appointment transaction from the server perspective. + +### 2:3.117.7 Other Profile Groupings + +Both the Scheduling Client and Scheduling Server MAY be grouped with their respective [Internet User Authentication (IUA)](https://profiles.ihe.net/ITI/IUA/index.html) Actors. \ No newline at end of file diff --git a/input/pagecontent/ITI-118.md b/input/pagecontent/ITI-118.md index 45b3041..cb4ed06 100644 --- a/input/pagecontent/ITI-118.md +++ b/input/pagecontent/ITI-118.md @@ -131,22 +131,28 @@ The Scheduling Server MAY include an OperationOutcome to the response where it u | diagnostics | \ | {: .grid} -### 2:3.118.5 Security Considerations +### 2:3.118.5 CapabilityStatement Resource + +Servers implementing this transaction SHALL provide a CapabilityStatement Resource as described in ITI TF-2x: Appendix Z.3 indicating the transaction has been implemented. +- Requirements CapabilityStatement for [Client](CapabilityStatement-IHE.Scheduling.client.html) +- Requirements CapabilityStatement for [Server](CapabilityStatement-IHE.Scheduling.server.html) + +### 2:3.118.6 Security Considerations See the general Security Considerations in [ITI TF-1: 38.5](https://profiles.ihe.net/ITI/PDQm/volume-1.html#1385-pdqm-security-considerations). -#### 2:3.118.5.1 Security Audit Considerations +#### 2:3.118.6.1 Security Audit Considerations Both the Scheduling Server as Scheduling Client SHALL record audit events. -##### 2:3.118.5.1.1 Scheduling Client Audit +##### 2:3.118.6.1.1 Scheduling Client Audit The Scheduling Client SHALL be grouped with an [ATNA Secure Node or Secure Application (ATNA)](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, and record a Find Appointment Query request according to the BALP basic profile for REST events - Execute as defined in [RESTful activities](https://profiles.ihe.net/ITI/BALP/content.html#3573-restful-activities). -##### 2:3.118.5.1.2 Scheduling Server Audit +##### 2:3.118.6.1.2 Scheduling Server Audit The Scheduling Server SHALL be grouped with an [ATNA Secure Node or Secure Application (ATNA)](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, and record a Find Appointment Query request according to the BALP basic profile for REST events - Execute as defined in [RESTful activities](https://profiles.ihe.net/ITI/BALP/content.html#3573-restful-activities). -### 2:3.118.6 Other Profile Groupings +### 2:3.118.7 Other Profile Groupings Both the Scheduling Client and Scheduling Server MAY be grouped with their respective [Internet User Authentication (IUA)](https://profiles.ihe.net/ITI/IUA/index.html) Actors. From 6f880c0c56325d648ad6687dfe737f2d82ecba9d Mon Sep 17 00:00:00 2001 From: Vassil Peytchev Date: Fri, 6 Dec 2024 15:14:47 -0600 Subject: [PATCH 6/6] Final set of examples --- input/fsh/ex-audit-115.fsh | 57 ++++++++++++++++++++++++++++++++++++ input/fsh/ex-audit-116.fsh | 56 +++++++++++++++++++++++++++++++++++ input/fsh/ex-audit-117.fsh | 6 ++-- input/fsh/ex-encounter.fsh | 8 ----- input/fsh/ex-patient.fsh | 26 ---------------- input/ignoreWarnings.txt | 5 +++- input/pagecontent/ITI-115.md | 4 +-- input/pagecontent/ITI-116.md | 4 +-- input/pagecontent/ITI-117.md | 4 +-- 9 files changed, 125 insertions(+), 45 deletions(-) create mode 100644 input/fsh/ex-audit-115.fsh create mode 100644 input/fsh/ex-audit-116.fsh delete mode 100644 input/fsh/ex-encounter.fsh delete mode 100644 input/fsh/ex-patient.fsh diff --git a/input/fsh/ex-audit-115.fsh b/input/fsh/ex-audit-115.fsh new file mode 100644 index 0000000..50f4ca3 --- /dev/null +++ b/input/fsh/ex-audit-115.fsh @@ -0,0 +1,57 @@ +Instance: ex-auditSchedulingFindPotential-recipient +InstanceOf: IHE.Scheduling.FindPotential.Audit.Recipient +Title: "Audit Example of ITI-115 at recipient" +Description: "Audit Example for a Book Appointment Transaction as recorded at the recipient" +Usage: #example +* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST +* recorded = 2024-04-29T09:49:00.000Z +* outcome = http://terminology.hl7.org/CodeSystem/audit-event-outcome#0 "Success" +* source.site = "server.example.com" +* source.observer = Reference(Device/ex-device) +* source.type = http://terminology.hl7.org/CodeSystem/security-source-type#4 "Application Server" +* agent[client].type = DCM#110153 "Source Role ID" +* agent[client].requestor = false +* agent[client].who.display = "schedServer.example.org" +* agent[client].network.address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" +* agent[client].network.type = http://hl7.org/fhir/network-type#2 "IP Address" +* agent[server].type = DCM#110152 "Destination Role ID" +* agent[server].who = Reference(Device/ex-device) +* agent[server].requestor = false +* agent[server].network.address = "http://server.example.com/fhir" +* agent[server].network.type = http://hl7.org/fhir/network-type#5 "URI" +* entity[patient].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#1 "Person" +* entity[patient].role = http://terminology.hl7.org/CodeSystem/object-role#1 "Patient" +* entity[patient].what = Reference(Patient/ex-patient) +* entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +* entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +* entity[data].what = Reference(Appointment/appt1-1) + + +Instance: ex-auditSchedulingFindPotential-source +InstanceOf: IHE.Scheduling.FindPotential.Audit.Source +Title: "Audit Example of ITI-115 at source" +Description: "Audit Example for a Simplified Publish Transaction from source perspective" +Usage: #example +* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST +* recorded = 2024-04-29T09:49:00.000Z +* outcome = http://terminology.hl7.org/CodeSystem/audit-event-outcome#0 "Success" +* source.site = "mobile app scheduling client" +* source.observer.display = "model number ABC, serial number 1234" +* source.type = http://terminology.hl7.org/CodeSystem/security-source-type#1 "User Device" +* agent[server].type = DCM#110152 "Destination Role ID" +* agent[server].who = Reference(Device/ex-device) +* agent[server].requestor = false +* agent[server].network.address = "http://server.example.com/fhir" +* agent[server].network.type = http://hl7.org/fhir/network-type#5 "URI" +* agent[client].type = DCM#110153 "Source Role ID" +* agent[client].requestor = false +* agent[client].who.display = "model number ABC, serial number 1234" +* agent[client].network.address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" +* agent[client].network.type = http://hl7.org/fhir/network-type#2 "IP Address" +* entity[patient].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#1 "Person" +* entity[patient].role = http://terminology.hl7.org/CodeSystem/object-role#1 "Patient" +* entity[patient].what = Reference(Patient/ex-patient) +* entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +* entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +* entity[data].what = Reference(Appointment/appt1-1) + diff --git a/input/fsh/ex-audit-116.fsh b/input/fsh/ex-audit-116.fsh new file mode 100644 index 0000000..9bf3362 --- /dev/null +++ b/input/fsh/ex-audit-116.fsh @@ -0,0 +1,56 @@ +Instance: ex-auditSchedulingHold-recipient +InstanceOf: IHE.Scheduling.Hold.Audit.Recipient +Title: "Audit Example of ITI-116 at recipient" +Description: "Audit Example for a Book Appointment Transaction as recorded at the recipient" +Usage: #example +* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST +* recorded = 2024-04-29T09:49:00.000Z +* outcome = http://terminology.hl7.org/CodeSystem/audit-event-outcome#0 "Success" +* source.site = "server.example.com" +* source.observer = Reference(Device/ex-device) +* source.type = http://terminology.hl7.org/CodeSystem/security-source-type#4 "Application Server" +* agent[client].type = DCM#110153 "Source Role ID" +* agent[client].requestor = false +* agent[client].who.display = "schedServer.example.org" +* agent[client].network.address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" +* agent[client].network.type = http://hl7.org/fhir/network-type#2 "IP Address" +* agent[server].type = DCM#110152 "Destination Role ID" +* agent[server].who = Reference(Device/ex-device) +* agent[server].requestor = false +* agent[server].network.address = "http://server.example.com/fhir" +* agent[server].network.type = http://hl7.org/fhir/network-type#5 "URI" +* entity[patient].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#1 "Person" +* entity[patient].role = http://terminology.hl7.org/CodeSystem/object-role#1 "Patient" +* entity[patient].what = Reference(Patient/ex-patient) +* entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +* entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +* entity[data].what = Reference(Appointment/appt1-1) + +Instance: ex-auditSchedulingHold-source +InstanceOf: IHE.Scheduling.Hold.Audit.Source +Title: "Audit Example of ITI-116 at source" +Description: "Audit Example for a Simplified Publish Transaction from source perspective" +Usage: #example +* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST +* recorded = 2024-04-29T09:49:00.000Z +* outcome = http://terminology.hl7.org/CodeSystem/audit-event-outcome#0 "Success" +* source.site = "mobile app scheduling client" +* source.observer.display = "model number ABC, serial number 1234" +* source.type = http://terminology.hl7.org/CodeSystem/security-source-type#1 "User Device" +* agent[server].type = DCM#110152 "Destination Role ID" +* agent[server].who = Reference(Device/ex-device) +* agent[server].requestor = false +* agent[server].network.address = "http://server.example.com/fhir" +* agent[server].network.type = http://hl7.org/fhir/network-type#5 "URI" +* agent[client].type = DCM#110153 "Source Role ID" +* agent[client].requestor = false +* agent[client].who.display = "model number ABC, serial number 1234" +* agent[client].network.address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" +* agent[client].network.type = http://hl7.org/fhir/network-type#2 "IP Address" +* entity[patient].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#1 "Person" +* entity[patient].role = http://terminology.hl7.org/CodeSystem/object-role#1 "Patient" +* entity[patient].what = Reference(Patient/ex-patient) +* entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" +* entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" +* entity[data].what = Reference(Appointment/appt1-1) + diff --git a/input/fsh/ex-audit-117.fsh b/input/fsh/ex-audit-117.fsh index 5fa4672..5120cf1 100644 --- a/input/fsh/ex-audit-117.fsh +++ b/input/fsh/ex-audit-117.fsh @@ -25,13 +25,11 @@ Usage: #example * entity[data].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" * entity[data].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" * entity[data].what = Reference(Appointment/appt1-1) -//* entity[2].type = http://terminology.hl7.org/CodeSystem/audit-entity-type#2 "System Object" -//* entity[2].role = http://terminology.hl7.org/CodeSystem/object-role#4 "Domain Resource" -//* entity[2].what = Reference(DocumentReference/ex-DocumentReferenceSimplifiedPublish) + Instance: ex-auditSchedulingBook-source InstanceOf: IHE.Scheduling.Book.Audit.Source -Title: "Audit Example of ITI-105 at source" +Title: "Audit Example of ITI-1017 at source" Description: "Audit Example for a Simplified Publish Transaction from source perspective" Usage: #example * meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST diff --git a/input/fsh/ex-encounter.fsh b/input/fsh/ex-encounter.fsh deleted file mode 100644 index 23149c9..0000000 --- a/input/fsh/ex-encounter.fsh +++ /dev/null @@ -1,8 +0,0 @@ -Instance: example -InstanceOf: Encounter -Title: "Example Encounter" -Description: "holding typical values" -* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST -* subject = Reference(Patient/ex-patient) -* status = #finished -* class = http://terminology.hl7.org/CodeSystem/v3-ActCode#HH diff --git a/input/fsh/ex-patient.fsh b/input/fsh/ex-patient.fsh deleted file mode 100644 index 85079b6..0000000 --- a/input/fsh/ex-patient.fsh +++ /dev/null @@ -1,26 +0,0 @@ -Instance: ex-patient -InstanceOf: Patient -Title: "Example Patient" -Description: "The patient from which all the example relate" -// history - http://playgroundjungle.com/2018/02/origins-of-john-jacob-jingleheimer-schmidt.html -* meta.security = http://terminology.hl7.org/CodeSystem/v3-ActReason#HTEST -* name[0].use = #usual -* name[0].family = "Smith" -* name[0].given = "Jack" -* name[1].use = #old -* name[1].family = "Schnidt" -* name[1].given[0] = "John" -* name[1].given[1] = "Jacob" -* name[1].given[2] = "Jingle" -* name[1].given[3] = "Heimer" -* name[1].period.end = "1960" -* name[2].use = #official -* name[2].family = "Smith" -* name[2].given[0] = "John" -* name[2].given[1] = "Jacob" -* name[2].given[2] = "Jingleheimer" -* name[2].period.start = "1960-01-01" -* gender = #other -* birthDate = "1923-07-25" -* address.state = "WI" -* address.country = "USA" \ No newline at end of file diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index ec09c1c..4744ad1 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -3,7 +3,10 @@ # IHE valueset that is not yet a real valueset A definition for CodeSystem 'urn:ihe:event-type-code' could not be found, so the code cannot be validated # See Issue 26 https://github.com/IHE/ITI.Scheduling/issues/26 -The Implementation Guide contains no examples for this profile The Implementation Guide contains no examples for this extension # Missing capability for this extension, see https://jira.hl7.org/browse/FHIR-34397 This element does not match any known slice defined in the profile http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination|5.1.0 +# Inherited property +The discriminator type 'pattern' is deprecated in R5+. For future compatibility, you could consider using type=value with a pattern[x] instead (if this is not an inherited slicing) +# Searchset Bundles that are a result of an operation don't have a valid self link +SearchSet Bundles should have a self link that specifies what the search was diff --git a/input/pagecontent/ITI-115.md b/input/pagecontent/ITI-115.md index ddb9ed4..3fc0674 100644 --- a/input/pagecontent/ITI-115.md +++ b/input/pagecontent/ITI-115.md @@ -142,11 +142,11 @@ The Find Potential Appointments Transaction, when it contains a Patient resource ##### 2:3.115.6.1.1 Client Audit -The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Find Potential Appointments Source AuditEvent](./StructureDefinition-IHE.Scheduling.FindPotential.Audit.Source.html). [Audit Example]() for a Find Potential Appointments transaction from the client perspective. +The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Find Potential Appointments Source AuditEvent](./StructureDefinition-IHE.Scheduling.FindPotential.Audit.Source.html). [Audit Example](./AuditEvent-ex-auditSchedulingFindPotential-source.html) for a Find Potential Appointments transaction from the client perspective. ##### 2:3.115.6.1.2 Server Audit -The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Potential Appointments Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.FindPotential.Audit.Recipient.html). [Audit Example]() for a Find Potential Appointments transaction from the server perspective. +The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Potential Appointments Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.FindPotential.Audit.Recipient.html). [Audit Example](./AuditEvent-ex-auditSchedulingFindPotential-recipient.html) for a Find Potential Appointments transaction from the server perspective. ### 2:3.115.7 Other Profile Groupings diff --git a/input/pagecontent/ITI-116.md b/input/pagecontent/ITI-116.md index 6d45d4b..ecaf6b3 100644 --- a/input/pagecontent/ITI-116.md +++ b/input/pagecontent/ITI-116.md @@ -77,11 +77,11 @@ The Hold Appointment Transaction is a Patient Record event as defined in [Table ##### 2:3.116.6.1.1 Client Audit -The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Hold Appointment Source AuditEvent](./StructureDefinition-IHE.Scheduling.Hold.Audit.Source.html). [Audit Example]() for a Hold Appointment transaction from the client perspective. +The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Hold Appointment Source AuditEvent](./StructureDefinition-IHE.Scheduling.Hold.Audit.Source.html). [Audit Example](AuditEvent-ex-auditSchedulingHold-source.html) for a Hold Appointment transaction from the client perspective. ##### 2:3.116.6.1.2 Server Audit -The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Hold Appointment Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.Hold.Audit.Recipient.html). [Audit Example]() for a Hold Appointment transaction from the server perspective. +The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Hold Appointment Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.Hold.Audit.Recipient.html). [Audit Example](AuditEvent-ex-auditSchedulingHold-recipient.html) for a Hold Appointment transaction from the server perspective. ### 2:3.116.7 Other Profile Groupings diff --git a/input/pagecontent/ITI-117.md b/input/pagecontent/ITI-117.md index 70f7354..efc2cd5 100644 --- a/input/pagecontent/ITI-117.md +++ b/input/pagecontent/ITI-117.md @@ -74,11 +74,11 @@ The Book Appointment Transaction is a Patient Record event as defined in [Table ##### 2:3.117.6.1.1 Client Audit -The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Appointment Source AuditEvent](./StructureDefinition-IHE.Scheduling.Book.Audit.Source.html). [Audit Example]() for a Book Appointment transaction from the client perspective. +The Scheduling Client, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Appointment Source AuditEvent](./StructureDefinition-IHE.Scheduling.Book.Audit.Source.html). [Audit Example](AuditEvent-ex-auditSchedulingBook-source.html) for a Book Appointment transaction from the client perspective. ##### 2:3.117.6.1.2 Server Audit -The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Appointment Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.Book.Audit.Recipient.html). [Audit Example]() for a Book Appointment transaction from the server perspective. +The Scheduling Server, when grouped with the [ATNA Secure Node or Secure Application](https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html) Actor, SHALL be able to record an audit event consistent with the [Book Appointment Recipient AuditEvent](./StructureDefinition-IHE.Scheduling.Book.Audit.Recipient.html). [Audit Example](./AuditEvent-ex-auditSchedulingBook-recipient.html) for a Book Appointment transaction from the server perspective. ### 2:3.117.7 Other Profile Groupings