From a41c732eef7c36bf967163815f8aac2804a8cdba Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Fri, 16 May 2025 10:36:16 +0100 Subject: [PATCH 01/62] Throw exception if ORC order control Id is null --- .../inform/datasources/ids/labs/LabOrderBuilder.java | 3 +++ .../inform/datasources/ids/labs/TestWinPathOrders.java | 10 ++++++++++ .../LabOrders/winpath/null_order_control_id.txt | 5 +++++ 3 files changed, 18 insertions(+) create mode 100644 hl7-reader/src/test/resources/LabOrders/winpath/null_order_control_id.txt diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java index 87175ec79..fe8e47d6c 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java @@ -87,6 +87,9 @@ String getEpicCareOrderNumberObr() { */ void populateOrderInformation(ORC orc, OBR obr) throws DataTypeException, Hl7InconsistencyException { // NA/NW/CA/CR/OC/XO + if (orc.getOrc1_OrderControl().getValue() == null) { + throw new Hl7InconsistencyException("ORC 1 Order Control value is null"); + } msg.setOrderControlId(orc.getOrc1_OrderControl().getValue()); epicCareOrderNumberOrc = orc.getOrc2_PlacerOrderNumber().getEi1_EntityIdentifier().getValueOrEmpty(); setLabSpecimenNumber(orc); diff --git a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/labs/TestWinPathOrders.java b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/labs/TestWinPathOrders.java index be8bc143e..452344d8e 100644 --- a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/labs/TestWinPathOrders.java +++ b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/labs/TestWinPathOrders.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; +import uk.ac.ucl.rits.inform.datasources.ids.exceptions.Hl7InconsistencyException; import uk.ac.ucl.rits.inform.interchange.InterchangeValue; import uk.ac.ucl.rits.inform.interchange.OrderCodingSystem; import uk.ac.ucl.rits.inform.interchange.lab.LabOrderMsg; @@ -12,6 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -208,4 +210,12 @@ void testOrmO01Notes() throws Exception { // separated by :- assertEquals("?stroke", order.getQuestions().get("Clinical Details")); } + + /** + * Null OrderControlId should throw an HL7InconsistencyException + */ + @Test + void testNullOrderControlId() { + assertThrows(Hl7InconsistencyException.class, () -> labReader.getFirstOrder(FILE_TEMPLATE, "null_order_control_id")); + } } diff --git a/hl7-reader/src/test/resources/LabOrders/winpath/null_order_control_id.txt b/hl7-reader/src/test/resources/LabOrders/winpath/null_order_control_id.txt new file mode 100644 index 000000000..982f39f08 --- /dev/null +++ b/hl7-reader/src/test/resources/LabOrders/winpath/null_order_control_id.txt @@ -0,0 +1,5 @@ +MSH|^~\&|WinPath|UCH|EPIC|UCH|20210101120000||ORM^O01|1828yhf9872-1234-1234-1234-123983hdi|P|2.3 +PID|||Test^^^MRENTR^MEDREC~||TEST^TEST||19000101|U +PV1|||UNKNOWN^UNKNOWN||||||UNKNOWN^Unknown +ORC|||11U123456 +OBR|1||11U123456|H.SIG1^^WinPath|N|20210101120000|20210101120000|||||||20210101120000||||||||20210101120000||IMM|I From f61f73e1e824f9413f3ee7ec54744d4d52654d4b Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Fri, 16 May 2025 10:39:32 +0100 Subject: [PATCH 02/62] Apply linting suggestions --- .../datasources/ids/labs/LabOrderBuilder.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java index fe8e47d6c..21bff4b3c 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java @@ -11,6 +11,7 @@ import ca.uhn.hl7v2.model.v26.segment.NTE; import ca.uhn.hl7v2.model.v26.segment.OBR; import ca.uhn.hl7v2.model.v26.segment.ORC; +import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.ucl.rits.inform.datasources.ids.HL7Utils; @@ -28,6 +29,7 @@ import java.util.StringJoiner; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; import static uk.ac.ucl.rits.inform.datasources.ids.HL7Utils.interpretLocalTime; @@ -39,6 +41,7 @@ abstract class LabOrderBuilder { private String epicCareOrderNumberObr; private final OrderCodingSystem codingSystem; + @Getter private final LabOrderMsg msg = new LabOrderMsg(); /** @@ -50,13 +53,6 @@ abstract class LabOrderBuilder { this.codingSystem = codingSystem; } - /** - * @return Lab Order Msg. - */ - public LabOrderMsg getMsg() { - return msg; - } - /** * @return order coding system. */ @@ -219,9 +215,9 @@ void populateObrFields(OBR obr, boolean requiredCollectionTime) throws DataTypeE epicCareOrderNumberObr = obr.getObr2_PlacerOrderNumber().getEi1_EntityIdentifier().getValueOrEmpty(); - msg.setStatusChangeTime(HL7Utils.interpretLocalTime(obr.getObr22_ResultsRptStatusChngDateTime())); + msg.setStatusChangeTime(interpretLocalTime(obr.getObr22_ResultsRptStatusChngDateTime())); - String reasonForStudy = List.of(obr.getObr31_ReasonForStudy()).stream() + String reasonForStudy = Stream.of(obr.getObr31_ReasonForStudy()) .map(CWE::getCwe2_Text) .map(ST::getValueOrEmpty) .collect(Collectors.joining("\n")) @@ -244,7 +240,7 @@ void populateObrFields(OBR obr, boolean requiredCollectionTime) throws DataTypeE } - protected void addMsgIfAllowedOcId(String idsUnid, List orders) { + void addMsgIfAllowedOcId(String idsUnid, Collection orders) { if (msg.getOrderControlId() != null && allowedOcIds.contains(msg.getOrderControlId())) { orders.add(msg); } else { From 9e7ac611a4bdc8a93774d3c6d36b39dde5c52c73 Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Fri, 16 May 2025 12:51:52 +0100 Subject: [PATCH 03/62] Remove unused imports --- .../ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java index 21bff4b3c..7dea0d15a 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/labs/LabOrderBuilder.java @@ -14,7 +14,6 @@ import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import uk.ac.ucl.rits.inform.datasources.ids.HL7Utils; import uk.ac.ucl.rits.inform.datasources.ids.exceptions.Hl7InconsistencyException; import uk.ac.ucl.rits.inform.datasources.ids.hl7.parser.NotesParser; import uk.ac.ucl.rits.inform.datasources.ids.hl7.parser.PatientInfoHl7; @@ -24,7 +23,6 @@ import java.time.Instant; import java.util.Collection; -import java.util.List; import java.util.Set; import java.util.StringJoiner; import java.util.regex.Pattern; From deb2c83e3f91bd1fe49ec4bb41448d5ee842aa7c Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 10 Aug 2025 14:17:58 +0100 Subject: [PATCH 04/62] add admission type to interchange --- .../java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java index 79835a44f..b679b1381 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java @@ -27,6 +27,7 @@ public abstract class AdtMessage extends EmapOperationMessage { private String nhsNumber; private String visitNumber; private InterchangeValue modeOfArrival = InterchangeValue.unknown(); + private InterchangeValue ethnicGroup = InterchangeValue.unknown(); private InterchangeValue fullLocationString = InterchangeValue.unknown(); private InterchangeValue previousLocationString = InterchangeValue.unknown(); @@ -44,6 +45,8 @@ public abstract class AdtMessage extends EmapOperationMessage { private InterchangeValue patientTitle = InterchangeValue.unknown(); private InterchangeValue patientZipOrPostalCode = InterchangeValue.unknown(); + private InterchangeValue admissionType = InterchangeValue.unknown(); + /** * Ideally the time the event occurred, but uses the message date time as a backup. From 567f6d992b154a4e2f8f0157c30315e7dcffafba Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 10 Aug 2025 14:27:16 +0100 Subject: [PATCH 05/62] add tests for admission type --- .../rits/inform/datasources/ids/adt/TestMiscAdt.java | 10 ++++++++++ hl7-reader/src/test/resources/Adt/generic/A01.txt | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java index 9059fbe3f..39e05bf53 100644 --- a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java +++ b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java @@ -55,6 +55,16 @@ public void testInpatientAdmission() throws Exception { assertEquals(AdmitPatient.class.getName(), msg.getMessageType()); } + /** + * A01 basics admission type + */ + @Test + public void testAdmissionType() throws Exception { + AdtMessage msg = processSingleAdtMessage("Adt/generic/A01.txt"); + assertTrue(AdmitPatient.class.getAdmissionType(), msg.getAdmissionType()); + + } + /** * When a birth datetime is purely a date, should keep the original day, even when BST. * @throws Exception shouldn't happen diff --git a/hl7-reader/src/test/resources/Adt/generic/A01.txt b/hl7-reader/src/test/resources/Adt/generic/A01.txt index 45753c2dd..3a51954f9 100644 --- a/hl7-reader/src/test/resources/Adt/generic/A01.txt +++ b/hl7-reader/src/test/resources/Adt/generic/A01.txt @@ -2,6 +2,6 @@ MSH|^~\&|EPIC|UCLH|||20130211100052|IPUC|ADT^A01|31644|T|2.4|||AL|NE EVN|A01|20130211100052||ADT_EVENT|IPUC^COORDINATOR^INPATIENT^UNIT^^^^^UCLHS^^^^^UCHC|20130211100052 PID|1||40800000^^^MRENTR^MEDREC~9999999999^^^NHS^HN||ORANGE^BLOOD^^^^^D||19800101|F|||^^^^^ENGLAND^L|||||||||||Z2||||||||N PD1 -PV1|1|I|T42E^T42E BY02^BY02-17^U^R^^^^^^DEPID|Matern Ante|||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|Anaes||||Usual|||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||123412341234|SELF|||||||||||||||||||||Adm*Conf|||20130211100052 +PV1|1|I|T42E^T42E BY02^BY02-17^U^R^^^^^^DEPID|Matern Ante|Elective||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|Anaes||||Usual|||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||123412341234|SELF|||||||||||||||||||||Adm*Conf|||20130211100052 PV2|||||||||20130211||||Hospital Encounter||||||||||N|||||||||||||||Ambulance OBX|1|TX|AdminCode^ADMINISTRATIVE CATEGORY CODE|1|1|||||||||20130211 From e0b5d5234e6514ce3f0083a8126d835a2af35968 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 10 Aug 2025 14:51:06 +0100 Subject: [PATCH 06/62] Revert "add tests for admission type" This reverts commit 567f6d992b154a4e2f8f0157c30315e7dcffafba. --- .../rits/inform/datasources/ids/adt/TestMiscAdt.java | 10 ---------- hl7-reader/src/test/resources/Adt/generic/A01.txt | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java index 39e05bf53..9059fbe3f 100644 --- a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java +++ b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java @@ -55,16 +55,6 @@ public void testInpatientAdmission() throws Exception { assertEquals(AdmitPatient.class.getName(), msg.getMessageType()); } - /** - * A01 basics admission type - */ - @Test - public void testAdmissionType() throws Exception { - AdtMessage msg = processSingleAdtMessage("Adt/generic/A01.txt"); - assertTrue(AdmitPatient.class.getAdmissionType(), msg.getAdmissionType()); - - } - /** * When a birth datetime is purely a date, should keep the original day, even when BST. * @throws Exception shouldn't happen diff --git a/hl7-reader/src/test/resources/Adt/generic/A01.txt b/hl7-reader/src/test/resources/Adt/generic/A01.txt index 3a51954f9..45753c2dd 100644 --- a/hl7-reader/src/test/resources/Adt/generic/A01.txt +++ b/hl7-reader/src/test/resources/Adt/generic/A01.txt @@ -2,6 +2,6 @@ MSH|^~\&|EPIC|UCLH|||20130211100052|IPUC|ADT^A01|31644|T|2.4|||AL|NE EVN|A01|20130211100052||ADT_EVENT|IPUC^COORDINATOR^INPATIENT^UNIT^^^^^UCLHS^^^^^UCHC|20130211100052 PID|1||40800000^^^MRENTR^MEDREC~9999999999^^^NHS^HN||ORANGE^BLOOD^^^^^D||19800101|F|||^^^^^ENGLAND^L|||||||||||Z2||||||||N PD1 -PV1|1|I|T42E^T42E BY02^BY02-17^U^R^^^^^^DEPID|Matern Ante|Elective||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|Anaes||||Usual|||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||123412341234|SELF|||||||||||||||||||||Adm*Conf|||20130211100052 +PV1|1|I|T42E^T42E BY02^BY02-17^U^R^^^^^^DEPID|Matern Ante|||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|Anaes||||Usual|||TYS^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID||123412341234|SELF|||||||||||||||||||||Adm*Conf|||20130211100052 PV2|||||||||20130211||||Hospital Encounter||||||||||N|||||||||||||||Ambulance OBX|1|TX|AdminCode^ADMINISTRATIVE CATEGORY CODE|1|1|||||||||20130211 From a1141cdd563b381b4a6cee929c57c5599d42f7e6 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 10 Aug 2025 15:16:06 +0100 Subject: [PATCH 07/62] Adds admission type to PV1 segment parsing Adds functionality to extract and utilize the admission type information from the PV1 segment of HL7 messages. This includes defining a getter method and adding a unit test to verify the correct extraction of the admission type value.. --- .../inform/datasources/ids/hl7/parser/PV1Wrap.java | 11 +++++++++++ .../inform/datasources/ids/adt/TestAdtFields.java | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java index a5e0a805b..46f38a069 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java @@ -78,6 +78,17 @@ default String getFullLocationString() { return createLocationString(currentLocation); } + /** + * PV1-4: Admission type + * @return the admission type string + */ + default String getAdmissionType() { + if (!pv1SegmentExists()) { + return null; + } + return getAdmissionType(); + } + /** * PV1-6: Previous patient location concatenated together. * @return the previous location string diff --git a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestAdtFields.java b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestAdtFields.java index 1890ac992..258132136 100644 --- a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestAdtFields.java +++ b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestAdtFields.java @@ -165,4 +165,9 @@ public void testDeathIndicator() { void testEthnicGroup() { assertEquals(InterchangeValue.buildFromHl7("Not Yet Asked"), msg.getEthnicGroup()); } + + @Test + void testAdmissionType() { + assertEquals(InterchangeValue.buildFromHl7("Elective"), msg.getAdmissionType()); + } } From 5f5d6ad51c952a273f22954c0cbab83c7025808e Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Mon, 11 Aug 2025 13:43:07 +0100 Subject: [PATCH 08/62] fixed check style --- .../ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java index 46f38a069..5a3d102d6 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java @@ -79,7 +79,7 @@ default String getFullLocationString() { } /** - * PV1-4: Admission type + * PV1-4: Admission type. * @return the admission type string */ default String getAdmissionType() { From 9bfe53f1633c36e5e6e728f8e0fc87e77519c09d Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 12 Aug 2025 15:53:04 +0100 Subject: [PATCH 09/62] Fixes infinate loop in hl7 parser and adds get admission type to the atd message factory --- .../ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java | 1 + .../ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index 6590e9e3a..c7c05c88e 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -191,6 +191,7 @@ private AdtMessage buildAdtMessageSubclass(final PV1Wrap pv1Wrap, final Message case "A01": AdmitPatient admitPatient = new AdmitPatient(); admitPatient.setAdmissionDateTime(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionDateTime())); + admitPatient.setAdmissionType(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionType())); msg = admitPatient; break; case "A02": diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java index 5a3d102d6..18af1b545 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java @@ -86,7 +86,7 @@ default String getAdmissionType() { if (!pv1SegmentExists()) { return null; } - return getAdmissionType(); + return getPV1().getAdmissionType().getValue(); } /** From 351b16b7ef2919fc8cde33d824f63b02c0af70f5 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 12 Aug 2025 16:59:36 +0100 Subject: [PATCH 10/62] Added test (failing) for emap star data sink --- .../inform/datasinks/emapstar/adt/TestAdtProcessingVisit.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdtProcessingVisit.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdtProcessingVisit.java index 50157c238..0ffee6c96 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdtProcessingVisit.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdtProcessingVisit.java @@ -60,6 +60,7 @@ public void testCreateNewAdmit() throws Exception { HospitalVisit visit = visits.get(0); assertNotNull(visit.getAdmissionDatetime()); + assertNotNull(visit.getAdmissionType()); assertNull(visit.getPresentationDatetime()); // no audit log should be added assertTrue(getAllAuditHospitalVisits().isEmpty()); From 6814fc39a6d12a41d4da631ef8cfcc79490f48ab Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 13 Aug 2025 08:20:23 +0100 Subject: [PATCH 11/62] Updated HL7 test message to match test --- hl7-reader/src/test/resources/Adt/TestForJunit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hl7-reader/src/test/resources/Adt/TestForJunit.txt b/hl7-reader/src/test/resources/Adt/TestForJunit.txt index 71f24eb69..475be92e5 100644 --- a/hl7-reader/src/test/resources/Adt/TestForJunit.txt +++ b/hl7-reader/src/test/resources/Adt/TestForJunit.txt @@ -3,7 +3,7 @@ EVN|A01|201209211843|hello|ADM|U439966^WYYYY^CLLLL|201201011200\r PID|||50032556^^^MRENTR^MEDREC~this is a test NHS number||INTERFACES^Amendadmission^Longforenamesecondfn^^LADY||194001010000|F|||42 Rooo Fooo^^Blorp^^ZZ1 0AB^^^^West Yorkshire|||||||||||Z1||||||||N PD1|||HH|397982^LA^M^^^DR^^^^^^^^G9010000~B8^4 L H L^B^^^^^ZZ1 0AB^^01222 222222^^^^B8&1~404278^ME^AH^^^^^^^^^^^D2444444~V244444^DENTAL SURGERY^9 W^B^WEST YORKSHIRE^^^BD1 1AA^^^^^^V22222&3||14\r NK1|1|NIECEOFTHEINTERFACETESTPATIENTDDDDD^Firstnameoftheneiceofthetestpatient|N|1 LINE OF VERY LONG ADDRESSWITHINFO&2 LINE OF VERY LONG ADDRESSWITHALLF^3 LINE OF VERYLONG ADDRESSWITH3DETA&4 LINE OF VERYLONGADDRESSWITH4DETAI^5 LINE FOR CITY OR TOWN ENTEREDINTO^^Z1 1AA^^^^6 LINE OF VERYLONGADDRESS FOR COUNT|02033333333|02033333333X888888|N\r -PV1||I|H2HH^H203^H203-11|1~I|||399999^IS^DAV^^^PROF|397982^LA^M^^^DR~399999^IS^DAV^J^^PROF||41008||||19|||||1234TESTVISITNUM|||PLS-1|||||||||||||||||HH||2|||201209211840\r +PV1||I|H2HH^H203^H203-11|Elective|||399999^IS^DAV^^^PROF|397982^LA^M^^^DR~399999^IS^DAV^J^^PROF||41008||||19|||||1234TESTVISITNUM|||PLS-1|||||||||||||||||HH||2|||201209211840\r PV2||W|DETAILS FOR a08 AMEND aDMISSION MESSAGE||||||||||B\r OBX|1|ST|^^^ABC^Assign Benefits^PLW-HL7||||||||N|||20120921\r OBX|2|ST|^^^LRRF^Reg Required Flags^PLW-HL7||~~~~14~1||||||N\r From e2c45dcc41e69653172e6c2b103e598d1e42208c Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 13 Aug 2025 08:58:14 +0100 Subject: [PATCH 12/62] Add admission type to A01 message for test --- .../src/test/resources/AdtMessages/generic/A01.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml index 88da640e3..272117cc9 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml @@ -18,6 +18,10 @@ fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" value: "T42E^T42E BY02^BY02-17" status: "SAVE" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Matern Ante" + status: "SAVE" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" From ee846381e8af74d747a92391d5e6a8c34cd60c65 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 13 Aug 2025 12:53:20 +0100 Subject: [PATCH 13/62] Add admission type to hospital visit schema --- .../ac/ucl/rits/inform/informdb/identity/HospitalVisit.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/identity/HospitalVisit.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/identity/HospitalVisit.java index a061eb819..e7cf8bd71 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/identity/HospitalVisit.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/identity/HospitalVisit.java @@ -81,6 +81,11 @@ public class HospitalVisit extends TemporalCore Date: Wed, 13 Aug 2025 14:51:03 +0100 Subject: [PATCH 14/62] added admission type to admitpatient message and adder to VisitController --- .../emapstar/controllers/VisitController.java | 13 ++++++++++++- .../rits/inform/interchange/adt/AdmitPatient.java | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java index 3469f99dc..772fb1fc7 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java @@ -138,7 +138,7 @@ public HospitalVisit updateOrCreateHospitalVisit( Instant validFrom = msg.bestGuessAtValidFrom(); RowState visitState = getOrCreateHospitalVisit( msg.getVisitNumber(), mrn, msg.getSourceSystem(), validFrom, storedFrom); - + addAdmissionType(msg, visitState); if (visitShouldBeUpdated(validFrom, msg.getSourceSystem(), visitState)) { updateGenericData(msg, visitState); @@ -219,6 +219,17 @@ private void addAdmissionDateTime(final AdmissionDateTime msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.assignInterchangeValue(msg.getAdmissionType(), visit.getAdmissionType(), visit::setAdmissionType); + } + + /** * Delete admission specific information. * @param msg cancellation message diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java index 832d82cd6..e5e72e773 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java @@ -18,6 +18,7 @@ @ToString(callSuper = true) public class AdmitPatient extends AdtMessage implements AdmissionDateTime { private InterchangeValue admissionDateTime = InterchangeValue.unknown(); + private InterchangeValue admissionType = InterchangeValue.unknown(); @Override From 3d7d5aa923acca17d0721a90e60a664c65f0cd3a Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 4 Sep 2025 11:49:45 +0100 Subject: [PATCH 15/62] See what happens if we remove admissiontype from generic message --- .../java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java index b679b1381..5ed2784b1 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java @@ -45,8 +45,6 @@ public abstract class AdtMessage extends EmapOperationMessage { private InterchangeValue patientTitle = InterchangeValue.unknown(); private InterchangeValue patientZipOrPostalCode = InterchangeValue.unknown(); - private InterchangeValue admissionType = InterchangeValue.unknown(); - /** * Ideally the time the event occurred, but uses the message date time as a backup. From d748f9c6b44f8f3dc9f2c8827d72e930f6be3e33 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 24 Sep 2025 12:42:52 +0100 Subject: [PATCH 16/62] Revert "See what happens if we remove admissiontype from generic message" This reverts commit 3d7d5aa923acca17d0721a90e60a664c65f0cd3a. --- .../java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java index 5ed2784b1..b679b1381 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java @@ -45,6 +45,8 @@ public abstract class AdtMessage extends EmapOperationMessage { private InterchangeValue patientTitle = InterchangeValue.unknown(); private InterchangeValue patientZipOrPostalCode = InterchangeValue.unknown(); + private InterchangeValue admissionType = InterchangeValue.unknown(); + /** * Ideally the time the event occurred, but uses the message date time as a backup. From 60cbc3fcf6022afde9875b2bb824818dc9aa76ab Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 1 Oct 2025 16:53:29 +0100 Subject: [PATCH 17/62] Try adding admission type to other message types --- .../ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index 980136f0a..0e5805178 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -199,11 +199,13 @@ private AdtMessage buildAdtMessageSubclass(final PV1Wrap pv1Wrap, final Message case "A07": TransferPatient transferPatient = new TransferPatient(); transferPatient.setAdmissionDateTime(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionDateTime())); + transferPatient.setAdmissionType(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionType())); msg = transferPatient; break; case "A03": DischargePatient dischargeMsg = new DischargePatient(); dischargeMsg.setAdmissionDateTime(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionDateTime())); + dischargeMsg.setAdmissionType(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionType())); dischargeMsg.setDischargeDateTime(pv1Wrap.getDischargeDateTime()); dischargeMsg.setDischargeDisposition(pv1Wrap.getDischargeDisposition()); dischargeMsg.setDischargeLocation(pv1Wrap.getDischargeLocation()); @@ -215,6 +217,7 @@ private AdtMessage buildAdtMessageSubclass(final PV1Wrap pv1Wrap, final Message } RegisterPatient registerPatient = new RegisterPatient(); registerPatient.setPresentationDateTime(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionDateTime())); + registerPatient.setAdmissionType(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionType())); msg = registerPatient; break; case "A08": From 43a408a9159da597c322240c12f2d3ba7e0688b1 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 2 Oct 2025 10:14:09 +0100 Subject: [PATCH 18/62] Update adt message yaml to reflect that they now contain admission type --- .../resources/AdtMessages/Location/CancelAdmit/05_A03.yaml | 4 ++++ .../AdtMessages/Location/CancelDischarge/03_A03.yaml | 4 ++++ .../AdtMessages/Location/CancelDischarge/05_A03.yaml | 4 ++++ .../AdtMessages/Location/DuplicateSimple/04_A03.yaml | 4 ++++ .../src/test/resources/AdtMessages/Location/Moves/08_A03.yaml | 4 ++++ .../src/test/resources/AdtMessages/generic/A02.yaml | 4 ++++ .../src/test/resources/AdtMessages/generic/A04.yaml | 4 ++++ .../src/test/resources/AdtMessages/generic/A06.yaml | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml index df2d72247..0ba608258 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml @@ -13,6 +13,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2013-02-11T13:00:52Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Matern Ante" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml index 4dcc5ae8c..422ee1854 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml @@ -13,6 +13,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2013-02-11T11:00:52Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Matern Ante" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml index 12eba4d40..4fd265f81 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml @@ -13,6 +13,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2013-02-11T11:00:52Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Matern Ante" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml index 23c76ea56..f562e0e2c 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml @@ -13,6 +13,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2013-02-11T12:00:52Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Matern Ante" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml index bfddb8b38..2c68f418b 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml @@ -13,6 +13,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2013-02-11T10:00:52Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Matern Ante" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml index 43b1b8af5..6c6198edf 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml @@ -10,6 +10,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2012-10-17T11:24:53Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Emerg Other" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml index 0b406bc03..95495d3e3 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml @@ -10,6 +10,10 @@ presentationDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2013-02-11T10:00:52Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Matern Ante" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml index 2f13fc145..48a25e3d4 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml @@ -10,6 +10,10 @@ admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "2020-04-01T18:30:00Z" +admissionType: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Emergency" modeOfArrival: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" From 0bffc180a129bc26c15ae21f172b2f5d251b45f7 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Mon, 6 Oct 2025 15:16:47 +0100 Subject: [PATCH 19/62] Adds hl7 for Z99 message and message factory test --- .../interchange/adt/HospitalService.java | 16 +++++++++ .../interchange/adt/UpdateSubSpeciality.java | 26 ++++++++++++++ .../AdtMessages/Location/Moves/09_Z99.yaml | 36 +++++++++++++++++++ .../datasources/ids/AdtMessageFactory.java | 11 ++++++ ...arsingMatchesInterchangeFactoryOutput.java | 2 +- .../resources/Adt/Location/Moves/09_Z99.txt | 6 ++++ 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java create mode 100644 emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java create mode 100644 emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml create mode 100644 hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java new file mode 100644 index 000000000..cd68ab7d3 --- /dev/null +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java @@ -0,0 +1,16 @@ +package uk.ac.ucl.rits.inform.interchange.adt; + +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; + + +/** + * Ensuring admission date time is used in a class. + *

+ * Used in specific circumstances because where the sub speciality is changed without a movement + * via a ADT Z99 message + */ +public interface HospitalService { + InterchangeValue getHospitalService(); + + void setHospitalService(InterchangeValue hospitalService); +} diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java new file mode 100644 index 000000000..24b122b75 --- /dev/null +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java @@ -0,0 +1,26 @@ +package uk.ac.ucl.rits.inform.interchange.adt; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import uk.ac.ucl.rits.inform.interchange.EmapOperationMessageProcessingException; +import uk.ac.ucl.rits.inform.interchange.EmapOperationMessageProcessor; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; + + +/** + * Change the Sub Speciality + * HL7 messages: Z99 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UpdateSubSpeciality extends AdtMessage implements HospitalService{ + private InterchangeValue hospitalService = InterchangeValue.unknown(); + + @Override + public void processMessage(EmapOperationMessageProcessor processor) throws EmapOperationMessageProcessingException { + processor.processMessage(this); + } + +} diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml new file mode 100644 index 000000000..134ec28ca --- /dev/null +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml @@ -0,0 +1,36 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality" +recordedDateTime: "2013-02-11T18:00:52Z" +eventOccurredDateTime: "2013-02-11T17:00:52Z" +eventReasonCode: "ADT_EVENT" +visitNumber: "123412341234" +nhsNumber: "9999999999" +sourceSystem: "EPIC" +mrn: "40800000" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "Anaes" +fullLocationString: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "EAU^UCH T00 EAU BY02^BY02-08" +patientClass: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "INPATIENT" +patientIsAlive: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: true +patientFamilyName: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "ORANGE" +patientGivenName: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "BLOOD" +patientSex: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + status: "SAVE" + value: "F" diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index 72626e4ae..ad8214105 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -45,6 +45,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.SwapLocations; import uk.ac.ucl.rits.inform.interchange.adt.TransferPatient; import uk.ac.ucl.rits.inform.interchange.adt.UpdatePatientInfo; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; /** * Build an AdtMessage Emap interchange object from an HL7 message. @@ -282,6 +283,12 @@ private AdtMessage buildAdtMessageSubclass(final PV1Wrap pv1Wrap, final Message setPreviousIdentifiers(changePatientIdentifiers, hl7Msg); msg = changePatientIdentifiers; break; + case "Z99": + // Z99 messages may be used to update the sub - speciality + UpdateSubSpeciality updateSubSpeciality = new UpdateSubSpeciality(); + setHospitalService(pv1Wrap, updateSubSpeciality); + msg = updateSubSpeciality; + break; default: throw new Hl7MessageNotImplementedException(String.format("Unimplemented ADT trigger event %s", triggerEvent)); } @@ -454,4 +461,8 @@ private void setHospitalService(PV1Wrap pv1Wrap, PendingEvent pendingEvent) thro String hospitalService = pv1Wrap.getHospitalService(); pendingEvent.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); } + private void setHospitalService(PV1Wrap pv1Wrap, UpdateSubSpeciality updateSubSpeciality ) throws HL7Exception { + String hospitalService = pv1Wrap.getHospitalService(); + updateSubSpeciality.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); + } } diff --git a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/TestHL7ParsingMatchesInterchangeFactoryOutput.java b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/TestHL7ParsingMatchesInterchangeFactoryOutput.java index 8b474793a..76e1c013d 100644 --- a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/TestHL7ParsingMatchesInterchangeFactoryOutput.java +++ b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/TestHL7ParsingMatchesInterchangeFactoryOutput.java @@ -187,7 +187,7 @@ public void testDoubleA01WithA13() throws Exception { @Test void testAdtPermutationMoves() throws Exception { - String[] fileNames = {"02_A01", "03_A02", "04_A02", "05_A02", "06_A02", "07_A06", "08_A03"}; + String[] fileNames = {"02_A01", "03_A02", "04_A02", "05_A02", "06_A02", "07_A06", "08_A03", "09_Z99"}; builtAndAssertAdtMessages("Adt", "Location/Moves", fileNames); } diff --git a/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt b/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt new file mode 100644 index 000000000..d9dba736e --- /dev/null +++ b/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt @@ -0,0 +1,6 @@ +MSH|^~\&|EPIC|UCLH|||20130211100052|IPUC|ADT^Z99|31644ZZZ|T|2.4|||AL|NE +EVN|Z99|20130211180052||ADT_EVENT|IPUC^COORDINATOR^INPATIENT^UNIT^^^^^UCLHS^^^^^UCHC|20130211170052 +PID|1||40800000^^^MRENTR^MEDREC~9999999999^^^NHS^HN||ORANGE^BLOOD^^^^^D|||F|||^^^^^ENGLAND^L|||||||||||||||||||N +PV1|1|I|EAU^UCH T00 EAU BY02^BY02-08^U^R^^^^^^DEPID|Matern Ante|||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|||Anaes||||Usual|||||123412341234|SELF||||||||||||||||Feeling great|Home||||Adm*Conf|||20130211100052|20130211170052 +PV2||||||||20130211||||Hospital Encounter||||||||||N||||||||||N +OBX|1|TX|AdminCode^ADMINISTRATIVE CATEGORY CODE|1|1|||||||||20130211 From d92806ba9fbeb6bef2202dd0867e93609100c8ad Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Mon, 6 Oct 2025 15:32:42 +0100 Subject: [PATCH 20/62] Style fix --- .../ac/ucl/rits/inform/interchange/adt/HospitalService.java | 2 +- .../ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java index cd68ab7d3..fc5233600 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/HospitalService.java @@ -6,7 +6,7 @@ /** * Ensuring admission date time is used in a class. *

- * Used in specific circumstances because where the sub speciality is changed without a movement + * Used in specific circumstances because where the sub speciality is changed without a movement * via a ADT Z99 message */ public interface HospitalService { diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java index 24b122b75..ab8644651 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java @@ -9,13 +9,13 @@ /** - * Change the Sub Speciality + * Change the Sub Speciality. * HL7 messages: Z99 */ @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class UpdateSubSpeciality extends AdtMessage implements HospitalService{ +public class UpdateSubSpeciality extends AdtMessage implements HospitalService { private InterchangeValue hospitalService = InterchangeValue.unknown(); @Override From 25fc8ed527a56d1ac1e0ec4235f2ff262b880323 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Mon, 6 Oct 2025 15:54:03 +0100 Subject: [PATCH 21/62] Style fix --- .../ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index ad8214105..642bd2cb1 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -461,7 +461,7 @@ private void setHospitalService(PV1Wrap pv1Wrap, PendingEvent pendingEvent) thro String hospitalService = pv1Wrap.getHospitalService(); pendingEvent.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); } - private void setHospitalService(PV1Wrap pv1Wrap, UpdateSubSpeciality updateSubSpeciality ) throws HL7Exception { + private void setHospitalService(PV1Wrap pv1Wrap, UpdateSubSpeciality updateSubSpeciality) throws HL7Exception { String hospitalService = pv1Wrap.getHospitalService(); updateSubSpeciality.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); } From 963ad71b92d563b54abda534f423a46bcccb57bb Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 7 Oct 2025 16:31:48 +0100 Subject: [PATCH 22/62] Attemping to get sub speciality change working. --- .../emapstar/InformDbOperations.java | 12 ++ .../UpdateSubSpecialityController.java | 188 ++++++++++++++++++ .../emapstar/dataprocessors/AdtProcessor.java | 23 ++- .../emapstar/adt/TestUpdateSubSpeciality.java | 101 ++++++++++ .../EmapOperationMessageProcessor.java | 8 + 5 files changed, 331 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java create mode 100644 core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/InformDbOperations.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/InformDbOperations.java index d0174c4e9..b5c362b55 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/InformDbOperations.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/InformDbOperations.java @@ -33,6 +33,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.SwapLocations; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import uk.ac.ucl.rits.inform.interchange.form.FormMetadataMsg; import uk.ac.ucl.rits.inform.interchange.form.FormMsg; import uk.ac.ucl.rits.inform.interchange.form.FormQuestionMetadataMsg; @@ -338,5 +339,16 @@ public void processMessage(FormQuestionMetadataMsg msg) { formProcessor.processQuestionMetadataMessage(msg, storedFrom); } + /** + * Process an Update Sub Speciality message. + * @param updateSubSpeciality the message + * @throws EmapOperationMessageProcessingException if message could not be processed + */ + @Override + @Transactional + public void processMessage(UpdateSubSpeciality updateSubSpeciality) throws EmapOperationMessageProcessingException { + Instant storedFrom = Instant.now(); + adtProcessor.processUpdateSubSpeciality(updateSubSpeciality, storedFrom); + } } diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java new file mode 100644 index 000000000..f2cbdce8c --- /dev/null +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java @@ -0,0 +1,188 @@ +package uk.ac.ucl.rits.inform.datasinks.emapstar.controllers; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import uk.ac.ucl.rits.inform.datasinks.emapstar.DataSources; +import uk.ac.ucl.rits.inform.datasinks.emapstar.RowState; +import uk.ac.ucl.rits.inform.datasinks.emapstar.exceptions.IncompatibleDatabaseStateException; +import uk.ac.ucl.rits.inform.datasinks.emapstar.exceptions.RequiredDataMissingException; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitAuditRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; +import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; +import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisitAudit; +import uk.ac.ucl.rits.inform.informdb.identity.Mrn; +import uk.ac.ucl.rits.inform.informdb.movement.Location; +import uk.ac.ucl.rits.inform.interchange.adt.AdmissionDateTime; +import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; +import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; +import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; +import uk.ac.ucl.rits.inform.interchange.adt.CancelAdmitPatient; +import uk.ac.ucl.rits.inform.interchange.adt.CancelDischargePatient; +import uk.ac.ucl.rits.inform.interchange.adt.DischargePatient; +import uk.ac.ucl.rits.inform.interchange.adt.ImpliedAdtMessage; +import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; +import uk.ac.ucl.rits.inform.interchange.adt.RegisterPatient; +import uk.ac.ucl.rits.inform.interchange.adt.UpdatePatientInfo; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; + +import java.time.Instant; +import java.util.List; + +/** + * Interactions with visits. + * @author Stef Piatek + */ +@Component +public class UpdateSubSpecialityController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + private final HospitalVisitRepository hospitalVisitRepo; + private final HospitalVisitAuditRepository hospitalVisitAuditRepo; + + /** + * @param hospitalVisitRepo repository for HospitalVisit + * @param hospitalVisitAuditRepo repository for HospitalVisitAudit + */ + public UpdateSubSpecialityController(HospitalVisitRepository hospitalVisitRepo, HospitalVisitAuditRepository hospitalVisitAuditRepo) { + this.hospitalVisitRepo = hospitalVisitRepo; + this.hospitalVisitAuditRepo = hospitalVisitAuditRepo; + } + + /** + * Update visit if message is from a trusted source update if newer or if database source isn't trusted. + * Otherwise only update if if is newly created. + * @param messageDateTime date time of the message + * @param messageSource Source system from the message + * @param visitState visit wrapped in state class + * @return true if the visit should be updated + */ + private boolean visitShouldBeUpdated( + final Instant messageDateTime, final String messageSource, final RowState visitState) { + // always update if a message is created + if (visitState.isEntityCreated()) { + return true; + } + HospitalVisit visit = visitState.getEntity(); + // if message source is trusted and (entity source system is untrusted or message is newer) + return DataSources.isTrusted(messageSource) + && (!DataSources.isTrusted(visit.getSourceSystem()) || !visit.getValidFrom().isAfter(messageDateTime)); + } + + /** + * Update visit with generic ADT information. + * @param msg adt message + * @param visitState visit wrapped in state class + */ + private void updateGenericData(final AdtMessage msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.assignInterchangeValue(msg.getPatientClass(), visit.getPatientClass(), visit::setPatientClass); + visitState.assignInterchangeValue(msg.getModeOfArrival(), visit.getArrivalMethod(), visit::setArrivalMethod); + visitState.assignIfDifferent(msg.getSourceSystem(), visit.getSourceSystem(), visit::setSourceSystem); + } + + /** + * Add admission date time. + * @param msg AdmissionDateTime + * @param visitState visit wrapped in state class + */ + private void addAdmissionDateTime(final AdmissionDateTime msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.assignInterchangeValue(msg.getAdmissionDateTime(), visit.getAdmissionDatetime(), visit::setAdmissionDatetime); + } + + /** + * Delete admission specific information. + * @param msg cancellation message + * @param visitState visit wrapped in state class + */ + private void removeAdmissionInformation(final AdtCancellation msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.removeIfExists(visit.getAdmissionDatetime(), visit::setAdmissionDatetime, msg.getCancelledDateTime()); + } + + /** + * Add registration specific information. + * @param msg adt message + * @param visitState visit wrapped in state class + */ + private void addRegistrationInformation(final RegisterPatient msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.assignInterchangeValue(msg.getPresentationDateTime(), visit.getPresentationDatetime(), visit::setPresentationDatetime); + } + + /** + * Add discharge specific information. + * If no value for admission time, add this in from the discharge message. + * @param msg adt message + * @param visitState visit wrapped in state class + */ + private void addDischargeInformation(final DischargePatient msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.assignIfDifferent(msg.getDischargeDateTime(), visit.getDischargeDatetime(), visit::setDischargeDatetime); + visitState.assignIfDifferent(msg.getDischargeDisposition(), visit.getDischargeDisposition(), visit::setDischargeDisposition); + visitState.assignIfDifferent(msg.getDischargeLocation(), visit.getDischargeDestination(), visit::setDischargeDestination); + + // If started mid-stream, no admission information so add this in on discharge + if (visit.getAdmissionDatetime() == null && !msg.getAdmissionDateTime().isUnknown()) { + visitState.assignInterchangeValue(msg.getAdmissionDateTime(), visit.getAdmissionDatetime(), visit::setAdmissionDatetime); + } + } + + /** + * Remove discharge specific information. + * @param msg cancellation message + * @param visitState visit wrapped in state class + */ + private void removeDischargeInformation(final AdtCancellation msg, RowState visitState) { + HospitalVisit visit = visitState.getEntity(); + visitState.removeIfExists(visit.getDischargeDatetime(), visit::setDischargeDatetime, msg.getCancelledDateTime()); + visitState.removeIfExists(visit.getDischargeDisposition(), visit::setDischargeDisposition, msg.getCancelledDateTime()); + visitState.removeIfExists(visit.getDischargeDestination(), visit::setDischargeDestination, msg.getCancelledDateTime()); + + } + + + public List getOlderVisits(Mrn mrn, Instant messageDateTime) { + return hospitalVisitRepo.findAllByMrnIdAndValidFromIsLessThanEqual(mrn, messageDateTime); + } + + /** + * @param msg MoveVisitInformation + * @return true if the message visit number changes and the final encounter already exists + */ + private boolean isVisitNumberChangesAndFinalEncounterAlreadyExists(MoveVisitInformation msg) { + return !msg.getPreviousVisitNumber().equals(msg.getVisitNumber()) && hospitalVisitRepo.findByEncounter(msg.getVisitNumber()).isPresent(); + } + + /** + * Deletes visit and updates corresponding audit table. + * @param visit List of hospital visits + * @param invalidationTime Time of the delete information message + * @param deletionTime time that emap-core started processing the message. + */ + public void deleteVisit(HospitalVisit visit, Instant invalidationTime, Instant deletionTime) { + hospitalVisitAuditRepo.save(visit.createAuditEntity(invalidationTime, deletionTime)); + hospitalVisitRepo.delete(visit); + } + + /** + * Process an Update subspeciality (Z99) request. + *

+ * The Hl7 feed will eventually be changed so that we have an identifier per pending transfer, until then we guarantee the order of cancellations. + * If we get messages out of order and have several cancellation messages before we receive any requests, + * then the first request message for the location and encounter will add the eventDatetime to the earliest cancellation. + * Subsequent requests will add the eventDatetime to the earliest cancellation with no eventDatetime, or create a new request if none exist + * after the pending request eventDatetime. + * @param visit associated visit + * @param msg update sub speciality + * @param validFrom time in the hospital when the message was created + * @param storedFrom time that emap core started processing the message + */ + public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant validFrom, Instant storedFrom) { + Location plannedLocation = null; + + } + + +} diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java index 4b75d4017..c9ea4f9e5 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java @@ -9,6 +9,7 @@ import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.PersonController; import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.VisitController; import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.DeletionController; +import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.UpdateSubSpecialityController; import uk.ac.ucl.rits.inform.datasinks.emapstar.exceptions.RequiredDataMissingException; import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; import uk.ac.ucl.rits.inform.informdb.identity.Mrn; @@ -21,6 +22,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.SwapLocations; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import java.time.Instant; import java.util.List; @@ -37,6 +39,7 @@ public class AdtProcessor { private final PatientLocationController patientLocationController; private final PendingAdtController pendingAdtController; private final DeletionController deletionController; + private final UpdateSubSpecialityController updateSubSpecialityController; /** * Implicitly wired spring beans. @@ -48,12 +51,13 @@ public class AdtProcessor { */ public AdtProcessor(PersonController personController, VisitController visitController, PatientLocationController patientLocationController, PendingAdtController pendingAdtController, - DeletionController deletionController) { + DeletionController deletionController, UpdateSubSpecialityController updateSubSpecialityController) { this.personController = personController; this.visitController = visitController; this.patientLocationController = patientLocationController; this.pendingAdtController = pendingAdtController; this.deletionController = deletionController; + this.updateSubSpecialityController = updateSubSpecialityController; } @@ -211,4 +215,21 @@ public void processPendingAdt(CancelPendingTransfer msg, Instant storedFrom) thr HospitalVisit visit = processPersonAndVisit(msg, storedFrom, validFrom); pendingAdtController.processMsg(visit, msg, validFrom, storedFrom); } + + /** + * Process an update subspeciality message. + *

+ * Updates the sub speciality in the hospital visit table + * @param msg change sub speciality adt message + * @param storedFrom time that emap core started processing the message + * @throws RequiredDataMissingException if the visit number is missing + */ + @Transactional + public void processUpdateSubSpeciality(UpdateSubSpeciality msg, Instant storedFrom) throws RequiredDataMissingException { + Instant validFrom = msg.bestGuessAtValidFrom(); + HospitalVisit visit = processPersonAndVisit(msg, storedFrom, validFrom); + // patientLocationController.processVisitLocation(visit, msg, storedFrom); + // updateSubSpecialityController.processMsg(visit, msg, validFrom, storedFrom); + } + } diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java new file mode 100644 index 000000000..0ad979d6c --- /dev/null +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -0,0 +1,101 @@ +package uk.ac.ucl.rits.inform.datasinks.emapstar.adt; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.junit.jupiter.params.provider.ArgumentsSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import uk.ac.ucl.rits.inform.datasinks.emapstar.MessageProcessingBase; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.CoreDemographicRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.MrnRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.PlannedMovementRepository; +import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; +import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; +import uk.ac.ucl.rits.inform.interchange.test.helpers.InterchangeMessageFactory; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; +import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; +import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; +import uk.ac.ucl.rits.inform.interchange.adt.PendingType; + +import java.io.IOException; +import java.io.InvalidClassException; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class TestUpdateSubSpeciality extends MessageProcessingBase { + private static final Logger logger = LoggerFactory.getLogger(TestPendingAdt.class); + @Autowired + private MrnRepository mrnRepository; + @Autowired + private CoreDemographicRepository coreDemographicRepository; + @Autowired + private HospitalVisitRepository hospitalVisitRepository; + @Autowired + private PlannedMovementRepository plannedMovementRepository; + + // end to end messages + private UpdateSubSpeciality updateSubSpeciality; + + private static final String VISIT_NUMBER = "123412341234"; + private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; + private static final Instant EVENT_TIME = Instant.parse("2022-04-21T23:22:58Z"); + private static final Instant CANCEL_TIME = Instant.parse("2022-04-21T23:37:58Z"); + + + private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String location) { + return plannedMovementRepository + .findByHospitalVisitIdEncounterAndLocationIdLocationString(visitNumber, location).orElseThrow(); + } + + @BeforeEach + void setup() throws IOException { + updateSubSpeciality = messageFactory.getAdtMessage("Location/Moves/09_Z99.yaml"); + } + + + /** + If no entities exist in the database then latest service is NULL, + create an entry with the correct sub speciality/ + */ + @Test + void testPendingCreatesOtherEntities() throws Exception { + dbOps.processMessage(updateSubSpeciality); + Optional byId = hospitalVisitRepository.findByEncounter(VISIT_NUMBER); + /* + get the most recent planned movement - there shouldn't be one, so will throw a + NoSuchElementException + */ + assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + } + + + /** + * Given that no entities exist in the database + * When a Z99 Message is created + * Mrn, core demographics and hospital visit entities should be created + * @throws Exception shouldn't happen + */ + @Test + void testUpdateCreatesOtherEntities() throws Exception { + dbOps.processMessage(updateSubSpeciality); + + assertEquals(1, mrnRepository.count()); + assertEquals(1, coreDemographicRepository.count()); + assertEquals(1, hospitalVisitRepository.count()); + } + +} + diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/EmapOperationMessageProcessor.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/EmapOperationMessageProcessor.java index d2fdef52e..6db793861 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/EmapOperationMessageProcessor.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/EmapOperationMessageProcessor.java @@ -8,6 +8,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.SwapLocations; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import uk.ac.ucl.rits.inform.interchange.form.FormMetadataMsg; import uk.ac.ucl.rits.inform.interchange.form.FormMsg; import uk.ac.ucl.rits.inform.interchange.form.FormQuestionMetadataMsg; @@ -176,4 +177,11 @@ public interface EmapOperationMessageProcessor { * @throws EmapOperationMessageProcessingException if message cannot be processed */ void processMessage(WaveformMessage msg) throws EmapOperationMessageProcessingException; + + /** + * @param msg the UpdateSubSpeciality message to process + * @throws EmapOperationMessageProcessingException if message cannot be processed + */ + void processMessage(UpdateSubSpeciality msg) throws EmapOperationMessageProcessingException; + } From 11934d3c3c65f90d41a65cae517bdd3d9a2a9c50 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 7 Oct 2025 16:38:54 +0100 Subject: [PATCH 23/62] Style fixes --- .../controllers/UpdateSubSpecialityController.java | 8 -------- .../emapstar/dataprocessors/AdtProcessor.java | 11 ++++++----- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java index f2cbdce8c..bff95f582 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java @@ -3,11 +3,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; import uk.ac.ucl.rits.inform.datasinks.emapstar.DataSources; import uk.ac.ucl.rits.inform.datasinks.emapstar.RowState; -import uk.ac.ucl.rits.inform.datasinks.emapstar.exceptions.IncompatibleDatabaseStateException; -import uk.ac.ucl.rits.inform.datasinks.emapstar.exceptions.RequiredDataMissingException; import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitAuditRepository; import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; @@ -15,16 +12,11 @@ import uk.ac.ucl.rits.inform.informdb.identity.Mrn; import uk.ac.ucl.rits.inform.informdb.movement.Location; import uk.ac.ucl.rits.inform.interchange.adt.AdmissionDateTime; -import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; -import uk.ac.ucl.rits.inform.interchange.adt.CancelAdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.CancelDischargePatient; -import uk.ac.ucl.rits.inform.interchange.adt.DischargePatient; -import uk.ac.ucl.rits.inform.interchange.adt.ImpliedAdtMessage; import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.RegisterPatient; -import uk.ac.ucl.rits.inform.interchange.adt.UpdatePatientInfo; import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import java.time.Instant; diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java index c9ea4f9e5..558a5c10b 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java @@ -43,11 +43,12 @@ public class AdtProcessor { /** * Implicitly wired spring beans. - * @param personController person interactions. - * @param visitController encounter interactions. - * @param patientLocationController location interactions. - * @param pendingAdtController pending ADT interactions. - * @param deletionController cascading deletes for hospital visits. + * @param personController person interactions. + * @param visitController encounter interactions. + * @param patientLocationController location interactions. + * @param pendingAdtController pending ADT interactions. + * @param deletionController cascading deletes for hospital visits. + * @param updateSubSpecialityController changing the sub speciality */ public AdtProcessor(PersonController personController, VisitController visitController, PatientLocationController patientLocationController, PendingAdtController pendingAdtController, From 810f65f283543bde8ce760723915489399efaedf Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 7 Oct 2025 16:40:39 +0100 Subject: [PATCH 24/62] Style fixes --- .../emapstar/controllers/UpdateSubSpecialityController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java index bff95f582..3b2e34928 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java @@ -14,7 +14,6 @@ import uk.ac.ucl.rits.inform.interchange.adt.AdmissionDateTime; import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; -import uk.ac.ucl.rits.inform.interchange.adt.CancelDischargePatient; import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.RegisterPatient; import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; From 0167e4ea903de2225bb7e3032b9ed8ad1e62ed50 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 7 Oct 2025 16:45:44 +0100 Subject: [PATCH 25/62] Fixed missing import --- .../emapstar/controllers/UpdateSubSpecialityController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java index 3b2e34928..c059a8ac9 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java @@ -14,6 +14,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.AdmissionDateTime; import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; +import uk.ac.ucl.rits.inform.interchange.adt.DischargePatient; import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.RegisterPatient; import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; From 12d21c662f2cc0d4c353a64b72702e5b4b1cc5af Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 9 Oct 2025 11:25:14 +0100 Subject: [PATCH 26/62] Put the subspeciality controller in same file as pending controller, as most of the logic is already there --- .../controllers/PendingAdtController.java | 19 ++ .../UpdateSubSpecialityController.java | 180 ------------------ .../emapstar/dataprocessors/AdtProcessor.java | 8 +- 3 files changed, 21 insertions(+), 186 deletions(-) delete mode 100644 core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 2600fbf50..32e8447b7 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -12,6 +12,7 @@ import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovementAudit; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; +import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import java.time.Instant; import java.util.List; @@ -139,6 +140,24 @@ public void processMsg(HospitalVisit visit, CancelPendingTransfer msg, Instant v plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); } + /** + * Process an Update subspeciality (Z99) request. + *

+ * The Hl7 feed will eventually be changed so that we have an identifier per pending transfer, until then we guarantee the order of cancellations. + * If we get messages out of order and have several cancellation messages before we receive any requests, + * then the first request message for the location and encounter will add the eventDatetime to the earliest cancellation. + * Subsequent requests will add the eventDatetime to the earliest cancellation with no eventDatetime, or create a new request if none exist + * after the pending request eventDatetime. + * @param visit associated visit + * @param msg update sub speciality + * @param validFrom time in the hospital when the message was created + * @param storedFrom time that emap core started processing the message + */ + public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant validFrom, Instant storedFrom) { + Location plannedLocation = null; + + } + /** * Delete planned movements from a delete patient information message. * @param visit Hospital visit that should have their planned movements deleted diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java deleted file mode 100644 index c059a8ac9..000000000 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/UpdateSubSpecialityController.java +++ /dev/null @@ -1,180 +0,0 @@ -package uk.ac.ucl.rits.inform.datasinks.emapstar.controllers; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import uk.ac.ucl.rits.inform.datasinks.emapstar.DataSources; -import uk.ac.ucl.rits.inform.datasinks.emapstar.RowState; -import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitAuditRepository; -import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; -import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; -import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisitAudit; -import uk.ac.ucl.rits.inform.informdb.identity.Mrn; -import uk.ac.ucl.rits.inform.informdb.movement.Location; -import uk.ac.ucl.rits.inform.interchange.adt.AdmissionDateTime; -import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; -import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; -import uk.ac.ucl.rits.inform.interchange.adt.DischargePatient; -import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; -import uk.ac.ucl.rits.inform.interchange.adt.RegisterPatient; -import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; - -import java.time.Instant; -import java.util.List; - -/** - * Interactions with visits. - * @author Stef Piatek - */ -@Component -public class UpdateSubSpecialityController { - private final Logger logger = LoggerFactory.getLogger(getClass()); - private final HospitalVisitRepository hospitalVisitRepo; - private final HospitalVisitAuditRepository hospitalVisitAuditRepo; - - /** - * @param hospitalVisitRepo repository for HospitalVisit - * @param hospitalVisitAuditRepo repository for HospitalVisitAudit - */ - public UpdateSubSpecialityController(HospitalVisitRepository hospitalVisitRepo, HospitalVisitAuditRepository hospitalVisitAuditRepo) { - this.hospitalVisitRepo = hospitalVisitRepo; - this.hospitalVisitAuditRepo = hospitalVisitAuditRepo; - } - - /** - * Update visit if message is from a trusted source update if newer or if database source isn't trusted. - * Otherwise only update if if is newly created. - * @param messageDateTime date time of the message - * @param messageSource Source system from the message - * @param visitState visit wrapped in state class - * @return true if the visit should be updated - */ - private boolean visitShouldBeUpdated( - final Instant messageDateTime, final String messageSource, final RowState visitState) { - // always update if a message is created - if (visitState.isEntityCreated()) { - return true; - } - HospitalVisit visit = visitState.getEntity(); - // if message source is trusted and (entity source system is untrusted or message is newer) - return DataSources.isTrusted(messageSource) - && (!DataSources.isTrusted(visit.getSourceSystem()) || !visit.getValidFrom().isAfter(messageDateTime)); - } - - /** - * Update visit with generic ADT information. - * @param msg adt message - * @param visitState visit wrapped in state class - */ - private void updateGenericData(final AdtMessage msg, RowState visitState) { - HospitalVisit visit = visitState.getEntity(); - visitState.assignInterchangeValue(msg.getPatientClass(), visit.getPatientClass(), visit::setPatientClass); - visitState.assignInterchangeValue(msg.getModeOfArrival(), visit.getArrivalMethod(), visit::setArrivalMethod); - visitState.assignIfDifferent(msg.getSourceSystem(), visit.getSourceSystem(), visit::setSourceSystem); - } - - /** - * Add admission date time. - * @param msg AdmissionDateTime - * @param visitState visit wrapped in state class - */ - private void addAdmissionDateTime(final AdmissionDateTime msg, RowState visitState) { - HospitalVisit visit = visitState.getEntity(); - visitState.assignInterchangeValue(msg.getAdmissionDateTime(), visit.getAdmissionDatetime(), visit::setAdmissionDatetime); - } - - /** - * Delete admission specific information. - * @param msg cancellation message - * @param visitState visit wrapped in state class - */ - private void removeAdmissionInformation(final AdtCancellation msg, RowState visitState) { - HospitalVisit visit = visitState.getEntity(); - visitState.removeIfExists(visit.getAdmissionDatetime(), visit::setAdmissionDatetime, msg.getCancelledDateTime()); - } - - /** - * Add registration specific information. - * @param msg adt message - * @param visitState visit wrapped in state class - */ - private void addRegistrationInformation(final RegisterPatient msg, RowState visitState) { - HospitalVisit visit = visitState.getEntity(); - visitState.assignInterchangeValue(msg.getPresentationDateTime(), visit.getPresentationDatetime(), visit::setPresentationDatetime); - } - - /** - * Add discharge specific information. - * If no value for admission time, add this in from the discharge message. - * @param msg adt message - * @param visitState visit wrapped in state class - */ - private void addDischargeInformation(final DischargePatient msg, RowState visitState) { - HospitalVisit visit = visitState.getEntity(); - visitState.assignIfDifferent(msg.getDischargeDateTime(), visit.getDischargeDatetime(), visit::setDischargeDatetime); - visitState.assignIfDifferent(msg.getDischargeDisposition(), visit.getDischargeDisposition(), visit::setDischargeDisposition); - visitState.assignIfDifferent(msg.getDischargeLocation(), visit.getDischargeDestination(), visit::setDischargeDestination); - - // If started mid-stream, no admission information so add this in on discharge - if (visit.getAdmissionDatetime() == null && !msg.getAdmissionDateTime().isUnknown()) { - visitState.assignInterchangeValue(msg.getAdmissionDateTime(), visit.getAdmissionDatetime(), visit::setAdmissionDatetime); - } - } - - /** - * Remove discharge specific information. - * @param msg cancellation message - * @param visitState visit wrapped in state class - */ - private void removeDischargeInformation(final AdtCancellation msg, RowState visitState) { - HospitalVisit visit = visitState.getEntity(); - visitState.removeIfExists(visit.getDischargeDatetime(), visit::setDischargeDatetime, msg.getCancelledDateTime()); - visitState.removeIfExists(visit.getDischargeDisposition(), visit::setDischargeDisposition, msg.getCancelledDateTime()); - visitState.removeIfExists(visit.getDischargeDestination(), visit::setDischargeDestination, msg.getCancelledDateTime()); - - } - - - public List getOlderVisits(Mrn mrn, Instant messageDateTime) { - return hospitalVisitRepo.findAllByMrnIdAndValidFromIsLessThanEqual(mrn, messageDateTime); - } - - /** - * @param msg MoveVisitInformation - * @return true if the message visit number changes and the final encounter already exists - */ - private boolean isVisitNumberChangesAndFinalEncounterAlreadyExists(MoveVisitInformation msg) { - return !msg.getPreviousVisitNumber().equals(msg.getVisitNumber()) && hospitalVisitRepo.findByEncounter(msg.getVisitNumber()).isPresent(); - } - - /** - * Deletes visit and updates corresponding audit table. - * @param visit List of hospital visits - * @param invalidationTime Time of the delete information message - * @param deletionTime time that emap-core started processing the message. - */ - public void deleteVisit(HospitalVisit visit, Instant invalidationTime, Instant deletionTime) { - hospitalVisitAuditRepo.save(visit.createAuditEntity(invalidationTime, deletionTime)); - hospitalVisitRepo.delete(visit); - } - - /** - * Process an Update subspeciality (Z99) request. - *

- * The Hl7 feed will eventually be changed so that we have an identifier per pending transfer, until then we guarantee the order of cancellations. - * If we get messages out of order and have several cancellation messages before we receive any requests, - * then the first request message for the location and encounter will add the eventDatetime to the earliest cancellation. - * Subsequent requests will add the eventDatetime to the earliest cancellation with no eventDatetime, or create a new request if none exist - * after the pending request eventDatetime. - * @param visit associated visit - * @param msg update sub speciality - * @param validFrom time in the hospital when the message was created - * @param storedFrom time that emap core started processing the message - */ - public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant validFrom, Instant storedFrom) { - Location plannedLocation = null; - - } - - -} diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java index 558a5c10b..fce057ce7 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java @@ -9,7 +9,6 @@ import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.PersonController; import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.VisitController; import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.DeletionController; -import uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.UpdateSubSpecialityController; import uk.ac.ucl.rits.inform.datasinks.emapstar.exceptions.RequiredDataMissingException; import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; import uk.ac.ucl.rits.inform.informdb.identity.Mrn; @@ -39,7 +38,6 @@ public class AdtProcessor { private final PatientLocationController patientLocationController; private final PendingAdtController pendingAdtController; private final DeletionController deletionController; - private final UpdateSubSpecialityController updateSubSpecialityController; /** * Implicitly wired spring beans. @@ -48,17 +46,15 @@ public class AdtProcessor { * @param patientLocationController location interactions. * @param pendingAdtController pending ADT interactions. * @param deletionController cascading deletes for hospital visits. - * @param updateSubSpecialityController changing the sub speciality */ public AdtProcessor(PersonController personController, VisitController visitController, PatientLocationController patientLocationController, PendingAdtController pendingAdtController, - DeletionController deletionController, UpdateSubSpecialityController updateSubSpecialityController) { + DeletionController deletionController) { this.personController = personController; this.visitController = visitController; this.patientLocationController = patientLocationController; this.pendingAdtController = pendingAdtController; this.deletionController = deletionController; - this.updateSubSpecialityController = updateSubSpecialityController; } @@ -230,7 +226,7 @@ public void processUpdateSubSpeciality(UpdateSubSpeciality msg, Instant storedFr Instant validFrom = msg.bestGuessAtValidFrom(); HospitalVisit visit = processPersonAndVisit(msg, storedFrom, validFrom); // patientLocationController.processVisitLocation(visit, msg, storedFrom); - // updateSubSpecialityController.processMsg(visit, msg, validFrom, storedFrom); + pendingAdtController.processMsg(visit, msg, validFrom, storedFrom); } } From e52832f6c8d3469c6554cf4452cbd7edf7d81698 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 9 Oct 2025 14:21:55 +0100 Subject: [PATCH 27/62] Implementing controller --- .../controllers/PendingAdtController.java | 19 ++++++++++++++++++- .../emapstar/adt/TestUpdateSubSpeciality.java | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 32e8447b7..e30134b59 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -154,8 +154,25 @@ public void processMsg(HospitalVisit visit, CancelPendingTransfer msg, Instant v * @param storedFrom time that emap core started processing the message */ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant validFrom, Instant storedFrom) { - Location plannedLocation = null; + Location fullLocation = null; + + if (msg.getFullLocationString().isSave()) { + fullLocation = locationController.getOrCreateLocation(msg.getFullLocationString().get()); + } + // pseudo from issue + // match pending adt by hospital_visit and location + // f if a match is found, add in new row to the planned_movement table, event_type = EDIT/HOSPTIAL_SERVICE_CHANGE + + // look for matching entry here + RowState plannedState = getOrCreate( + allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", msg.getEventOccurredDateTime(), validFrom, storedFrom + ); + + plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); + plannedMovementRepo.findAllByHospitalVisitId(visit); + //plannedMovementRepo.findByHospitalVisitIdEncounterAndLocationIdLocationString(visit, plannedLocation); + //plannedMovementRepo. } /** diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index 0ad979d6c..b28441ecb 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -78,7 +78,7 @@ void testPendingCreatesOtherEntities() throws Exception { get the most recent planned movement - there shouldn't be one, so will throw a NoSuchElementException */ - assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, "EAU^UCH T00 EAU BY02^BY02-08")); } From 27448306dc26237113fb4715b87dc0bf44a29ce2 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 14 Oct 2025 12:34:31 +0100 Subject: [PATCH 28/62] Fix style --- .../datasinks/emapstar/controllers/PendingAdtController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index e30134b59..664073255 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -161,8 +161,7 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val } // pseudo from issue // match pending adt by hospital_visit and location - // f if a match is found, add in new row to the planned_movement table, event_type = EDIT/HOSPTIAL_SERVICE_CHANGE - + // if if a match is found, add in new row to the planned_movement table, event_type = EDIT/HOSPTIAL_SERVICE_CHANGE // look for matching entry here RowState plannedState = getOrCreate( From 7b227787b62014402d7e5065de293ff9bf7776ea Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 14 Oct 2025 16:44:14 +0100 Subject: [PATCH 29/62] Implementation - time search not quite working --- .../controllers/PendingAdtController.java | 4 +++- .../repos/PlannedMovementRepository.java | 21 +++++++++++++++++++ .../emapstar/adt/TestUpdateSubSpeciality.java | 17 +++++++++++++++ .../AdtMessages/Location/Moves/09_Z99.yaml | 4 ++-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 664073255..4e97b8520 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -169,7 +169,9 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val ); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); - plannedMovementRepo.findAllByHospitalVisitId(visit); + List movements = plannedMovementRepo.findAllByHospitalVisitId(visit); + Instant eventDateTime = msg.getEventOccurredDateTime(); + List movements_anew = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); //plannedMovementRepo.findByHospitalVisitIdEncounterAndLocationIdLocationString(visit, plannedLocation); //plannedMovementRepo. } diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java index 44af22f6f..9f586e17c 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java @@ -39,6 +39,27 @@ List findMatchingMovementsFromRequest( String eventType, HospitalVisit hospitalVisitId, Location plannedLocation, Instant eventDatetime ); + /** + * Try and find a matching planned movement from a Z99 edit sub speciality message. + *

+ * Always find planned location and hospital visit Id, then: + * - Messages before the the same event date time + * @param hospitalVisitId hospital visit associated with the movement + * @param plannedLocation planned location for the movement + * @param eventDatetime the datetime that event was created + * @return planned movement entities + */ + @Query("from PlannedMovement " + + "where hospitalVisitId = :hospitalVisitId " + + "and (locationId = :plannedLocation or (:plannedLocation is null and locationId is null)) " + + "and (eventDatetime <= :eventDatetime) " + + "order by eventDatetime " + ) + List findMatchingMovementsFromZ99( + HospitalVisit hospitalVisitId, Location plannedLocation, Instant eventDatetime + ); + + /** * Try and find a matching planned movement from a pending adt cancellation message. *

diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index b28441ecb..cf6c85180 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -17,6 +17,7 @@ import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.PlannedMovementRepository; import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; +import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.test.helpers.InterchangeMessageFactory; import uk.ac.ucl.rits.inform.interchange.InterchangeValue; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; @@ -97,5 +98,21 @@ void testUpdateCreatesOtherEntities() throws Exception { assertEquals(1, hospitalVisitRepository.count()); } + /** + * If more than one pending transfer exists choose and edit the most recent occurence + */ + @Test + void testLastMessageIsEdited() throws Exception { + PendingTransfer pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); + PendingTransfer pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); + + Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); + pendingTransferLater.setEventOccurredDateTime(laterTime); + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(pendingTransferLater); + dbOps.processMessage(updateSubSpeciality); + + } + } diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml index 134ec28ca..02e2bfb0b 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/09_Z99.yaml @@ -1,6 +1,6 @@ "@class": "uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality" recordedDateTime: "2013-02-11T18:00:52Z" -eventOccurredDateTime: "2013-02-11T17:00:52Z" +eventOccurredDateTime: "2022-04-22T00:00:00Z" eventReasonCode: "ADT_EVENT" visitNumber: "123412341234" nhsNumber: "9999999999" @@ -13,7 +13,7 @@ hospitalService: fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" - value: "EAU^UCH T00 EAU BY02^BY02-08" + value: "1020100166^SDEC BY02^11 SDEC" patientClass: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" From a021e84fc9c06cfc6cb816033a8417bcbf6cdc52 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 15 Oct 2025 10:53:57 +0100 Subject: [PATCH 30/62] Add matched movement value to table and populate --- .../controllers/PendingAdtController.java | 22 ++++++++++++++----- .../emapstar/adt/TestUpdateSubSpeciality.java | 5 +++++ .../inform/interchange/adt/AdtMessage.java | 2 +- .../interchange/adt/UpdateSubSpeciality.java | 1 + .../informdb/movement/PlannedMovement.java | 8 ++++++- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 4e97b8520..d81e755bc 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -10,11 +10,13 @@ import uk.ac.ucl.rits.inform.informdb.movement.Location; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovementAudit; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; @@ -164,16 +166,24 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val // if if a match is found, add in new row to the planned_movement table, event_type = EDIT/HOSPTIAL_SERVICE_CHANGE // look for matching entry here + Instant eventDateTime = msg.getEventOccurredDateTime(); + List movements = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); + Long matched_movement_id; + if ( movements.isEmpty() ) { + matched_movement_id = null; + } + else { + matched_movement_id = movements.get(0).getPlannedMovementId(); + } + RowState plannedState = getOrCreate( allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", msg.getEventOccurredDateTime(), validFrom, storedFrom ); - + PlannedMovement movement = plannedState.getEntity(); + //plannedState.assignInterchangeValue(matched_movement_id, movement.getMatchedMovementId(), movement::setMatchedMovementId); + plannedState.assignIfDifferent(matched_movement_id, movement.getMatchedMovementId(), movement::setMatchedMovementId); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); - List movements = plannedMovementRepo.findAllByHospitalVisitId(visit); - Instant eventDateTime = msg.getEventOccurredDateTime(); - List movements_anew = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); - //plannedMovementRepo.findByHospitalVisitIdEncounterAndLocationIdLocationString(visit, plannedLocation); - //plannedMovementRepo. + } /** diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index cf6c85180..86536cd89 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -96,6 +96,8 @@ void testUpdateCreatesOtherEntities() throws Exception { assertEquals(1, mrnRepository.count()); assertEquals(1, coreDemographicRepository.count()); assertEquals(1, hospitalVisitRepository.count()); + // an entry should have been added to the planned movement table with a null matched movement id. + assertNull(1); } /** @@ -112,6 +114,9 @@ void testLastMessageIsEdited() throws Exception { dbOps.processMessage(pendingTransferLater); dbOps.processMessage(updateSubSpeciality); + // and entry should have been added to the planned movement table with the correct matched planned movement id + assertEquals (1, 0); + } } diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java index 79835a44f..29c1df9c3 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java @@ -43,7 +43,7 @@ public abstract class AdtMessage extends EmapOperationMessage { private InterchangeValue patientSex = InterchangeValue.unknown(); private InterchangeValue patientTitle = InterchangeValue.unknown(); private InterchangeValue patientZipOrPostalCode = InterchangeValue.unknown(); - + private InterchangeValue matchedMovementId = InterchangeValue.unknown(); /** * Ideally the time the event occurred, but uses the message date time as a backup. diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java index ab8644651..194b86b99 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdateSubSpeciality.java @@ -17,6 +17,7 @@ @ToString(callSuper = true) public class UpdateSubSpeciality extends AdtMessage implements HospitalService { private InterchangeValue hospitalService = InterchangeValue.unknown(); + private InterchangeValue matchedMovementId = InterchangeValue.unknown(); @Override public void processMessage(EmapOperationMessageProcessor processor) throws EmapOperationMessageProcessingException { diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/PlannedMovement.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/PlannedMovement.java index 6ab3a91d0..fa9ca9ca0 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/PlannedMovement.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/PlannedMovement.java @@ -63,10 +63,15 @@ public class PlannedMovement extends TemporalCore Date: Wed, 15 Oct 2025 11:22:49 +0100 Subject: [PATCH 31/62] style fixes --- .../controllers/PendingAdtController.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index d81e755bc..c443fcb87 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -10,13 +10,11 @@ import uk.ac.ucl.rits.inform.informdb.movement.Location; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovementAudit; -import uk.ac.ucl.rits.inform.interchange.InterchangeValue; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import java.time.Instant; -import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; @@ -168,12 +166,11 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val Instant eventDateTime = msg.getEventOccurredDateTime(); List movements = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); - Long matched_movement_id; - if ( movements.isEmpty() ) { - matched_movement_id = null; - } - else { - matched_movement_id = movements.get(0).getPlannedMovementId(); + Long matchedMovementId; + if (movements.isEmpty()) { + matchedMovementId = null; + } else { + matchedMovementId = movements.get(0).getPlannedMovementId(); } RowState plannedState = getOrCreate( @@ -181,7 +178,7 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val ); PlannedMovement movement = plannedState.getEntity(); //plannedState.assignInterchangeValue(matched_movement_id, movement.getMatchedMovementId(), movement::setMatchedMovementId); - plannedState.assignIfDifferent(matched_movement_id, movement.getMatchedMovementId(), movement::setMatchedMovementId); + plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); } From fe1a7133b5230bd70e90b7bd67c97ac781b4d81e Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 15 Oct 2025 13:58:47 +0100 Subject: [PATCH 32/62] Update HL7, implement tests, and get last value in list --- .../emapstar/controllers/PendingAdtController.java | 2 +- .../emapstar/adt/TestUpdateSubSpeciality.java | 13 ++++++++----- .../test/resources/Adt/Location/Moves/09_Z99.txt | 6 +++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index c443fcb87..2ed6bd3ab 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -170,7 +170,7 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val if (movements.isEmpty()) { matchedMovementId = null; } else { - matchedMovementId = movements.get(0).getPlannedMovementId(); + matchedMovementId = movements.get(movements.size() - 1).getPlannedMovementId(); } RowState plannedState = getOrCreate( diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index 86536cd89..dd084d0fc 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -1,5 +1,6 @@ package uk.ac.ucl.rits.inform.datasinks.emapstar.adt; +import org.h2.table.Plan; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; @@ -52,7 +53,7 @@ class TestUpdateSubSpeciality extends MessageProcessingBase { private static final String VISIT_NUMBER = "123412341234"; private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; - private static final Instant EVENT_TIME = Instant.parse("2022-04-21T23:22:58Z"); + private static final Instant EVENT_TIME = Instant.parse("2022-04-22T00:00:00Z"); private static final Instant CANCEL_TIME = Instant.parse("2022-04-21T23:37:58Z"); @@ -87,6 +88,7 @@ void testPendingCreatesOtherEntities() throws Exception { * Given that no entities exist in the database * When a Z99 Message is created * Mrn, core demographics and hospital visit entities should be created + * and a planned movement should be created with a Null matchedMovementId * @throws Exception shouldn't happen */ @Test @@ -96,8 +98,9 @@ void testUpdateCreatesOtherEntities() throws Exception { assertEquals(1, mrnRepository.count()); assertEquals(1, coreDemographicRepository.count()); assertEquals(1, hospitalVisitRepository.count()); - // an entry should have been added to the planned movement table with a null matched movement id. - assertNull(1); + + PlannedMovement movement = getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING); + assertNull(movement.getMatchedMovementId()); } /** @@ -115,8 +118,8 @@ void testLastMessageIsEdited() throws Exception { dbOps.processMessage(updateSubSpeciality); // and entry should have been added to the planned movement table with the correct matched planned movement id - assertEquals (1, 0); - + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals (6, movements.get(2).getMatchedMovementId()); } } diff --git a/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt b/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt index d9dba736e..74a1fa777 100644 --- a/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt +++ b/hl7-reader/src/test/resources/Adt/Location/Moves/09_Z99.txt @@ -1,6 +1,6 @@ -MSH|^~\&|EPIC|UCLH|||20130211100052|IPUC|ADT^Z99|31644ZZZ|T|2.4|||AL|NE -EVN|Z99|20130211180052||ADT_EVENT|IPUC^COORDINATOR^INPATIENT^UNIT^^^^^UCLHS^^^^^UCHC|20130211170052 +MSH|^~\&|EPIC|UCLH|||20220421230000|IPUC|ADT^Z99|31644ZZZ|T|2.4|||AL|NE +EVN|Z99|20130211180052||ADT_EVENT|IPUC^COORDINATOR^INPATIENT^UNIT^^^^^UCLHS^^^^^UCHC|20220422010000 PID|1||40800000^^^MRENTR^MEDREC~9999999999^^^NHS^HN||ORANGE^BLOOD^^^^^D|||F|||^^^^^ENGLAND^L|||||||||||||||||||N -PV1|1|I|EAU^UCH T00 EAU BY02^BY02-08^U^R^^^^^^DEPID|Matern Ante|||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|||Anaes||||Usual|||||123412341234|SELF||||||||||||||||Feeling great|Home||||Adm*Conf|||20130211100052|20130211170052 +PV1|1|I|1020100166^SDEC BY02^11 SDEC|Matern Ante|||HB^BADGER^HONEY^^^^^^CONS^^^^CONS~C1111111^BADGER^HONEY^^^^^^CDS^^^^CDS~752^BADGER^HONEY^^^^^^PROVID^^^^PROVID|||Anaes||||Usual|||||123412341234|SELF||||||||||||||||Feeling great|Home||||Adm*Conf|||20130211100052|20220422000000 PV2||||||||20130211||||Hospital Encounter||||||||||N||||||||||N OBX|1|TX|AdminCode^ADMINISTRATIVE CATEGORY CODE|1|1|||||||||20130211 From 50a60e5cc52cc4b3ab9ac92054887c72d348dc56 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 15 Oct 2025 16:26:25 +0100 Subject: [PATCH 33/62] Add hospital service to data --- .../datasinks/emapstar/controllers/PendingAdtController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 2ed6bd3ab..a5e598f72 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -176,8 +176,10 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val RowState plannedState = getOrCreate( allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", msg.getEventOccurredDateTime(), validFrom, storedFrom ); + + PlannedMovement movement = plannedState.getEntity(); - //plannedState.assignInterchangeValue(matched_movement_id, movement.getMatchedMovementId(), movement::setMatchedMovementId); + plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); From a15c101b5c317bf37c59ec22a2591b56ac1345c8 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 15 Oct 2025 16:56:21 +0100 Subject: [PATCH 34/62] Add in event date time --- .../datasinks/emapstar/controllers/PendingAdtController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index a5e598f72..52d19f67c 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -179,6 +179,10 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val PlannedMovement movement = plannedState.getEntity(); + // not sure why but event date time isn't being set. Add it here. + if (movement.getEventDatetime() == null) { + plannedState.assignIfDifferent(msg.getEventOccurredDateTime(), movement.getEventDatetime(), movement::setEventDatetime); + } plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); From 5cab8c158ce40d8dce39a33373ec79c3b1846447 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 16 Oct 2025 10:32:50 +0100 Subject: [PATCH 35/62] Update logic so only changed services are put in table, and update tests to match --- .../controllers/PendingAdtController.java | 41 ++++++++++--------- .../emapstar/adt/TestUpdateSubSpeciality.java | 13 +++--- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 52d19f67c..dff4fa1de 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -16,6 +16,7 @@ import java.time.Instant; import java.util.List; +import java.util.Objects; import java.util.Optional; /** @@ -166,27 +167,27 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val Instant eventDateTime = msg.getEventOccurredDateTime(); List movements = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); - Long matchedMovementId; - if (movements.isEmpty()) { - matchedMovementId = null; - } else { - matchedMovementId = movements.get(movements.size() - 1).getPlannedMovementId(); + if (!movements.isEmpty()) { + + int mostRecentMoveIndex = movements.size() - 1; + String currentService = movements.get(mostRecentMoveIndex).getHospitalService(); + String editedService = msg.getHospitalService().get(); + + if (!Objects.equals(currentService, editedService)) { + Long matchedMovementId = movements.get(mostRecentMoveIndex).getPlannedMovementId(); + RowState plannedState = getOrCreate( + allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", msg.getEventOccurredDateTime(), validFrom, storedFrom + ); + PlannedMovement movement = plannedState.getEntity(); + // not sure why but event date time isn't being set. Add it here. + if (movement.getEventDatetime() == null) { + plannedState.assignIfDifferent(msg.getEventOccurredDateTime(), movement.getEventDatetime(), movement::setEventDatetime); + } + plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); + plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); + plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); + } } - - RowState plannedState = getOrCreate( - allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", msg.getEventOccurredDateTime(), validFrom, storedFrom - ); - - - PlannedMovement movement = plannedState.getEntity(); - // not sure why but event date time isn't being set. Add it here. - if (movement.getEventDatetime() == null) { - plannedState.assignIfDifferent(msg.getEventOccurredDateTime(), movement.getEventDatetime(), movement::setEventDatetime); - } - plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); - plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); - plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); - } /** diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index dd084d0fc..a2f8f8c44 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -87,8 +87,9 @@ void testPendingCreatesOtherEntities() throws Exception { /** * Given that no entities exist in the database * When a Z99 Message is created - * Mrn, core demographics and hospital visit entities should be created - * and a planned movement should be created with a Null matchedMovementId + * Mrn, core demographics and hospital visit entities should be created. + * A planned movement should not be created as there are no matching planned moves in the + * planned movement table * @throws Exception shouldn't happen */ @Test @@ -99,15 +100,15 @@ void testUpdateCreatesOtherEntities() throws Exception { assertEquals(1, coreDemographicRepository.count()); assertEquals(1, hospitalVisitRepository.count()); - PlannedMovement movement = getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING); - assertNull(movement.getMatchedMovementId()); + assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); } /** - * If more than one pending transfer exists choose and edit the most recent occurence + * If more than one pending transfer exists find the most recent one and if it + * has a different hospital service insert the edit into the planned movement table. */ @Test - void testLastMessageIsEdited() throws Exception { + void testEditMessageInsertedIfHospitalServicesAreDifferent() throws Exception { PendingTransfer pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); PendingTransfer pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); From e37d4e767e8fe820059ffc135ca9e171a643ec7c Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 16 Oct 2025 13:53:13 +0100 Subject: [PATCH 36/62] Added test cases and tidied up test file --- .../emapstar/adt/TestUpdateSubSpeciality.java | 65 ++++++++----------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index a2f8f8c44..e2e98e87d 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -1,13 +1,7 @@ package uk.ac.ucl.rits.inform.datasinks.emapstar.adt; -import org.h2.table.Plan; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; -import org.junit.jupiter.params.provider.ArgumentsSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -16,24 +10,16 @@ import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.MrnRepository; import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.PlannedMovementRepository; -import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; -import uk.ac.ucl.rits.inform.interchange.test.helpers.InterchangeMessageFactory; -import uk.ac.ucl.rits.inform.interchange.InterchangeValue; -import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; -import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; -import uk.ac.ucl.rits.inform.interchange.adt.PendingType; import java.io.IOException; -import java.io.InvalidClassException; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.List; import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.stream.Stream; + import static org.junit.jupiter.api.Assertions.*; @@ -53,8 +39,7 @@ class TestUpdateSubSpeciality extends MessageProcessingBase { private static final String VISIT_NUMBER = "123412341234"; private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; - private static final Instant EVENT_TIME = Instant.parse("2022-04-22T00:00:00Z"); - private static final Instant CANCEL_TIME = Instant.parse("2022-04-21T23:37:58Z"); + private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String location) { @@ -67,23 +52,6 @@ void setup() throws IOException { updateSubSpeciality = messageFactory.getAdtMessage("Location/Moves/09_Z99.yaml"); } - - /** - If no entities exist in the database then latest service is NULL, - create an entry with the correct sub speciality/ - */ - @Test - void testPendingCreatesOtherEntities() throws Exception { - dbOps.processMessage(updateSubSpeciality); - Optional byId = hospitalVisitRepository.findByEncounter(VISIT_NUMBER); - /* - get the most recent planned movement - there shouldn't be one, so will throw a - NoSuchElementException - */ - assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, "EAU^UCH T00 EAU BY02^BY02-08")); - } - - /** * Given that no entities exist in the database * When a Z99 Message is created @@ -111,17 +79,40 @@ void testUpdateCreatesOtherEntities() throws Exception { void testEditMessageInsertedIfHospitalServicesAreDifferent() throws Exception { PendingTransfer pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); PendingTransfer pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); + PendingTransfer pendingTransferAfter = messageFactory.getAdtMessage("pending/A15.yaml"); - Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); + Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.MINUTES); pendingTransferLater.setEventOccurredDateTime(laterTime); + + Instant afterTime = pendingTransferAfter.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); + pendingTransferAfter.setEventOccurredDateTime(afterTime); + dbOps.processMessage(pendingTransfer); dbOps.processMessage(pendingTransferLater); + dbOps.processMessage(pendingTransferAfter); dbOps.processMessage(updateSubSpeciality); // and entry should have been added to the planned movement table with the correct matched planned movement id List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); - assertEquals (6, movements.get(2).getMatchedMovementId()); + assertEquals(4, movements.size()); + assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", movements.get(3).getEventType()); + assertEquals(7, movements.get(3).getMatchedMovementId()); } -} + /** + * Find the most recent one, but don't add to table if it has the same hospital service as the edit message + */ + @Test + void testEditMessageNotInsertedIfHospitalServicesAreTheSame() throws Exception { + PendingTransfer pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); + dbOps.processMessage(pendingTransfer); + updateSubSpeciality.setHospitalService(pendingTransfer.getHospitalService()); + dbOps.processMessage(updateSubSpeciality); + + // and entry should have been added to the planned movement table with the correct matched planned movement id + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + } +} \ No newline at end of file From d69046f5156a670fa1fa478a589f6bf9b6034825 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 19 Oct 2025 12:56:51 +0100 Subject: [PATCH 37/62] add new variables --- .../informdb/movement/DepartmentState.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java index ebc08edd5..235d99e0c 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java @@ -54,6 +54,22 @@ public class DepartmentState extends AuditCore { * \brief Current speciality of the department. */ private String speciality; + + /** + * \brief Report Group Nine (RPT_GRP_NINE) value associated with this department. + */ + private String rptGrpNine; + + /** + * \brief Predicate determining whether the Department is a ward or flow area. + */ + private Boolean isWardOrFlowArea; + + /** + * \brief Predicate determining whether the Department is a core inpatient area. + */ + private Boolean isCoreInpatientArea; + /** * Create valid department state. * @param department parent department @@ -61,11 +77,19 @@ public class DepartmentState extends AuditCore { * @param validFrom time that the message was valid from * @param storedFrom time that emap core stared processing the message * @param speciality name of the current speciality of this department + * @param rptGrpNine Report Group Nine value associated with this department + * @param isWardOrFlowArea is this department a ward or flow area + * @param isCoreInpatientArea is this department a core inpatient area */ - public DepartmentState(Department department, String status, String speciality, Instant validFrom, Instant storedFrom) { + public DepartmentState(Department department, String status, + String speciality, String rptGrpNine, Boolean isWardOrFlowArea, + Boolean isCoreInpatientArea, Instant validFrom, Instant storedFrom) { departmentId = department; this.status = status; this.speciality = speciality; + this.rptGrpNine = rptGrpNine; + this.isWardOrFlowArea = isWardOrFlowArea; + this.isCoreInpatientArea = isCoreInpatientArea; setValidFrom(validFrom); setStoredFrom(storedFrom); } @@ -78,6 +102,9 @@ private DepartmentState(DepartmentState other) { departmentId = other.departmentId; status = other.status; speciality = other.speciality; + rptGrpNine = other.rptGrpNine; + isWardOrFlowArea = other.isWardOrFlowArea; + isCoreInpatientArea = other.isCoreInpatientArea; } @Override From 80ff91d36d5f16250169312fe40dd3d2acbc4294 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 19 Oct 2025 12:57:22 +0100 Subject: [PATCH 38/62] change check style to allow more than seven arguments to a function --- emap-checker.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/emap-checker.xml b/emap-checker.xml index 1e27d302e..a526209c9 100644 --- a/emap-checker.xml +++ b/emap-checker.xml @@ -107,8 +107,10 @@ - - + + + + From ffd29fee2f9e0a656dad41a4e95a511fe474b9ea Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 19 Oct 2025 14:05:53 +0100 Subject: [PATCH 39/62] Add the variables to the metadata class --- .../inform/interchange/location/DepartmentMetadata.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java index ad6fb9c72..1c6f49193 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java @@ -42,6 +42,13 @@ public class DepartmentMetadata extends EmapOperationMessage implements MinimalD private String departmentSpeciality; private Instant specialityUpdate; private String previousDepartmentSpeciality; + + /** + * Variables added to make location processing more robust. + */ + private String rptGrpNine; + private Boolean isWardOrFlowArea; + private Boolean isCoreInpatientArea; /** * Not used in processing, but useful to debugging ordering. */ From ad22070e92a16cf971ebdf97a6b22e99bcf94e5f Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sun, 19 Oct 2025 14:06:26 +0100 Subject: [PATCH 40/62] fix the location controller to reflect the new metadata values --- .../emapstar/controllers/LocationController.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java index 482bf5a46..90bab82a3 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java @@ -199,7 +199,7 @@ class DepartmentController { } /** - * Get or create minomal department entity. + * Get or create minimal department entity. * @param msg minimal department message * @return saved department entity */ @@ -257,7 +257,10 @@ private static boolean updateFieldIfNull(String currentData, String newdata, Con void processDepartmentStates(DepartmentMetadata msg, Department department, Instant storedFrom) throws IncompatibleDatabaseStateException { Instant validFrom = msg.getSpecialityUpdate() == null ? msg.getDepartmentContactDate() : msg.getSpecialityUpdate(); DepartmentState currentState = new DepartmentState( - department, msg.getDepartmentRecordStatus().toString(), msg.getDepartmentSpeciality(), validFrom, storedFrom); + department, msg.getDepartmentRecordStatus().toString(), + msg.getDepartmentSpeciality(), msg.getRptGrpNine(), + msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), + validFrom, storedFrom); if (departmentStateRepo.existsByDepartmentIdAndSpecialityAndValidFrom(department, msg.getDepartmentSpeciality(), validFrom)) { logger.debug("Department State already exists in the database, no need to process further"); @@ -274,9 +277,11 @@ void processDepartmentStates(DepartmentMetadata msg, Department department, Inst invalidatePreviousStateIfChanged(msg.getPreviousDepartmentSpeciality(), currentState, possiblePreviousState.get()); } else if (msg.getPreviousDepartmentSpeciality() != null) { // if the previous department speciality is not in the database - DepartmentState previousState = new DepartmentState( - department, msg.getDepartmentRecordStatus().toString(), msg.getPreviousDepartmentSpeciality(), - msg.getDepartmentContactDate(), storedFrom); + DepartmentState previousState = new DepartmentState(department, + msg.getDepartmentRecordStatus().toString(), + msg.getPreviousDepartmentSpeciality(), msg.getRptGrpNine(), + msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), + msg.getDepartmentContactDate(), storedFrom); previousState.setStoredUntil(currentState.getStoredFrom()); previousState.setValidUntil(currentState.getValidFrom()); departmentStateRepo.saveAll(List.of(previousState, currentState)); From 32f117e5ef00202e6ca411d4f256afe187b99fc2 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Mon, 20 Oct 2025 11:35:03 +0100 Subject: [PATCH 41/62] files for testing hoover --- .../DepartmentMetadata/additional-acun_dept.yaml | 14 ++++++++++++++ .../dental_department_only.yaml | 11 +++++++++++ .../medsurg_active_pool_bed.yaml | 11 +++++++++++ .../no_department_history.yaml | 10 ++++++++++ .../paediatric_department_only_1.yaml | 12 ++++++++++++ .../paediatric_department_only_2.yaml | 12 ++++++++++++ .../paediatric_department_only_3.yaml | 12 ++++++++++++ 7 files changed, 82 insertions(+) create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml create mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml new file mode 100644 index 000000000..7078e3aba --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml @@ -0,0 +1,14 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +departmentHl7: "ACUN" +departmentName: "EGA E03 ACU NURSERY" +departmentId: "2" +departmentSpeciality: "Maternity - Well Baby" +departmentRecordStatus: "ACTIVE" +previousDepartmentSpeciality: "Dental - Oral Medicine" +departmentContactDate: "2012-02-09T00:00:00Z" +specialityUpdate: "2022-02-09T00:00:20Z" +combinedUpdate: "2022-02-09T00:00:20Z" +rptGrpNine: "ACUN" +isWardOrFlowArea: true +isCoreInpatientArea: true \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml new file mode 100644 index 000000000..f74c366b6 --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml @@ -0,0 +1,11 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +# department +departmentHl7: "1000000059" +departmentName: "DENTAL: ORAL MEDICINE" +departmentId: "13" +departmentRecordStatus: "ACTIVE" +departmentContactDate: "2018-08-22T00:00:00Z" +departmentSpeciality: "Dental - Oral Medicine" +specialityUpdate: "2020-09-22T13:47:56Z" +combinedUpdate: "2020-09-22T13:47:56Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml new file mode 100644 index 000000000..41cf2670a --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml @@ -0,0 +1,11 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +# department +departmentHl7: "MEDSURG" +departmentName: "EMH MED SURG" +departmentId: "1" +departmentSpeciality: null +departmentRecordStatus: "DELETED_AND_HIDDEN" +departmentContactDate: "2005-12-08T00:00:00Z" +combinedUpdate: "2021-04-23T09:00:00Z" + diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml new file mode 100644 index 000000000..bbe538032 --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml @@ -0,0 +1,10 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +# department +departmentHl7: "1020100002" +departmentName: "UCH ROI" +departmentId: "1020100002" +departmentSpeciality: null +departmentRecordStatus: "ACTIVE" +departmentContactDate: "2022-12-08T00:00:00Z" +combinedUpdate: "2022-12-08T00:00:00Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml new file mode 100644 index 000000000..b396e601f --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml @@ -0,0 +1,12 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +# department +departmentHl7: "100000060" +departmentName: "OFF SE5PC" +departmentId: "1020610068" +departmentSpeciality: "Paediatric - Respiratory Medicine" +departmentRecordStatus: "ACTIVE" +departmentContactDate: "2021-08-25T23:00:00Z" +# missing previous department will be null +specialityUpdate: "2021-08-26T11:28:51Z" +combinedUpdate: "2021-08-26T11:28:51Z" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml new file mode 100644 index 000000000..7872eae2e --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml @@ -0,0 +1,12 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +# department +departmentHl7: "100000060" +departmentName: "OFF SE5PC" +departmentId: "1020610068" +departmentSpeciality: "Paediatric - Infectious Diseases" +previousDepartmentSpeciality: "Paediatric - Respiratory Medicine" +departmentRecordStatus: "ACTIVE" +departmentContactDate: "2021-08-25T23:00:00Z" +specialityUpdate: "2021-09-06T06:42:26Z" +combinedUpdate: "2021-09-06T06:42:26Z" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml new file mode 100644 index 000000000..1834085f7 --- /dev/null +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml @@ -0,0 +1,12 @@ +"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" +sourceSystem: "clarity" +# department +departmentHl7: "100000060" +departmentName: "OFF SE5PC" +departmentId: "1020610068" +departmentSpeciality: "Paediatric - RESPOND" +previousDepartmentSpeciality: "Paediatric - Infectious Diseases" +departmentRecordStatus: "ACTIVE" +departmentContactDate: "2021-08-25T23:00:00Z" +specialityUpdate: "2021-10-08T23:00:20Z" +combinedUpdate: "2021-10-08T23:00:20Z" \ No newline at end of file From 7ccf9c694f8117216a66eb08f926a503aa8cfed2 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Mon, 20 Oct 2025 13:45:35 +0100 Subject: [PATCH 42/62] Added a test case for pending transfers after the edit --- .../emapstar/adt/TestUpdateSubSpeciality.java | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index e2e98e87d..68cb3796c 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -36,12 +36,14 @@ class TestUpdateSubSpeciality extends MessageProcessingBase { // end to end messages private UpdateSubSpeciality updateSubSpeciality; + private PendingTransfer pendingTransfer; + private PendingTransfer pendingTransferLater; + private PendingTransfer pendingTransferAfter; private static final String VISIT_NUMBER = "123412341234"; private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; - private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String location) { return plannedMovementRepository .findByHospitalVisitIdEncounterAndLocationIdLocationString(visitNumber, location).orElseThrow(); @@ -50,6 +52,16 @@ private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String loc @BeforeEach void setup() throws IOException { updateSubSpeciality = messageFactory.getAdtMessage("Location/Moves/09_Z99.yaml"); + + pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); + pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); + pendingTransferAfter = messageFactory.getAdtMessage("pending/A15.yaml"); + + Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.MINUTES); + pendingTransferLater.setEventOccurredDateTime(laterTime); + + Instant afterTime = pendingTransferAfter.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); + pendingTransferAfter.setEventOccurredDateTime(afterTime); } /** @@ -77,15 +89,6 @@ void testUpdateCreatesOtherEntities() throws Exception { */ @Test void testEditMessageInsertedIfHospitalServicesAreDifferent() throws Exception { - PendingTransfer pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); - PendingTransfer pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); - PendingTransfer pendingTransferAfter = messageFactory.getAdtMessage("pending/A15.yaml"); - - Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.MINUTES); - pendingTransferLater.setEventOccurredDateTime(laterTime); - - Instant afterTime = pendingTransferAfter.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); - pendingTransferAfter.setEventOccurredDateTime(afterTime); dbOps.processMessage(pendingTransfer); dbOps.processMessage(pendingTransferLater); @@ -104,8 +107,6 @@ void testEditMessageInsertedIfHospitalServicesAreDifferent() throws Exception { */ @Test void testEditMessageNotInsertedIfHospitalServicesAreTheSame() throws Exception { - PendingTransfer pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); - dbOps.processMessage(pendingTransfer); updateSubSpeciality.setHospitalService(pendingTransfer.getHospitalService()); dbOps.processMessage(updateSubSpeciality); @@ -115,4 +116,19 @@ void testEditMessageNotInsertedIfHospitalServicesAreTheSame() throws Exception { assertEquals(1, movements.size()); assertEquals("TRANSFER", movements.get(0).getEventType()); } -} \ No newline at end of file + + /** + * If pending transfers only exist after the edit event, don't add edit message. + */ + @Test + void testEditMessageNotInsertedIfTransfersAreAfter() throws Exception { + dbOps.processMessage(pendingTransferAfter); + dbOps.processMessage(updateSubSpeciality); + + assertEquals(1, mrnRepository.count()); + assertEquals(1, coreDemographicRepository.count()); + assertEquals(1, hospitalVisitRepository.count()); + + assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + } +} From dddead664e44e6d0d671fe40a41e4fde1b4d2c65 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Mon, 20 Oct 2025 16:45:58 +0100 Subject: [PATCH 43/62] Simplified setting of event time, and updated test --- .../emapstar/controllers/PendingAdtController.java | 7 +++---- .../datasinks/emapstar/adt/TestUpdateSubSpeciality.java | 6 +++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index dff4fa1de..b7048111d 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -166,6 +166,7 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val // look for matching entry here Instant eventDateTime = msg.getEventOccurredDateTime(); + List movements = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); if (!movements.isEmpty()) { @@ -176,13 +177,11 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val if (!Objects.equals(currentService, editedService)) { Long matchedMovementId = movements.get(mostRecentMoveIndex).getPlannedMovementId(); RowState plannedState = getOrCreate( - allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", msg.getEventOccurredDateTime(), validFrom, storedFrom + allFromRequest, visit, fullLocation, "EDIT/HOSPITAL_SERVICE_CHANGE", eventDateTime, validFrom, storedFrom ); PlannedMovement movement = plannedState.getEntity(); // not sure why but event date time isn't being set. Add it here. - if (movement.getEventDatetime() == null) { - plannedState.assignIfDifferent(msg.getEventOccurredDateTime(), movement.getEventDatetime(), movement::setEventDatetime); - } + plannedState.assignIfDifferent(eventDateTime, movement.getEventDatetime(), movement::setEventDatetime); plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index 68cb3796c..b8b3791b3 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -129,6 +129,10 @@ void testEditMessageNotInsertedIfTransfersAreAfter() throws Exception { assertEquals(1, coreDemographicRepository.count()); assertEquals(1, hospitalVisitRepository.count()); - assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + // one entry should have been added to the planned movement table with the correct matched planned movement id + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + //assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); } } From 016c3150938dd41b0221e06e36273e8e85f5c7cf Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Tue, 21 Oct 2025 16:37:47 +0100 Subject: [PATCH 44/62] Adds site location to department metadata Adds site location information to the Department table to allow for easier querying of locations. Renames rptGrpNine to departmentType. Populates the site location based on sending facility in HL7 messages. --- .../ucl/rits/inform/interchange/adt/AdtMessage.java | 1 + .../interchange/location/DepartmentMetadata.java | 2 +- .../test/resources/DepartmentMetadata/acun_dept.yaml | 3 ++- .../DepartmentMetadata/additional-acun_dept.yaml | 5 +++-- .../dental_department_only.yaml | 1 + .../medsurg_active_pool_bed.yaml | 2 +- .../additional-local-only/no_department_history.yaml | 1 + .../paediatric_department_only_1.yaml | 3 ++- .../paediatric_department_only_2.yaml | 3 ++- .../paediatric_department_only_3.yaml | 3 ++- .../rits/inform/informdb/movement/Department.java | 5 +++++ .../inform/informdb/movement/DepartmentState.java | 12 ++++++------ .../inform/datasources/ids/AdtMessageFactory.java | 1 + 13 files changed, 28 insertions(+), 14 deletions(-) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java index 79835a44f..603f63c14 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java @@ -26,6 +26,7 @@ public abstract class AdtMessage extends EmapOperationMessage { private String mrn; private String nhsNumber; private String visitNumber; + private String siteLocation; private InterchangeValue modeOfArrival = InterchangeValue.unknown(); private InterchangeValue ethnicGroup = InterchangeValue.unknown(); private InterchangeValue fullLocationString = InterchangeValue.unknown(); diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java index 1c6f49193..58e2322d5 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java @@ -46,7 +46,7 @@ public class DepartmentMetadata extends EmapOperationMessage implements MinimalD /** * Variables added to make location processing more robust. */ - private String rptGrpNine; + private String departmentType; private Boolean isWardOrFlowArea; private Boolean isCoreInpatientArea; /** diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml index ff889578d..6428ca20b 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml @@ -8,4 +8,5 @@ departmentRecordStatus: "ACTIVE" previousDepartmentSpeciality: "Dental - Oral Medicine" departmentContactDate: "2012-02-09T00:00:00Z" specialityUpdate: "2022-02-09T00:00:20Z" -combinedUpdate: "2022-02-09T00:00:20Z" \ No newline at end of file +combinedUpdate: "2022-02-09T00:00:20Z" +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml index 7078e3aba..855281a54 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml @@ -9,6 +9,7 @@ previousDepartmentSpeciality: "Dental - Oral Medicine" departmentContactDate: "2012-02-09T00:00:00Z" specialityUpdate: "2022-02-09T00:00:20Z" combinedUpdate: "2022-02-09T00:00:20Z" -rptGrpNine: "ACUN" +departmentType: "ACUN" isWardOrFlowArea: true -isCoreInpatientArea: true \ No newline at end of file +isCoreInpatientArea: true +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml index f74c366b6..eedb8a794 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml @@ -9,3 +9,4 @@ departmentContactDate: "2018-08-22T00:00:00Z" departmentSpeciality: "Dental - Oral Medicine" specialityUpdate: "2020-09-22T13:47:56Z" combinedUpdate: "2020-09-22T13:47:56Z" +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml index 41cf2670a..9d45554f6 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml @@ -8,4 +8,4 @@ departmentSpeciality: null departmentRecordStatus: "DELETED_AND_HIDDEN" departmentContactDate: "2005-12-08T00:00:00Z" combinedUpdate: "2021-04-23T09:00:00Z" - +siteLocation: "UCLH" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml index bbe538032..51195e9bb 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml @@ -8,3 +8,4 @@ departmentSpeciality: null departmentRecordStatus: "ACTIVE" departmentContactDate: "2022-12-08T00:00:00Z" combinedUpdate: "2022-12-08T00:00:00Z" +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml index b396e601f..739ef24dd 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml @@ -9,4 +9,5 @@ departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" # missing previous department will be null specialityUpdate: "2021-08-26T11:28:51Z" -combinedUpdate: "2021-08-26T11:28:51Z" \ No newline at end of file +combinedUpdate: "2021-08-26T11:28:51Z" +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml index 7872eae2e..e12250363 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml @@ -9,4 +9,5 @@ previousDepartmentSpeciality: "Paediatric - Respiratory Medicine" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-09-06T06:42:26Z" -combinedUpdate: "2021-09-06T06:42:26Z" \ No newline at end of file +combinedUpdate: "2021-09-06T06:42:26Z" +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml index 1834085f7..a45b5a0d3 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml @@ -9,4 +9,5 @@ previousDepartmentSpeciality: "Paediatric - Infectious Diseases" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-10-08T23:00:20Z" -combinedUpdate: "2021-10-08T23:00:20Z" \ No newline at end of file +combinedUpdate: "2021-10-08T23:00:20Z" +siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java index e6cb65c12..46c1ca90d 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java @@ -42,6 +42,11 @@ public class Department implements Serializable { */ private String name; + /** + * \brief Hospital site where this department is located + */ + private String siteLocation; + /** * Create minimal department. * @param internalId ID of the department in EPIC. diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java index 235d99e0c..9bf5b34e0 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java @@ -56,9 +56,9 @@ public class DepartmentState extends AuditCore { private String speciality; /** - * \brief Report Group Nine (RPT_GRP_NINE) value associated with this department. + * \brief Report Group Nine (departmentType) value associated with this department. */ - private String rptGrpNine; + private String departmentType; /** * \brief Predicate determining whether the Department is a ward or flow area. @@ -77,17 +77,17 @@ public class DepartmentState extends AuditCore { * @param validFrom time that the message was valid from * @param storedFrom time that emap core stared processing the message * @param speciality name of the current speciality of this department - * @param rptGrpNine Report Group Nine value associated with this department + * @param departmentType Report Group Nine value associated with this department * @param isWardOrFlowArea is this department a ward or flow area * @param isCoreInpatientArea is this department a core inpatient area */ public DepartmentState(Department department, String status, - String speciality, String rptGrpNine, Boolean isWardOrFlowArea, + String speciality, String departmentType, Boolean isWardOrFlowArea, Boolean isCoreInpatientArea, Instant validFrom, Instant storedFrom) { departmentId = department; this.status = status; this.speciality = speciality; - this.rptGrpNine = rptGrpNine; + this.departmentType = departmentType; this.isWardOrFlowArea = isWardOrFlowArea; this.isCoreInpatientArea = isCoreInpatientArea; setValidFrom(validFrom); @@ -102,7 +102,7 @@ private DepartmentState(DepartmentState other) { departmentId = other.departmentId; status = other.status; speciality = other.speciality; - rptGrpNine = other.rptGrpNine; + departmentType = other.departmentType; isWardOrFlowArea = other.isWardOrFlowArea; isCoreInpatientArea = other.isCoreInpatientArea; } diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index ec98bf202..ebc8ef265 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -105,6 +105,7 @@ private void addGenericDataToAdtMessage(final String sourceId, final PatientInfo if (sendingApplication.isEmpty()) { throw new Hl7MessageIgnoredException("No sending application in message"); } + msg.setSiteLocation(patientInfoHl7.getSendingFacility()); msg.setSourceSystem(patientInfoHl7.getSendingApplication()); // will be replaced if there is an evn segment msg.setRecordedDateTime(patientInfoHl7.getMessageTimestamp()); From d9ed94fbf44d0105ccb428d2f9a8881be910ec79 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Tue, 21 Oct 2025 16:44:20 +0100 Subject: [PATCH 45/62] fix linting --- .../uk/ac/ucl/rits/inform/informdb/movement/Department.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java index 46c1ca90d..e04bc10c4 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java @@ -43,7 +43,7 @@ public class Department implements Serializable { private String name; /** - * \brief Hospital site where this department is located + * \brief Hospital site where this department is located. */ private String siteLocation; From 6bdf74ccdba02e1b8e5d48713bcb9c38e6c51923 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Tue, 21 Oct 2025 16:53:18 +0100 Subject: [PATCH 46/62] missed the capitalization form --- .../datasinks/emapstar/controllers/LocationController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java index 90bab82a3..e9e0a62ac 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java @@ -258,7 +258,7 @@ void processDepartmentStates(DepartmentMetadata msg, Department department, Inst Instant validFrom = msg.getSpecialityUpdate() == null ? msg.getDepartmentContactDate() : msg.getSpecialityUpdate(); DepartmentState currentState = new DepartmentState( department, msg.getDepartmentRecordStatus().toString(), - msg.getDepartmentSpeciality(), msg.getRptGrpNine(), + msg.getDepartmentSpeciality(), msg.getDepartmentType(), msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), validFrom, storedFrom); @@ -279,7 +279,7 @@ void processDepartmentStates(DepartmentMetadata msg, Department department, Inst // if the previous department speciality is not in the database DepartmentState previousState = new DepartmentState(department, msg.getDepartmentRecordStatus().toString(), - msg.getPreviousDepartmentSpeciality(), msg.getRptGrpNine(), + msg.getPreviousDepartmentSpeciality(), msg.getDepartmentType(), msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), msg.getDepartmentContactDate(), storedFrom); previousState.setStoredUntil(currentState.getStoredFrom()); From 0aefbf649ed09d1738b631a4435d396df258b160 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Wed, 22 Oct 2025 14:46:27 +0100 Subject: [PATCH 47/62] update all the comparison messages to include site location --- .../src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml | 1 + .../src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml | 1 + .../src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml | 1 + .../resources/AdtMessages/Location/CancelAdmit/01_A01.yaml | 1 + .../resources/AdtMessages/Location/CancelAdmit/02_A11.yaml | 1 + .../resources/AdtMessages/Location/CancelAdmit/03_A01.yaml | 1 + .../resources/AdtMessages/Location/CancelAdmit/04_A02.yaml | 1 + .../resources/AdtMessages/Location/CancelAdmit/05_A03.yaml | 1 + .../resources/AdtMessages/Location/CancelDischarge/01_A01.yaml | 1 + .../resources/AdtMessages/Location/CancelDischarge/02_A02.yaml | 1 + .../resources/AdtMessages/Location/CancelDischarge/03_A03.yaml | 1 + .../resources/AdtMessages/Location/CancelDischarge/04_A13.yaml | 1 + .../resources/AdtMessages/Location/CancelDischarge/05_A03.yaml | 1 + .../resources/AdtMessages/Location/CancelTransfer/01_A01.yaml | 1 + .../resources/AdtMessages/Location/CancelTransfer/02_A02.yaml | 1 + .../resources/AdtMessages/Location/CancelTransfer/03_A02.yaml | 1 + .../resources/AdtMessages/Location/CancelTransfer/04_A12.yaml | 1 + .../resources/AdtMessages/Location/CancelTransfer/05_A02.yaml | 1 + .../resources/AdtMessages/Location/CancelTransfer/06_A03.yaml | 1 + .../resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml | 1 + .../resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml | 1 + .../resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml | 1 + .../resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/02_A01.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/03_A02.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/04_A02.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/05_A02.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/06_A02.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/07_A06.yaml | 1 + .../src/test/resources/AdtMessages/Location/Moves/08_A03.yaml | 1 + .../src/test/resources/AdtMessages/generic/A01.yaml | 1 + .../src/test/resources/AdtMessages/generic/A02.yaml | 1 + .../src/test/resources/AdtMessages/generic/A03.yaml | 1 + .../src/test/resources/AdtMessages/generic/A04.yaml | 1 + .../src/test/resources/AdtMessages/generic/A06.yaml | 1 + .../src/test/resources/AdtMessages/generic/A08_v1.yaml | 1 + .../src/test/resources/AdtMessages/generic/A11.yaml | 1 + .../src/test/resources/AdtMessages/generic/A12.yaml | 1 + .../src/test/resources/AdtMessages/generic/A13.yaml | 1 + .../src/test/resources/AdtMessages/generic/A17.yaml | 1 + .../src/test/resources/AdtMessages/generic/A29.yaml | 1 + .../src/test/resources/AdtMessages/generic/A40.yaml | 1 + .../src/test/resources/AdtMessages/generic/A45.yaml | 1 + .../src/test/resources/AdtMessages/generic/A47.yaml | 1 + .../src/test/resources/AdtMessages/pending/A15.yaml | 1 + .../src/test/resources/AdtMessages/pending/A16.yaml | 1 + .../src/test/resources/AdtMessages/pending/A25.yaml | 1 + .../src/test/resources/AdtMessages/pending/A26.yaml | 1 + .../src/test/resources/DepartmentMetadata/acun_dept.yaml | 3 +-- 49 files changed, 49 insertions(+), 2 deletions(-) diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml index d0bff6d47..d7c241bfc 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml @@ -5,6 +5,7 @@ eventOccurredDateTime: "2013-02-11T13:45:00Z" sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T13:45:00Z" dischargeDisposition: "19" dischargeLocation: "1" diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml index 38de8c119..a9b7bc9f2 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml @@ -4,6 +4,7 @@ eventReasonCode: "ADT_EVENT" sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml index e14ec7d68..d1f8b7939 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml @@ -4,6 +4,7 @@ eventOccurredDateTime: "2013-02-11T13:45:00Z" visitNumber: "123412341234" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" cancelledDateTime: "2013-02-11T13:45:00Z" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml index 51795bd72..75922fc0f 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml index 21c4258e2..181afbd50 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" cancelledDateTime: "2013-02-11T11:00:52Z" modeOfArrival: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml index 6e1ca3be8..6c2e51543 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml index a8e198b6f..ce16c8ff0 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml index df2d72247..ab039e083 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T15:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml index 67dd481ca..3bc2b7ecf 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml @@ -5,6 +5,7 @@ eventReasonCode: "ADT_EVENT" sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" +siteLocation: "UCLH" visitNumber: "123412341234" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml index ef1ed8500..acd242182 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml index 4dcc5ae8c..091e37db5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml @@ -9,6 +9,7 @@ mrn: "40800000" dischargeDateTime: "2013-02-11T12:30:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml index b16668d04..3b1674dd0 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" cancelledDateTime: "2013-02-11T12:30:52Z" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml index 12eba4d40..b061f16ac 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T13:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml index 67dd481ca..b496b7557 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml index ef1ed8500..acd242182 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml index 5e116c917..2a27aa117 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml index e4c4920b7..ebccdcb96 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" cancelledDateTime: "2013-02-11T12:30:52Z" cancelledLocation: "ED^DELETE ME^DELETE" fullLocationString: diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml index f6f313e4d..f209e2190 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml index 97aa98653..c64ede1d4 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T14:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml index 6d8431ae2..edda4b838 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" presentationDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml index 2556795b5..a77b6f61f 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml index 9d32e432c..c9062d970 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml index 23c76ea56..2f0982a8f 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T14:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml index 67dd481ca..b496b7557 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml index 74a6c0f53..56790ab07 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml index fb8255699..f0e01518d 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml index d56baa47d..33d13e97a 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml index b3658e6fa..1823e4c47 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml index 842c83553..d4337770a 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml index bfddb8b38..e891d2563 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T17:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml index 88da640e3..f5c46174f 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml index 43b1b8af5..bdf0aa7a1 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml index a6dd9483f..977fad786 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml @@ -5,6 +5,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" dischargeDateTime: "2013-02-11T10:00:00Z" dischargeDisposition: "19" dischargeLocation: "1" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml index 0b406bc03..9e295b247 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" presentationDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml index 2f13fc145..9ea323a5e 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml @@ -6,6 +6,7 @@ visitNumber: "1234567890" sourceSystem: "EPIC" mrn: "A/AA1111" nhsNumber: "9999999999" +siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml index 09e1d7365..4ed7b7cb5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml @@ -5,6 +5,7 @@ sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" nhsNumber: "9999999999" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml index 8f061ef06..56d059da1 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" cancelledDateTime: "2010-09-14T15:27:00Z" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml index 2874461d2..1b62863a9 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" +siteLocation: "UCLH" cancelledDateTime: "2013-02-11T10:01:52Z" cancelledLocation: "THP3^UCHP03THR POOL01^THR" fullLocationString: diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml index e3708c698..5f8e00938 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml @@ -7,6 +7,7 @@ nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" cancelledDateTime: "2010-09-16T10:00:00Z" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml index a6621b55a..861ae2ed3 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" nhsNumber: "9999999999" +siteLocation: "UCLH" otherMrn: "30700000" otherNhsNumber: "1111111111" otherVisitNumber: "0999999999" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml index 1a372e324..d117601bd 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml @@ -6,6 +6,7 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "" +siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml index 6b167fe83..eef403593 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml @@ -5,6 +5,7 @@ previousMrn: "40800000" sourceSystem: "EPIC" mrn: "40800001" nhsNumber: "9999999999" +siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml index 7206d3a86..757ee1b7d 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml @@ -7,6 +7,7 @@ sourceSystem: "EPIC" visitNumber: "123412341234" mrn: "60600000" nhsNumber: "1111111111" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" value: "T42E^T42E BY02^BY02-17" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml index d5afa8e59..65dd13bc5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml @@ -5,6 +5,7 @@ previousMrn: "50100010" sourceSystem: "EPIC" mrn: "51111111" nhsNumber: "111222223" +siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml index 56d0cc178..98247bbb8 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml index 374ded4eb..6e8bac8f0 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml @@ -3,6 +3,7 @@ recordedDateTime: "2022-04-21T23:23:00Z" eventOccurredDateTime: "2022-04-21T23:22:58Z" eventReasonCode: "PNDDISCHARGE" visitNumber: "123412341234" +siteLocation: "UCLH" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml index f600ce670..0700afa60 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml index 4bb9078d5..3a2616639 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml @@ -6,6 +6,7 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml index 6428ca20b..ff889578d 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml @@ -8,5 +8,4 @@ departmentRecordStatus: "ACTIVE" previousDepartmentSpeciality: "Dental - Oral Medicine" departmentContactDate: "2012-02-09T00:00:00Z" specialityUpdate: "2022-02-09T00:00:20Z" -combinedUpdate: "2022-02-09T00:00:20Z" -siteLocation: "UCLH" \ No newline at end of file +combinedUpdate: "2022-02-09T00:00:20Z" \ No newline at end of file From 4eff55f6df2aef9c2d7ca64844ecfed6bcb10142 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Wed, 22 Oct 2025 14:55:52 +0100 Subject: [PATCH 48/62] no I didn't check they are all UCLH --- .../src/test/resources/AdtMessages/generic/A40.yaml | 2 +- .../src/test/resources/AdtMessages/generic/A45.yaml | 2 +- .../src/test/resources/AdtMessages/generic/A47.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml index eef403593..5c6cebc31 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml @@ -5,7 +5,7 @@ previousMrn: "40800000" sourceSystem: "EPIC" mrn: "40800001" nhsNumber: "9999999999" -siteLocation: "UCLH" +siteLocation: "RRV03" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml index 757ee1b7d..cddbbaaf6 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml @@ -7,7 +7,7 @@ sourceSystem: "EPIC" visitNumber: "123412341234" mrn: "60600000" nhsNumber: "1111111111" -siteLocation: "UCLH" +siteLocation: "RRV03" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" value: "T42E^T42E BY02^BY02-17" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml index 65dd13bc5..826c8cfea 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml @@ -5,7 +5,7 @@ previousMrn: "50100010" sourceSystem: "EPIC" mrn: "51111111" nhsNumber: "111222223" -siteLocation: "UCLH" +siteLocation: "RRV03" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" From 5e7dd29a7fea87c5e4d7f06ac9081341c83b3b21 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Thu, 23 Oct 2025 13:06:04 +0100 Subject: [PATCH 49/62] Add time check assert to test --- .../inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java index b8b3791b3..ddda5fbf7 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdateSubSpeciality.java @@ -100,6 +100,7 @@ void testEditMessageInsertedIfHospitalServicesAreDifferent() throws Exception { assertEquals(4, movements.size()); assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", movements.get(3).getEventType()); assertEquals(7, movements.get(3).getMatchedMovementId()); + assertEquals(Instant.parse("2022-04-22T00:00:00Z"), movements.get(3).getEventDatetime()); } /** From f25f2bb9585123f145d45c035f2b60a5e669a4c7 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sat, 25 Oct 2025 13:09:21 +0100 Subject: [PATCH 50/62] Revert "no I didn't check they are all UCLH" This reverts commit 4eff55f6df2aef9c2d7ca64844ecfed6bcb10142. --- .../src/test/resources/AdtMessages/generic/A40.yaml | 2 +- .../src/test/resources/AdtMessages/generic/A45.yaml | 2 +- .../src/test/resources/AdtMessages/generic/A47.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml index 5c6cebc31..eef403593 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml @@ -5,7 +5,7 @@ previousMrn: "40800000" sourceSystem: "EPIC" mrn: "40800001" nhsNumber: "9999999999" -siteLocation: "RRV03" +siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml index cddbbaaf6..757ee1b7d 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml @@ -7,7 +7,7 @@ sourceSystem: "EPIC" visitNumber: "123412341234" mrn: "60600000" nhsNumber: "1111111111" -siteLocation: "RRV03" +siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" value: "T42E^T42E BY02^BY02-17" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml index 826c8cfea..65dd13bc5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml @@ -5,7 +5,7 @@ previousMrn: "50100010" sourceSystem: "EPIC" mrn: "51111111" nhsNumber: "111222223" -siteLocation: "RRV03" +siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" From e159567c7b952c830b194e93a7248d5a89e0098d Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sat, 25 Oct 2025 13:10:01 +0100 Subject: [PATCH 51/62] Revert "update all the comparison messages to include site location" This reverts commit 0aefbf649ed09d1738b631a4435d396df258b160. --- .../src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml | 1 - .../src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml | 1 - .../src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml | 1 - .../resources/AdtMessages/Location/CancelAdmit/01_A01.yaml | 1 - .../resources/AdtMessages/Location/CancelAdmit/02_A11.yaml | 1 - .../resources/AdtMessages/Location/CancelAdmit/03_A01.yaml | 1 - .../resources/AdtMessages/Location/CancelAdmit/04_A02.yaml | 1 - .../resources/AdtMessages/Location/CancelAdmit/05_A03.yaml | 1 - .../resources/AdtMessages/Location/CancelDischarge/01_A01.yaml | 1 - .../resources/AdtMessages/Location/CancelDischarge/02_A02.yaml | 1 - .../resources/AdtMessages/Location/CancelDischarge/03_A03.yaml | 1 - .../resources/AdtMessages/Location/CancelDischarge/04_A13.yaml | 1 - .../resources/AdtMessages/Location/CancelDischarge/05_A03.yaml | 1 - .../resources/AdtMessages/Location/CancelTransfer/01_A01.yaml | 1 - .../resources/AdtMessages/Location/CancelTransfer/02_A02.yaml | 1 - .../resources/AdtMessages/Location/CancelTransfer/03_A02.yaml | 1 - .../resources/AdtMessages/Location/CancelTransfer/04_A12.yaml | 1 - .../resources/AdtMessages/Location/CancelTransfer/05_A02.yaml | 1 - .../resources/AdtMessages/Location/CancelTransfer/06_A03.yaml | 1 - .../resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml | 1 - .../resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml | 1 - .../resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml | 1 - .../resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/02_A01.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/03_A02.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/04_A02.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/05_A02.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/06_A02.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/07_A06.yaml | 1 - .../src/test/resources/AdtMessages/Location/Moves/08_A03.yaml | 1 - .../src/test/resources/AdtMessages/generic/A01.yaml | 1 - .../src/test/resources/AdtMessages/generic/A02.yaml | 1 - .../src/test/resources/AdtMessages/generic/A03.yaml | 1 - .../src/test/resources/AdtMessages/generic/A04.yaml | 1 - .../src/test/resources/AdtMessages/generic/A06.yaml | 1 - .../src/test/resources/AdtMessages/generic/A08_v1.yaml | 1 - .../src/test/resources/AdtMessages/generic/A11.yaml | 1 - .../src/test/resources/AdtMessages/generic/A12.yaml | 1 - .../src/test/resources/AdtMessages/generic/A13.yaml | 1 - .../src/test/resources/AdtMessages/generic/A17.yaml | 1 - .../src/test/resources/AdtMessages/generic/A29.yaml | 1 - .../src/test/resources/AdtMessages/generic/A40.yaml | 1 - .../src/test/resources/AdtMessages/generic/A45.yaml | 1 - .../src/test/resources/AdtMessages/generic/A47.yaml | 1 - .../src/test/resources/AdtMessages/pending/A15.yaml | 1 - .../src/test/resources/AdtMessages/pending/A16.yaml | 1 - .../src/test/resources/AdtMessages/pending/A25.yaml | 1 - .../src/test/resources/AdtMessages/pending/A26.yaml | 1 - .../src/test/resources/DepartmentMetadata/acun_dept.yaml | 3 ++- 49 files changed, 2 insertions(+), 49 deletions(-) diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml index d7c241bfc..d0bff6d47 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A03.yaml @@ -5,7 +5,6 @@ eventOccurredDateTime: "2013-02-11T13:45:00Z" sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T13:45:00Z" dischargeDisposition: "19" dischargeLocation: "1" diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml index a9b7bc9f2..38de8c119 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml @@ -4,7 +4,6 @@ eventReasonCode: "ADT_EVENT" sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml index d1f8b7939..e14ec7d68 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A13.yaml @@ -4,7 +4,6 @@ eventOccurredDateTime: "2013-02-11T13:45:00Z" visitNumber: "123412341234" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" cancelledDateTime: "2013-02-11T13:45:00Z" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml index 75922fc0f..51795bd72 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml index 181afbd50..21c4258e2 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/02_A11.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" cancelledDateTime: "2013-02-11T11:00:52Z" modeOfArrival: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml index 6c2e51543..6e1ca3be8 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml index ce16c8ff0..a8e198b6f 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/04_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml index ab039e083..df2d72247 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/05_A03.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T15:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml index 3bc2b7ecf..67dd481ca 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml @@ -5,7 +5,6 @@ eventReasonCode: "ADT_EVENT" sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" -siteLocation: "UCLH" visitNumber: "123412341234" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml index acd242182..ef1ed8500 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/02_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml index 091e37db5..4dcc5ae8c 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/03_A03.yaml @@ -9,7 +9,6 @@ mrn: "40800000" dischargeDateTime: "2013-02-11T12:30:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml index 3b1674dd0..b16668d04 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/04_A13.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" cancelledDateTime: "2013-02-11T12:30:52Z" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml index b061f16ac..12eba4d40 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/05_A03.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T13:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml index b496b7557..67dd481ca 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml index acd242182..ef1ed8500 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/02_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml index 2a27aa117..5e116c917 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/03_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml index ebccdcb96..e4c4920b7 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/04_A12.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" cancelledDateTime: "2013-02-11T12:30:52Z" cancelledLocation: "ED^DELETE ME^DELETE" fullLocationString: diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml index f209e2190..f6f313e4d 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/05_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml index c64ede1d4..97aa98653 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/06_A03.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T14:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml index edda4b838..6d8431ae2 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/01_A04.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" presentationDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml index a77b6f61f..2556795b5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml index c9062d970..9d32e432c 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/03_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml index 2f0982a8f..23c76ea56 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/04_A03.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T14:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml index b496b7557..67dd481ca 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml index 56790ab07..74a6c0f53 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/03_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml index f0e01518d..fb8255699 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/04_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml index 33d13e97a..d56baa47d 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/05_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml index 1823e4c47..b3658e6fa 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/06_A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml index d4337770a..842c83553 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/07_A06.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml index e891d2563..bfddb8b38 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/08_A03.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T17:00:52Z" dischargeDisposition: "Feeling great" dischargeLocation: "Home" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml index f5c46174f..88da640e3 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml index bdf0aa7a1..43b1b8af5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A02.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml index 977fad786..a6dd9483f 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A03.yaml @@ -5,7 +5,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" dischargeDateTime: "2013-02-11T10:00:00Z" dischargeDisposition: "19" dischargeLocation: "1" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml index 9e295b247..0b406bc03 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A04.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" presentationDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml index 9ea323a5e..2f13fc145 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A06.yaml @@ -6,7 +6,6 @@ visitNumber: "1234567890" sourceSystem: "EPIC" mrn: "A/AA1111" nhsNumber: "9999999999" -siteLocation: "UCLH" admissionDateTime: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml index 4ed7b7cb5..09e1d7365 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml @@ -5,7 +5,6 @@ sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" nhsNumber: "9999999999" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml index 56d059da1..8f061ef06 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A11.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" cancelledDateTime: "2010-09-14T15:27:00Z" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml index 1b62863a9..2874461d2 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A12.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "123412341234" -siteLocation: "UCLH" cancelledDateTime: "2013-02-11T10:01:52Z" cancelledLocation: "THP3^UCHP03THR POOL01^THR" fullLocationString: diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml index 5f8e00938..e3708c698 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A13.yaml @@ -7,7 +7,6 @@ nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" cancelledDateTime: "2010-09-16T10:00:00Z" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml index 861ae2ed3..a6621b55a 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A17.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" visitNumber: "123412341234" nhsNumber: "9999999999" -siteLocation: "UCLH" otherMrn: "30700000" otherNhsNumber: "1111111111" otherVisitNumber: "0999999999" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml index d117601bd..1a372e324 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A29.yaml @@ -6,7 +6,6 @@ sourceSystem: "EPIC" mrn: "40800000" nhsNumber: "9999999999" visitNumber: "" -siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml index eef403593..6b167fe83 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A40.yaml @@ -5,7 +5,6 @@ previousMrn: "40800000" sourceSystem: "EPIC" mrn: "40800001" nhsNumber: "9999999999" -siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml index 757ee1b7d..7206d3a86 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A45.yaml @@ -7,7 +7,6 @@ sourceSystem: "EPIC" visitNumber: "123412341234" mrn: "60600000" nhsNumber: "1111111111" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" value: "T42E^T42E BY02^BY02-17" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml index 65dd13bc5..d5afa8e59 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A47.yaml @@ -5,7 +5,6 @@ previousMrn: "50100010" sourceSystem: "EPIC" mrn: "51111111" nhsNumber: "111222223" -siteLocation: "UCLH" patientBirthDate: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml index 98247bbb8..56d0cc178 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A15.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml index 6e8bac8f0..374ded4eb 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A16.yaml @@ -3,7 +3,6 @@ recordedDateTime: "2022-04-21T23:23:00Z" eventOccurredDateTime: "2022-04-21T23:22:58Z" eventReasonCode: "PNDDISCHARGE" visitNumber: "123412341234" -siteLocation: "UCLH" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml index 0700afa60..f600ce670 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A25.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml b/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml index 3a2616639..4bb9078d5 100644 --- a/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/pending/A26.yaml @@ -6,7 +6,6 @@ visitNumber: "123412341234" nhsNumber: "9999999999" sourceSystem: "EPIC" mrn: "40800000" -siteLocation: "UCLH" fullLocationString: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml index ff889578d..6428ca20b 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml @@ -8,4 +8,5 @@ departmentRecordStatus: "ACTIVE" previousDepartmentSpeciality: "Dental - Oral Medicine" departmentContactDate: "2012-02-09T00:00:00Z" specialityUpdate: "2022-02-09T00:00:20Z" -combinedUpdate: "2022-02-09T00:00:20Z" \ No newline at end of file +combinedUpdate: "2022-02-09T00:00:20Z" +siteLocation: "UCLH" \ No newline at end of file From baaaa0a5f1a03f0fc15643377c80730e4da4f286 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sat, 25 Oct 2025 13:10:44 +0100 Subject: [PATCH 52/62] take out the site location variable --- .../uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java | 1 - .../uk/ac/ucl/rits/inform/informdb/movement/Department.java | 5 ----- .../ucl/rits/inform/datasources/ids/AdtMessageFactory.java | 1 - 3 files changed, 7 deletions(-) diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java index 603f63c14..79835a44f 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdtMessage.java @@ -26,7 +26,6 @@ public abstract class AdtMessage extends EmapOperationMessage { private String mrn; private String nhsNumber; private String visitNumber; - private String siteLocation; private InterchangeValue modeOfArrival = InterchangeValue.unknown(); private InterchangeValue ethnicGroup = InterchangeValue.unknown(); private InterchangeValue fullLocationString = InterchangeValue.unknown(); diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java index e04bc10c4..e6cb65c12 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/Department.java @@ -42,11 +42,6 @@ public class Department implements Serializable { */ private String name; - /** - * \brief Hospital site where this department is located. - */ - private String siteLocation; - /** * Create minimal department. * @param internalId ID of the department in EPIC. diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index ebc8ef265..ec98bf202 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -105,7 +105,6 @@ private void addGenericDataToAdtMessage(final String sourceId, final PatientInfo if (sendingApplication.isEmpty()) { throw new Hl7MessageIgnoredException("No sending application in message"); } - msg.setSiteLocation(patientInfoHl7.getSendingFacility()); msg.setSourceSystem(patientInfoHl7.getSendingApplication()); // will be replaced if there is an evn segment msg.setRecordedDateTime(patientInfoHl7.getMessageTimestamp()); From d60ad275c89fed6274c8109057218ce26713bc0c Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sat, 25 Oct 2025 13:24:09 +0100 Subject: [PATCH 53/62] add site location as metadata to be red by the hoover --- .../emapstar/controllers/LocationController.java | 4 ++-- .../interchange/location/DepartmentMetadata.java | 2 ++ .../rits/inform/informdb/movement/DepartmentState.java | 10 +++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java index e9e0a62ac..ae182908b 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java @@ -260,7 +260,7 @@ void processDepartmentStates(DepartmentMetadata msg, Department department, Inst department, msg.getDepartmentRecordStatus().toString(), msg.getDepartmentSpeciality(), msg.getDepartmentType(), msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), - validFrom, storedFrom); + msg.getSiteLocation(), validFrom, storedFrom); if (departmentStateRepo.existsByDepartmentIdAndSpecialityAndValidFrom(department, msg.getDepartmentSpeciality(), validFrom)) { logger.debug("Department State already exists in the database, no need to process further"); @@ -281,7 +281,7 @@ void processDepartmentStates(DepartmentMetadata msg, Department department, Inst msg.getDepartmentRecordStatus().toString(), msg.getPreviousDepartmentSpeciality(), msg.getDepartmentType(), msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), - msg.getDepartmentContactDate(), storedFrom); + msg.getSiteLocation(), msg.getDepartmentContactDate(),storedFrom); previousState.setStoredUntil(currentState.getStoredFrom()); previousState.setValidUntil(currentState.getValidFrom()); departmentStateRepo.saveAll(List.of(previousState, currentState)); diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java index 58e2322d5..467761180 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java @@ -49,6 +49,8 @@ public class DepartmentMetadata extends EmapOperationMessage implements MinimalD private String departmentType; private Boolean isWardOrFlowArea; private Boolean isCoreInpatientArea; + private String siteLocation; + /** * Not used in processing, but useful to debugging ordering. */ diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java index 9bf5b34e0..b026d542a 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java @@ -70,6 +70,11 @@ public class DepartmentState extends AuditCore { */ private Boolean isCoreInpatientArea; + /** + * \brief hospital location where this department is situated. + */ + private String siteLocation; + /** * Create valid department state. * @param department parent department @@ -80,16 +85,18 @@ public class DepartmentState extends AuditCore { * @param departmentType Report Group Nine value associated with this department * @param isWardOrFlowArea is this department a ward or flow area * @param isCoreInpatientArea is this department a core inpatient area + * @param siteLocation hospital location where this department is situated. */ public DepartmentState(Department department, String status, String speciality, String departmentType, Boolean isWardOrFlowArea, - Boolean isCoreInpatientArea, Instant validFrom, Instant storedFrom) { + Boolean isCoreInpatientArea, String siteLocation, Instant validFrom, Instant storedFrom) { departmentId = department; this.status = status; this.speciality = speciality; this.departmentType = departmentType; this.isWardOrFlowArea = isWardOrFlowArea; this.isCoreInpatientArea = isCoreInpatientArea; + this.siteLocation = siteLocation; setValidFrom(validFrom); setStoredFrom(storedFrom); } @@ -105,6 +112,7 @@ private DepartmentState(DepartmentState other) { departmentType = other.departmentType; isWardOrFlowArea = other.isWardOrFlowArea; isCoreInpatientArea = other.isCoreInpatientArea; + siteLocation = other.siteLocation; } @Override From 9492f6e3f7270cfb98ef68d560ad6ad0c6f3a2e5 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Sat, 25 Oct 2025 13:32:09 +0100 Subject: [PATCH 54/62] fix check style --- .../datasinks/emapstar/controllers/LocationController.java | 2 +- .../rits/inform/interchange/location/DepartmentMetadata.java | 2 +- .../ac/ucl/rits/inform/informdb/movement/DepartmentState.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java index ae182908b..742847ad0 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/LocationController.java @@ -281,7 +281,7 @@ void processDepartmentStates(DepartmentMetadata msg, Department department, Inst msg.getDepartmentRecordStatus().toString(), msg.getPreviousDepartmentSpeciality(), msg.getDepartmentType(), msg.getIsWardOrFlowArea(), msg.getIsCoreInpatientArea(), - msg.getSiteLocation(), msg.getDepartmentContactDate(),storedFrom); + msg.getSiteLocation(), msg.getDepartmentContactDate(), storedFrom); previousState.setStoredUntil(currentState.getStoredFrom()); previousState.setValidUntil(currentState.getValidFrom()); departmentStateRepo.saveAll(List.of(previousState, currentState)); diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java index 467761180..7a06350ca 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/location/DepartmentMetadata.java @@ -50,7 +50,7 @@ public class DepartmentMetadata extends EmapOperationMessage implements MinimalD private Boolean isWardOrFlowArea; private Boolean isCoreInpatientArea; private String siteLocation; - + /** * Not used in processing, but useful to debugging ordering. */ diff --git a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java index b026d542a..46092781e 100644 --- a/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java +++ b/emap-star/emap-star/src/main/java/uk/ac/ucl/rits/inform/informdb/movement/DepartmentState.java @@ -73,7 +73,7 @@ public class DepartmentState extends AuditCore { /** * \brief hospital location where this department is situated. */ - private String siteLocation; + private String siteLocation; /** * Create valid department state. From 79767f14248015d8ef690e7cdfd1a82816884599 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Tue, 28 Oct 2025 16:08:18 +0000 Subject: [PATCH 55/62] add additional metadata and remove the files I don't need --- .../DepartmentMetadata/additional-acun_dept.yaml | 15 --------------- .../dental_department_only.yaml | 12 ------------ .../medsurg_active_pool_bed.yaml | 11 ----------- .../no_department_history.yaml | 11 ----------- .../paediatric_department_only_1.yaml | 13 ------------- .../paediatric_department_only_2.yaml | 13 ------------- .../paediatric_department_only_3.yaml | 13 ------------- .../local-only/dental_department_only.yaml | 4 ++++ .../local-only/medsurg_active_pool_bed.yaml | 5 ++++- .../local-only/no_department_history.yaml | 4 ++++ .../local-only/paediatric_department_only_1.yaml | 6 +++++- .../local-only/paediatric_department_only_2.yaml | 6 +++++- .../local-only/paediatric_department_only_3.yaml | 6 +++++- 13 files changed, 27 insertions(+), 92 deletions(-) delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml delete mode 100644 emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml deleted file mode 100644 index 855281a54..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-acun_dept.yaml +++ /dev/null @@ -1,15 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -departmentHl7: "ACUN" -departmentName: "EGA E03 ACU NURSERY" -departmentId: "2" -departmentSpeciality: "Maternity - Well Baby" -departmentRecordStatus: "ACTIVE" -previousDepartmentSpeciality: "Dental - Oral Medicine" -departmentContactDate: "2012-02-09T00:00:00Z" -specialityUpdate: "2022-02-09T00:00:20Z" -combinedUpdate: "2022-02-09T00:00:20Z" -departmentType: "ACUN" -isWardOrFlowArea: true -isCoreInpatientArea: true -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml deleted file mode 100644 index eedb8a794..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/dental_department_only.yaml +++ /dev/null @@ -1,12 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -# department -departmentHl7: "1000000059" -departmentName: "DENTAL: ORAL MEDICINE" -departmentId: "13" -departmentRecordStatus: "ACTIVE" -departmentContactDate: "2018-08-22T00:00:00Z" -departmentSpeciality: "Dental - Oral Medicine" -specialityUpdate: "2020-09-22T13:47:56Z" -combinedUpdate: "2020-09-22T13:47:56Z" -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml deleted file mode 100644 index 9d45554f6..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/medsurg_active_pool_bed.yaml +++ /dev/null @@ -1,11 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -# department -departmentHl7: "MEDSURG" -departmentName: "EMH MED SURG" -departmentId: "1" -departmentSpeciality: null -departmentRecordStatus: "DELETED_AND_HIDDEN" -departmentContactDate: "2005-12-08T00:00:00Z" -combinedUpdate: "2021-04-23T09:00:00Z" -siteLocation: "UCLH" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml deleted file mode 100644 index 51195e9bb..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/no_department_history.yaml +++ /dev/null @@ -1,11 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -# department -departmentHl7: "1020100002" -departmentName: "UCH ROI" -departmentId: "1020100002" -departmentSpeciality: null -departmentRecordStatus: "ACTIVE" -departmentContactDate: "2022-12-08T00:00:00Z" -combinedUpdate: "2022-12-08T00:00:00Z" -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml deleted file mode 100644 index 739ef24dd..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_1.yaml +++ /dev/null @@ -1,13 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -# department -departmentHl7: "100000060" -departmentName: "OFF SE5PC" -departmentId: "1020610068" -departmentSpeciality: "Paediatric - Respiratory Medicine" -departmentRecordStatus: "ACTIVE" -departmentContactDate: "2021-08-25T23:00:00Z" -# missing previous department will be null -specialityUpdate: "2021-08-26T11:28:51Z" -combinedUpdate: "2021-08-26T11:28:51Z" -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml deleted file mode 100644 index e12250363..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_2.yaml +++ /dev/null @@ -1,13 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -# department -departmentHl7: "100000060" -departmentName: "OFF SE5PC" -departmentId: "1020610068" -departmentSpeciality: "Paediatric - Infectious Diseases" -previousDepartmentSpeciality: "Paediatric - Respiratory Medicine" -departmentRecordStatus: "ACTIVE" -departmentContactDate: "2021-08-25T23:00:00Z" -specialityUpdate: "2021-09-06T06:42:26Z" -combinedUpdate: "2021-09-06T06:42:26Z" -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml deleted file mode 100644 index a45b5a0d3..000000000 --- a/emap-interchange/src/test/resources/DepartmentMetadata/additional-local-only/paediatric_department_only_3.yaml +++ /dev/null @@ -1,13 +0,0 @@ -"@class": "uk.ac.ucl.rits.inform.interchange.location.DepartmentMetadata" -sourceSystem: "clarity" -# department -departmentHl7: "100000060" -departmentName: "OFF SE5PC" -departmentId: "1020610068" -departmentSpeciality: "Paediatric - RESPOND" -previousDepartmentSpeciality: "Paediatric - Infectious Diseases" -departmentRecordStatus: "ACTIVE" -departmentContactDate: "2021-08-25T23:00:00Z" -specialityUpdate: "2021-10-08T23:00:20Z" -combinedUpdate: "2021-10-08T23:00:20Z" -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml index f74c366b6..685b215c1 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml @@ -9,3 +9,7 @@ departmentContactDate: "2018-08-22T00:00:00Z" departmentSpeciality: "Dental - Oral Medicine" specialityUpdate: "2020-09-22T13:47:56Z" combinedUpdate: "2020-09-22T13:47:56Z" +siteLocation: "DENTAL HOSPITAL" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml index 41cf2670a..ca316a463 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml @@ -8,4 +8,7 @@ departmentSpeciality: null departmentRecordStatus: "DELETED_AND_HIDDEN" departmentContactDate: "2005-12-08T00:00:00Z" combinedUpdate: "2021-04-23T09:00:00Z" - +siteLocation: "DENTAL HOSPITAL" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml index bbe538032..a2bb05573 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml @@ -8,3 +8,7 @@ departmentSpeciality: null departmentRecordStatus: "ACTIVE" departmentContactDate: "2022-12-08T00:00:00Z" combinedUpdate: "2022-12-08T00:00:00Z" +siteLocation: "DENTAL HOSPITAL" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml index b396e601f..720cd9c32 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml @@ -9,4 +9,8 @@ departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" # missing previous department will be null specialityUpdate: "2021-08-26T11:28:51Z" -combinedUpdate: "2021-08-26T11:28:51Z" \ No newline at end of file +combinedUpdate: "2021-08-26T11:28:51Z" +siteLocation: "DENTAL HOSPITAL" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml index 7872eae2e..c2d4ba30d 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml @@ -9,4 +9,8 @@ previousDepartmentSpeciality: "Paediatric - Respiratory Medicine" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-09-06T06:42:26Z" -combinedUpdate: "2021-09-06T06:42:26Z" \ No newline at end of file +combinedUpdate: "2021-09-06T06:42:26Z" +siteLocation: "DENTAL HOSPITAL" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml index 1834085f7..616bb5b52 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml @@ -9,4 +9,8 @@ previousDepartmentSpeciality: "Paediatric - Infectious Diseases" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-10-08T23:00:20Z" -combinedUpdate: "2021-10-08T23:00:20Z" \ No newline at end of file +combinedUpdate: "2021-10-08T23:00:20Z" +siteLocation: "DENTAL HOSPITAL" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false \ No newline at end of file From 9f38de2959c4dd196783c8c7647a5b16bf4fa98c Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Wed, 29 Oct 2025 13:31:38 +0000 Subject: [PATCH 56/62] Reordered variables --- .../src/test/resources/DepartmentMetadata/acun_dept.yaml | 5 ++++- .../local-only/dental_department_only.yaml | 5 +++-- .../local-only/medsurg_active_pool_bed.yaml | 5 +++-- .../local-only/no_department_history.yaml | 6 +++--- .../local-only/paediatric_department_only_1.yaml | 5 +++-- .../local-only/paediatric_department_only_2.yaml | 6 +++--- .../local-only/paediatric_department_only_3.yaml | 6 +++--- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml index 6428ca20b..feca9276c 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml @@ -8,5 +8,8 @@ departmentRecordStatus: "ACTIVE" previousDepartmentSpeciality: "Dental - Oral Medicine" departmentContactDate: "2012-02-09T00:00:00Z" specialityUpdate: "2022-02-09T00:00:20Z" +departmentType: "CLINICAL" +isWardOrFlowArea: false +isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" combinedUpdate: "2022-02-09T00:00:20Z" -siteLocation: "UCLH" \ No newline at end of file diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml index 685b215c1..9c3c27b68 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml @@ -8,8 +8,9 @@ departmentRecordStatus: "ACTIVE" departmentContactDate: "2018-08-22T00:00:00Z" departmentSpeciality: "Dental - Oral Medicine" specialityUpdate: "2020-09-22T13:47:56Z" -combinedUpdate: "2020-09-22T13:47:56Z" -siteLocation: "DENTAL HOSPITAL" departmentType: "CLINICAL" isWardOrFlowArea: false isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" +combinedUpdate: "2020-09-22T13:47:56Z" + diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml index ca316a463..8f25b0fd8 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml @@ -7,8 +7,9 @@ departmentId: "1" departmentSpeciality: null departmentRecordStatus: "DELETED_AND_HIDDEN" departmentContactDate: "2005-12-08T00:00:00Z" -combinedUpdate: "2021-04-23T09:00:00Z" -siteLocation: "DENTAL HOSPITAL" departmentType: "CLINICAL" isWardOrFlowArea: false isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" +combinedUpdate: "2021-04-23T09:00:00Z" + diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml index a2bb05573..53779ca60 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml @@ -7,8 +7,8 @@ departmentId: "1020100002" departmentSpeciality: null departmentRecordStatus: "ACTIVE" departmentContactDate: "2022-12-08T00:00:00Z" -combinedUpdate: "2022-12-08T00:00:00Z" -siteLocation: "DENTAL HOSPITAL" departmentType: "CLINICAL" isWardOrFlowArea: false -isCoreInpatientArea: false \ No newline at end of file +isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" +combinedUpdate: "2022-12-08T00:00:00Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml index 720cd9c32..7110f34db 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml @@ -9,8 +9,9 @@ departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" # missing previous department will be null specialityUpdate: "2021-08-26T11:28:51Z" -combinedUpdate: "2021-08-26T11:28:51Z" -siteLocation: "DENTAL HOSPITAL" departmentType: "CLINICAL" isWardOrFlowArea: false isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" +combinedUpdate: "2021-08-26T11:28:51Z" + diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml index c2d4ba30d..8c92ea616 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml @@ -9,8 +9,8 @@ previousDepartmentSpeciality: "Paediatric - Respiratory Medicine" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-09-06T06:42:26Z" -combinedUpdate: "2021-09-06T06:42:26Z" -siteLocation: "DENTAL HOSPITAL" departmentType: "CLINICAL" isWardOrFlowArea: false -isCoreInpatientArea: false \ No newline at end of file +isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" +combinedUpdate: "2021-09-06T06:42:26Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml index 616bb5b52..61db4d9ab 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml @@ -9,8 +9,8 @@ previousDepartmentSpeciality: "Paediatric - Infectious Diseases" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-10-08T23:00:20Z" -combinedUpdate: "2021-10-08T23:00:20Z" -siteLocation: "DENTAL HOSPITAL" departmentType: "CLINICAL" isWardOrFlowArea: false -isCoreInpatientArea: false \ No newline at end of file +isCoreInpatientArea: false +siteLocation: "DENTAL HOSPITAL" +combinedUpdate: "2021-10-08T23:00:20Z" From 57da9ee0bd853cd4f8e5f9faa715aee74968cdd7 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Thu, 30 Oct 2025 13:54:25 +0000 Subject: [PATCH 57/62] FIX THE VALUES TO MATCH THOSE EXPECTED --- .../local-only/dental_department_only.yaml | 8 ++++---- .../local-only/no_department_history.yaml | 6 +++--- .../local-only/paediatric_department_only_1.yaml | 6 +++--- .../local-only/paediatric_department_only_2.yaml | 6 +++--- .../local-only/paediatric_department_only_3.yaml | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml index 9c3c27b68..35c7eb22a 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/dental_department_only.yaml @@ -8,9 +8,9 @@ departmentRecordStatus: "ACTIVE" departmentContactDate: "2018-08-22T00:00:00Z" departmentSpeciality: "Dental - Oral Medicine" specialityUpdate: "2020-09-22T13:47:56Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false -isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +departmentType: "2" +isWardOrFlowArea: true +isCoreInpatientArea: true +siteLocation: "UCLH" combinedUpdate: "2020-09-22T13:47:56Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml index 53779ca60..d7b8c0436 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/no_department_history.yaml @@ -7,8 +7,8 @@ departmentId: "1020100002" departmentSpeciality: null departmentRecordStatus: "ACTIVE" departmentContactDate: "2022-12-08T00:00:00Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false +departmentType: "12" +isWardOrFlowArea: true isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +siteLocation: "UCLH" combinedUpdate: "2022-12-08T00:00:00Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml index 7110f34db..a7f1faa24 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_1.yaml @@ -9,9 +9,9 @@ departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" # missing previous department will be null specialityUpdate: "2021-08-26T11:28:51Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false +departmentType: "12" +isWardOrFlowArea: true isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +siteLocation: "UCLH" combinedUpdate: "2021-08-26T11:28:51Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml index 8c92ea616..351787ec3 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_2.yaml @@ -9,8 +9,8 @@ previousDepartmentSpeciality: "Paediatric - Respiratory Medicine" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-09-06T06:42:26Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false +departmentType: "12" +isWardOrFlowArea: true isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +siteLocation: "UCLH" combinedUpdate: "2021-09-06T06:42:26Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml index 61db4d9ab..0cd332acf 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/paediatric_department_only_3.yaml @@ -9,8 +9,8 @@ previousDepartmentSpeciality: "Paediatric - Infectious Diseases" departmentRecordStatus: "ACTIVE" departmentContactDate: "2021-08-25T23:00:00Z" specialityUpdate: "2021-10-08T23:00:20Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false +departmentType: "12" +isWardOrFlowArea: true isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +siteLocation: "UCLH" combinedUpdate: "2021-10-08T23:00:20Z" From 7f1d6957bb781d9d6e69e73085fd25b70acdf043 Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Thu, 30 Oct 2025 15:24:51 +0000 Subject: [PATCH 58/62] Fixup department queries --- .../src/test/resources/DepartmentMetadata/acun_dept.yaml | 8 ++++---- .../local-only/medsurg_active_pool_bed.yaml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml index feca9276c..b0e854559 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/acun_dept.yaml @@ -8,8 +8,8 @@ departmentRecordStatus: "ACTIVE" previousDepartmentSpeciality: "Dental - Oral Medicine" departmentContactDate: "2012-02-09T00:00:00Z" specialityUpdate: "2022-02-09T00:00:20Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false -isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +departmentType: "2" +isWardOrFlowArea: true +isCoreInpatientArea: true +siteLocation: "EMH" combinedUpdate: "2022-02-09T00:00:20Z" diff --git a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml index 8f25b0fd8..99c5cbbfb 100644 --- a/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml +++ b/emap-interchange/src/test/resources/DepartmentMetadata/local-only/medsurg_active_pool_bed.yaml @@ -7,9 +7,9 @@ departmentId: "1" departmentSpeciality: null departmentRecordStatus: "DELETED_AND_HIDDEN" departmentContactDate: "2005-12-08T00:00:00Z" -departmentType: "CLINICAL" -isWardOrFlowArea: false -isCoreInpatientArea: false -siteLocation: "DENTAL HOSPITAL" +departmentType: "2" +isWardOrFlowArea: true +isCoreInpatientArea: true +siteLocation: "UCLH" combinedUpdate: "2021-04-23T09:00:00Z" From f58d6d2017e985f546a1020acbb336eb1d840ccb Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 21 Jul 2026 13:32:43 +0100 Subject: [PATCH 59/62] Extend planned_movement hospital service fallback to ADT^A01 and ADT^A08 The ADT-triggered fallback that inserts a planned_movement row on a real subspeciality change previously only fired for the custom Z99 message, so admissions (A01) and demographics updates (A08/A28/A31) either showed the correct subspeciality hours late or, for A&E admissions, never at all (see SAFEHR-data/emap#166). AdmitPatient and UpdatePatientInfo now implement HospitalService and feed the same fallback, deduplicated against the last known value per encounter. Also fixes two bugs the new tests surfaced: PV1Wrap.getHospitalService() had no guard for a missing PV1 segment (A08 can legitimately omit one), and UpdatePatientInfo never creates its own HospitalVisit so the fallback needs an explicit lookup for an existing visit. Bumps emap-star's pinned Lombok version, which was incompatible with JDK 21. Co-Authored-By: Claude Sonnet 5 --- .../controllers/PendingAdtController.java | 28 ++-- .../emapstar/controllers/VisitController.java | 12 ++ .../emapstar/dataprocessors/AdtProcessor.java | 10 +- .../repos/PlannedMovementRepository.java | 5 +- ...stAdmitPatientHospitalServiceFallback.java | 131 +++++++++++++++ ...atePatientInfoHospitalServiceFallback.java | 155 ++++++++++++++++++ .../inform/interchange/adt/AdmitPatient.java | 3 +- .../interchange/adt/UpdatePatientInfo.java | 5 +- .../AdtMessages/DoubleA01WithA13/A08.yaml | 4 + .../Location/CancelAdmit/01_A01.yaml | 4 + .../Location/CancelAdmit/03_A01.yaml | 4 + .../Location/CancelDischarge/01_A01.yaml | 4 + .../Location/CancelTransfer/01_A01.yaml | 4 + .../Location/DuplicateSimple/02_A01.yaml | 4 + .../AdtMessages/Location/Moves/02_A01.yaml | 4 + .../resources/AdtMessages/generic/A01.yaml | 4 + .../resources/AdtMessages/generic/A08_v1.yaml | 4 + emap-star/emap-star/pom.xml | 2 +- .../datasources/ids/AdtMessageFactory.java | 10 +- .../datasources/ids/hl7/parser/PV1Wrap.java | 3 + .../datasources/ids/adt/TestMiscAdt.java | 33 ++++ .../test/resources/Adt/generic/A08_no_pv1.txt | 3 + 22 files changed, 415 insertions(+), 21 deletions(-) create mode 100644 core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java create mode 100644 core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdatePatientInfoHospitalServiceFallback.java create mode 100644 hl7-reader/src/test/resources/Adt/generic/A08_no_pv1.txt diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 60f3b74b3..b284d64d2 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -10,11 +10,12 @@ import uk.ac.ucl.rits.inform.informdb.movement.Location; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovementAudit; +import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; +import uk.ac.ucl.rits.inform.interchange.adt.HospitalService; import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingDischarge; import uk.ac.ucl.rits.inform.interchange.adt.PendingDischarge; -import uk.ac.ucl.rits.inform.interchange.adt.UpdateSubSpeciality; import java.time.Instant; import java.util.List; @@ -177,7 +178,9 @@ public void processMsg(HospitalVisit visit, CancelPendingTransfer msg, Instant v } /** - * Process an Update subspeciality (Z99) request. + * Process a real ADT-triggered change of hospital service/subspeciality, as a fallback for when + * a matching pending transfer request was never sent (e.g. Z99 edits, or a real admission/update + * that carries a hospital service different to the one currently recorded). *

