diff --git a/pom.xml b/pom.xml index 4e21d60e..a332c9e9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ opensrp-plan-evaluator jar - 0.0.16-SNAPSHOT + 0.0.17-SNAPSHOT OpenSRP Plan Evaluator OpenSRP Plan Evaluator Library https://github.com/OpenSRP/opensrp-plan-evaluator diff --git a/src/main/java/org/smartregister/domain/Task.java b/src/main/java/org/smartregister/domain/Task.java index a355f7eb..dfe2e43b 100644 --- a/src/main/java/org/smartregister/domain/Task.java +++ b/src/main/java/org/smartregister/domain/Task.java @@ -7,7 +7,9 @@ import org.joda.time.DateTime; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; @ToString public class Task implements Serializable{ @@ -22,7 +24,23 @@ public enum TaskStatus { IN_PROGRESS, @SerializedName("Completed") COMPLETED, @SerializedName("Failed") FAILED, @SerializedName("Archived") - ARCHIVED + ARCHIVED; + + private static final Map lookup = new HashMap(); + + static { + lookup.put("Draft", TaskStatus.DRAFT); + lookup.put("Ready", TaskStatus.READY); + lookup.put("Cancelled", TaskStatus.CANCELLED); + lookup.put("In Progress", TaskStatus.IN_PROGRESS); + lookup.put("Completed", TaskStatus.COMPLETED); + lookup.put("Failed", TaskStatus.FAILED); + lookup.put("Archived", TaskStatus.ARCHIVED); + } + + public static TaskStatus get(String algorithm) { + return lookup.get(algorithm); + } } public static final String[] INACTIVE_TASK_STATUS = new String[]{TaskStatus.CANCELLED.name(), TaskStatus.ARCHIVED.name()}; diff --git a/src/main/java/org/smartregister/pathevaluator/dao/TaskDao.java b/src/main/java/org/smartregister/pathevaluator/dao/TaskDao.java index 5b88fdce..53240257 100644 --- a/src/main/java/org/smartregister/pathevaluator/dao/TaskDao.java +++ b/src/main/java/org/smartregister/pathevaluator/dao/TaskDao.java @@ -33,5 +33,9 @@ public interface TaskDao { boolean checkIfTaskExists(String baseEntityId, String planIdentifier, String code); List findAllTasksForEntity(String id); - + + org.smartregister.domain.Task getTaskByEntityId(String id); + + void updateTask(org.smartregister.domain.Task task); + } diff --git a/src/main/java/org/smartregister/pathevaluator/plan/PlanEvaluator.java b/src/main/java/org/smartregister/pathevaluator/plan/PlanEvaluator.java index 7e434f70..8c231a0c 100644 --- a/src/main/java/org/smartregister/pathevaluator/plan/PlanEvaluator.java +++ b/src/main/java/org/smartregister/pathevaluator/plan/PlanEvaluator.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.List; +import org.smartregister.domain.Action; import org.smartregister.domain.Jurisdiction; import org.smartregister.domain.PlanDefinition; import org.smartregister.pathevaluator.PathEvaluatorLibrary; @@ -117,8 +118,13 @@ private void evaluatePlan(PlanDefinition planDefinition, TriggerType triggerEven questionnaireResponse == null ? resource : questionnaireResponse.toBuilder().contained(Collections.singleton(resource)).build(), action, planDefinition.getIdentifier(), triggerEvent)) { - taskHelper.generateTask(resource, action, planDefinition.getIdentifier(), jurisdiction.getCode(), - username,questionnaireResponse); + if (action.getType().equals(Action.ActionType.UPDATE)) { + taskHelper.updateTask(resource, action); + } else { + taskHelper.generateTask(resource, action, planDefinition.getIdentifier(), jurisdiction.getCode(), + username, questionnaireResponse); + } + } }); } diff --git a/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java b/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java index 6636fbbb..66109943 100644 --- a/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java +++ b/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java @@ -3,7 +3,9 @@ */ package org.smartregister.pathevaluator.task; +import java.lang.reflect.Field; import java.util.UUID; +import java.util.logging.Level; import java.util.logging.Logger; import org.joda.time.DateTime; @@ -70,6 +72,29 @@ public void generateTask(DomainResource resource, Action action, String planIden logger.info("Created task " + task.toString()); } } + + public void updateTask(DomainResource resource, Action action) { + TaskDao taskDao = PathEvaluatorLibrary.getInstance().getTaskProvider().getTaskDao(); + Task task = taskDao.getTaskByEntityId(resource.getId()); + try { + for (DynamicValue dynamicValue : action.getDynamicValue()) { + Field aField = task.getClass().getDeclaredField(dynamicValue.getPath()); + aField.setAccessible(true); + if (aField.getType().isAssignableFrom(Task.TaskStatus.class)) { + aField.set(task, Task.TaskStatus.get(dynamicValue.getExpression().getExpression())); + } else if (aField.getType().isAssignableFrom(String.class)) { + aField.set(task, dynamicValue.getExpression().getExpression()); + } else { + throw new IllegalArgumentException(); + } + } + } + catch (Exception e) { + logger.log(Level.SEVERE, "Exception occurred while updating properties using Reflection" + e); + } + + taskDao.updateTask(task); + } private DateTime getDateTime(ExecutionPeriod executionPeriod, boolean start) { if (executionPeriod != null) { diff --git a/src/test/java/org/smartregister/pathevaluator/TestData.java b/src/test/java/org/smartregister/pathevaluator/TestData.java index da3d4195..3cb481e9 100644 --- a/src/test/java/org/smartregister/pathevaluator/TestData.java +++ b/src/test/java/org/smartregister/pathevaluator/TestData.java @@ -7,11 +7,16 @@ import java.util.ArrayList; import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.smartregister.domain.Jurisdiction; +import org.smartregister.domain.Action; +import org.smartregister.domain.DynamicValue; +import org.smartregister.domain.Expression; import org.smartregister.domain.PlanDefinition; import org.smartregister.utils.DateTypeConverter; import org.smartregister.utils.TaskDateTimeTypeConverter; @@ -102,6 +107,8 @@ public class TestData { + "}]\n" + "}"; + public static String TASK_JSON = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":3,\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":null,\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T0700\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0,\"reasonReference\":\"reasonrefuuid\",\"location\":\"catchment1\",\"requester\":\"chw1\",\"syncStatus\":null,\"structureId\":null,\"rowid\":null}"; + public static PlanDefinition createPlan() { return gson.fromJson(plan, PlanDefinition.class); } @@ -141,4 +148,37 @@ public static PlanDefinition createPlanV1() { return gson.fromJson(plan_1, PlanDefinition.class); } + public static org.smartregister.domain.Task createDomainTask() { + return gson.fromJson(TASK_JSON, org.smartregister.domain.Task.class); + } + + public static Action createAction(){ + Action action = new Action(); + Set dynamicValues = new HashSet<>(); + DynamicValue dynamicValue = new DynamicValue(); + Expression expression = new Expression(); + expression.setExpression("Cancelled"); + dynamicValue.setPath("status"); + dynamicValue.setExpression(expression); + dynamicValues.add(dynamicValue); + + dynamicValue = new DynamicValue(); + expression = new Expression(); + expression.setExpression("Family Already Registered"); + dynamicValue.setPath("businessStatus"); + dynamicValue.setExpression(expression); + dynamicValues.add(dynamicValue); + + dynamicValue = new DynamicValue(); + expression = new Expression(); + expression.setExpression("Family Already Registered"); + dynamicValue.setPath("businessStatus"); + dynamicValue.setExpression(expression); + dynamicValues.add(dynamicValue); + + action.setType(Action.ActionType.UPDATE); + action.setDynamicValue(dynamicValues); + return action; + } + } diff --git a/src/test/java/org/smartregister/pathevaluator/task/TaskHelperTest.java b/src/test/java/org/smartregister/pathevaluator/task/TaskHelperTest.java index 235667b6..2360cbed 100644 --- a/src/test/java/org/smartregister/pathevaluator/task/TaskHelperTest.java +++ b/src/test/java/org/smartregister/pathevaluator/task/TaskHelperTest.java @@ -108,4 +108,19 @@ public void testShouldNotGenerateTask() { taskHelper.generateTask(patient, planDefinition.getActions().get(0), planIdentifier, jurisdiction, "testUser", null); verify(taskDao, never()).saveTask(any(Task.class), any(QuestionnaireResponse.class)); } + + @Test + public void testUpdateTask() { + Task task = TestData.createDomainTask(); + Action action = TestData.createAction(); + + when(taskDao.getTaskByEntityId(anyString())).thenReturn(task); + Mockito.doNothing().when(taskDao).updateTask(any(Task.class)); + taskHelper.updateTask(patient, action); + verify(taskDao, times(1)).updateTask(taskCaptor.capture()); + Task updatedTask = taskCaptor.getValue(); + assertEquals("location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc", updatedTask.getForEntity()); + assertEquals("Family Already Registered", updatedTask.getBusinessStatus()); + assertEquals("CANCELLED", updatedTask.getStatus().name()); + } }