Stream: questionnaire
Topic: Questionnaire Workflow
Grey Faulkenberry (May 23 2021 at 16:56):
I have another question about workflows for questionnaires. I'm designing a workflow for screening questionnaires using FHIR, and I want to make sure I have all of the resources I'm going to use. It's going to go something like this:
- The clinical provider (doctor/nurse/social worker) places an order to screen a patient
- That order references a list of multiple questionnaires that together make up the entire screening survey
- After ordering, the patient sent a link via text or email that they have a survey waiting
- The patient clicks the link, is directed to the login screen, and then has the surveys displayed for them to complete
- The surveys are saved during the process, so patients can come back to complete them later
- The patient is alerted periodically if they have not completed the questionnaire
- When completed, the questionnaire is scored, and referrals are made based on these scores
Using FHIR, I thought the workflow would look something like this:
- Order from outside system gets placed
- This generates a FHIR ServiceRequest
- The ServiceRequest references a PlanDefinition
- The PlanDefinition is a list of Questionnaires
- A Communication is generated for an email or text which is sent to the patient with a link
- When they open the link, the Questionnaires from the PlanDefinition are displayed
- They answer the Questionnaire, which gets stored as a QuestionnaireResponse on the server
- If it is incomplete, periodically a Communication is again generated to alert the patient to complete the survey
- When the questionnaire is complete, it is scored (should this be stored in an Observation, or only in the QuestionnaireResponse?)
- If the score meets certain thresholds, then another ServiceRequest is generated for referrals
Am I missing anything in this workflow?
Lloyd McKenzie (May 23 2021 at 19:31):
Step 5 should ideally be a Task. Task says "please do", while Communication just says "here's some info". They can refuse a Task, they can't refuse a Communication. And patient's are absolutely going to want to refuse sometimes. (If you keep hounding them forever, they're not going to be happy with you...) Also, you might ideally create a distinct Task for each Questionnaire, as they might fill out some but not others. You can use Communication to log the fact that you sent a prompting email/text as well as follow-ups though. In terms of step 9, If you want the score to be subsequently searchable, you'll definitely want an Observation for it. (You can link it to the QuestionnaireResponse as the source it's derived form though.
Grey Faulkenberry (May 23 2021 at 23:02):
Yeah, agreed about bothering the patient (I'm not a huge fan of that aspect, but that's what we've been requested to do).
And for step 5, you're suggesting creating both a Task and a Communication, correct? The Task would be the "request" to the patient to do something, and the Communication is just the record that we did actually send them something.
Grey Faulkenberry (Jun 16 2021 at 16:21):
OK, one further question.
Grey Faulkenberry (Jun 16 2021 at 16:28):
Sorry, I'm just trying to be as clear as I can be on the workflow:
- Order placed
- ServiceRequest created from Order
- Service Request Triggers the Creation of a Task and Instantiates a PlanDefinition
- The PlanDefinition has references to all of the Questionnaires that are to be included
- The Task references the PlanDefinition and keeps track of the progress through the questionnaires
- When the Task is initially created, it triggers the creation of a CommunicationRequest
- The CommunicationRequest Triggers an SMS with a link to login and complete the Questionnaires
- Anytime an SMS is sent, a Communication resource is created
- The responses to each Questionnaire is stored as a QuestionnaireResponse, and again, this process is tracked within the Task
- When complete, the QuestionnaireResponse is scored, and Observations are created if appropriate
Grey Faulkenberry (Jun 16 2021 at 16:35):
Assuming that I now have the workflow correct,
- Is there a proper way in FHIR for these resources to reference one another?
- Both ServiceRequest and Task contain an instantiatesCanonical, should that reference the PlanDefinition?
Lloyd McKenzie (Jun 24 2021 at 23:56):
- What's the difference between 'Order' and 'ServiceRequest'? Is the former your internal object and ServiceRequest is your FHIR representation of that?
- Presume the ServiceRequest instantiates, not the Task?
- If you've got multiple Questionnaires to be completed, there should be a separate Task for each (though they could be partOf an overall Task). Each would be a "to do" item and each would have their own status. Some might be complete, some might be refused.
- Why do you need CommunicationRequest at all? Task is the mechanism to say "please complete". If you want to notify someone that a Task exists, you're free to fire an SMS. If you want to track all the reminder SMSs you've sent, those would be Communication instances. The "please fill out the form" would be Task, not CommunicationRequest.
- The response for each Questionnaire should be the 'output' for the sub-Task tied to that Questionnaire.
ServiceRequest would point to the PlanDefinition if at the time of ordering, the order is saying "please follow protocol X". The Task could have it as well, or it could have it alone if the determination to follow a particular protocol was not driven by the ServiceRequest but rather by local business rules.
Grey Faulkenberry (Jul 26 2021 at 14:49):
@Lloyd McKenzie , sorry, just coming back to this and wanted to add to it to ensure I'm understanding. Without any of the Communication stuff from above, the basic workflow would be:
- Order (internal object) is placed, and a ServiceRequest is Created
- The ServiceRequest triggers the creation of a Task, and passes a PlanDefinition to the newly created Task
- The Task uses the PlanDefinition to find the correct Questionnaire
- When ready to distribute the Questionnaire to a patient, we could poll the system to look for new tasks or for a specific task
- That Task specifies the correct PlanDefinition/Questionnaire/QuestionnaireResponse, and also gives us information about the state (in process, percent completed, etc)
Is that closer to how it's supposed to work?
Lloyd McKenzie (Jul 26 2021 at 17:11):
A ServiceRequest is just an authorization - it doesn't drive any activity. You'd normally have a Task that said "please fulfill (all or part of) this ServiceRequest". If the PlanDefinition was going to be referenced by anything, it would typically be referenced by the ServiceRequest. If as part of satisfying the ServiceRequest you wanted to ask someone to fill out a Questionnaire, then you'd have a Task that pointed to the Questionnaire. It might have a 'basedOn' relationship to the ServiceRequest and/or an 'instantiates' relationship to the PlanDefinition.
Grey Faulkenberry (Jul 26 2021 at 19:09):
If that's the case, should the original internal order create a serviceRequest (to represent itself) and also create the Task object?
Lloyd McKenzie (Jul 26 2021 at 19:55):
I'm not sure why you're differentiating "original internal order". My expectation is that the original internal order is a ServiceRequest - or more specifically, ServiceRequest is the way that original order is exposed over the FHIR interface. Is there a reason they wouldn't be the same?
Grey Faulkenberry (Jul 26 2021 at 22:42):
I think they could probably be the same. I think I'm just missing something about the workflows.
The overall idea its that we're working with a group of clinics and we're going to provide screening tools for their patients.
The provider is going to send us a request from outside of our system. That request is going to have a patient's information, (mostly just age, name, birthdate). Depending on the age of the patient, there is a group of surveys we're going to provide. For instance, if the patient is 2 years old, we're going to give them a questionnaire about demographics, one about developmental milestones, and then two questionnaires about general pediatrics.
My plan was to have all of the questionnaires saved on our FHIR server. For each age group, there would be a PlanDefinition which would define which questionnaires are given for which age.
Grey Faulkenberry (Jul 26 2021 at 22:42):
And then I was trying to understand the workflow and which resources drove the action.
Grey Faulkenberry (Jul 26 2021 at 22:44):
And also I mispoke about the initial order. It's an external order/order from outside of our system.
Lloyd McKenzie (Jul 26 2021 at 22:45):
What does the external order 'order'? Just "Please get them to fill out whatever questionnaires are necessary?" (If so, that sounds more like a Task than an order, as there doesn't seem to be an authorization involved...)
Grey Faulkenberry (Jul 26 2021 at 22:45):
Yep. The external order is from a provider asking us to survey the patient.
Grey Faulkenberry (Jul 26 2021 at 22:46):
So then would it make more sense to skip the serviceRequest completely, and just create a task?
Lloyd McKenzie (Jul 26 2021 at 22:47):
I think so. You could then link the various "please fill out form X" Tasks as sub-tasks.
Grey Faulkenberry (Jul 26 2021 at 22:47):
What sort of authorization would differentiate an order from a task?
Lloyd McKenzie (Jul 26 2021 at 22:55):
An authorization is needed when you're prescribing, ordering drugs, lab tests, etc. You might also want an order if you were saying "Patient should be administered xyz psych assessment instrument". But just saying "send them whatever forms you deem appropriate" doesn't really sound like an authorization of "I hereby give permission for forms to be sent". (Because normally permission includes at least some sense of what's actually supposed to happen.)
Grey Faulkenberry (Jul 26 2021 at 22:59):
Well, we have a specified list of questionnaires for each age group. So for 12-15 months you're supposed to fill out these 4 surveys, but if you're 23-28 months, you're supposed to fill out these 6 surveys.
Grey Faulkenberry (Jul 26 2021 at 22:59):
If the request is sent, the goal is to have the patient complete all of those specific surveys based on the patient's age.
Grey Faulkenberry (Jul 26 2021 at 23:00):
But the order doesn't have to come from a clinician (it can come from a social worker, case manager, etc). And there's no insurance requirements or anything like that.
Daniel Tam (Aug 04 2021 at 23:29):
Hi Grey, I am running into this now, and was wondering: In step 10, after scoring the questionnaire, did you choose to store the score as an observation? Or are you also storing the score within the QuestionnaireResponse itself?
My inclination is to store the score only as an Observation, but was curious if you considered storing the score in the QuestionnaireResponse (perhaps as an extension hidden from the patient??)
Lloyd McKenzie (Aug 04 2021 at 23:31):
The reason for storing it in the QR would be that the logic for calculating it would be in the Questionnaire - and the extraction process generally only works with data that resides somewhere in the QR.
Last updated: Apr 12 2022 at 19:14 UTC