Structured Data Capture, published by HL7 International / FHIR Infrastructure. This guide is not an authorized publication; it is the continuous build for version 3.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/sdc/ and changes regularly. See the Directory of published versions
Page standards status: Informative |
Contents:
The Structured Data Capture (SDC) Initiative identifies and recommends standards for the interoperable representation and transmission of the following:
FHIR Capability statements define the expectations for system "roles" within an SDC environment. To be considered SDC-conformant, a system must adhere to the requirements defined by at least one of these statements. Some systems might choose to comply with more than one.
In addition to the above, there are three other roles that are not defined by this implementation guide:
The relationship between these roles and a summary of how they can interact is shown in Figure 1.
Figure 1: Role operations
There are two primary workflows that fall within the scope of the SDC implementation guide - form creation/curation and form filling. There's a third workflow not strictly within the scope of SDC that is also discussed - form solicitation.
Figure 2: Form Curation Workflow
In form curation, as shown in Figure 2, the Form Designer interacts with both the Form Manager and the Data Element Registry to create, edit and update forms, including identifying and defining associated terminologies and data elements. This is an iterative process where an initial version is created and then subsequently updated and maintained, eventually changing status to active and later retired.
The more significant (and complex) workflow in SDC is to complete (and potentially submit) a completed questionnaire response.
Figure 3: Form Filling Workflow
Note: The diagram depicts the optional storage of the completed form by the EHR. This can occur when the EHR stores a copy of the form as they send it to the External Data Repository or by the external data repository returning a copy of the form to the sender who can store an internal version of the form.
The driver of this workflow is the Form Filler system. It retrieves a form (Questionnaire) from the Form Manager. It may also request that the Form Manager generate an initial QuestionnaireResponse, potentially partially populated with information known by the Form Manager, supplied by the Form Filler or queried from the underlying EHR. The Form Filler could generate the QuestionnaireResponse itself without the assistance of the Form Manager and in either case could partially fill in the response based on information known by the form filler.
When as much of the questionnaire response as possible has been filled in by automated means, the form is displayed to an end-user who reviews and edits the automatically populated content as well as completing those portions of the form that were not populated automatically. In some cases, the form may be stored locally or using a Form Response Manager to allow a user to stop and resume editing at a later point.
The Form Filler (possibly with help from the Form Manager) is responsible for verifying that a completed form is complete and valid against the corresponding Questionnaire. Once valid, the form filler submits the form to one or more target repositories (Form Receiver allows the completed form to be subsequently retrieved, Form Archiver does not) and/or stores the completed form itself. (Note - Form Receivers may perform validation on forms prior to consumption, Form Archivers typically will not.) The receiver of the completed form might then extract the data into relevant FHIR resources.
Figure 4: Form Solicitation Workflow
In this workflow, a clinical, research or other system that wants a user to complete a form creates a Task instance which behaves as a "to do" item for the specified 'owner'. There are two different options in terms of the nature of the Task. The Task could specifically say "Please fill out this Questionnaire" or it could say "please fulfill this ServiceRequest where the ServiceRequest in turn seeks fulfillment of a specific Questionnaire. The recommendation is to use the Task-only approach unless there's a genuine need for a formal 'order' associated with the request - e.g. to support payment, to encourage compliance, etc.
The SDC Task profile sets expectations for an instance regardless of which approach is chosen.
In this mode, a Task is initiated that indicates the Questionnaire to be completed by specifying the Questionnaire itself as a Task.input
.
(In R5, if Task.focus is expanded to support canonical, this will likely change to use Task.focus instead.) This implementation guide defines a specific
code to use for the Task.code
that defines the expected action on that focus - i.e. to create a completed QuestionnaireResponse instance that is valid against the specified Questionnaire.
The questionnaire
from the http://hl7.org/fhir/uv/sdc/CodeSystem/temp code system. (This code will eventually be replaced with an 'official'
code in an externally maintained code system - e.g. LOINC, SNOMED or something in terminology.hl7.org.) The Task identifies the Questionnaire to be completed and also provides
information such as why the Questionnaire needs to be completed, who is to complete it, who is asking for it, when it needs to be done, etc.
While this approach doesn't rely on the existence of an order to specify the Questionnaire to be completed, there might still be an 'order' associated with the Task that provides an
overall authorization that drives the
need for the form to be completed. For example, a pre-surgery form or a satisfaction survey might point to a ServiceRequest that had ordered the surgery. In this case, the relevant
Request resource will be referenced by the Task.basedOn
element. In this case, the 'Request' would not dictate the specific
Questionnaire, but would instead typically specify a higher level action (appointment, medication, surgery, therapy, etc.). An example for Task-based solicitation can be found here.
In this situation, the Questionnaire to be filled out is the primary focus of the order and is explicitly identified in the 'Request' - which in this case will always be a
ServiceRequest. The same code
is used as was used on the Task, however with ServiceRequest, the Questionnaire to
be completed is specified in an SDC-specific extension. There can only be one Questionnaire specified. A Task is then created to seek fulfillment of the order. It is possible
that the order might solicit the Questionnaire to be filled out multiple times. However, there will be a separate Task for each occurrence. The reason, expected timing, intended performer,
etc. may be fully specified by the ServiceRequest, might only be specified by the Task, or might be defined at a high-level by the ServiceRequest and then refined by the Task.
As with the Task-based approach, a ServiceRequest might in turn point to a 'higher-level' Request that is fulfilled, in part, by the ServiceRequest seeking the filling of the form. This higher-level ServiceRequest might be an order, but could also be a proposal or plan. For example, a decision support recommendation. An example for Request-based solicitation can be found here.
Regardless of the type of Task used, there are a number of common considerations when using the Task to solicit activity. The first is how the Task is delivered. The Workflow Management section of the core specification provides a number of mechanisms for communicating the Task to the system responsible for acting upon it, including:
In addition to delivery, there are several other considerations:
owner
and performerType
, the owner
omitted and the performerType
specified or the owner
specified with a higher-level performer (e.g. an Organization or a
CareTeam, with the expectation that the actual QuestionnaireResponse will be completed by someone who is a 'member' of the specified group.
Even if the Task is assigned to a specific individual (e.g. a Patient), workflow processes might allow for the owner to be changed or the QuestionnaireResponse author to differ
from the assigned Task owner. E.g. A form filled out by a next-of-kin in situations where the patient is unable.
statusReason
to indicate why they will not or cannot fill out the Questionnaire. Workflow should allow for this possibility of rejection and decide whether standardized reason codes should be used.
SDC does not impose any constraints at this time.
Task.executionPeriod.end
), the status might be changed to
'failed' by either the placer or filler system.
Once the QuestionnaireResponse has been created, it needs to be stored somewhere and linked as a Task.output
. Again, SDC has defined an explicit output code -
questionnaire-response
from the http://hl7.org/fhir/uv/sdc/CodeSystem/temp code system. This code will also be replaced with an
'official' code once the business requirements have been better confirmed.
If the 'responseEndpoint' Task.output
is present, the QuestionnareResponse should be POSTed to all of the specified endpoints. Similarly, if the
sdc-questionnaire-endpoint extension is present on the Questionnaire, it should be POSTed to those endpoints as
well. If any of those endpoints are simple RESTful locations (i.e. ending in QuestionnaireResponse) and the corresponding server supports the read
operation, then that endpoint can be used as the target of the 'responseEndpoint' reference. If there are no specified endpoints in either the Task or the Questionnaire, or if
all of the endpoints specified are write-only or operation endpoints such as $process-response, then the
QuestionnaireResponse will need to be posted elsewhere - typically on the same server as the Task, but it can be elsewhere. It obviously SHOULD be accessible to the system
that initiated the Task.
Task.output
, allowing it to be easily re-loaded on
resumption of the Task. The QuestionnaireResponse.status and the Task.status would not be set to 'completed' until the user had decided the form was 'done' and it
successfully met validation criteria. Submission to any indicated endpoints would typically not occur until the QuestionnaireResponse was deemed 'completed'.