MedMij FHIR use case GP Data
This page has status 'draft' - Working version FHIR IG - GP Data |
Inhoud
Introduction
The input document "Richtlijn online inzage in het H-EPD door patiënt" (Dutch) described online access of GP data by patients. The use case evolves around a GP specific Patient Data that consists of 10 sections plus the patient and the healthcare provider (GP). These sections correspond to the "HIS referentiemodel Publieksversie 2016" (Dutch). HIS referentiemodel is the GP information system reference model (GP-IS-RM).
Some but not all sections in the GP Patient Data correspond to Health and Care Information Models (HCIMs (English) or ZIBs (Dutch)). A joint initiative project between Nictiz and the Dutch GP association NHG is underway to analyse the relationship between the GP-IS-RM and the HCIMs and propose updates where needed. This analysis will not yield results before 2019. This specification thus predates the analysis, and will updated accordingly moving forward.
This page will elaborate further on the HL7 FHIR details needed to exchange the GP Patient Data information using FHIR.
Actors involved
Persons | Systems | FHIR Capability Statements | |||
---|---|---|---|---|---|
Name | Description | Name | Description | Name | Description |
Patient | The user of a personal healthcare enviorment. | PHR | Personal health record | CapabilityStatement: Client | GP Patient Data client requirements |
Healthcare professional | The user of a XIS | XIS | Healthcare information system | CapabilityStatement: Server | GP Patient Data server requirements |
Boundaries and Relationships
The GP Patient Data use case has similarities and differences with other use cases such as the BgZ, Medication Process, Vital Signs and Lab Results. These use cases use much of the same HCIM based FHIR profiles for exchanging information. Wherever possible every attempt is made to re-use the profiles as used in the BgZ. The GP Patient Data also has a few unique profiles compared to the aforementioned use cases. A second thing to note is that while the selection criteria of certain sections like lab do not match, this does not affect the response profiles. For example it is irrelevant for the response profile lab if you request the 'latest lab result' or 'every result since date X'.
List of invocations
This FHIR implementation guide assumes that the PHR system is able to make a connection to the XIS that contains the GP Patient Data information. It does not provide information on finding the right XIS nor does it provide information about security. These infrastructure and interface specifications are described in the 'Afsprakenstelsel'.
Client - PHR
The PHR system can request the GP Patient Data using individual search interactions. The search interaction searches the current resources based on some filter criteria. The interaction can be performed by an HTTP GET or command as shown:
GET [base]/[type]/{?[parameters]{&_format=[mime-type]}}
The GP Patient Data consists of multiple FHIR resources with certain constraints. To obtain the patients GP Patient Data, the client can use multiple individual search operations based on specified search queries. The client may also bundle the search operations in a batch. The individual requests are discussed first, followed by the batch procedure.
Individual resource requests
The table below shows in the first four columns the GP Patient Data sections, the GP-IS-RM sections / HCIMs that constitute those sections and the specific content of the GP Patient Data. The last column shows the FHIR search queries to obtain the GP Patient Data information. These queries are based on StructureDefinitions listed in this section. As noted in the introduction, the associated HCIMs are ahead of a separate joint initiative project that aims to analyse and harmonize this further.
Each query is performed in the context of a specific authenticated patient, for which an OAuth2 token has been retrieved using the Authentication mechanisms described in the 'Afsprakenstelsel'. This token must be passed in each call in the HTTP header named “Authorization”. Each XIS Gateway is required to perform filtering based on the patient associated with the OAuth2 token received for the request, so that only the records associated with the authenticated patient are returned. Therefore, no search parameters should be passed for patient identification.
Bijlage 1 Richtlijn Online inzage in het H-EPD door patiënt | |||||
---|---|---|---|---|---|
# | GP Patient Data Section | HCIM EN | Content | Example search URL | |
1 | General Practitioner/Practice | HealthProfessional v3.1 (2017) HealthcareProvider v3.1 (2017) |
The GP or GP practice that originates the patient data. | TODO. Check assumption here that a patient requests the data from his regular GP. If he were to request it from any other GP/practice he might have visited, then the Patient.generalPractitioner does not apply.see Patient | |
2 | Patient | Patient v3.1 (2017) | De patient data of the patient the data is for. | GET [base]/Patient?_include=Patient:general-practitioner | |
3 | Episodes | A health concern like a complaint of illness, that may change in nature as diagnoses are made and/or the illness develops. | GET [base]/EpisodeOfCare?_revinclude=Flag:detail | ||
4 | Episodes with alert flag | Episodes may have an associated alert signaling extra attention to the episode is requested. The alert flag may stay active even if after closing the episode, if the user deems it important to stay aware. | |||
5 | Open and closed episodes | Episodes may be open (currently active) or closed (no longer active). | |||
6 | Treatment | Procedure v4.0 (2017) | Procedure on the patient targeting the patients health situation. E.g. operative and (severe) procedures like radiation or chemotherapy. | GET [base]/Procedure?category=http://snomed.info/sct|365508006 | |
7 | Prophylaxis en precaution | Prophylaxis and precaution contain precautionary measures required for or to prevent certain medical conditions. See NHG Tabel 56 | TODO: No HCIM. GP systems do not yet export this info. Unclear if it'll be anything beyond the Table 56 code (id, time, author, text?)GET [base]/Observation?code=https://referentiemodel.nhg.org/tabellen/nhg-tabel-56-profylaxe-en-voorzorg| | ||
8 | Current medication | MedicationAgreement v1.0 (2017) | MedicationAgreement The prescriber proposed use of medication that the patient agrees with. The agreement may signal starting, repeating, updating or stopping the medication. The list of MedicationAgreements is also known as the list of medication the patient is currently using |
GET [base]/MedicationRequest?status=active&category=http://snomed.info/sct|16076005&_include:MedicationRequest:medication | |
9 | Medication intolerance | AllergyIntolerance v3.1 (2017) | A medication intolerance concerns the intolerance of a patient for a specific drug, substance or substance group, that needs to be taken into account when prescribing, dispensing or administering medication. | GET [base]/AllergyIntolerance | |
10 | Correspondence | TextResult v4.0 (2017) | Incoming: an incoming letter about a patient, recorded as such in the patients medical record. Outbound: a letter created by a healthcare professional for a third party healthcare professional. |
TODO: HCIM is a poor match. GP systems do not yet export this info. FHIR DocumentReference is a very good match thoughGET [base]/DocumentReference | |
11 | Diagnostic/Lab results | LaboratoryTestResult v4.0 (2017) | A lab test is an objectifiable diagnostic procedure. The result is the outcome of the procedure. Lab tests include vital signs like blood pressure, weight and lab results like ferro in blood. Note that GP (lab) results are normally coded using NHG Tabel 45. While some of these codes might be convertible to LOINC or SNOMED CT, this is not expected at present. Bridging code systems between primary and secondary care is part of a larger national discussion Note that the date parameter is optional and needs calculation, e.g. current-date() - 14 months. The business rules in the guide lines determine the maximum range for the returned results. If the date parameter is omitted, the maximum range is assumed |
GET [base]/Observation?code=https://referentiemodel.nhg.org/tabellen/nhg-tabel-45-diagnostische-bepalingen|&_include=Observation:related-target&_include=Observation:specimen&date=ge2017-01-01 | |
BloodPressure v3.1 (2017) | |||||
BodyHeight v3.1 (2017) | |||||
BodyTemperature v3.1 (2017) | |||||
BodyWeight v3.1 (2017) | |||||
GeneralMeasurement v3.0 (2017) | |||||
HeartRate v3.1 (2017) | |||||
O2Saturation v3.1(2017) | |||||
PulseRate v3.1(2017) | |||||
12 | E- and P-journal entries of the SOAP (EN) or SOEP (NL) structure - recorded after introduction of online access | TextResult v4.0 (2017) | Information from an encounter, recorded in free text using the SOAP structure. The acronym SOAP stands for Subjective, Objective, Assessment and Plan. The E entry contains the consultation conclusion and the P entry contains potential next steps. Note that the profile for SOAP entries is yet to be created and the code system value is preliminary |
TODO: LOINC code has status proposalGET [base]/Composition?type=http://loinc.org|67781-5 |
Batch request
A FHIR Bundle resource can be used to group the individual resources requests of the GP Patient Data. If a bundle is used to query the GP Patient Data, the bundle SHALL be of type = "batch".
A batch (type = "batch") consists of a series of entries. Each entry element SHALL contain a request element. Each entry has the details of an HTTP operation that informs the system processing the batch what to do with the entry. The bundle with type = batch is a transaction that is intended to be processed by a server as a group of actions in contrary to a bundle with type = 'transaction' where the entire set of HTTP operations is intended to be processed by a server as an atomic commit.
A batch interaction is performed by an HTTP POST command as shown:
POST [base] {?_format=[mime-type]}
The content of the post submission is a Bundle with Bundle.type = batch. Each entry carries request details (Bundle.entry.request) that provides the HTTP details of the action in order to inform the system processing the batch or what to do for the entry (note: the request is optional, but SHOULD be present). Every bundle.entry retrieves a resource using a GET method and a specified url. The XML below demonstrates a batch of requests that can be send to a server. This example can also be found here.
<Bundle xmlns="http://hl7.org/fhir"> <id value="bundle-request-simplesummary"/> <type value="batch"/> <!-- Each entry is used to represent a RESTful API request This request retrieves a single Patient resource --> <entry> <request> <method value="GET"/> <url value="/Patient/example"/> </request> </entry> <!-- This request will retrieve the conditions for the patient --> <entry> <request> <method value="GET"/> <url value="/Condition?patient=example"/> </request> </entry> <!-- This request will retrieve the allergy intolerances for the patient requested above --> <entry> <request> <method value="GET"/> <url value="/AllergyIntolerance?patient=example"/> </request> </entry> </Bundle>
Example batch request
A predefined GP Patient Data bundled request can be found here: https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2015/1.0.0/files/133140/~xml.
As mentioned earlier, within MedMij each query is performed in the context of a specific authenticated patient. Therefore the search queries do not have to contain the patient ID. However, in a broader context these queries with the patient ID may be necessary. Another batch example that contains these example patient ID's in the URLs can be found here: https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2015/1.0.0/files/133104/~xml.
Server - XIS
Important sections of the FHIR specification for a server in this use case are the RESTful API section the search section and operation section (for the nlast operation).
Response on individual resource requests
If the search succeeds, the server SHALL return a 200 OK HTTP status code and the return content SHALL be a Bundle with type = searchset containing the results of the search as a collection of zero or more resources in a defined order. The result collection can be long, so servers may use paging. If they do, they SHALL use the method described below (adapted from RFC 5005 (Feed Paging and Archiving ) for breaking the collection into pages if appropriate. The server MAY also return an OperationOutcome resource within the searchset Bundle entries that contains additional information about the search; if one is sent it SHALL NOT include any issues with a fatal or error severity, and it SHALL be marked with a Bundle.entry.search.mode of outcome.
In order to allow the client to be confident about what search parameters were used as criteria by the server, the server SHALL return the parameters that were actually used to process the search. Applications processing search results SHALL check these returned values where necessary. For example, if the server did not support some of the filters specified in the search, a client might manually apply those filters to the retrieved result set, display a warning message to the user or take some other action.
In the case of a RESTful search, these parameters are encoded in the self link in the bundle that is returned:
<link> <relation value="self"/> <url value="http://example.org/Patient?identifier=[Patient-ID]/> </link>
Link to the relevant FHIR specification: http://hl7.org/fhir/STU3/http.html#search
Response for a batch request
For a batch the response the server SHALL return a Bundle with type set to batch-response that contains one entry for each entry in the request, in the same order, with the outcome of processing the entry. For the GP Patient Data bundle batch, the response is a bundle of type = batch-response with multiple entries containing bundles of type = searchset that correspond to the individual search queries.
A client may use the returned Bundle to track the outcomes of processing the entry, and the identities assigned to the resources by the server. Each entry element SHALL contain a response element which details the outcome of processing the entry - the HTTP status code, and the location and ETag header values, which are used for identifying and versioning the resources. In addition, a resource may be included in the entry, as specified by the Prefer header.
Link to relevant FHIR specification: http://hl7.org/fhir/STU3/http.html#transaction-response
Handling errors
If the search fails (cannot be executed, not that there are no matches), the return value is a status code 4xx or 5xx with an OperationOutcome. A HTTP status code of 403 signifies that the server refused to perform the search, while other 4xx and 5xx codes signify that some sort of error has occurred. When the search fails, a server SHOULD return an OperationOutcome detailing the cause of the failure. Note: An empty search result is not a failure.
In some cases, parameters may cause an error. For instance:
- A parameter may refer to a non-existent resource e.g.
GET [base]/Observation?subject=101
, where "101" does not exist - A parameter may refer to an unknown code e.g.
GET [base]/Observation?code=loinc|1234-1
, where the LOINC code "1234-1" is not known to the server - A parameter may refer to a time that is out of scope e.g.
GET [base]/Condition?onset=le1995
, where the system only has data going back to 2001 - A parameter may use an illegal or unacceptable modifier e.g.
GET [base]/Condition?onset:text=1995
, where the modifier cannot be processed by the server - A data time parameter may have incorrect format e.g.
GET [base]/Condition?onset=23%20May%202009
- A parameter may be unknown or unsupported
Where the content of the parameter is syntactically incorrect, servers SHOULD return an error. However, where the issue is a logical condition (e.g. unknown subject or code), the server SHOULD process the search, including processing the parameter - with the result of returning an empty search set, since the parameter cannot be satisfied.
In such cases, the search process MAY include an OperationOutcome in the search set that contains additional hints and warnings about the search process. This is included in the search results as an entry with search mode = outcome. Clients can use this information to improve future searches.
Common HTTP Status codes returned on FHIR-related errors (in addition to normal HTTP errors related to security, header and content type negotiation issues):
- 400 Bad Request - search could not be processed or failed basic FHIR validation rules
- 401 Not Authorized - authorization is required for the interaction that was attempted
- 404 Not Found - resource type not supported, or not a FHIR end-point
Link to relevant FHIR specification: http://hl7.org/fhir/STU3/search.html#errors
Example batch response
An example of a batch response can be found here: https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2015/1.0.0/files/133093/~xml.
The batch-response is a bundle that contains bundles of the type = searchset in the entries. These bundles of type = searchset represent the individual queries in the bundle that is posted to the server. Please note that this example does not contain actual search results. There is no patient with the identifier '123456789' on the server. Therefore all the returned bundles are empty.
Interactions, operations, search parameters
Interactions
The following logical interactions are needed for the GP Patient Data use case:
Operations
There are no operations required to support this use case
Search parameters
The following search parameter types and search result parameters need to be supported for this use case.
Search parameter types:
Search result parameters:
List of StructureDefinitions
The profiles represent their entire respective HCIM, to make them applicable in a broader context than the exchange of GP Patient Data or a MedMij context. An example for reuse of existing profiles are those of the patient administration resources and vital signs.
Bijlage 1 Richtlijn Online inzage in het H-EPD door patiënt | |||||
---|---|---|---|---|---|
Section | ZIB NL | HCIM EN | FHIR Resource | URL Profile | Reference to section |
1 | Zorgverlener | HealthProfessional | http://fhir.nl/fhir/StructureDefinition/nl-core-practitioner | HealthProfessional | |
Zorgaanbieder | HealthcareProvider | Organization | http://fhir.nl/fhir/StructureDefinition/nl-core-organization | HealthcareProvider | |
2 | Patiënt | Patient | Patient | http://fhir.nl/fhir/StructureDefinition/nl-core-patient | Patient |
3 | OverdrachtConcern | ConcernForTransfer | EpisodeOfCare | http://fhir.nl/fhir/StructureDefinition/nl-core-episodeofcare | EpisodeOfCare |
4 | |||||
5 | |||||
6 | Procedure | Verrichting | Procedure | http://nictiz.nl/fhir/StructureDefinition/zib-Procedure | Procedure |
7 | AlgemeneMeting | GeneralMeasurement | |||
8 | MedicatieAfspraak | MedicationAgreement | MedicationRequest | http://nictiz.nl/fhir/StructureDefinition/zib-MedicationAgreement | MedicationAgreement |
9 | AllergieIntolerantie | AllergyIntolerance | AllergyIntolerance | http://nictiz.nl/fhir/StructureDefinition/zib-AllergyIntolerance | AllergyIntolerance |
10 | Correspondentie | DocumentReference | http://ihe.net/fhir/StructureDefinition/IHE.MHD.DocumentReference | ||
11 | LaboratoriumUitslag | LaboratoryTestResult | Observation | http://nictiz.nl/fhir/StructureDefinition/gp-DiagnosticResult | GP-DiagnosticResult |
Bloeddruk | BloodPressure | ||||
Lichaamslengte | BodyHeight | ||||
Lichaamstemperatuur | BodyTemperature | ||||
Lichaamsgewicht | BodyWeight | ||||
AlgemeneMeting | GeneralMeasurement | ||||
Harfrequentie | HeartRate | ||||
O2Saturatie | O2Saturation | ||||
Polsfrequentie | PulseRate | ||||
12 | E and P entry from SOAP/SOEP | Observation | http://nictiz.nl/fhir/StructureDefinition/gp-EncounterReport | GP-EncounterReport |
Terminology, NamingSystems, Mappings
Terminology
Relevant value sets can be found in the package.
NamingSystems
Relevant NamingSystems can be found in the package.
Mappings
Relevant ZIB to FHIR value set mappings can be found in the package. All profiles include HCIM mappings. HCIM concepts are mapped in the corresponding FHIR elements using the HCIMs concept id. The top of the StructureDefinition contains meta information regarding the HCIM mapping, such as the name and uri of the HCIM. In the StructureDefinition elements the corresponding HCIM ID is given including the mapping meta information id. This is illustrated in the following example.
<StructureDefinition> <id value="nl-core-patient" /> ..... <mapping> <identity value="hcim-patient-v3.1-2017EN"/> <uri value="https://zibs.nl/wiki/Patient-v3.1(2017EN)"/> <name value="HCIM Patient-v3.1(2017EN)"/> </mapping> ..... <element id="Patient.name"> <path value="Patient.name" /> <short value="NameInformation" /> <alias value="Naamgegevens" /> <type> <code value="HumanName" /> <profile value="http://fhir.nl/fhir/StructureDefinition/nl-core-humanname" /> </type> <mapping> <identity value="hcim-patient-v3.1-2017EN"/> <map value="NL-CM:0.1.6"/> </mapping> </element> ..... </StructureDefinition>