From 4c48c41752bee5b9fdd69e4d0e6c6ebe06b96137 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Thu, 8 Feb 2024 17:42:47 +0530 Subject: [PATCH 1/4] Change to consider MedicationRequest as a default serviceType if is not sent in payload --- .../module/ipd/service/impl/IPDScheduleServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 f35f0ff..a0b7140 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 @@ -69,7 +69,8 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat savedSchedule = scheduleService.saveSchedule(schedule); } DrugOrder order = (DrugOrder) orderService.getOrderByUuid(scheduleMedicationRequest.getOrderUuid()); - if(scheduleMedicationRequest.getServiceType().equals(ServiceType.MEDICATION_REQUEST)){ + ServiceType serviceType = scheduleMedicationRequest.getServiceType() !=null ? scheduleMedicationRequest.getServiceType() : ServiceType.MEDICATION_REQUEST; + if(serviceType.equals(ServiceType.MEDICATION_REQUEST)){ List existingSlots = getMedicationSlots(patient.getUuid(),ServiceType.MEDICATION_REQUEST,new ArrayList<>(Arrays.asList(new String[]{order.getUuid()}))); if (existingSlots !=null && !existingSlots.isEmpty()) { throw new RuntimeException("Slots already created for this drug order"); @@ -78,7 +79,7 @@ public Schedule saveMedicationSchedule(ScheduleMedicationRequest scheduleMedicat slotFactory.createSlotsForMedicationFrom(savedSchedule, slotsStartTime, order, null, SCHEDULED, ServiceType.MEDICATION_REQUEST, scheduleMedicationRequest.getComments()) .forEach(slotService::saveSlot); } - else if (scheduleMedicationRequest.getServiceType().equals(ServiceType.AS_NEEDED_PLACEHOLDER)){ + else if (serviceType.equals(ServiceType.AS_NEEDED_PLACEHOLDER)){ Slot slot = slotFactory.createAsNeededPlaceholderSlot(savedSchedule, order, scheduleMedicationRequest.getComments()); slotService.saveSlot(slot); } From 923828b1fe2c21cd8ad7c528c868f3bf399cac18 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Thu, 8 Feb 2024 17:57:33 +0530 Subject: [PATCH 2/4] MAde Visit UUid as non-mandatory Param, if visit is not send consider Active Visit of the patient --- .../openmrs/module/ipd/controller/IPDScheduleController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java index 44b906c..153698a 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java +++ b/omod/src/main/java/org/openmrs/module/ipd/controller/IPDScheduleController.java @@ -81,14 +81,15 @@ public ResponseEntity updateMedicationSchedule(@RequestBody ScheduleMedi @ResponseBody public ResponseEntity getMedicationSlotsByDate(@RequestParam(value = "patientUuid") String patientUuid, @RequestParam(value = "startTime") Long startTime, @RequestParam(value = "endTime") Long endTime, - @RequestParam(value = "visitUuid") String visitUuid, + @RequestParam(value = "visitUuid",required = false) String visitUuid, @RequestParam(value = "view", required = false) String view) { try { ; if (startTime != null && endTime != null) { LocalDateTime localStartDate = convertEpocUTCToLocalTimeZone(startTime); LocalDateTime localEndDate = convertEpocUTCToLocalTimeZone(endTime); Boolean considerAdministeredTime = view!=null & IPDConstants.IPD_VIEW_DRUG_CHART.equals(view); - Visit visit = visitService.getVisitByUuid(visitUuid); + Patient patient=patientService.getPatientByUuid(patientUuid); + Visit visit = visitUuid !=null ? visitService.getVisitByUuid(visitUuid) : visitService.getActiveVisitsByPatient(patient).get(0); List slots = ipdScheduleService.getMedicationSlotsForTheGivenTimeFrame(patientUuid, localStartDate, localEndDate,considerAdministeredTime, visit); return new ResponseEntity<>(constructResponse(slots, visit), OK); } From 4a61a4eb3cdafcd1b66083b90ec859d9950e4734 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Fri, 9 Feb 2024 12:41:06 +0530 Subject: [PATCH 3/4] Backend changed to accomodate prn slots --- .../ipd/service/impl/IPDVisitServiceImpl.java | 5 ++ .../service/impl/SlotTimeCreationService.java | 55 ++++++++++--------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java index d765303..e14f1ec 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDVisitServiceImpl.java @@ -105,9 +105,14 @@ private Map getDrugOrderScheduleForOrders(String pati .map(BahmniDrugOrder::getUuid) .collect(Collectors.toList()); List slots = ipdScheduleService.getMedicationSlots(patientUuid, ServiceType.MEDICATION_REQUEST,orderUuids); + List prnSlots = ipdScheduleService.getMedicationSlots(patientUuid, ServiceType.AS_NEEDED_MEDICATION_REQUEST,orderUuids); + slots.addAll(prnSlots); Map> groupedByOrders = slots.stream() .collect(Collectors.groupingBy(slot -> (DrugOrder) slot.getOrder())); + Map drugOrderScheduleByOrders = slotTimeCreationService.getDrugOrderScheduledTime(groupedByOrders); + + return drugOrderScheduleByOrders; } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 56e66da..09c7ffa 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -104,33 +104,34 @@ private List getSlotsStartTimeWithStartTimeDurationFrequency(Sche public HashMap getDrugOrderScheduledTime(Map> slotsByOrder){ HashMap drugOrderScheduleHash= new HashMap<>(); for (DrugOrder drugOrder : slotsByOrder.keySet()) { - Double frequencyPerDay = drugOrder.getFrequency().getFrequencyPerDay(); - String frequency=drugOrder.getFrequency().getName(); - Map> groupedByDateAndEpoch = slotsByOrder.get(drugOrder).stream() - .collect(Collectors.groupingBy( - obj -> obj.getStartDateTime().toLocalDate(), - Collectors.mapping( - obj -> obj.getStartDateTime(), - Collectors.toList() - ) - )); - - List> sortedList = groupedByDateAndEpoch.entrySet().stream() - .sorted(Map.Entry.comparingByKey()) // Sort by LocalDate in ascending order - .map(Map.Entry::getValue) // Get the list of Longs for each entry - .collect(Collectors.toList()); // Collect the list of lists into a single ArrayList - - DrugOrderSchedule drugOrderSchedule=new DrugOrderSchedule(); - if (START_TIME_FREQUENCIES.contains(frequency)){ - drugOrderSchedule.setSlotStartTime(DateTimeUtil.convertLocalDateTimeToUTCEpoc(sortedList.get(0).get(0))); - } - else if (sortedList.get(0).size() == frequencyPerDay || (sortedList.size() == 1)) { - drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(0).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); - } else { - drugOrderSchedule.setFirstDaySlotsStartTime(sortedList.get(0).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); - drugOrderSchedule.setRemainingDaySlotsStartTime(sortedList.get(sortedList.size() - 1).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); - if (sortedList.size() > 2) { - drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(1).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); + DrugOrderSchedule drugOrderSchedule = new DrugOrderSchedule(); + if (!drugOrder.getAsNeeded()) { + Double frequencyPerDay = drugOrder.getFrequency().getFrequencyPerDay(); + String frequency = drugOrder.getFrequency().getName(); + Map> groupedByDateAndEpoch = slotsByOrder.get(drugOrder).stream() + .collect(Collectors.groupingBy( + obj -> obj.getStartDateTime().toLocalDate(), + Collectors.mapping( + obj -> obj.getStartDateTime(), + Collectors.toList() + ) + )); + + List> sortedList = groupedByDateAndEpoch.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) // Sort by LocalDate in ascending order + .map(Map.Entry::getValue) // Get the list of Longs for each entry + .collect(Collectors.toList()); // Collect the list of lists into a single ArrayList + + if (START_TIME_FREQUENCIES.contains(frequency)) { + drugOrderSchedule.setSlotStartTime(DateTimeUtil.convertLocalDateTimeToUTCEpoc(sortedList.get(0).get(0))); + } else if (sortedList.get(0).size() == frequencyPerDay || (sortedList.size() == 1)) { + drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(0).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); + } else { + drugOrderSchedule.setFirstDaySlotsStartTime(sortedList.get(0).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); + drugOrderSchedule.setRemainingDaySlotsStartTime(sortedList.get(sortedList.size() - 1).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); + if (sortedList.size() > 2) { + drugOrderSchedule.setDayWiseSlotsStartTime(sortedList.get(1).stream().map(DateTimeUtil::convertLocalDateTimeToUTCEpoc).collect(Collectors.toList())); + } } } drugOrderSchedule.setSlots(slotsByOrder.get(drugOrder)); From f272b842c11bc6785fcd057ab13f63a2c1c92f62 Mon Sep 17 00:00:00 2001 From: Kalaiyarasan Raja Date: Fri, 9 Feb 2024 17:43:25 +0530 Subject: [PATCH 4/4] added First Slot Start time to response in DrugOrderSchedule --- .../module/ipd/service/impl/SlotTimeCreationService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java index 09c7ffa..074bf79 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/SlotTimeCreationService.java @@ -105,7 +105,10 @@ private List getSlotsStartTimeWithStartTimeDurationFrequency(Sche HashMap drugOrderScheduleHash= new HashMap<>(); for (DrugOrder drugOrder : slotsByOrder.keySet()) { DrugOrderSchedule drugOrderSchedule = new DrugOrderSchedule(); - if (!drugOrder.getAsNeeded()) { + if (drugOrder.getAsNeeded()){ + drugOrderSchedule.setSlotStartTime(DateTimeUtil.convertLocalDateTimeToUTCEpoc(slotsByOrder.get(drugOrder).get(0).getStartDateTime())); + } + else { Double frequencyPerDay = drugOrder.getFrequency().getFrequencyPerDay(); String frequency = drugOrder.getFrequency().getName(); Map> groupedByDateAndEpoch = slotsByOrder.get(drugOrder).stream()