From 5f252373caad5da5de64b002654d11d1b56d742a Mon Sep 17 00:00:00 2001 From: azizdiakite <38459539+azizdiakite@users.noreply.github.com> Date: Wed, 11 Sep 2024 09:15:24 +0000 Subject: [PATCH] Track progress of fhir task status (#50) * Track progress of fhir task status * Remove unused lines * Remove REQUESTED status from the list * Change RECEIVED to IN_PROGRESS while updating the status --- .../api/scheduler/FetchTaskUpdates.java | 80 ++++++++++++++++--- 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/labonfhir/api/scheduler/FetchTaskUpdates.java b/api/src/main/java/org/openmrs/module/labonfhir/api/scheduler/FetchTaskUpdates.java index dcd14b4..11542b6 100644 --- a/api/src/main/java/org/openmrs/module/labonfhir/api/scheduler/FetchTaskUpdates.java +++ b/api/src/main/java/org/openmrs/module/labonfhir/api/scheduler/FetchTaskUpdates.java @@ -29,6 +29,7 @@ import org.hl7.fhir.r4.model.Task; import org.hl7.fhir.r4.model.codesystems.TaskStatus; import org.openmrs.Order; +import org.openmrs.Order.FulfillerStatus; import org.openmrs.api.OrderService; import org.openmrs.module.fhir2.FhirConstants; import org.openmrs.module.fhir2.api.FhirDiagnosticReportService; @@ -119,13 +120,20 @@ public void execute() { lastRequstDate = dateFormat.format(lastRequest.getRequestDate()); } + String practitionerId = config.getLisUserUuid(); + String currentTime = dateFormat.format(newDate); DateRangeParam lastUpdated = new DateRangeParam().setLowerBound(lastRequstDate).setUpperBound(currentTime); // Get List of Tasks that belong to this instance and update them Bundle taskBundle = client.search().forResource(Task.class) .where(Task.IDENTIFIER.hasSystemWithAnyCode(FhirConstants.OPENMRS_FHIR_EXT_TASK_IDENTIFIER)) - .where(Task.STATUS.exactly().code(TaskStatus.COMPLETED.toCode())).lastUpdated(lastUpdated) + .where(Task.OWNER.hasId(practitionerId)) + .where(Task.STATUS.exactly().codes( + TaskStatus.COMPLETED.toCode(), + TaskStatus.ACCEPTED.toCode(), + TaskStatus.REJECTED.toCode(), + TaskStatus.CANCELLED.toCode())).lastUpdated(lastUpdated) .returnBundle(Bundle.class).execute(); List taskBundles = new ArrayList<>(); @@ -158,6 +166,7 @@ public void shutdown() { private Boolean updateTasksInBundle(List taskBundles) { Boolean tasksUpdated = false; + String commentText = "Update Order with remote fhir status :)"; for (Bundle bundle : taskBundles) { for (Iterator tasks = bundle.getEntry().iterator(); tasks.hasNext();) { String openmrsTaskUuid = null; @@ -172,19 +181,42 @@ private Boolean updateTasksInBundle(List taskBundles) { // Only update if matching OpenMRS Task found if (openmrsTask != null) { // Handle status - openmrsTask.setStatus(openelisTask.getStatus()); + if (openelisTask.getStatus().toString().equals(TaskStatus.COMPLETED.toString())) { + + openmrsTask.setStatus(openelisTask.getStatus()); - Boolean taskOutPutUpdated = false; - if(openmrsTask.hasBasedOn()){ - setOrderNumberFromLIS(openmrsTask.getBasedOn()); + Boolean taskOutPutUpdated = false; + if(openmrsTask.hasBasedOn()){ + setOrderNumberFromLIS(openmrsTask.getBasedOn()); + } + if (openelisTask.hasOutput()) { + // openmrsTask.setOutput(openelisTask.getOutput()); + taskOutPutUpdated = updateOutput(openelisTask.getOutput(), openmrsTask); + } + if (taskOutPutUpdated) { + taskService.update(openmrsTaskUuid, openmrsTask); + tasksUpdated = taskOutPutUpdated; + } + } + + if(openelisTask.getStatus().toString().equals(TaskStatus.REJECTED.toString()) ){ + openmrsTask.setStatus(openelisTask.getStatus()); + commentText = openelisTask.getStatusReason().getText().toString().isEmpty() ? commentText: openelisTask.getStatusReason().getText(); + setOrderStatus(openmrsTask.getBasedOn(), openelisTask.getStatus().toCode(), Order.FulfillerStatus.EXCEPTION, commentText); + tasksUpdated = true; } - if (openelisTask.hasOutput()) { - // openmrsTask.setOutput(openelisTask.getOutput()); - taskOutPutUpdated = updateOutput(openelisTask.getOutput(), openmrsTask); + + if(openelisTask.getStatus().toString().equals(TaskStatus.CANCELLED.toString()) ){ + openmrsTask.setStatus(openelisTask.getStatus()); + commentText = TaskStatus.CANCELLED.toString(); + setOrderStatus(openmrsTask.getBasedOn(), openelisTask.getStatus().toCode(), Order.FulfillerStatus.EXCEPTION, commentText); + tasksUpdated = true; } - if (taskOutPutUpdated) { - taskService.update(openmrsTaskUuid, openmrsTask); - tasksUpdated = taskOutPutUpdated; + + if( openelisTask.getStatus().toString().equals(TaskStatus.ACCEPTED.toString()) ){ + openmrsTask.setStatus(openelisTask.getStatus()); + setOrderStatus(openmrsTask.getBasedOn(), openelisTask.getStatus().toCode(), Order.FulfillerStatus.IN_PROGRESS, commentText); + tasksUpdated = true; } } } @@ -210,7 +242,7 @@ private void setOrderNumberFromLIS(List basedOn) { if (order != null) { String commentText = "Update Order with Accesion Number From LIS"; String accessionNumber = serviceRequest.getRequisition().getValue(); - orderService.updateOrderFulfillerStatus(order, Order.FulfillerStatus.IN_PROGRESS, + orderService.updateOrderFulfillerStatus(order, Order.FulfillerStatus.COMPLETED, commentText, accessionNumber); } } @@ -285,6 +317,30 @@ private Boolean updateOutput(List output, Task openmrs } return taskOutPutUpdated; } + private void setOrderStatus(List basedOn, String string, FulfillerStatus fulfillerStatus, String commentText) { + basedOn.forEach(ref -> { + if (ref.hasReferenceElement()) { + IIdType referenceElement = ref.getReferenceElement(); + if ("ServiceRequest".equals(referenceElement.getResourceType())) { + String serviceRequestUuid = referenceElement.getIdPart(); + try { + + Order order = orderService.getOrderByUuid(serviceRequestUuid); + if (order != null) { + String accessionNumber = ""; + orderService.updateOrderFulfillerStatus(order, fulfillerStatus, + commentText, accessionNumber); + } + + } + catch (ResourceNotFoundException e) { + log.error( + "Could not Fetch ServiceRequest/" + serviceRequestUuid + ":" + e.toString() + getStackTrace(e)); + } + } + } + }); + } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {