eHealth Infrastructure (v2020.7)

StructureDefinition: ehealth-questionnaire

Introduction

A Questionnaire is a structured set of questions intended to guide the collection of answers from end-users. Questionnaires provide detailed control over order, presentation, phraseology and grouping to allow coherent, consistent data collection.

Scope and Usage

In the eHealth Infrastructure the Questionnaire resource is used in line with this. Questionnaires are built and maintained by Practitioners and presented to Patients by client applications in order to gather input and answers from Patients in the form of QuestionnaireResponse resources.

Setting minimal and maximal number of permitted choices

A question where possible answers are given as a list of options (of item.type set to choice) can allow multiple choices by setting item.repeats to true. When no further constraints are set, item.repeats set to true means that any number of the options can be provided as answer to the question in a QuestionnaireResponse. The standard extensions item.questionnaire-minOccurs and item.questionnaire-maxOccurs can be used to set such further constraints.

  • item.questionnaire-minOccurs sets the minimum number of answers allowed, for instance 2 (of the number of options, say, 5). The element shall be set only when its value is greater than one.
  • item.questionnaire-maxOccurs sets the maximum number of answers allowed, for instance 3 (of the number of options, say 5). The element shall be set only when its value is greater than one.

When exactly one answer shall be required, item.requied shall be set to true and item.repeats shall be set to false. When exactly one answer is permitted, item.requied shall be set to false and item.repeats shall be set to false. In these cases, the minOCcurs and maxOccurs shall not be used.

Feedback to the Patient

The Questionnaire resource supports the Question Feedback Pattern from DK QFDD questionnaires. This enables immediate feedback to the patient upon answering a question.

The feedback is pre-defined in the Questionnaire resource using the item.feedback element, so that for each item a patient feedback can be prepared. The feedback will be shown to the patient if the patient’s answer to an item lies within a given interval. The mechanism only works for questions which can be answered with a numeric value. The interval is defined by the min and a max elements of the feedback extension. If the Patient answers the item with a numeric value in the interval given by min-max then the value of the feedback extension is intended to be shown to the Patient.

Recommendation

In the recommendation element, a questionnaire can optionally hold a “degree of recommendation” intended to aid the Practitioner in deciding whether or not the Questionnaire should be applied to the Patient.

Formal Views of Profile Content

The official URL for this profile is:

http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-questionnaire

This profile builds on Questionnaire.

This profile was published on Tue Oct 27 14:11:48 UTC 2020 as a draft by ehealth.sundhed.dk.

Description of Profiles, Differentials, Snapshots, and how the XML and JSON presentations work.

 

Terminology Bindings

PathConformanceValueSet
Questionnaire.languageextensibleCommon Languages
Max Binding: All Languages
Questionnaire.statusrequiredPublicationStatus
Questionnaire.jurisdictionextensibleJurisdiction
Questionnaire.codeexampleQuestionnaire Question Codes
Questionnaire.subjectTyperequiredResourceType
Questionnaire.item.codeexampleQuestionnaire Question Codes
Questionnaire.item.typerequiredQuestionnaireItemType
Questionnaire.item.enableWhen.answer[x]exampleQuestionnaire Answer Codes
Questionnaire.item.option.value[x]exampleQuestionnaire Answer Codes
Questionnaire.item.initial[x]exampleQuestionnaire Answer Codes

Constraints

IdPathDetailsRequirements
dom-2QuestionnaireIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-1QuestionnaireIf the resource is contained in another resource, it SHALL NOT contain any narrative
: contained.text.empty()
dom-4QuestionnaireIf a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
: contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-3QuestionnaireIf the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource
: contained.where(('#'+id in %resource.descendants().reference).not()).empty()
que-2QuestionnaireThe link ids for groups and questions must be unique within the questionnaire
: descendants().linkId.isDistinct()
ele-1Questionnaire.extension:recommendationAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.extension:recommendationMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.extension:intendedOrganizationAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.extension:intendedOrganizationMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.extension:revisionAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.extension:revisionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.extension:modifierRoleAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.extension:modifierRoleMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.extension:typeAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.extension:typeMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.itemAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
que-9Questionnaire.itemRead-only can't be specified for "display" items
: type!='display' or readOnly.empty()
que-8Questionnaire.itemDefault values can't be specified for groups or display items
: (type!='group' and type!='display') or initial.empty()
que-6Questionnaire.itemRequired and repeat aren't permitted for display items
: type!='display' or (required.empty() and repeats.empty())
que-5Questionnaire.itemOnly 'choice' items can have options
: (type ='choice' or type = 'open-choice') or (options.empty() and option.empty())
que-4Questionnaire.itemA question cannot have both option and options
: option.empty() or options.empty()
que-3Questionnaire.itemDisplay items cannot have a "code" asserted
: type!='display' or code.empty()
que-10Questionnaire.itemMaximum length can only be declared for simple question types
: (type in ('boolean' | 'decimal' | 'integer' | 'string' | 'text' | 'url')) or maxLength.empty()
que-1Questionnaire.itemGroup items must have nested items, display items cannot have nested items
: (type='group' implies item.empty().not()) and (type.trace('type')='display' implies item.trace('item').empty())
ele-1Questionnaire.item.extension:minOccursAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:minOccursMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.extension:feedbackAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:feedbackMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.extension:maxOccursAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:maxOccursMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.extension:minValueAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:minValueMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.extension:maxValueAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:maxValueMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.extension:slidingStepValueAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:slidingStepValueMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.extension:overviewUsageModeAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Questionnaire.item.extension:overviewUsageModeMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Questionnaire.item.enableWhenAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
que-7Questionnaire.item.enableWhenenableWhen must contain either a 'answer' or a 'hasAnswer' element
: hasAnswer.exists() xor answer.exists()
ele-1Questionnaire.item.optionAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
.