Skip to content

Commit

Permalink
for RACD events, check no event exists with case_number, and flag
Browse files Browse the repository at this point in the history
case_number and flag, should be unique
  • Loading branch information
LZRS committed Sep 1, 2021
1 parent 4569134 commit efa2557
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 5 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<artifactId>opensrp-server-core</artifactId>
<packaging>jar</packaging>
<version>2.12.5-SNAPSHOT</version>
<version>2.12.6-SNAPSHOT</version>
<name>opensrp-server-core</name>
<description>OpenSRP Server Core module</description>
<url>https://github.com/OpenSRP/opensrp-server-core</url>
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/opensrp/repository/EventsRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Event>, EventDao {

Expand Down Expand Up @@ -95,5 +96,13 @@ Pair<List<String>, Long> findIdsByEventType(String eventType, boolean isDeleted,
List<String> findBaseEntityIdsByLocation(String locationId);

List<org.opensrp.domain.postgres.Event> 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);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -715,6 +716,9 @@ public List<QuestionnaireResponse> findEventsByJurisdictionIdAndPlan(String juri
.collect(Collectors.toList());
/**@formatter:on*/
}



@Override
public boolean checkEventExists(@NonNull String caseNumber, @NonNull String flag) {
return eventMapper.selectCaseTriggeredEventExists(caseNumber, flag);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,7 @@ List<Event> selectByBaseEntityIdAndDetails(@Param("baseEntityId") String baseEnt

int updateByPrimaryKeyAndGenerateServerVersion(Event record);

boolean selectCaseTriggeredEventExists(@Param("caseNumber") String caseNumber,
@Param("flag") String flag);

}
Original file line number Diff line number Diff line change
Expand Up @@ -134,5 +134,12 @@
and e.date_deleted is null
</select>

<select id="selectCaseTriggeredEventExists" resultType="boolean" useCache="false">
select EXISTS(
select id
from core.event
where json->'details'->>'case_number'= #{caseNumber,jdbcType=VARCHAR}
and json->'details'->>'flag'=#{flag,jdbcType=VARCHAR})
</select>

</mapper>
34 changes: 33 additions & 1 deletion src/main/java/org/opensrp/service/EventService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -674,4 +702,8 @@ public ExportImagesSummary getImagesMetadataForFlagProblemEvent(String planIdent

}

public boolean checkIfEventExists(@NonNull String caseNumber, @NonNull String flag){
return allEvents.checkEventExists(caseNumber, flag);
}

}
3 changes: 3 additions & 0 deletions src/main/java/org/opensrp/util/constants/EventConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
34 changes: 33 additions & 1 deletion src/test/java/org/opensrp/service/EventServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit efa2557

Please sign in to comment.