From efa2557e6fcdb4b54a44ec3ba1f499fc094b1df1 Mon Sep 17 00:00:00 2001
From: LZRS <12814349+LZRS@users.noreply.github.com>
Date: Tue, 31 Aug 2021 17:25:18 +0300
Subject: [PATCH] for RACD events, check no event exists with case_number, and
flag
case_number and flag, should be unique
---
pom.xml | 2 +-
.../opensrp/repository/EventsRepository.java | 9 +++++
.../postgres/EventsRepositoryImpl.java | 8 +++--
.../mapper/custom/CustomEventMapper.java | 3 ++
.../mapper/custom/xml/CustomEventMapper.xml | 7 ++++
.../org/opensrp/service/EventService.java | 34 ++++++++++++++++++-
.../util/constants/EventConstants.java | 3 ++
.../org/opensrp/service/EventServiceTest.java | 34 ++++++++++++++++++-
8 files changed, 95 insertions(+), 5 deletions(-)
diff --git a/pom.xml b/pom.xml
index d36864239..2a14be4f8 100755
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
opensrp-server-core
jar
- 2.12.5-SNAPSHOT
+ 2.12.6-SNAPSHOT
opensrp-server-core
OpenSRP Server Core module
https://github.com/OpenSRP/opensrp-server-core
diff --git a/src/main/java/org/opensrp/repository/EventsRepository.java b/src/main/java/org/opensrp/repository/EventsRepository.java
index ab2fa34fe..91db455f3 100644
--- a/src/main/java/org/opensrp/repository/EventsRepository.java
+++ b/src/main/java/org/opensrp/repository/EventsRepository.java
@@ -8,6 +8,7 @@
import org.smartregister.domain.Event;
import org.smartregister.pathevaluator.dao.EventDao;
import org.opensrp.search.EventSearchBean;
+import org.springframework.lang.NonNull;
public interface EventsRepository extends BaseRepository, EventDao {
@@ -95,5 +96,13 @@ Pair, Long> findIdsByEventType(String eventType, boolean isDeleted,
List findBaseEntityIdsByLocation(String locationId);
List getEventData(String planIdentifier, String eventType, Date fromDate, Date toDate);
+
+ /**
+ * Checks if events exists
+ * @param caseNumber
+ * @param flag
+ * @return true if exists else false
+ */
+ boolean checkEventExists(@NonNull String caseNumber, @NonNull String flag);
}
diff --git a/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java b/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java
index 89c5b9d13..40995f31e 100644
--- a/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java
+++ b/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java
@@ -23,6 +23,7 @@
import org.smartregister.converters.EventConverter;
import org.smartregister.domain.Event;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.NonNull;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@@ -715,6 +716,9 @@ public List findEventsByJurisdictionIdAndPlan(String juri
.collect(Collectors.toList());
/**@formatter:on*/
}
-
-
+
+ @Override
+ public boolean checkEventExists(@NonNull String caseNumber, @NonNull String flag) {
+ return eventMapper.selectCaseTriggeredEventExists(caseNumber, flag);
+ }
}
diff --git a/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java b/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java
index a6d59f5f6..32453e747 100644
--- a/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java
+++ b/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java
@@ -34,4 +34,7 @@ List selectByBaseEntityIdAndDetails(@Param("baseEntityId") String baseEnt
int updateByPrimaryKeyAndGenerateServerVersion(Event record);
+ boolean selectCaseTriggeredEventExists(@Param("caseNumber") String caseNumber,
+ @Param("flag") String flag);
+
}
diff --git a/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml b/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml
index df450ee58..4e908236a 100644
--- a/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml
+++ b/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml
@@ -134,5 +134,12 @@
and e.date_deleted is null
+
diff --git a/src/main/java/org/opensrp/service/EventService.java b/src/main/java/org/opensrp/service/EventService.java
index bbb44eb64..9b41fdbe3 100644
--- a/src/main/java/org/opensrp/service/EventService.java
+++ b/src/main/java/org/opensrp/service/EventService.java
@@ -24,18 +24,34 @@
import org.smartregister.domain.PlanDefinition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.UUID;
import java.util.stream.Collectors;
import static org.opensrp.util.constants.EventConstants.BIRTH_REGISTRATION_EVENT;
import static org.opensrp.util.constants.EventConstants.CARD_ID_PREFIX;
+import static org.opensrp.util.constants.EventConstants.CASE_NUMBER;
import static org.opensrp.util.constants.EventConstants.CODED;
import static org.opensrp.util.constants.EventConstants.CONCEPT;
import static org.opensrp.util.constants.EventConstants.DATE;
import static org.opensrp.util.constants.EventConstants.DOSE;
+import static org.opensrp.util.constants.EventConstants.EVENT_TYPE_CASE_DETAILS;
+import static org.opensrp.util.constants.EventConstants.FLAG;
import static org.opensrp.util.constants.EventConstants.GROWTH_MONITORING_EVENT;
import static org.opensrp.util.constants.EventConstants.NFC_CARD_IDENTIFIER;
import static org.opensrp.util.constants.EventConstants.NUMERIC;
@@ -189,6 +205,18 @@ && getByBaseEntityAndFormSubmissionId(event.getBaseEntityId(), event.getFormSubm
"An event already exists with given baseEntity and formSubmission combination. Consider updating");
}
+ if (event.getEventType() != null
+ && event.getEventType().equals(EVENT_TYPE_CASE_DETAILS)
+ && event.getDetails() != null
+ && StringUtils.isNotBlank(event.getDetails().get(CASE_NUMBER))){
+ String caseNumber = event.getDetails().get(CASE_NUMBER);
+ String flag = event.getDetails().get(FLAG);
+ boolean caseEventExists = checkIfEventExists(caseNumber, flag);
+ if (caseEventExists){
+ throw new DuplicateKeyException("An event already exists with case_number " + caseNumber + ", and flag '" + flag + "'");
+ }
+ }
+
event.setDateCreated(DateTime.now());
allEvents.add(event);
triggerPlanEvaluation(event, username);
@@ -674,4 +702,8 @@ public ExportImagesSummary getImagesMetadataForFlagProblemEvent(String planIdent
}
+ public boolean checkIfEventExists(@NonNull String caseNumber, @NonNull String flag){
+ return allEvents.checkEventExists(caseNumber, flag);
+ }
+
}
diff --git a/src/main/java/org/opensrp/util/constants/EventConstants.java b/src/main/java/org/opensrp/util/constants/EventConstants.java
index 400fc1dab..5de0532b9 100644
--- a/src/main/java/org/opensrp/util/constants/EventConstants.java
+++ b/src/main/java/org/opensrp/util/constants/EventConstants.java
@@ -24,4 +24,7 @@ public interface EventConstants {
String CONCEPT = "concept";
String YES = "yes";
String PLAN_IDENTIFIER = "planIdentifier";
+ String CASE_NUMBER = "case_number";
+ String FLAG = "flag";
+ String EVENT_TYPE_CASE_DETAILS = "Case_Details";
}
diff --git a/src/test/java/org/opensrp/service/EventServiceTest.java b/src/test/java/org/opensrp/service/EventServiceTest.java
index 836b07990..8bf1572ad 100644
--- a/src/test/java/org/opensrp/service/EventServiceTest.java
+++ b/src/test/java/org/opensrp/service/EventServiceTest.java
@@ -5,15 +5,19 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.opensrp.common.AllConstants.Event.OPENMRS_UUID_IDENTIFIER_TYPE;
import static org.opensrp.repository.postgres.EventsRepositoryTest.createFlagProblemEvent;
+import static org.opensrp.util.constants.EventConstants.CASE_NUMBER;
+import static org.opensrp.util.constants.EventConstants.EVENT_TYPE_CASE_DETAILS;
+import static org.opensrp.util.constants.EventConstants.FLAG;
import java.sql.SQLException;
import java.util.HashMap;
@@ -225,6 +229,34 @@ public void testAddEventShouldEvaluatePlan() {
verify(planRepository, times(1)).get(stringArgumentCaptor.capture());
verify(taskGenerator, times(1)).processPlanEvaluation(planDefinitionArgumentCaptor.capture(),stringArgumentCaptor.capture(),eventArgumentCaptor.capture());
}
+
+ @Test(expected = DuplicateKeyException.class)
+ public void testAddCaseTriggeredEventThrowsExceptionOnDuplicate() {
+ Obs obs = new Obs("concept", "decimal", "1730AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", null, "3.5", null, "weight");
+ Event event = new Event()
+ .withBaseEntityId("4355345345488")
+ .withEventType(EVENT_TYPE_CASE_DETAILS)
+ .withFormSubmissionId("gjhg34534 nvbnv3345345__16")
+ .withEventDate(new DateTime())
+ .withObs(obs);
+ event.addDetails(CASE_NUMBER, "141311000005892210504");
+ event.addDetails(FLAG, "Source");
+ PlanDefinition plan = new PlanDefinition();
+ plan.setIdentifier("identifier");
+
+ when(planRepository.get(anyString())).thenReturn(plan);
+ Mockito.doNothing().when(taskGenerator).processPlanEvaluation(any(PlanDefinition.class), anyString(), any(Event.class));
+ eventService.addEvent(event, username);
+
+ Event savedEvent = eventService.findByFormSubmissionId("gjhg34534 nvbnv3345345__16");
+ assertNotNull(savedEvent);
+ assertNotNull(savedEvent.getId());
+ assertNotNull(eventService.getById(savedEvent.getId()));
+
+ // add as duplicate with different FormSubmissionId
+ Event duplicateEvent = event.withFormSubmissionId("gjhg34534 nvbnv3345345__3444556");
+ eventService.addEvent(duplicateEvent, username);
+ }
@Test
public void testProcessOutOfArea() throws SQLException {