From 9df66f132579be1a3891fce18a30da06ec365c82 Mon Sep 17 00:00:00 2001 From: Kavitha S Date: Thu, 4 Jan 2024 14:01:41 +0530 Subject: [PATCH] Kavitha | refactored treatments API to include emergency medications --- .../openmrs/module/ipd/api/dao/SlotDAO.java | 5 +- .../ipd/api/dao/impl/HibernateSlotDAO.java | 13 +++++ .../module/ipd/api/service/SlotService.java | 4 +- .../ipd/api/service/impl/SlotServiceImpl.java | 9 ++-- .../contract/DrugOrderScheduleResponse.java | 18 +++---- .../ipd/contract/IPDTreatmentsResponse.java | 28 +++++++++++ .../controller/IPDDrugOrderController.java | 49 ------------------ .../ipd/controller/IPDVisitController.java | 48 ++++++++++++++++++ .../ipd/service/IPDDrugOrderService.java | 11 ---- .../module/ipd/service/IPDVisitService.java | 14 ++++++ .../service/impl/IPDScheduleServiceImpl.java | 1 - ...viceImpl.java => IPDVisitServiceImpl.java} | 50 +++++++++++++++---- 12 files changed, 164 insertions(+), 86 deletions(-) create mode 100644 omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java delete mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java create mode 100644 omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java rename omod/src/main/java/org/openmrs/module/ipd/service/impl/{IPDDrugOrderServiceImpl.java => IPDVisitServiceImpl.java} (71%) diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java index 36546c3..939b1f8 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java @@ -1,6 +1,7 @@ package org.openmrs.module.ipd.api.dao; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.db.DAOException; @@ -23,4 +24,6 @@ public interface SlotDAO { List getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType); List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); -} \ No newline at end of file + + List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType); +} diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java index 241e4f7..a494c1a 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateSlotDAO.java @@ -2,6 +2,7 @@ import org.hibernate.query.Query; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Slot; @@ -84,4 +85,16 @@ public List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere return query.getResultList(); } + + @Override + public List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType) { + Query query = sessionFactory.getCurrentSession() + .createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.schedule.visit=:visit and slot.serviceType=:serviceType"); + + query.setParameter("subject", subject); + query.setParameter("visit", visit); + query.setParameter("serviceType", serviceType); + + return query.getResultList(); + } } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java index e4fb189..46725a5 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/SlotService.java @@ -1,8 +1,8 @@ package org.openmrs.module.ipd.api.service; import org.openmrs.Concept; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.model.Reference; -import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.api.APIException; import org.openmrs.api.OpenmrsService; @@ -30,4 +30,6 @@ public interface SlotService extends OpenmrsService { List getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List orderUuids); void voidSlot(Slot slot,String voidReason); + + List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType); } diff --git a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java index 8767cea..3eb063a 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/service/impl/SlotServiceImpl.java @@ -2,9 +2,9 @@ import org.openmrs.Concept; import org.openmrs.api.context.Context; +import org.openmrs.Visit; import org.openmrs.module.ipd.api.dao.SlotDAO; import org.openmrs.module.ipd.api.model.Reference; -import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; import org.openmrs.module.ipd.api.service.SlotService; import org.openmrs.api.APIException; @@ -16,8 +16,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.List; @@ -75,4 +73,9 @@ public void voidSlot(Slot slot, String voidReason) throws APIException { slotDAO.saveSlot(slot); } + + @Override + public List getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType) { + return slotDAO.getSlotsByPatientAndVisitAndServiceType(subject, visit, serviceType); + } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java index 27a5f98..c7ee133 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/DrugOrderScheduleResponse.java @@ -2,10 +2,8 @@ import lombok.*; import org.openmrs.module.ipd.model.DrugOrderSchedule; -import org.openmrs.module.webservices.rest.web.representation.Representation; import java.util.List; -import java.util.stream.Collectors; @Getter @Builder @@ -17,15 +15,15 @@ public class DrugOrderScheduleResponse { private List dayWiseSlotsStartTime; private List remainingDaySlotsStartTime; private Long slotStartTime; - private List slots; + private Boolean medicationAdministrationStarted; public static DrugOrderScheduleResponse createFrom(DrugOrderSchedule drugOrderSchedule){ - return DrugOrderScheduleResponse.builder(). - firstDaySlotsStartTime(drugOrderSchedule.getFirstDaySlotsStartTime()). - dayWiseSlotsStartTime(drugOrderSchedule.getDayWiseSlotsStartTime()). - remainingDaySlotsStartTime(drugOrderSchedule.getRemainingDaySlotsStartTime()). - slotStartTime(drugOrderSchedule.getSlotStartTime()). - slots(drugOrderSchedule.getSlots().stream().map(slot -> MedicationSlotResponse.createFrom(slot, Representation.REF)).collect(Collectors.toList())). - build(); + return DrugOrderScheduleResponse.builder(). + firstDaySlotsStartTime(drugOrderSchedule.getFirstDaySlotsStartTime()). + dayWiseSlotsStartTime(drugOrderSchedule.getDayWiseSlotsStartTime()). + remainingDaySlotsStartTime(drugOrderSchedule.getRemainingDaySlotsStartTime()). + slotStartTime(drugOrderSchedule.getSlotStartTime()). + medicationAdministrationStarted(drugOrderSchedule.getSlots().stream().anyMatch(slot -> slot.getMedicationAdministration() != null)). + build(); } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java new file mode 100644 index 0000000..1b9e195 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/contract/IPDTreatmentsResponse.java @@ -0,0 +1,28 @@ +package org.openmrs.module.ipd.contract; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IPDTreatmentsResponse { + + private List ipdDrugOrders; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private List emergencyMedications; + + public static IPDTreatmentsResponse createFrom(List ipdDrugOrders, List emergencyMedications) { + return IPDTreatmentsResponse.builder() + .ipdDrugOrders(ipdDrugOrders) + .emergencyMedications(emergencyMedications) + .build(); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java deleted file mode 100644 index 9972913..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDDrugOrderController.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.openmrs.module.ipd.controller; - -import lombok.extern.slf4j.Slf4j; -import org.bahmni.module.bahmnicore.util.BahmniDateUtil; -import org.openmrs.module.ipd.model.IPDDrugOrder; -import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; -import org.openmrs.module.ipd.service.IPDDrugOrderService; -import org.openmrs.module.webservices.rest.web.RestConstants; -import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import java.text.ParseException; -import java.util.*; -import java.util.stream.Collectors; - -@Controller -@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipd") -@Slf4j -public class IPDDrugOrderController extends BaseRestController { - - private IPDDrugOrderService ipdDrugOrderService; - - @Autowired - public IPDDrugOrderController(IPDDrugOrderService ipdDrugOrderService) { - this.ipdDrugOrderService = ipdDrugOrderService; - } - - @RequestMapping(value = "/drugOrders", method = RequestMethod.GET) - @ResponseBody - public List getVisitWisePrescribedAndOtherActiveOrders( - @RequestParam(value = "patientUuid") String patientUuid, - @RequestParam(value = "numberOfVisits", required = false) Integer numberOfVisits, - @RequestParam(value = "visitUuids", required = false) List visitUuids, - @RequestParam(value = "startDate", required = false) String startDateStr, - @RequestParam(value = "endDate", required = false) String endDateStr, - @RequestParam(value = "includes", required = false) List includes, - @RequestParam(value = "getEffectiveOrdersOnly", required = false) Boolean getEffectiveOrdersOnly) throws ParseException { - - Date startDate = BahmniDateUtil.convertToDate(startDateStr, BahmniDateUtil.DateFormatType.UTC); - Date endDate = BahmniDateUtil.convertToDate(endDateStr, BahmniDateUtil.DateFormatType.UTC); - - List prescribedOrders = ipdDrugOrderService.getPrescribedOrders(visitUuids, patientUuid, true, numberOfVisits, startDate, endDate, Boolean.TRUE.equals(getEffectiveOrdersOnly)); - return prescribedOrders.stream().map(IPDDrugOrderResponse::createFrom).collect(Collectors.toList()); - } -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java new file mode 100644 index 0000000..d6857e6 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDVisitController.java @@ -0,0 +1,48 @@ +package org.openmrs.module.ipd.controller; + +import lombok.extern.slf4j.Slf4j; +import org.openmrs.module.ipd.api.model.ServiceType; +import org.openmrs.module.ipd.api.model.Slot; +import org.openmrs.module.ipd.contract.IPDDrugOrderResponse; +import org.openmrs.module.ipd.contract.IPDTreatmentsResponse; +import org.openmrs.module.ipd.contract.MedicationAdministrationResponse; +import org.openmrs.module.ipd.model.IPDDrugOrder; +import org.openmrs.module.ipd.service.IPDVisitService; +import org.openmrs.module.webservices.rest.web.RestConstants; +import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.text.ParseException; +import java.util.*; +import java.util.stream.Collectors; + +@Controller +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/ipdVisit/{visitUuid}") +@Slf4j +public class IPDVisitController extends BaseRestController { + + private IPDVisitService ipdVisitService; + + @Autowired + public IPDVisitController(IPDVisitService ipdVisitService) { + this.ipdVisitService = ipdVisitService; + } + + @RequestMapping(value = "/medication", method = RequestMethod.GET) + @ResponseBody + public IPDTreatmentsResponse getVisitWiseMedications ( + @PathVariable("visitUuid") String visitUuid, + @RequestParam(value = "includes", required = false) List includes) throws ParseException { + + List prescribedOrders = ipdVisitService.getPrescribedOrders(visitUuid, true, null, null, null, false); + List prescribedOrderResponse = prescribedOrders.stream().map(IPDDrugOrderResponse::createFrom).collect(Collectors.toList()); + List emergencyMedications = null; + if (includes != null && includes.contains("emergencyMedications")) { + List emergencyMedicationSlots = ipdVisitService.getMedicationSlots(visitUuid, ServiceType.EMERGENCY_MEDICATION_REQUEST); + emergencyMedications = emergencyMedicationSlots.stream().map(slot -> MedicationAdministrationResponse.createFrom(slot.getMedicationAdministration())).collect(Collectors.toList()); + } + return IPDTreatmentsResponse.createFrom(prescribedOrderResponse, emergencyMedications); + } +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java deleted file mode 100644 index 6abc974..0000000 --- a/omod/src/main/java/org/openmrs/module/ipd/service/IPDDrugOrderService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.openmrs.module.ipd.service; - -import org.openmrs.module.ipd.model.IPDDrugOrder; - -import java.util.Date; -import java.util.List; - -public interface IPDDrugOrderService { - - List getPrescribedOrders(List visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly); -} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java b/omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java new file mode 100644 index 0000000..c000f32 --- /dev/null +++ b/omod/src/main/java/org/openmrs/module/ipd/service/IPDVisitService.java @@ -0,0 +1,14 @@ +package org.openmrs.module.ipd.service; + +import org.openmrs.module.ipd.model.IPDDrugOrder; +import org.openmrs.module.ipd.api.model.ServiceType; +import org.openmrs.module.ipd.api.model.Slot; + +import java.util.Date; +import java.util.List; + +public interface IPDVisitService { + + List getPrescribedOrders(String visitUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly); + List getMedicationSlots(String visitUuid, ServiceType serviceType); +} diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java index 14110d7..64cbc5c 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDScheduleServiceImpl.java @@ -8,7 +8,6 @@ import org.openmrs.api.OrderService; import org.openmrs.api.PatientService; import org.openmrs.api.VisitService; -import org.openmrs.api.context.Context; import org.openmrs.module.ipd.api.model.Reference; import org.openmrs.module.ipd.api.model.Schedule; import org.openmrs.module.ipd.api.model.ServiceType; diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java similarity index 71% rename from omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java rename to omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java index 464ca98..af9fb09 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDDrugOrderServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java @@ -4,7 +4,10 @@ import org.bahmni.module.bahmnicore.service.BahmniObsService; import org.openmrs.Concept; import org.openmrs.DrugOrder; +import org.openmrs.Patient; +import org.openmrs.Visit; import org.openmrs.api.ConceptService; +import org.openmrs.api.VisitService; import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniDrugOrder; import org.openmrs.module.bahmniemrapi.drugorder.contract.BahmniOrderAttribute; import org.openmrs.module.bahmniemrapi.drugorder.mapper.BahmniDrugOrderMapper; @@ -13,7 +16,10 @@ import org.openmrs.module.ipd.model.IPDDrugOrder; import org.openmrs.module.ipd.api.model.ServiceType; import org.openmrs.module.ipd.api.model.Slot; -import org.openmrs.module.ipd.service.IPDDrugOrderService; +import org.openmrs.module.ipd.api.model.*; +import org.openmrs.module.ipd.api.service.ReferenceService; +import org.openmrs.module.ipd.api.service.SlotService; +import org.openmrs.module.ipd.service.IPDVisitService; import org.openmrs.module.ipd.service.IPDScheduleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -25,7 +31,7 @@ @Service @Transactional -public class IPDDrugOrderServiceImpl implements IPDDrugOrderService { +public class IPDVisitServiceImpl implements IPDVisitService { private BahmniDrugOrderService drugOrderService; private IPDScheduleService ipdScheduleService; @@ -33,27 +39,39 @@ public class IPDDrugOrderServiceImpl implements IPDDrugOrderService { private BahmniObsService bahmniObsService; private ConceptService conceptService; private BahmniDrugOrderMapper bahmniDrugOrderMapper; + private ReferenceService referenceService; + private VisitService visitService; + private SlotService slotService; @Autowired - public IPDDrugOrderServiceImpl(BahmniDrugOrderService drugOrderService, - IPDScheduleService ipdScheduleService, - SlotTimeCreationService slotTimeCreationService, - BahmniObsService bahmniObsService, - ConceptService conceptService) { + public IPDVisitServiceImpl(BahmniDrugOrderService drugOrderService, + IPDScheduleService ipdScheduleService, + SlotTimeCreationService slotTimeCreationService, + BahmniObsService bahmniObsService, + ConceptService conceptService, + ReferenceService referenceService, + VisitService visitService, + SlotService slotService) { this.drugOrderService = drugOrderService; this.ipdScheduleService = ipdScheduleService; this.slotTimeCreationService = slotTimeCreationService; this.bahmniObsService = bahmniObsService; this.conceptService = conceptService; this.bahmniDrugOrderMapper = new BahmniDrugOrderMapper(); + this.referenceService = referenceService; + this.visitService = visitService; + this.slotService = slotService; } @Override - public List getPrescribedOrders(List visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) { - List prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuids, patientUuid, includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly); - return getIPDDrugOrders(patientUuid, prescribedDrugOrders); + public List getPrescribedOrders(String visitUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) { + List visitUuidsList = new ArrayList<>(); + visitUuidsList.add(visitUuid); + Visit visit = visitService.getVisitByUuid(visitUuid); + List prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuidsList, visit.getPatient().getUuid(), includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly); + return getIPDDrugOrders(visit.getPatient().getUuid(), prescribedDrugOrders); } private List getIPDDrugOrders(String patientUuid, List drugOrders) { @@ -124,4 +142,16 @@ private Collection getOrdAttributeConcepts() { Concept orderAttribute = conceptService.getConceptByName(BahmniOrderAttribute.ORDER_ATTRIBUTES_CONCEPT_SET_NAME); return orderAttribute == null ? Collections.EMPTY_LIST : orderAttribute.getSetMembers(); } + + @Override + public List getMedicationSlots(String visitUuid, ServiceType serviceType) { + Visit visit = visitService.getVisitByUuid(visitUuid); + Concept concept = conceptService.getConceptByName(serviceType.conceptName()); + Optional subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), visit.getPatient().getUuid()); + + if(!subjectReference.isPresent()) + return Collections.emptyList(); + + return slotService.getSlotsByPatientAndVisitAndServiceType(subjectReference.get(), visit, concept); + } }