* The Hl7 feed will eventually be changed so that we have an identifier per pending transfer, until then we guarantee the order of cancellations. * If we get messages out of order and have several cancellation messages before we receive any requests, @@ -185,29 +188,30 @@ public void processMsg(HospitalVisit visit, CancelPendingTransfer msg, Instant v * Subsequent requests will add the eventDatetime to the earliest cancellation with no eventDatetime, or create a new request if none exist * after the pending request eventDatetime. * @param visit associated visit - * @param msg update sub speciality + * @param msg the ADT message, for the fields shared by all ADT messages + * @param serviceMsg the same message, as its HospitalService view * @param validFrom time in the hospital when the message was created * @param storedFrom time that emap core started processing the message */ - public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant validFrom, Instant storedFrom) { - Location fullLocation = null; + public void processHospitalServiceFallback(HospitalVisit visit, AdtMessage msg, HospitalService serviceMsg, + Instant validFrom, Instant storedFrom) { + if (serviceMsg.getHospitalService().isUnknown()) { + return; + } + Location fullLocation = null; if (msg.getFullLocationString().isSave()) { fullLocation = locationController.getOrCreateLocation(msg.getFullLocationString().get()); } - // pseudo from issue - // match pending adt by hospital_visit and location - // if if a match is found, add in new row to the planned_movement table, event_type = EDIT/HOSPTIAL_SERVICE_CHANGE - // look for matching entry here Instant eventDateTime = msg.getEventOccurredDateTime(); - List movements = plannedMovementRepo.findMatchingMovementsFromZ99(visit, fullLocation, eventDateTime); + List movements = plannedMovementRepo.findMatchingMovementsForHospitalServiceFallback(visit, fullLocation, eventDateTime); if (!movements.isEmpty()) { int mostRecentMoveIndex = movements.size() - 1; String currentService = movements.get(mostRecentMoveIndex).getHospitalService(); - String editedService = msg.getHospitalService().get(); + String editedService = serviceMsg.getHospitalService().get(); if (!Objects.equals(currentService, editedService)) { Long matchedMovementId = movements.get(mostRecentMoveIndex).getPlannedMovementId(); @@ -217,7 +221,7 @@ public void processMsg(HospitalVisit visit, UpdateSubSpeciality msg, Instant val PlannedMovement movement = plannedState.getEntity(); // not sure why but event date time isn't being set. Add it here. plannedState.assignIfDifferent(eventDateTime, movement.getEventDatetime(), movement::setEventDatetime); - plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); + plannedState.assignInterchangeValue(serviceMsg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); } diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java index 772fb1fc7..c29a74287 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/VisitController.java @@ -69,6 +69,18 @@ public HospitalVisit getOrCreateMinimalHospitalVisit( return visit.getEntity(); } + /** + * Look up an existing hospital visit without creating one. + * @param encounter encounter number + * @return the existing visit, or null if none exists for this encounter + */ + public HospitalVisit getHospitalVisitIfExists(final String encounter) { + if (encounter == null || encounter.isEmpty()) { + return null; + } + return hospitalVisitRepo.findByEncounter(encounter).orElse(null); + } + /** * Get or create minimal hospital visit, and update whether it was created. * @param encounter encounter number diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java index cfba1ed35..bed0ec4c8 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java @@ -18,6 +18,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.ChangePatientIdentifiers; import uk.ac.ucl.rits.inform.interchange.adt.DeletePersonInformation; +import uk.ac.ucl.rits.inform.interchange.adt.HospitalService; import uk.ac.ucl.rits.inform.interchange.adt.MergePatient; import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; import uk.ac.ucl.rits.inform.interchange.adt.PendingDischarge; @@ -71,6 +72,13 @@ public void processMessage(final AdtMessage msg, final Instant storedFrom) throw Instant messageDateTime = msg.bestGuessAtValidFrom(); HospitalVisit visit = processPersonAndVisit(msg, storedFrom, messageDateTime); patientLocationController.processVisitLocation(visit, msg, storedFrom); + if (msg instanceof HospitalService) { + // UpdatePatientInfo doesn't create a visit of its own, so look up an existing one for the fallback. + HospitalVisit visitForFallback = (visit != null) ? visit : visitController.getHospitalVisitIfExists(msg.getVisitNumber()); + if (visitForFallback != null) { + pendingAdtController.processHospitalServiceFallback(visitForFallback, msg, (HospitalService) msg, messageDateTime, storedFrom); + } + } } private HospitalVisit processPersonAndVisit(AdtMessage msg, Instant storedFrom, Instant validFrom) throws RequiredDataMissingException { @@ -259,7 +267,7 @@ public void processUpdateSubSpeciality(UpdateSubSpeciality msg, Instant storedFr Instant validFrom = msg.bestGuessAtValidFrom(); HospitalVisit visit = processPersonAndVisit(msg, storedFrom, validFrom); // patientLocationController.processVisitLocation(visit, msg, storedFrom); - pendingAdtController.processMsg(visit, msg, validFrom, storedFrom); + pendingAdtController.processHospitalServiceFallback(visit, msg, msg, validFrom, storedFrom); } } diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java index 9f586e17c..ce2a08bb6 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/repos/PlannedMovementRepository.java @@ -40,7 +40,8 @@ List findMatchingMovementsFromRequest( ); /** - * Try and find a matching planned movement from a Z99 edit sub speciality message. + * Try and find a matching planned movement for the ADT-triggered hospital service fallback + * (e.g. Z99 edit sub speciality, or a real admission/update carrying a hospital service). *

* Always find planned location and hospital visit Id, then: * - Messages before the the same event date time @@ -55,7 +56,7 @@ List findMatchingMovementsFromRequest( + "and (eventDatetime <= :eventDatetime) " + "order by eventDatetime " ) - List findMatchingMovementsFromZ99( + List findMatchingMovementsForHospitalServiceFallback( HospitalVisit hospitalVisitId, Location plannedLocation, Instant eventDatetime ); diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java new file mode 100644 index 000000000..e3ec76a65 --- /dev/null +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java @@ -0,0 +1,131 @@ +package uk.ac.ucl.rits.inform.datasinks.emapstar.adt; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import uk.ac.ucl.rits.inform.datasinks.emapstar.MessageProcessingBase; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.CoreDemographicRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.MrnRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.PlannedMovementRepository; +import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; +import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; +import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; + +import java.io.IOException; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * A real admission (ADT^A01) should feed the same ADT-triggered hospital service fallback as Z99, + * per #166. + */ +class TestAdmitPatientHospitalServiceFallback extends MessageProcessingBase { + @Autowired + private MrnRepository mrnRepository; + @Autowired + private CoreDemographicRepository coreDemographicRepository; + @Autowired + private HospitalVisitRepository hospitalVisitRepository; + @Autowired + private PlannedMovementRepository plannedMovementRepository; + + private AdmitPatient admitPatient; + private PendingTransfer pendingTransfer; + private PendingTransfer pendingTransferLater; + private PendingTransfer pendingTransferAfter; + + private static final String VISIT_NUMBER = "123412341234"; + private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; + private static final Instant ADMISSION_EVENT_TIME = Instant.parse("2022-04-22T00:00:00Z"); + + private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String location) { + return plannedMovementRepository + .findByHospitalVisitIdEncounterAndLocationIdLocationString(visitNumber, location).orElseThrow(); + } + + @BeforeEach + void setup() throws IOException { + admitPatient = messageFactory.getAdtMessage("generic/A01.yaml"); + admitPatient.setFullLocationString(InterchangeValue.buildFromHl7(LOCATION_STRING)); + admitPatient.setEventOccurredDateTime(ADMISSION_EVENT_TIME); + + pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); + pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); + pendingTransferAfter = messageFactory.getAdtMessage("pending/A15.yaml"); + + Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.MINUTES); + pendingTransferLater.setEventOccurredDateTime(laterTime); + + Instant afterTime = pendingTransferAfter.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); + pendingTransferAfter.setEventOccurredDateTime(afterTime); + } + + /** + * Given that no entities exist in the database + * When an admission is processed + * Mrn, core demographics and hospital visit entities should be created, + * but no planned movement fallback row should be created as there is nothing to match against. + */ + @Test + void testAdmissionCreatesOtherEntitiesNoFallback() throws Exception { + dbOps.processMessage(admitPatient); + + assertEquals(1, mrnRepository.count()); + assertEquals(1, coreDemographicRepository.count()); + assertEquals(1, hospitalVisitRepository.count()); + + assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + } + + /** + * If more than one pending transfer exists find the most recent one and if the admission + * has a different hospital service insert the edit into the planned movement table. + */ + @Test + void testAdmissionInsertsEditIfHospitalServicesAreDifferent() throws Exception { + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(pendingTransferLater); + dbOps.processMessage(pendingTransferAfter); + dbOps.processMessage(admitPatient); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(4, movements.size()); + assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", movements.get(3).getEventType()); + assertEquals(Instant.parse("2022-04-22T00:00:00Z"), movements.get(3).getEventDatetime()); + } + + /** + * Find the most recent matching planned movement, but don't add to the table + * if the admission has the same hospital service as it. + */ + @Test + void testAdmissionDoesNotInsertIfHospitalServicesAreTheSame() throws Exception { + dbOps.processMessage(pendingTransfer); + admitPatient.setHospitalService(pendingTransfer.getHospitalService()); + dbOps.processMessage(admitPatient); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + } + + /** + * If pending transfers only exist after the admission event, don't add the fallback edit. + */ + @Test + void testAdmissionDoesNotInsertIfTransfersAreAfter() throws Exception { + dbOps.processMessage(pendingTransferAfter); + dbOps.processMessage(admitPatient); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + } +} diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdatePatientInfoHospitalServiceFallback.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdatePatientInfoHospitalServiceFallback.java new file mode 100644 index 000000000..f4626660a --- /dev/null +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestUpdatePatientInfoHospitalServiceFallback.java @@ -0,0 +1,155 @@ +package uk.ac.ucl.rits.inform.datasinks.emapstar.adt; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import uk.ac.ucl.rits.inform.datasinks.emapstar.MessageProcessingBase; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.CoreDemographicRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.HospitalVisitRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.MrnRepository; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.PlannedMovementRepository; +import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; +import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; +import uk.ac.ucl.rits.inform.interchange.adt.UpdatePatientInfo; + +import java.io.IOException; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * A patient info update (ADT^A08) should feed the same ADT-triggered hospital service fallback as Z99, + * per #166. Also covers the issue's explicit + * deduplication requirement: repeated A08s carrying the same, already-recorded hospital service must not + * flood planned_movement with duplicate rows. + */ +class TestUpdatePatientInfoHospitalServiceFallback extends MessageProcessingBase { + @Autowired + private MrnRepository mrnRepository; + @Autowired + private CoreDemographicRepository coreDemographicRepository; + @Autowired + private HospitalVisitRepository hospitalVisitRepository; + @Autowired + private PlannedMovementRepository plannedMovementRepository; + + private UpdatePatientInfo updatePatientInfo; + private PendingTransfer pendingTransfer; + private PendingTransfer pendingTransferLater; + private PendingTransfer pendingTransferAfter; + + private static final String VISIT_NUMBER = "123412341234"; + private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; + private static final Instant UPDATE_EVENT_TIME = Instant.parse("2022-04-22T00:00:00Z"); + + private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String location) { + return plannedMovementRepository + .findByHospitalVisitIdEncounterAndLocationIdLocationString(visitNumber, location).orElseThrow(); + } + + @BeforeEach + void setup() throws IOException { + updatePatientInfo = messageFactory.getAdtMessage("generic/A08_v1.yaml"); + updatePatientInfo.setFullLocationString(InterchangeValue.buildFromHl7(LOCATION_STRING)); + updatePatientInfo.setEventOccurredDateTime(UPDATE_EVENT_TIME); + + pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); + pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); + pendingTransferAfter = messageFactory.getAdtMessage("pending/A15.yaml"); + + Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.MINUTES); + pendingTransferLater.setEventOccurredDateTime(laterTime); + + Instant afterTime = pendingTransferAfter.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); + pendingTransferAfter.setEventOccurredDateTime(afterTime); + } + + /** + * Given that no entities exist in the database + * When an update is processed + * Mrn and core demographics entities should be created (UpdatePatientInfo does not create its own + * hospital visit), and no planned movement fallback row should be created as there is nothing to + * match against. + */ + @Test + void testUpdateCreatesOtherEntitiesNoFallback() throws Exception { + dbOps.processMessage(updatePatientInfo); + + assertEquals(1, mrnRepository.count()); + assertEquals(1, coreDemographicRepository.count()); + assertEquals(0, hospitalVisitRepository.count()); + + assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + } + + /** + * If more than one pending transfer exists find the most recent one and if the update + * has a different hospital service insert the edit into the planned movement table. + */ + @Test + void testUpdateInsertsEditIfHospitalServicesAreDifferent() throws Exception { + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(pendingTransferLater); + dbOps.processMessage(pendingTransferAfter); + dbOps.processMessage(updatePatientInfo); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(4, movements.size()); + assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", movements.get(3).getEventType()); + assertEquals(Instant.parse("2022-04-22T00:00:00Z"), movements.get(3).getEventDatetime()); + } + + /** + * Find the most recent matching planned movement, but don't add to the table + * if the update has the same hospital service as it. + */ + @Test + void testUpdateDoesNotInsertIfHospitalServicesAreTheSame() throws Exception { + dbOps.processMessage(pendingTransfer); + updatePatientInfo.setHospitalService(pendingTransfer.getHospitalService()); + dbOps.processMessage(updatePatientInfo); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + } + + /** + * If pending transfers only exist after the update event, don't add the fallback edit. + */ + @Test + void testUpdateDoesNotInsertIfTransfersAreAfter() throws Exception { + dbOps.processMessage(pendingTransferAfter); + dbOps.processMessage(updatePatientInfo); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + } + + /** + * Real A08 traffic reconfirms the same subspeciality repeatedly for hours after admission. + * A second A08 carrying the same hospital service as the fallback row just inserted by the + * first one must not insert a duplicate row. + */ + @Test + void testRepeatedUpdatesWithSameHospitalServiceAreDeduplicated() throws Exception { + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(updatePatientInfo); + + UpdatePatientInfo secondUpdate = messageFactory.getAdtMessage("generic/A08_v1.yaml"); + secondUpdate.setFullLocationString(InterchangeValue.buildFromHl7(LOCATION_STRING)); + secondUpdate.setEventOccurredDateTime(UPDATE_EVENT_TIME.plus(1, ChronoUnit.HOURS)); + secondUpdate.setHospitalService(updatePatientInfo.getHospitalService()); + dbOps.processMessage(secondUpdate); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(2, movements.size()); + assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", movements.get(1).getEventType()); + } +} diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java index e5e72e773..2b8b46ddb 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/AdmitPatient.java @@ -16,9 +16,10 @@ @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class AdmitPatient extends AdtMessage implements AdmissionDateTime { +public class AdmitPatient extends AdtMessage implements AdmissionDateTime, HospitalService { private InterchangeValue admissionDateTime = InterchangeValue.unknown(); private InterchangeValue admissionType = InterchangeValue.unknown(); + private InterchangeValue hospitalService = InterchangeValue.unknown(); @Override diff --git a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdatePatientInfo.java b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdatePatientInfo.java index 9543c2e2a..af4e7213d 100644 --- a/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdatePatientInfo.java +++ b/emap-interchange/src/main/java/uk/ac/ucl/rits/inform/interchange/adt/UpdatePatientInfo.java @@ -5,6 +5,7 @@ import lombok.ToString; import uk.ac.ucl.rits.inform.interchange.EmapOperationMessageProcessingException; import uk.ac.ucl.rits.inform.interchange.EmapOperationMessageProcessor; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; /** * Change patient demographics, can contain visit information. @@ -13,7 +14,9 @@ @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class UpdatePatientInfo extends AdtMessage { +public class UpdatePatientInfo extends AdtMessage implements HospitalService { + private InterchangeValue hospitalService = InterchangeValue.unknown(); + @Override public void processMessage(EmapOperationMessageProcessor processor) throws EmapOperationMessageProcessingException { processor.processMessage(this); diff --git a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml index 38de8c119..b34ed461a 100644 --- a/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/DoubleA01WithA13/A08.yaml @@ -36,3 +36,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml index 51795bd72..376f9d0dd 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/01_A01.yaml @@ -38,3 +38,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml index 6e1ca3be8..dd0f0a707 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelAdmit/03_A01.yaml @@ -38,3 +38,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml index 67dd481ca..79e641a53 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelDischarge/01_A01.yaml @@ -38,3 +38,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml index 67dd481ca..79e641a53 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/CancelTransfer/01_A01.yaml @@ -38,3 +38,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml index 2556795b5..3798606a8 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/DuplicateSimple/02_A01.yaml @@ -38,3 +38,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml index 67dd481ca..79e641a53 100644 --- a/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/Location/Moves/02_A01.yaml @@ -38,3 +38,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml index 272117cc9..4464b3d92 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A01.yaml @@ -54,3 +54,7 @@ ethnicGroup: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "Refused to Give" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml b/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml index 09e1d7365..124d9b744 100644 --- a/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml +++ b/emap-interchange/src/test/resources/AdtMessages/generic/A08_v1.yaml @@ -37,3 +37,7 @@ patientSex: "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" status: "SAVE" value: "F" +hospitalService: + "@class": "uk.ac.ucl.rits.inform.interchange.InterchangeValue" + value: "Anaes" + status: "SAVE" diff --git a/emap-star/emap-star/pom.xml b/emap-star/emap-star/pom.xml index a84891117..5936a7375 100644 --- a/emap-star/emap-star/pom.xml +++ b/emap-star/emap-star/pom.xml @@ -25,7 +25,7 @@ jdt_apt 2.13.1 - 1.18.22 + 1.18.30 diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java index 8c463ab20..9cdc766d3 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/AdtMessageFactory.java @@ -35,6 +35,7 @@ import uk.ac.ucl.rits.inform.interchange.adt.ChangePatientIdentifiers; import uk.ac.ucl.rits.inform.interchange.adt.DeletePersonInformation; import uk.ac.ucl.rits.inform.interchange.adt.DischargePatient; +import uk.ac.ucl.rits.inform.interchange.adt.HospitalService; import uk.ac.ucl.rits.inform.interchange.adt.ImpliedAdtMessage; import uk.ac.ucl.rits.inform.interchange.adt.MergePatient; import uk.ac.ucl.rits.inform.interchange.adt.MoveVisitInformation; @@ -195,6 +196,7 @@ private AdtMessage buildAdtMessageSubclass(final PV1Wrap pv1Wrap, final Message AdmitPatient admitPatient = new AdmitPatient(); admitPatient.setAdmissionDateTime(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionDateTime())); admitPatient.setAdmissionType(InterchangeValue.buildFromHl7(pv1Wrap.getAdmissionType())); + setHospitalService(pv1Wrap, admitPatient); msg = admitPatient; break; case "A02": @@ -226,7 +228,9 @@ private AdtMessage buildAdtMessageSubclass(final PV1Wrap pv1Wrap, final Message case "A08": case "A28": case "A31": - msg = new UpdatePatientInfo(); + UpdatePatientInfo updatePatientInfo = new UpdatePatientInfo(); + setHospitalService(pv1Wrap, updatePatientInfo); + msg = updatePatientInfo; break; // We are receiving A05 and A14, A38 messages but are not implementing scheduling case "A14": @@ -476,8 +480,8 @@ private void setHospitalService(PV1Wrap pv1Wrap, PendingEvent pendingEvent) thro String hospitalService = pv1Wrap.getHospitalService(); pendingEvent.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); } - private void setHospitalService(PV1Wrap pv1Wrap, UpdateSubSpeciality updateSubSpeciality) throws HL7Exception { + private void setHospitalService(PV1Wrap pv1Wrap, HospitalService hospitalServiceMsg) throws HL7Exception { String hospitalService = pv1Wrap.getHospitalService(); - updateSubSpeciality.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); + hospitalServiceMsg.setHospitalService(InterchangeValue.buildFromHl7(hospitalService)); } } diff --git a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java index 18af1b545..019e67a76 100644 --- a/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java +++ b/hl7-reader/src/main/java/uk/ac/ucl/rits/inform/datasources/ids/hl7/parser/PV1Wrap.java @@ -135,6 +135,9 @@ default Vector getReferringDoctors() throws HL7Exception { * @throws HL7Exception if HAPI does */ default String getHospitalService() throws HL7Exception { + if (!pv1SegmentExists()) { + return null; + } return getPV1().getHospitalService().getValue(); } diff --git a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java index 9059fbe3f..b867d455f 100644 --- a/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java +++ b/hl7-reader/src/test/java/uk/ac/ucl/rits/inform/datasources/ids/adt/TestMiscAdt.java @@ -5,8 +5,10 @@ import uk.ac.ucl.rits.inform.interchange.InterchangeValue; import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; +import uk.ac.ucl.rits.inform.interchange.adt.HospitalService; import uk.ac.ucl.rits.inform.interchange.adt.PatientClass; import uk.ac.ucl.rits.inform.interchange.adt.RegisterPatient; +import uk.ac.ucl.rits.inform.interchange.adt.UpdatePatientInfo; import java.time.Instant; import java.time.LocalDate; @@ -55,6 +57,37 @@ public void testInpatientAdmission() throws Exception { assertEquals(AdmitPatient.class.getName(), msg.getMessageType()); } + /** + * A01 carries PV1-10, so should populate hospital service on the interchange message. + * @throws Exception shouldn't happen + */ + @Test + void testAdmissionHospitalService() throws Exception { + AdmitPatient msg = (AdmitPatient) processSingleAdtMessage("Adt/generic/A01.txt"); + assertEquals(InterchangeValue.buildFromHl7("Anaes"), msg.getHospitalService()); + } + + /** + * A08 carries PV1-10, so should populate hospital service on the interchange message. + * @throws Exception shouldn't happen + */ + @Test + void testUpdateInfoHospitalService() throws Exception { + UpdatePatientInfo msg = (UpdatePatientInfo) processSingleAdtMessage("Adt/generic/A08_v1.txt"); + assertEquals(InterchangeValue.buildFromHl7("Anaes"), msg.getHospitalService()); + } + + /** + * A08 can legitimately have no PV1 segment at all (a demographics-only update). + * Hospital service should resolve to unknown rather than the message failing to parse. + * @throws Exception shouldn't happen + */ + @Test + void testUpdateInfoNoPv1HospitalServiceUnknown() throws Exception { + HospitalService msg = (HospitalService) processSingleAdtMessage("Adt/generic/A08_no_pv1.txt"); + assertTrue(msg.getHospitalService().isUnknown()); + } + /** * When a birth datetime is purely a date, should keep the original day, even when BST. * @throws Exception shouldn't happen diff --git a/hl7-reader/src/test/resources/Adt/generic/A08_no_pv1.txt b/hl7-reader/src/test/resources/Adt/generic/A08_no_pv1.txt new file mode 100644 index 000000000..0b40c6a2f --- /dev/null +++ b/hl7-reader/src/test/resources/Adt/generic/A08_no_pv1.txt @@ -0,0 +1,3 @@ +MSH|^~\&|EPIC|UCLH|||20130311100052|IPUC|ADT^A08|31644ZZZ|T|2.4|||AL|NE +EVN|A08|20130311100052||ADT_EVENT|IPUC^COORDINATOR^INPATIENT^UNIT^^^^^UCLHS^^^^^UCHC +PID|1||40800000^^^MRENTR^MEDREC~9999999999^^^NHS^HN||ORANG^BLOD^^^^^D||19890909|F|||^^^^^ENGLAND^L|||||||||||||||||||N From cd814a1b1586ea5ebccba0b55f563524362baf50 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Tue, 21 Jul 2026 17:19:58 +0100 Subject: [PATCH 60/62] Cancel matching planned_movement row when an admission is cancelled ADT^A11 (CancelAdmitPatient) previously had zero effect on planned_movement, so a hospital-service-fallback edit created by a now-cancelled admission was left stale in the table. On A11, find the most recent planned_movement row for that visit+location and, only if it's an EDIT/HOSPITAL_SERVICE_CHANGE row, mark it cancelled - mirroring the existing CancelPendingTransfer/CancelPendingDischarge pattern of marking rather than deleting. Rows from a real pending transfer/ discharge request are left untouched, since they may still represent a valid plan regardless of this one ADT message. Co-Authored-By: Claude Sonnet 5 --- .../controllers/PendingAdtController.java | 37 ++++++ .../emapstar/dataprocessors/AdtProcessor.java | 4 + ...elAdmitPatientHospitalServiceFallback.java | 119 ++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index b284d64d2..52296ea9c 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -10,6 +10,7 @@ import uk.ac.ucl.rits.inform.informdb.movement.Location; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovementAudit; +import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.HospitalService; @@ -257,6 +258,42 @@ public void processMsg(HospitalVisit visit, CancelPendingDischarge msg, Instant } + /** + * Cancel the matching hospital-service-fallback edit for a cancelled admission. + *

+ * Only rows created by {@link #processHospitalServiceFallback} (event type EDIT/HOSPITAL_SERVICE_CHANGE) + * are ever cancelled here. A row originating from a real pending transfer/discharge request is left alone, + * since it represents a separately-tracked plan that may still be valid regardless of this one ADT message. + * @param visit associated visit + * @param msg the ADT message, for the fields shared by all ADT messages + * @param cancellation the same message, as its AdtCancellation view + * @param validFrom time in the hospital when the message was created + * @param storedFrom time that emap core started processing the message + */ + public void processAdmissionCancellation(HospitalVisit visit, AdtMessage msg, AdtCancellation cancellation, + Instant validFrom, Instant storedFrom) { + Location fullLocation = null; + if (msg.getFullLocationString().isSave()) { + fullLocation = locationController.getOrCreateLocation(msg.getFullLocationString().get()); + } + + List movements = plannedMovementRepo.findMatchingMovementsForHospitalServiceFallback( + visit, fullLocation, cancellation.getCancelledDateTime()); + if (movements.isEmpty()) { + return; + } + + PlannedMovement movement = movements.get(movements.size() - 1); + if (!"EDIT/HOSPITAL_SERVICE_CHANGE".equals(movement.getEventType()) || movement.getCancelledDatetime() != null) { + return; + } + + RowState plannedState = new RowState<>(movement, validFrom, storedFrom, false); + plannedState.assignIfDifferent(cancellation.getCancelledDateTime(), movement.getCancelledDatetime(), movement::setCancelledDatetime); + plannedState.assignIfDifferent(true, movement.getCancelled(), movement::setCancelled); + plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); + } + /** * Delete planned movements from a delete patient information message. * @param visit Hospital visit that should have their planned movements deleted diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java index bed0ec4c8..d4ad97676 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java @@ -14,6 +14,7 @@ import uk.ac.ucl.rits.inform.informdb.identity.Mrn; import uk.ac.ucl.rits.inform.interchange.EmapOperationMessageProcessingException; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; +import uk.ac.ucl.rits.inform.interchange.adt.CancelAdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingDischarge; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; import uk.ac.ucl.rits.inform.interchange.adt.ChangePatientIdentifiers; @@ -79,6 +80,9 @@ public void processMessage(final AdtMessage msg, final Instant storedFrom) throw pendingAdtController.processHospitalServiceFallback(visitForFallback, msg, (HospitalService) msg, messageDateTime, storedFrom); } } + if (msg instanceof CancelAdmitPatient) { + pendingAdtController.processAdmissionCancellation(visit, msg, (CancelAdmitPatient) msg, messageDateTime, storedFrom); + } } private HospitalVisit processPersonAndVisit(AdtMessage msg, Instant storedFrom, Instant validFrom) throws RequiredDataMissingException { diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java new file mode 100644 index 000000000..026eac399 --- /dev/null +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java @@ -0,0 +1,119 @@ +package uk.ac.ucl.rits.inform.datasinks.emapstar.adt; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import uk.ac.ucl.rits.inform.datasinks.emapstar.MessageProcessingBase; +import uk.ac.ucl.rits.inform.datasinks.emapstar.repos.PlannedMovementRepository; +import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; +import uk.ac.ucl.rits.inform.interchange.InterchangeValue; +import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; +import uk.ac.ucl.rits.inform.interchange.adt.CancelAdmitPatient; +import uk.ac.ucl.rits.inform.interchange.adt.PendingTransfer; + +import java.io.IOException; +import java.time.Instant; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Cancelling an admission (ADT^A11) should cancel a matching hospital-service-fallback edit row + * (event type EDIT/HOSPITAL_SERVICE_CHANGE), but must never touch a planned_movement row that + * originated from a real pending transfer/discharge request. + */ +class TestCancelAdmitPatientHospitalServiceFallback extends MessageProcessingBase { + @Autowired + private PlannedMovementRepository plannedMovementRepository; + + private PendingTransfer pendingTransfer; + private AdmitPatient admitPatient; + private CancelAdmitPatient cancelAdmitPatient; + + private static final String VISIT_NUMBER = "123412341234"; + private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; + private static final Instant ADMISSION_EVENT_TIME = Instant.parse("2022-04-22T00:00:00Z"); + + @BeforeEach + void setup() throws IOException { + pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); + + admitPatient = messageFactory.getAdtMessage("generic/A01.yaml"); + admitPatient.setFullLocationString(InterchangeValue.buildFromHl7(LOCATION_STRING)); + admitPatient.setEventOccurredDateTime(ADMISSION_EVENT_TIME); + + cancelAdmitPatient = messageFactory.getAdtMessage("generic/A11.yaml"); + cancelAdmitPatient.setFullLocationString(InterchangeValue.buildFromHl7(LOCATION_STRING)); + cancelAdmitPatient.setCancelledDateTime(ADMISSION_EVENT_TIME); + } + + /** + * If no planned movement exists at all, cancelling the admission is a no-op. + */ + @Test + void testNoPlannedMovementsIsNoOp() throws Exception { + dbOps.processMessage(cancelAdmitPatient); + + assertEquals(0, plannedMovementRepository.count()); + } + + /** + * A pending transfer creates a TRANSFER row, then a differently-serviced admission creates an + * EDIT/HOSPITAL_SERVICE_CHANGE row. Cancelling that admission should cancel only the EDIT row. + */ + @Test + void testCancelsOnlyTheEditRow() throws Exception { + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(admitPatient); + dbOps.processMessage(cancelAdmitPatient); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(2, movements.size()); + + PlannedMovement transferRow = movements.get(0); + assertEquals("TRANSFER", transferRow.getEventType()); + assertFalse(transferRow.getCancelled()); + assertNull(transferRow.getCancelledDatetime()); + + PlannedMovement editRow = movements.get(1); + assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", editRow.getEventType()); + assertTrue(editRow.getCancelled()); + assertEquals(ADMISSION_EVENT_TIME, editRow.getCancelledDatetime()); + } + + /** + * If no EDIT row was ever created (e.g. the admission never differed in service), cancelling the + * admission must not touch the pre-existing TRANSFER row, even though it's the most recent match + * at that location. + */ + @Test + void testDoesNotCancelTransferRow() throws Exception { + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(cancelAdmitPatient); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("TRANSFER", movements.get(0).getEventType()); + assertFalse(movements.get(0).getCancelled()); + } + + /** + * Cancelling the same admission twice should be idempotent: no error, and the cancelledDatetime + * set by the first call is not overwritten by the second. + */ + @Test + void testCancellingTwiceIsIdempotent() throws Exception { + dbOps.processMessage(pendingTransfer); + dbOps.processMessage(admitPatient); + dbOps.processMessage(cancelAdmitPatient); + dbOps.processMessage(cancelAdmitPatient); + + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + PlannedMovement editRow = movements.get(1); + assertTrue(editRow.getCancelled()); + assertEquals(ADMISSION_EVENT_TIME, editRow.getCancelledDatetime()); + } +} From 3f317841432e461184e841acd941654802436615 Mon Sep 17 00:00:00 2001 From: Stephen Thompson Date: Wed, 22 Jul 2026 16:30:51 +0100 Subject: [PATCH 61/62] A01 admissions insert their own ADMISSION row instead of editing TRANSFER rows PendingTransfer always labels its planned_movement row TRANSFER (PendingType.ADMIT is unused), so a confirmed admission was left showing as TRANSFER forever, and admissions with no preceding pending transfer (e.g. direct A&E) never got a row at all despite carrying the correct hospital service on arrival. AdmitPatient no longer shares the diff-based hospital-service fallback with UpdatePatientInfo. It now always inserts (or idempotently reuses) its own ADMISSION row via the new PendingAdtController.processAdmission, linking to whatever it fulfils via matchedMovementId without ever modifying that row. processAdmissionCancellation is updated to match: A11 now cancels the ADMISSION row it created rather than an EDIT/HOSPITAL_SERVICE_CHANGE row. Co-Authored-By: Claude Sonnet 5 --- .../controllers/PendingAdtController.java | 50 +++++++++-- .../emapstar/dataprocessors/AdtProcessor.java | 5 +- ...stAdmitPatientHospitalServiceFallback.java | 88 +++++++++---------- ...elAdmitPatientHospitalServiceFallback.java | 32 +++---- 4 files changed, 109 insertions(+), 66 deletions(-) diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java index 52296ea9c..8b866acf9 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/controllers/PendingAdtController.java @@ -10,6 +10,7 @@ import uk.ac.ucl.rits.inform.informdb.movement.Location; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovement; import uk.ac.ucl.rits.inform.informdb.movement.PlannedMovementAudit; +import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.AdtCancellation; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingTransfer; @@ -229,6 +230,45 @@ public void processHospitalServiceFallback(HospitalVisit visit, AdtMessage msg, } } + /** + * Record a real admission as its own planned movement. + *

+ * Unlike {@link #processHospitalServiceFallback}, this always inserts (or idempotently reuses) an + * ADMISSION row, regardless of whether a matching planned movement already exists or has the same + * hospital service. Any matched prior movement (e.g. a TRANSFER row from a pending transfer request) + * is only referenced via matchedMovementId - it is never itself modified. + * @param visit associated visit + * @param msg the admission message + * @param validFrom time in the hospital when the message was created + * @param storedFrom time that emap core started processing the message + */ + public void processAdmission(HospitalVisit visit, AdmitPatient msg, Instant validFrom, Instant storedFrom) { + if (msg.getHospitalService().isUnknown()) { + return; + } + + Location fullLocation = null; + if (msg.getFullLocationString().isSave()) { + fullLocation = locationController.getOrCreateLocation(msg.getFullLocationString().get()); + } + Instant eventDateTime = msg.getEventOccurredDateTime(); + + List priorMovements = plannedMovementRepo.findMatchingMovementsForHospitalServiceFallback( + visit, fullLocation, eventDateTime); + Long matchedMovementId = priorMovements.isEmpty() ? null : priorMovements.get(priorMovements.size() - 1).getPlannedMovementId(); + + RowState plannedState = getOrCreate( + allFromRequest, visit, fullLocation, "ADMISSION", eventDateTime, validFrom, storedFrom + ); + PlannedMovement movement = plannedState.getEntity(); + plannedState.assignIfDifferent(eventDateTime, movement.getEventDatetime(), movement::setEventDatetime); + plannedState.assignInterchangeValue(msg.getHospitalService(), movement.getHospitalService(), movement::setHospitalService); + if (matchedMovementId != null) { + plannedState.assignIfDifferent(matchedMovementId, movement.getMatchedMovementId(), movement::setMatchedMovementId); + } + plannedState.saveEntityOrAuditLogIfRequired(plannedMovementRepo, plannedMovementAuditRepo); + } + /** * Process pending ADT cancellation. *

@@ -259,11 +299,11 @@ public void processMsg(HospitalVisit visit, CancelPendingDischarge msg, Instant /** - * Cancel the matching hospital-service-fallback edit for a cancelled admission. + * Cancel the matching ADMISSION row for a cancelled admission. *

- * Only rows created by {@link #processHospitalServiceFallback} (event type EDIT/HOSPITAL_SERVICE_CHANGE) - * are ever cancelled here. A row originating from a real pending transfer/discharge request is left alone, - * since it represents a separately-tracked plan that may still be valid regardless of this one ADT message. + * Only rows created by {@link #processAdmission} (event type ADMISSION) are ever cancelled here. + * A row originating from a real pending transfer/discharge request is left alone, since it + * represents a separately-tracked plan that may still be valid regardless of this one ADT message. * @param visit associated visit * @param msg the ADT message, for the fields shared by all ADT messages * @param cancellation the same message, as its AdtCancellation view @@ -284,7 +324,7 @@ public void processAdmissionCancellation(HospitalVisit visit, AdtMessage msg, Ad } PlannedMovement movement = movements.get(movements.size() - 1); - if (!"EDIT/HOSPITAL_SERVICE_CHANGE".equals(movement.getEventType()) || movement.getCancelledDatetime() != null) { + if (!"ADMISSION".equals(movement.getEventType()) || movement.getCancelledDatetime() != null) { return; } diff --git a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java index d4ad97676..91bf73fa3 100644 --- a/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java +++ b/core/src/main/java/uk/ac/ucl/rits/inform/datasinks/emapstar/dataprocessors/AdtProcessor.java @@ -13,6 +13,7 @@ import uk.ac.ucl.rits.inform.informdb.identity.HospitalVisit; import uk.ac.ucl.rits.inform.informdb.identity.Mrn; import uk.ac.ucl.rits.inform.interchange.EmapOperationMessageProcessingException; +import uk.ac.ucl.rits.inform.interchange.adt.AdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.AdtMessage; import uk.ac.ucl.rits.inform.interchange.adt.CancelAdmitPatient; import uk.ac.ucl.rits.inform.interchange.adt.CancelPendingDischarge; @@ -73,7 +74,9 @@ public void processMessage(final AdtMessage msg, final Instant storedFrom) throw Instant messageDateTime = msg.bestGuessAtValidFrom(); HospitalVisit visit = processPersonAndVisit(msg, storedFrom, messageDateTime); patientLocationController.processVisitLocation(visit, msg, storedFrom); - if (msg instanceof HospitalService) { + if (msg instanceof AdmitPatient) { + pendingAdtController.processAdmission(visit, (AdmitPatient) msg, messageDateTime, storedFrom); + } else if (msg instanceof HospitalService) { // UpdatePatientInfo doesn't create a visit of its own, so look up an existing one for the fallback. HospitalVisit visitForFallback = (visit != null) ? visit : visitController.getHospitalVisitIfExists(msg.getVisitNumber()); if (visitForFallback != null) { diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java index e3ec76a65..00d04e827 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestAdmitPatientHospitalServiceFallback.java @@ -15,16 +15,16 @@ import java.io.IOException; import java.time.Instant; -import java.time.temporal.ChronoUnit; import java.util.List; -import java.util.NoSuchElementException; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertNull; /** - * A real admission (ADT^A01) should feed the same ADT-triggered hospital service fallback as Z99, - * per #166. + * A real admission (ADT^A01) always records its own ADMISSION row in planned_movement, + * per #166. Unlike the Z99/A08 + * hospital-service fallback, this never edits a matched row in place - it only links to it + * via matchedMovementId. */ class TestAdmitPatientHospitalServiceFallback extends MessageProcessingBase { @Autowired @@ -38,18 +38,11 @@ class TestAdmitPatientHospitalServiceFallback extends MessageProcessingBase { private AdmitPatient admitPatient; private PendingTransfer pendingTransfer; - private PendingTransfer pendingTransferLater; - private PendingTransfer pendingTransferAfter; private static final String VISIT_NUMBER = "123412341234"; private static final String LOCATION_STRING = "1020100166^SDEC BY02^11 SDEC"; private static final Instant ADMISSION_EVENT_TIME = Instant.parse("2022-04-22T00:00:00Z"); - private PlannedMovement getPlannedMovementOrThrow(String visitNumber, String location) { - return plannedMovementRepository - .findByHospitalVisitIdEncounterAndLocationIdLocationString(visitNumber, location).orElseThrow(); - } - @BeforeEach void setup() throws IOException { admitPatient = messageFactory.getAdtMessage("generic/A01.yaml"); @@ -57,75 +50,82 @@ void setup() throws IOException { admitPatient.setEventOccurredDateTime(ADMISSION_EVENT_TIME); pendingTransfer = messageFactory.getAdtMessage("pending/A15.yaml"); - pendingTransferLater = messageFactory.getAdtMessage("pending/A15.yaml"); - pendingTransferAfter = messageFactory.getAdtMessage("pending/A15.yaml"); - - Instant laterTime = pendingTransferLater.getEventOccurredDateTime().plus(1, ChronoUnit.MINUTES); - pendingTransferLater.setEventOccurredDateTime(laterTime); - - Instant afterTime = pendingTransferAfter.getEventOccurredDateTime().plus(1, ChronoUnit.HOURS); - pendingTransferAfter.setEventOccurredDateTime(afterTime); } /** - * Given that no entities exist in the database - * When an admission is processed - * Mrn, core demographics and hospital visit entities should be created, - * but no planned movement fallback row should be created as there is nothing to match against. + * Given that no planned movement exists at all (e.g. a direct A&E admission with no + * preceding pending transfer request), an admission still inserts its own ADMISSION row, + * with no matchedMovementId since there was nothing to fulfil. */ @Test - void testAdmissionCreatesOtherEntitiesNoFallback() throws Exception { + void testAdmissionInsertsOwnRowWithNoPriorMovement() throws Exception { dbOps.processMessage(admitPatient); assertEquals(1, mrnRepository.count()); assertEquals(1, coreDemographicRepository.count()); assertEquals(1, hospitalVisitRepository.count()); - assertThrows(NoSuchElementException.class, () -> getPlannedMovementOrThrow(VISIT_NUMBER, LOCATION_STRING)); + List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); + assertEquals(1, movements.size()); + assertEquals("ADMISSION", movements.get(0).getEventType()); + assertEquals(ADMISSION_EVENT_TIME, movements.get(0).getEventDatetime()); + assertNull(movements.get(0).getMatchedMovementId()); } /** - * If more than one pending transfer exists find the most recent one and if the admission - * has a different hospital service insert the edit into the planned movement table. + * A prior pending transfer creates a TRANSFER row. An admission with the SAME hospital + * service still inserts its own ADMISSION row (not a no-op), linking back to the TRANSFER + * row via matchedMovementId - the TRANSFER row itself is left untouched. */ @Test - void testAdmissionInsertsEditIfHospitalServicesAreDifferent() throws Exception { + void testAdmissionInsertsOwnRowWhenHospitalServicesAreTheSame() throws Exception { dbOps.processMessage(pendingTransfer); - dbOps.processMessage(pendingTransferLater); - dbOps.processMessage(pendingTransferAfter); + admitPatient.setHospitalService(pendingTransfer.getHospitalService()); dbOps.processMessage(admitPatient); List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); - assertEquals(4, movements.size()); - assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", movements.get(3).getEventType()); - assertEquals(Instant.parse("2022-04-22T00:00:00Z"), movements.get(3).getEventDatetime()); + assertEquals(2, movements.size()); + + PlannedMovement transferRow = movements.get(0); + assertEquals("TRANSFER", transferRow.getEventType()); + + PlannedMovement admissionRow = movements.get(1); + assertEquals("ADMISSION", admissionRow.getEventType()); + assertEquals(transferRow.getPlannedMovementId(), admissionRow.getMatchedMovementId()); + assertEquals(admitPatient.getHospitalService().get(), admissionRow.getHospitalService()); } /** - * Find the most recent matching planned movement, but don't add to the table - * if the admission has the same hospital service as it. + * Same as above, but with a differing hospital service - still just one new ADMISSION row, + * not a separate EDIT/HOSPITAL_SERVICE_CHANGE row. The TRANSFER row is still untouched. */ @Test - void testAdmissionDoesNotInsertIfHospitalServicesAreTheSame() throws Exception { + void testAdmissionInsertsOwnRowWhenHospitalServicesDiffer() throws Exception { dbOps.processMessage(pendingTransfer); - admitPatient.setHospitalService(pendingTransfer.getHospitalService()); dbOps.processMessage(admitPatient); List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); - assertEquals(1, movements.size()); - assertEquals("TRANSFER", movements.get(0).getEventType()); + assertEquals(2, movements.size()); + + PlannedMovement transferRow = movements.get(0); + assertEquals("TRANSFER", transferRow.getEventType()); + + PlannedMovement admissionRow = movements.get(1); + assertEquals("ADMISSION", admissionRow.getEventType()); + assertEquals(transferRow.getPlannedMovementId(), admissionRow.getMatchedMovementId()); + assertEquals(admitPatient.getHospitalService().get(), admissionRow.getHospitalService()); } /** - * If pending transfers only exist after the admission event, don't add the fallback edit. + * Reprocessing the identical admission message must not duplicate the ADMISSION row. */ @Test - void testAdmissionDoesNotInsertIfTransfersAreAfter() throws Exception { - dbOps.processMessage(pendingTransferAfter); + void testReprocessingSameAdmissionIsIdempotent() throws Exception { + dbOps.processMessage(admitPatient); dbOps.processMessage(admitPatient); List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); assertEquals(1, movements.size()); - assertEquals("TRANSFER", movements.get(0).getEventType()); + assertEquals("ADMISSION", movements.get(0).getEventType()); } } diff --git a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java index 026eac399..96cc39beb 100644 --- a/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java +++ b/core/src/test/java/uk/ac/ucl/rits/inform/datasinks/emapstar/adt/TestCancelAdmitPatientHospitalServiceFallback.java @@ -21,9 +21,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue; /** - * Cancelling an admission (ADT^A11) should cancel a matching hospital-service-fallback edit row - * (event type EDIT/HOSPITAL_SERVICE_CHANGE), but must never touch a planned_movement row that - * originated from a real pending transfer/discharge request. + * Cancelling an admission (ADT^A11) should cancel the matching ADMISSION row created by + * {@link uk.ac.ucl.rits.inform.datasinks.emapstar.controllers.PendingAdtController#processAdmission}, + * but must never touch a planned_movement row that originated from a real pending transfer/discharge + * request. */ class TestCancelAdmitPatientHospitalServiceFallback extends MessageProcessingBase { @Autowired @@ -61,11 +62,11 @@ void testNoPlannedMovementsIsNoOp() throws Exception { } /** - * A pending transfer creates a TRANSFER row, then a differently-serviced admission creates an - * EDIT/HOSPITAL_SERVICE_CHANGE row. Cancelling that admission should cancel only the EDIT row. + * A pending transfer creates a TRANSFER row, then an admission creates its own ADMISSION row. + * Cancelling that admission should cancel only the ADMISSION row. */ @Test - void testCancelsOnlyTheEditRow() throws Exception { + void testCancelsOnlyTheAdmissionRow() throws Exception { dbOps.processMessage(pendingTransfer); dbOps.processMessage(admitPatient); dbOps.processMessage(cancelAdmitPatient); @@ -78,16 +79,15 @@ void testCancelsOnlyTheEditRow() throws Exception { assertFalse(transferRow.getCancelled()); assertNull(transferRow.getCancelledDatetime()); - PlannedMovement editRow = movements.get(1); - assertEquals("EDIT/HOSPITAL_SERVICE_CHANGE", editRow.getEventType()); - assertTrue(editRow.getCancelled()); - assertEquals(ADMISSION_EVENT_TIME, editRow.getCancelledDatetime()); + PlannedMovement admissionRow = movements.get(1); + assertEquals("ADMISSION", admissionRow.getEventType()); + assertTrue(admissionRow.getCancelled()); + assertEquals(ADMISSION_EVENT_TIME, admissionRow.getCancelledDatetime()); } /** - * If no EDIT row was ever created (e.g. the admission never differed in service), cancelling the - * admission must not touch the pre-existing TRANSFER row, even though it's the most recent match - * at that location. + * If no admission was ever processed, cancelling the admission must not touch the pre-existing + * TRANSFER row, even though it's the most recent match at that location. */ @Test void testDoesNotCancelTransferRow() throws Exception { @@ -112,8 +112,8 @@ void testCancellingTwiceIsIdempotent() throws Exception { dbOps.processMessage(cancelAdmitPatient); List movements = plannedMovementRepository.findAllByHospitalVisitIdEncounter(VISIT_NUMBER); - PlannedMovement editRow = movements.get(1); - assertTrue(editRow.getCancelled()); - assertEquals(ADMISSION_EVENT_TIME, editRow.getCancelledDatetime()); + PlannedMovement admissionRow = movements.get(1); + assertTrue(admissionRow.getCancelled()); + assertEquals(ADMISSION_EVENT_TIME, admissionRow.getCancelledDatetime()); } } From 86eb1544d0906385fb0bcd0f882b20e13a3163d2 Mon Sep 17 00:00:00 2001 From: Sarah Keating Date: Fri, 31 Jul 2026 13:59:07 +0100 Subject: [PATCH 62/62] run tests for test_branch_zella --- .github/workflows/emap-tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/emap-tests.yaml b/.github/workflows/emap-tests.yaml index 2a003b64b..64fedaa7b 100644 --- a/.github/workflows/emap-tests.yaml +++ b/.github/workflows/emap-tests.yaml @@ -3,7 +3,7 @@ on: push: branches: [ main, develop ] pull_request: - branches: [ main, develop, sk/waveform-dev ] + branches: [ main, develop, sk/waveform-dev, test_branch_zella ] repository_dispatch: permissions: contents: read