From 2d0d4e0b2784b0851ba09f0724b197ffb8fe1a5e Mon Sep 17 00:00:00 2001 From: mogoodrich Date: Tue, 3 Mar 2026 09:43:57 -0500 Subject: [PATCH 1/2] O3-5396: Service queues duplicates detection needs additional safety --- .../openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java | 3 ++- .../module/queue/validators/QueueEntryValidatorTest.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java b/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java index fc9f081..4efb7c9 100644 --- a/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java +++ b/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java @@ -25,6 +25,7 @@ import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; +import org.joda.time.DateTime; import org.openmrs.Patient; import org.openmrs.module.queue.api.dao.QueueEntryDao; import org.openmrs.module.queue.api.search.QueueEntrySearchCriteria; @@ -116,7 +117,7 @@ public boolean updateIfUnmodified(QueueEntry queueEntry, Date expectedDateChange } javax.persistence.Query query = session.createQuery(jpql.toString()); - query.setParameter("endedAt", queueEntry.getEndedAt()); + query.setParameter("endedAt", new DateTime(queueEntry.getEndedAt()).withMillisOfSecond(0).toDate()); // see https://openmrs.atlassian.net/browse/O3-5396 query.setParameter("id", queueEntry.getQueueEntryId()); if (expectedDateChanged != null) { query.setParameter("expectedDateChanged", expectedDateChanged); diff --git a/integration-tests/src/test/java/org/openmrs/module/queue/validators/QueueEntryValidatorTest.java b/integration-tests/src/test/java/org/openmrs/module/queue/validators/QueueEntryValidatorTest.java index fc96fc8..b507d50 100644 --- a/integration-tests/src/test/java/org/openmrs/module/queue/validators/QueueEntryValidatorTest.java +++ b/integration-tests/src/test/java/org/openmrs/module/queue/validators/QueueEntryValidatorTest.java @@ -319,8 +319,8 @@ public void shouldNotRejectNonOverlappingQueueEntriesForSamePatientAndQueue() { firstEntry.setPatient(patient); firstEntry.setStatus(validStatus); firstEntry.setPriority(validPriority); - firstEntry.setStartedAt(DateUtils.addHours(now, -2)); - firstEntry.setEndedAt(DateUtils.addHours(now, -1)); + firstEntry.setStartedAt(DateUtils.addHours(now, -1)); + firstEntry.setEndedAt(now); services.getQueueEntryService().saveQueueEntry(firstEntry); QueueEntry secondEntry = new QueueEntry(); From 90576c00128b6b9147227cfdb84f31cfb8c230ea Mon Sep 17 00:00:00 2001 From: mogoodrich Date: Tue, 3 Mar 2026 11:26:31 -0500 Subject: [PATCH 2/2] O3-5396: Service queues duplicates detection needs additional safety --- .../openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java b/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java index 4efb7c9..b982ecc 100644 --- a/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java +++ b/api/src/main/java/org/openmrs/module/queue/api/dao/impl/QueueEntryDaoImpl.java @@ -14,6 +14,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -25,7 +26,6 @@ import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; -import org.joda.time.DateTime; import org.openmrs.Patient; import org.openmrs.module.queue.api.dao.QueueEntryDao; import org.openmrs.module.queue.api.search.QueueEntrySearchCriteria; @@ -117,7 +117,7 @@ public boolean updateIfUnmodified(QueueEntry queueEntry, Date expectedDateChange } javax.persistence.Query query = session.createQuery(jpql.toString()); - query.setParameter("endedAt", new DateTime(queueEntry.getEndedAt()).withMillisOfSecond(0).toDate()); // see https://openmrs.atlassian.net/browse/O3-5396 + query.setParameter("endedAt", Date.from(queueEntry.getEndedAt().toInstant().truncatedTo(ChronoUnit.SECONDS))); query.setParameter("id", queueEntry.getQueueEntryId()); if (expectedDateChanged != null) { query.setParameter("expectedDateChanged", expectedDateChanged);