From f742f9177588436981799d1a8636b28c3ff82ef3 Mon Sep 17 00:00:00 2001 From: Dutervil Date: Mon, 22 Sep 2025 10:46:13 -0400 Subject: [PATCH] Show lab prescription taken from Analyse form to lab order form for a specific patient --- api/src/main/resources/messages.properties | 3 +- api/src/main/resources/messages_fr.properties | 3 +- .../module/pihapps/constant/AppConstant.java | 6 ++ .../labs/LabOrderPageController.java | 20 +++-- .../service/LabPrescriptionService.java | 11 +++ .../impl/LabPrescriptionServiceImpl.java | 90 +++++++++++++++++++ omod/src/main/webapp/pages/labs/labOrder.gsp | 56 +++++++++++- 7 files changed, 176 insertions(+), 13 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/pihapps/constant/AppConstant.java create mode 100644 omod/src/main/java/org/openmrs/module/pihapps/service/LabPrescriptionService.java create mode 100644 omod/src/main/java/org/openmrs/module/pihapps/service/impl/LabPrescriptionServiceImpl.java diff --git a/api/src/main/resources/messages.properties b/api/src/main/resources/messages.properties index b7d10ce..ba56b14 100644 --- a/api/src/main/resources/messages.properties +++ b/api/src/main/resources/messages.properties @@ -34,4 +34,5 @@ pihapps.orderReason=Order reason pihapps.status=Status pihapps.discontinue=Discontinue pihapps.discontinueOrder=Discontinue order -pihapps.discontinueReason=Discontinue reason \ No newline at end of file +pihapps.discontinueReason=Discontinue reason +pihapps.addLabOrders.ExamstoOrder=Exams to Order \ No newline at end of file diff --git a/api/src/main/resources/messages_fr.properties b/api/src/main/resources/messages_fr.properties index 5c06c99..8001d92 100644 --- a/api/src/main/resources/messages_fr.properties +++ b/api/src/main/resources/messages_fr.properties @@ -34,4 +34,5 @@ pihapps.return=Retourner pihapps.status=État pihapps.discontinue=Interrompre pihapps.discontinueOrder=Interrompre l'ordonnance -pihapps.discontinueReason=Raison d'interrompre \ No newline at end of file +pihapps.discontinueReason=Raison d'interrompre +pihapps.addLabOrders.ExamstoOrder=Examens � commander \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/pihapps/constant/AppConstant.java b/omod/src/main/java/org/openmrs/module/pihapps/constant/AppConstant.java new file mode 100644 index 0000000..d46743e --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/pihapps/constant/AppConstant.java @@ -0,0 +1,6 @@ +package org.openmrs.module.pihapps.constant; + +public class AppConstant { + public static final String LAB_TEST_ORDERED_MAPPING = "10745"; + public static final String LAB_TEST_ORDERED_MAPPING_SOURCE = "PIH"; +} diff --git a/omod/src/main/java/org/openmrs/module/pihapps/page/controller/labs/LabOrderPageController.java b/omod/src/main/java/org/openmrs/module/pihapps/page/controller/labs/LabOrderPageController.java index db9c7f2..f5ae12b 100644 --- a/omod/src/main/java/org/openmrs/module/pihapps/page/controller/labs/LabOrderPageController.java +++ b/omod/src/main/java/org/openmrs/module/pihapps/page/controller/labs/LabOrderPageController.java @@ -3,12 +3,13 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.openmrs.Concept; -import org.openmrs.ConceptAnswer; -import org.openmrs.Patient; +import org.openmrs.*; import org.openmrs.api.ConceptService; +import org.openmrs.api.ObsService; import org.openmrs.module.emrapi.patient.PatientDomainWrapper; import org.openmrs.module.pihapps.PihAppsUtils; +import org.openmrs.module.pihapps.service.LabPrescriptionService; +import org.openmrs.module.pihapps.service.impl.LabPrescriptionServiceImpl; import org.openmrs.ui.framework.UiUtils; import org.openmrs.ui.framework.annotation.InjectBeans; import org.openmrs.ui.framework.annotation.SpringBean; @@ -16,10 +17,7 @@ import org.openmrs.util.ConfigUtil; import org.springframework.web.bind.annotation.RequestParam; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class LabOrderPageController { @@ -29,7 +27,9 @@ public void get(PageModel model, UiUtils ui, @InjectBeans PatientDomainWrapper patientDomainWrapper, @RequestParam(value = "patient") Patient patient, @RequestParam(value = "returnUrl", required = false) String returnUrl, - @SpringBean("conceptService") ConceptService conceptService) { + @SpringBean("conceptService") ConceptService conceptService, + @SpringBean LabPrescriptionService labPrescriptionService + ) { String labSetProp = ConfigUtil.getGlobalProperty("orderentryowa.labOrderablesConceptSet"); Concept labSet = conceptService.getConceptByReference(labSetProp); @@ -65,8 +65,10 @@ else if (reasonConcept.getAnswers() != null && !reasonConcept.getAnswers().isEmp } } } - + // Get lab prescriptions for this patient + List labPrescriptions = labPrescriptionService.getLabPrescriptions(patient); patientDomainWrapper.setPatient(patient); + model.addAttribute("labPrescriptions", labPrescriptions); model.addAttribute("patient", patientDomainWrapper); model.addAttribute("labSet", labSet); model.addAttribute("orderReasonsMap", orderReasonsMap); diff --git a/omod/src/main/java/org/openmrs/module/pihapps/service/LabPrescriptionService.java b/omod/src/main/java/org/openmrs/module/pihapps/service/LabPrescriptionService.java new file mode 100644 index 0000000..7aa1c37 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/pihapps/service/LabPrescriptionService.java @@ -0,0 +1,11 @@ +package org.openmrs.module.pihapps.service; + +import org.openmrs.Patient; + + +import java.util.List; + +public interface LabPrescriptionService { + // Returns a list of lab prescriptions for the given patient. + List getLabPrescriptions(Patient patient); +} diff --git a/omod/src/main/java/org/openmrs/module/pihapps/service/impl/LabPrescriptionServiceImpl.java b/omod/src/main/java/org/openmrs/module/pihapps/service/impl/LabPrescriptionServiceImpl.java new file mode 100644 index 0000000..ebf240c --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/pihapps/service/impl/LabPrescriptionServiceImpl.java @@ -0,0 +1,90 @@ +package org.openmrs.module.pihapps.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.BooleanUtils; +import org.openmrs.*; +import org.openmrs.api.ConceptService; +import org.openmrs.api.ObsService; +import org.openmrs.api.OrderService; +import org.openmrs.api.context.Context; +import org.openmrs.api.db.hibernate.HibernateUtil; +import org.openmrs.module.pihapps.service.LabPrescriptionService; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +import static org.openmrs.module.pihapps.constant.AppConstant.LAB_TEST_ORDERED_MAPPING; +import static org.openmrs.module.pihapps.constant.AppConstant.LAB_TEST_ORDERED_MAPPING_SOURCE; + +@Service +@Slf4j +public class LabPrescriptionServiceImpl implements LabPrescriptionService { + private final OrderService orderService; + private final ConceptService conceptService; + private final ObsService obsService; + + public LabPrescriptionServiceImpl( + @Qualifier("orderService") OrderService orderService, + @Qualifier("conceptService") ConceptService conceptService, + @Qualifier("obsService") ObsService obsService ) { + this.orderService = orderService; + this.conceptService = conceptService; + this.obsService = obsService; + } + + @Override + public List getLabPrescriptions(Patient patient) { + + // This list is to store the lab exam name; + List labTests = new ArrayList<>(); + Concept concept = conceptService.getConceptByMapping(LAB_TEST_ORDERED_MAPPING, LAB_TEST_ORDERED_MAPPING_SOURCE); + + if (concept == null) { + return Collections.emptyList(); + } + + // Get obs + List observations = obsService.getObservationsByPersonAndConcept(patient, concept); + observations.sort(Comparator.comparing(Obs::getObsDatetime).reversed()); + Locale userLocale = Context.getLocale(); + + + // Get lab test names and store in list + for (Obs obs : observations) { + if (obs.getValueCoded() != null) { + labTests.add(obs.getValueCoded().getName(userLocale).getName()); + } + } + + // Get RECEIVED orders + List labOrders = getLabOrders(patient); + Set receivedOrderNames = labOrders.stream() + .map(order -> order.getConcept().getName(userLocale).getName()) + .collect(Collectors.toSet()); + + + // Filter out names that already exist in received orders + List filteredLabTests = labTests.stream() + .filter(name -> !receivedOrderNames.contains(name)) + .collect(Collectors.toList()); + + // If all lab prescriptions are already received, return empty list + return filteredLabTests.isEmpty() ? Collections.emptyList() : filteredLabTests; + } + + // This method is to get all RECEIVED orders for a patient. + private List getLabOrders(Patient patient) { + List labOrders = new ArrayList<>(); + for (Order order : orderService.getAllOrdersByPatient(patient)) { + order = HibernateUtil.getRealObjectFromProxy(order); + if (order instanceof TestOrder && BooleanUtils.isNotTrue(order.getVoided())) { + labOrders.add((TestOrder) order); + } + } + return labOrders; + } + + +} diff --git a/omod/src/main/webapp/pages/labs/labOrder.gsp b/omod/src/main/webapp/pages/labs/labOrder.gsp index 60b314e..1cfafbd 100644 --- a/omod/src/main/webapp/pages/labs/labOrder.gsp +++ b/omod/src/main/webapp/pages/labs/labOrder.gsp @@ -267,7 +267,37 @@ ${ui.includeFragment("coreapps", "patientHeader", [patient: patient.patient])}