Skip to content

Commit bb67f2a

Browse files
leventegal-sheLevente Gal
andauthored
#13217 [Automatic message processing] Check sample assignment threshold against sample data instead of current date (#13218)
Co-authored-by: Levente Gal <levente.gal.ext@vitagroup.ag>
1 parent 9d38e9b commit bb67f2a

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.function.Function;
3232
import java.util.stream.Collectors;
3333

34+
import javax.annotation.Nullable;
3435
import javax.ejb.EJB;
3536
import javax.ejb.LocalBean;
3637
import javax.ejb.Stateless;
@@ -2345,7 +2346,9 @@ protected String getDeleteReferenceField(DeletionReference deletionReference) {
23452346
return super.getDeleteReferenceField(deletionReference);
23462347
}
23472348

2348-
public String getCaseUuidForAutomaticSampleAssignment(Set<String> uuids, Disease disease, int threshold) {
2349+
public String getCaseUuidForAutomaticSampleAssignment(Set<String> uuids, Disease disease, @Nullable Date sampleDateTime, int threshold) {
2350+
Date dateToCompareTo = sampleDateTime != null ? sampleDateTime : new Date();
2351+
23492352
CriteriaBuilder cb = em.getCriteriaBuilder();
23502353
CriteriaQuery<String> cq = cb.createQuery(String.class);
23512354
Root<Case> caseRoot = cq.from(Case.class);
@@ -2366,7 +2369,7 @@ public String getCaseUuidForAutomaticSampleAssignment(Set<String> uuids, Disease
23662369
ExtendedPostgreSQL94Dialect.DATE,
23672370
Date.class,
23682371
CriteriaBuilderHelper.coalesce(cb, Date.class, earliestSampleSq, caseRoot.get(Case.REPORT_DATE))),
2369-
cb.function(ExtendedPostgreSQL94Dialect.DATE, Date.class, cb.literal(new Date()))),
2372+
cb.function(ExtendedPostgreSQL94Dialect.DATE, Date.class, cb.literal(dateToCompareTo))),
23702373
Long.valueOf(TimeUnit.DAYS.toSeconds(threshold)).doubleValue()));
23712374
cq.orderBy(cb.desc(caseRoot.get(Case.REPORT_DATE)));
23722375

sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/labmessage/AutomaticLabMessageProcessor.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
package de.symeda.sormas.backend.externalmessage.labmessage;
1717

1818
import java.text.Collator;
19+
import java.util.Comparator;
20+
import java.util.Date;
1921
import java.util.List;
22+
import java.util.Objects;
2023
import java.util.Set;
2124
import java.util.concurrent.CompletableFuture;
2225
import java.util.concurrent.CompletionStage;
@@ -43,6 +46,7 @@
4346
import de.symeda.sormas.api.event.EventParticipantDto;
4447
import de.symeda.sormas.api.event.SimilarEventParticipantDto;
4548
import de.symeda.sormas.api.externalmessage.ExternalMessageDto;
49+
import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto;
4650
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageMapper;
4751
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingFacade;
4852
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingResult;
@@ -183,7 +187,14 @@ protected void handlePickOrCreateEntry(
183187
}
184188

185189
Set<String> similarCaseUuids = similarCases.stream().map(CaseSelectionDto::getUuid).collect(Collectors.toSet());
186-
String caseUuid = caseService.getCaseUuidForAutomaticSampleAssignment(similarCaseUuids, disease, automaticSampleAssignmentThreshold);
190+
Date sampleDate = externalMessageDto.getSampleReports()
191+
.stream()
192+
.map(SampleReportDto::getSampleDateTime)
193+
.filter(Objects::nonNull)
194+
.min(Comparator.comparing(Date::getTime))
195+
.orElse(null);
196+
String caseUuid =
197+
caseService.getCaseUuidForAutomaticSampleAssignment(similarCaseUuids, disease, sampleDate, automaticSampleAssignmentThreshold);
187198

188199
if (caseUuid == null) {
189200
logger.debug(

sormas-backend/src/test/java/de/symeda/sormas/backend/externalmessage/labmessage/AutomaticLabMessageProcessorTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.junit.jupiter.api.Test;
3232

3333
import de.symeda.sormas.api.Disease;
34+
import de.symeda.sormas.api.caze.CaseCriteria;
3435
import de.symeda.sormas.api.caze.CaseDataDto;
3536
import de.symeda.sormas.api.externalmessage.ExternalMessageDto;
3637
import de.symeda.sormas.api.externalmessage.ExternalMessageStatus;
@@ -46,6 +47,7 @@
4647
import de.symeda.sormas.api.sample.PathogenTestDto;
4748
import de.symeda.sormas.api.sample.PathogenTestResultType;
4849
import de.symeda.sormas.api.sample.PathogenTestType;
50+
import de.symeda.sormas.api.sample.SampleCriteria;
4951
import de.symeda.sormas.api.sample.SampleDto;
5052
import de.symeda.sormas.api.sample.SampleMaterial;
5153
import de.symeda.sormas.api.sample.SamplePurpose;
@@ -213,6 +215,42 @@ public void testProcessWithExistingPersonAndCase() throws ExecutionException, In
213215
assertThat(samples, hasSize(2));
214216
}
215217

218+
/**
219+
* External message with sample date in the threshold period should generate a new sample to the existing case
220+
* @throws ExecutionException
221+
* @throws InterruptedException
222+
*/
223+
@Test
224+
public void testThresholdAgainstSampleDate() throws ExecutionException, InterruptedException {
225+
ExternalMessageDto externalMessage = createExternalMessage(e -> {
226+
e.getSampleReports().get(0).setSampleDateTime(DateHelper.subtractDays(new Date(), 10));
227+
});
228+
229+
PersonDto person =
230+
creator.createPerson(externalMessage.getPersonFirstName(), externalMessage.getPersonLastName(), externalMessage.getPersonSex(), p -> {
231+
p.setNationalHealthId(externalMessage.getPersonNationalHealthId());
232+
});
233+
234+
CaseDataDto caze = creator.createCase(reportingUser.toReference(), person.toReference(), rdcf, c -> {
235+
c.setDisease(externalMessage.getDisease());
236+
c.setReportDate(DateHelper.subtractDays(new Date(), 15));
237+
});
238+
creator.createSample(caze.toReference(), reportingUser.toReference(), rdcf.facility, s -> {
239+
s.setSampleDateTime(DateHelper.subtractDays(new Date(), 15));
240+
});
241+
242+
// set the threshold
243+
creator.updateDiseaseConfiguration(externalMessage.getDisease(), true, true, true, true, null, 10);
244+
getBean(DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal.class).loadData();
245+
246+
ProcessingResult<ExternalMessageProcessingResult> result = runFlow(externalMessage);
247+
assertThat(result.getStatus(), is(DONE));
248+
assertThat(externalMessage.getStatus(), is(ExternalMessageStatus.PROCESSED));
249+
250+
assertThat(getCaseFacade().count(new CaseCriteria().person(caze.getPerson())), is(1L));
251+
assertThat(getSampleFacade().count(new SampleCriteria().caze(caze.toReference())), is(2L));
252+
}
253+
216254
@Test
217255
public void testProcessWithExistingPersonAndCaseWithBySampleDate() throws ExecutionException, InterruptedException {
218256
ExternalMessageDto externalMessage = createExternalMessage(null);

0 commit comments

Comments
 (0)