All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
- In the event of patient migration request which has failed, the adaptor would previously reject an XML Electronic Health Record which had been resent to it. Now the adaptor will instead accept the resent EHR and perform the translation to FHIR.
- When sending a negative acknowledgement to the sending system in the event of a failure, include the textual description of the reason, e.g. "EHR Extract message not well-formed or not able to be processed". This behaviour while not required by the spec, has been implemented by other GP2GP systems, and is expected to be provided by one implementation.
- When a
LinkSet
which is a linkage between aReferralRequest
and one or moreDocumentReferences
is mapped then aCondition
will no longer be mapped for thisLinkset
. Instead, thestatementRef
s will be added to thesupportingInfo
when mapping theReferralRequest
asDocumentReferences
- When provided an
agentPerson
without aname
element, the adaptor will no longer throw an exception, but will instead map thePractitioner
with afamilyName
of"unknown"
.
- Remove 20 MB data processing limit to enable the Adaptor to handle larger pieces of data.
- Documented how the Adaptor behaves when dependent services are unavailable.
- Expanded the functionality added in version 2.1.0 to deduplicate SystmOne Problems.
Handle the case where a duplicate, empty
ObservationStatement
is provided by SystmOne and ignore it from the generated FHIR output.
- In the event that an inbound MHS message cannot be processed and needs to be sent to the dead letter queue, the adaptor will now emit a log message at INFO level as opposed to DEBUG level.
- Fixed a bug when mapping a post-dated acute prescription with multiple issues, whereby the adaptor was generating
a
MedicationRequest [Plan]
which was being referenced by multipleMedicationRequest [Order]
. Now each acute prescription issue gets its ownMedicationRequest [Plan]
, with thepriorPrescription
field linking the plans together.
Note
Upgrade information This release includes an update to the SNOMED database Users will need to perform an update of their SNOMED database. This will need to be performed first, followed by deploying the updated version of the translator image.
- If a
medicationStatement
ormedicationRequest
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If a
referralRequest
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If a
procedureRequest
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If a
linkset
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If a
documentReference
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If an
immunization
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If a
bloodPressure
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. - If a
Observation
,Specimen
,DiagnosticReport
record includes aconfidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated.
- Resolved issue where the SNOMED import script would reject a password containing a '%' character.
- Fixed some Test Results being given a duplicated
Observation.category
entries forLaboratory
. - Fixed issue where the GPC Facade was not returning an error when an invalid
ConversationId
header was provided. The Facade will now return a 400 instead of a 500 HTTP response. - Filing Comments were creating with incorrect
effectiveDateTime
, this is now set from theehrComposition /author / time
instead. - Filing Comments were creating with an incorrect
performer
, this now references theehrComposition / author / agentRef
instead. - Addressed a bug where immunizations were incorrectly mapped to observations when the Snomed CT code being sent was a Description ID. The adaptor previously only checked against known vaccination Concept IDs.
- If a
ehrComposition
record includes aconfidentialityCode
, themeta.security
field of the correspondingEncounter
FHIR resource will now be appropriately populated. - Add support for an Organization being referenced within the
ReferralRequest.recipient
field.
-
The AllergyIntoleranceMapper has been enhanced to support the redaction fix. If an Allergy Intolerance record includes a
confidentialityCode
, themeta.security
field of the corresponding FHIR resource will now be appropriately populated. -
When the SNOMED DB ingest script has not completed successfully, The GP2GP Translator Service will now exit and throw a RuntimeException with the following message:
FATAL: Expected Immunization codes not found in snomedct.immunization_codes view. SNOMED CT Database not set up correctly. Please update / reload the SNOMED DB.
DiagnosticReport.result
s now preserve original ordering provided in the HL7.
- The adaptor no longer checks incoming attachment content types aginst the
SUPPORTED_FILE_TYPES
list. This functionality can be implemented outside the adaptor if still desired.
- The
/$gpc.ack
endpoint is now case insensitive and supports uppercase and lowercase values for theconversationId
header values.
- Retry mechanism has been added for when the MHS outbound returns a 500 server response when acknowledging COPC messages.
- Mapping of
issued
for Test Group Headers, Test Results, Filing Comment and has been updated to use time value from the GP2GPObservationStatement / availabilityTime
field and useEhrComposition / author / time
if not available.
- Cron time schedule has been changed from 6h to 2h so that the timeouts can be identified earlier
- When mapping a
MedicationRequest (PLAN)
, if the text in the original text is duplicated by a pertinent information text, then the original text is disregarded to avoid the unnecessary duplication.
-
SystmOne send a problem over GP2GP as two
ObservationStatement
s, where one is truncated and one isn't. This truncation can be identified where anObservationStatement
is part of a problem, and the note ends in '...'. The adaptor will now identify this duplication, and merge the two into oneObservationStatement
.Example
Original XML:<ehrComposition xmlns="urn:hl7-org:v3" classCode="COMPOSITION" moodCode="EVN"> <id root="e9105749-5aef-400d-8ad4-649ff03ac879"/> <code code="25671000000102" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Surgery Consultation Note"/> <statusCode code="COMPLETE"/> ... <component typeCode="COMP"> <ObservationStatement classCode="OBS" moodCode="EVN"> <id root="ba4edfcd-142e-4090-8a81-9ca2790849a8"/> <code code="14J.." codeSystem="2.16.840.1.113883.2.1.3.2.4.14" displayName="H/O: injury"> <translation code="161586000" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="H/O: injury"/> <translation code="14J..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="H/O: injury"/> </code> <statusCode code="COMPLETE"/> <effectiveTime> <low value="20001004"/> <high value="19000101000000"/> </effectiveTime> <availabilityTime value="20001004"/> <pertinentInformation typeCode="PERT"> <sequenceNumber value="+1"/> <pertinentAnnotation classCode="OBS" moodCode="EVN"> <text>Problem severity: Minor H/O: injury to little finger left hand poss gla...</text> </pertinentAnnotation> </pertinentInformation> </ObservationStatement> </component> <component typeCode="COMP"> <LinkSet classCode="OBS" moodCode="EVN"> <id root="7f384915-a2f9-44df-b407-e9c339707297"/> <code code="394775005" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Inactive Problem"/> <statusCode code="COMPLETE"/> <effectiveTime> <low value="20001004"/> <high value="19000101000000"/> </effectiveTime> <availabilityTime value="20001004"/> <conditionNamed inversionInd="true" typeCode="NAME"> <namedStatementRef classCode="OBS" moodCode="EVN"> <id root="ba4edfcd-142e-4090-8a81-9ca2790849a8"/> </namedStatementRef> </conditionNamed> </LinkSet> </component> <component typeCode="COMP"> <ObservationStatement classCode="OBS" moodCode="EVN"> <id root="f04d2995-c6f8-4cf0-8e07-5362a950e2a5"/> <code code="14J.." codeSystem="2.16.840.1.113883.2.1.3.2.4.14" displayName="H/O: injury"> <translation code="161586000" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="H/O: injury"/> <translation code="14J..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="H/O: injury"/> </code> <statusCode code="COMPLETE"/> <effectiveTime> <center nullFlavor="NI"/> </effectiveTime> <availabilityTime value="20001004"/> <pertinentInformation typeCode="PERT"> <sequenceNumber value="+1"/> <pertinentAnnotation classCode="OBS" moodCode="EVN"> <text>(New Episode). H/O: injury to little finger left hand poss glass in wound therefore refered to A+E</text> </pertinentAnnotation> </pertinentInformation> </ObservationStatement> </component> </ehrComposition>
Gets merged into:<ehrComposition xmlns="urn:hl7-org:v3" classCode="COMPOSITION" moodCode="EVN"> <id root="e9105749-5aef-400d-8ad4-649ff03ac879"/> <code code="25671000000102" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Surgery Consultation Note"/> <statusCode code="COMPLETE"/> ... <component typeCode="COMP"> <ObservationStatement classCode="OBS" moodCode="EVN"> <id root="ba4edfcd-142e-4090-8a81-9ca2790849a8"/> <code code="14J.." codeSystem="2.16.840.1.113883.2.1.3.2.4.14" displayName="H/O: injury"> <translation code="161586000" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="H/O: injury"/> <translation code="14J..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="H/O: injury"/> </code> <statusCode code="COMPLETE"/> <effectiveTime> <low value="20001004"/> <high value="19000101000000"/> </effectiveTime> <availabilityTime value="20001004"/> <pertinentInformation typeCode="PERT"> <sequenceNumber value="+1"/> <pertinentAnnotation classCode="OBS" moodCode="EVN"> <text>Problem severity: Minor (New Episode). H/O: injury to little finger left hand poss glass in wound therefore refered to A+E</text> </pertinentAnnotation> </pertinentInformation> </ObservationStatement> </component> <component typeCode="COMP"> <LinkSet classCode="OBS" moodCode="EVN"> <id root="7f384915-a2f9-44df-b407-e9c339707297"/> <code code="394775005" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Inactive Problem"/> <statusCode code="COMPLETE"/> <effectiveTime> <low value="20001004"/> <high value="19000101000000"/> </effectiveTime> <availabilityTime value="20001004"/> <conditionNamed inversionInd="true" typeCode="NAME"> <namedStatementRef classCode="OBS" moodCode="EVN"> <id root="ba4edfcd-142e-4090-8a81-9ca2790849a8"/> </namedStatementRef> </conditionNamed> </LinkSet> </component> </ehrComposition>
-
When a
CommentType: USER COMMENT
NarrativeStatement
is located within theBATTERY
of aFiled Report
, the adaptor now generates a new filing commentObservation
and references this in the result property of the parentDiagnosticReport
. This change makes the adaptor more closely resemble the GP Connect specification for DiagnosticReport and filing comments. The generatedObservation
filing comment will have thestatus
ofunknown
.
- Breaking Change Identifier values and code systems where an OID is provided
(such as
2.16.840.1.113883.2.1.6.9
) will now be provided as a URN (i.e.urn:oid:2.16.840.1.113883.2.1.6.9
), as per GP Connect specification.
- The source of date for List (Consultation) is now ehrComposition author time otherwise from
the following fields in order of precedence:
- ehrComposition availibiltyTime
- ehrComposition effectiveTime - center
- EhrComposition effectiveTime - high
- EhrComposition effectiveTime - low
Condition.onsetDateTime
is now set to NULL when low or center entries of effectiveTime arenullFlavor="UNK"
.
-
Removed the
EhrExtract / AvailabilityTime
field as a fallback value from:Condition.assertedDate
List.date
DiagnosticReport.issued
Observation.issuedDate
-
Replaced the
EhrExtract / AvailabilityTime
field as a fallback value withEhrComposition / author / time[@value]
for:AllergyIntolerance.assertedDate
MedicationRequest.authoredOn
- Plan Statements (Recalls) were previously mapped with a fixed value of
active
for the Status field. The adaptor will now interrogate the text field to see if a status has been provided, otherwise defaulting tounknown
.
- Added Materialised View in the SnomedCT database to be used when querying for preferred terms.
Note
Upgrade information This release includes an update to the SNOMED database Users will need to perform an update of their SNOMED database. This will need to be performed first, followed by deploying the updated version of the translator image.
- Added Episodicity information to
comment
property of Observations.
- Fixed malformed role coding defect introduced in version 1.4.1
- Assigning a role to a practitioner who records vaccinations
- Fixed an issue where
Observation Test Group
orObservation Test Results
were incorrectly creating a relationship toFiling Comments
using thehas-member
relationship ProcedureRequestMapper.authoredOn
is no longer populated withEhrExtract / availabilityTime
as a fallback, but does useEhrComposition / author / time
as a fallback instead now.
- REST buffer size has been set to 150Mb
- Fixed issue where mapping failed due to a Referral Request Priority not being found.
- Codings are now provided (code, display and system) in
PractionionerRole.code
andOrganization.type
fields, where only thetext
attribute was provided previously. - Fixed a bug which could lead to medication resource not being mapped if a failure had occurred when processing the previous EhrExtract during the medication mapping stage
- In the event of a GP2GP failure, the raw error code is now available in the
/Patient/$gpc.migratestructuredrecord
response section with code system2.16.840.1.113883.2.1.3.2.4.17.101
.
- Removed surplus references to Medication Statements from the Topic and Category entry arrays. The GP Connect documentation states Medications should be referenced using the Medication Request resource, which is already done.
- Updated postman collection to include attachment tests.
- Swapped the mixed-up population of 'author' and 'practitioner' fields in AllergyIntolerance.
- A SystmOne attachment split into multiple chunks can arrive with the same filename "Untitled". Previously each fragment would be stored using the filename provided, which in the case of SystmOne caused chunks to overwrite each other. The adaptor now generates a UUID which is prepended to the filename of a provided chunk to ensure uniqueness.
- Populate
identifier
field forPractitioner
resources using the General Practitioner (GMP) number if available.
- Prevent
NarrativeStatement / text
sat within a blood pressureCompoundStatement
from being mapped into separate "Comment note" Observation resources. This information is already populated within the blood pressureObservation.comment
field, so creating a separate resource was duplicating this info.
- Changed
ReferralRequest
mapping to useASAP
instead of theStat
value.
- Updated the way immunization codes are loaded to build these from the relationships reference set in the SNOMED CT release rather than a static set of values. The previous static list of values was incomplete and included invalid codes. More information about how this improved functionality works can be found in the SNOMED database documentation.
Note
Upgrade information This release includes a database migration. This database migration will need to be performed first, followed by deploying the updated version of the facade and translator images. Finally users will need to perform an update of their SNOMED database.
This release backported the following fix to the v1.0 release.
- A SystmOne attachment split into multiple chunks can arrive with the same filename "Untitled". Previously each fragment would be stored using the filename provided, which in the case of SystmOne caused chunks to overwrite each other. The adaptor now generates a UUID which is prepended to the filename of a provided chunk to ensure uniqueness.
- Added functionality to include episodicity qualifiers when mapping allergy intolerances.
- Preserve the ordering of code / translation elements when mapping Codeable Concepts.
- Fix invalid state transition bug which caused the adaptor to move from a failed state to an in-progress state when a positive acknowledgement was received.
- Add additional error handling for exceptions raised when processing PSS queue, and MHS queue messages.
- Fix bug in some SQL statements which caused excessively large amounts of data to be returned, sometimes resulting in a PostgresSQL Out of Memory error.
- Fixed issue with some
ObservationStatement
coded as blood pressure readings not being output into Bundle. - Fixed issue with
AllergyIntolerance
recorder and asserter fields mapping.
- Documented database requirements in OPERATING.md
- New docker image published as nhsdev/nia-ps-db-migration
- Querying SDS service using an addtional endpoint to fetch ODS code
- Fix issue where continue message was not accepted by EMIS
- Fixed issue where EMIS
cid
references caused large message merging to fail - Fix issue where attachments were given the incorrect object storage URL
- Fix issue where attachments were not de-compressed
- Enable logging of migration status updates when PS_LOGGING_LEVEL is set to DEBUG
- Fix acknowledgement message as it was not accepted by system one
- Fix SDS failing as part of GP2GP transfer process
- Add details about object storage to operating documentation.
- Enable AWS Instance Roles to be used for connecting to S3
- Fix issue where attachments with filenames containing special characters causes the transfer to fail.
- Fix issue where some resource types do not contain a degraded code when a SNOMED code has not been provided.
- Fix issue where unnecessary length checks on inline attachments could cause a transfer to fail.
- Change the codeable concept mapping to map Egton Codes found in
code
elements. - Change the codeable concept mapping to map Read Codes (READV2, CTV3) found in
code
elements. - Change the codeable concept mapping to map unknown code systems found in
code
elements.
- Fix issue where Inbound Adaptor rejects an EHR Extract from EMIS containing inline attachments where the description contains only the filename.
- Fix issue where Allergy Intolerances are referenced incorrectly when they are referenced from a list.
- Fix issue where a
Condition
is not correctly mapping thecode
element in all instances.