Skip to content

Commit

Permalink
Kavitha | refactored treatments API to include emergency medications
Browse files Browse the repository at this point in the history
  • Loading branch information
kavitha-sundararajan committed Jan 4, 2024
1 parent 1b6c4b5 commit 9df66f1
Show file tree
Hide file tree
Showing 12 changed files with 164 additions and 86 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -23,4 +24,6 @@ public interface SlotDAO {
List<Slot> getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType);

List<Slot> getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List<String> orderUuids);
}

List<Slot> getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -84,4 +85,16 @@ public List<Slot> getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere

return query.getResultList();
}

@Override
public List<Slot> 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();
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -30,4 +30,6 @@ public interface SlotService extends OpenmrsService {
List<Slot> getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List<String> orderUuids);

void voidSlot(Slot slot,String voidReason);

List<Slot> getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -75,4 +73,9 @@ public void voidSlot(Slot slot, String voidReason) throws APIException {
slotDAO.saveSlot(slot);
}


@Override
public List<Slot> getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType) {
return slotDAO.getSlotsByPatientAndVisitAndServiceType(subject, visit, serviceType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -17,15 +15,15 @@ public class DrugOrderScheduleResponse {
private List<Long> dayWiseSlotsStartTime;
private List<Long> remainingDaySlotsStartTime;
private Long slotStartTime;
private List<MedicationSlotResponse> 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();
}
}
Original file line number Diff line number Diff line change
@@ -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<IPDDrugOrderResponse> ipdDrugOrders;

@JsonInclude(JsonInclude.Include.NON_NULL)
private List<MedicationAdministrationResponse> emergencyMedications;

public static IPDTreatmentsResponse createFrom(List<IPDDrugOrderResponse> ipdDrugOrders, List<MedicationAdministrationResponse> emergencyMedications) {
return IPDTreatmentsResponse.builder()
.ipdDrugOrders(ipdDrugOrders)
.emergencyMedications(emergencyMedications)
.build();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<String> includes) throws ParseException {

List<IPDDrugOrder> prescribedOrders = ipdVisitService.getPrescribedOrders(visitUuid, true, null, null, null, false);
List<IPDDrugOrderResponse> prescribedOrderResponse = prescribedOrders.stream().map(IPDDrugOrderResponse::createFrom).collect(Collectors.toList());
List<MedicationAdministrationResponse> emergencyMedications = null;
if (includes != null && includes.contains("emergencyMedications")) {
List<Slot> 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);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<IPDDrugOrder> getPrescribedOrders(String visitUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly);
List<Slot> getMedicationSlots(String visitUuid, ServiceType serviceType);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -25,35 +31,47 @@

@Service
@Transactional
public class IPDDrugOrderServiceImpl implements IPDDrugOrderService {
public class IPDVisitServiceImpl implements IPDVisitService {

private BahmniDrugOrderService drugOrderService;
private IPDScheduleService ipdScheduleService;
private SlotTimeCreationService slotTimeCreationService;
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<IPDDrugOrder> getPrescribedOrders(List<String> visitUuids, String patientUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) {
List<DrugOrder> prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuids, patientUuid, includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly);
return getIPDDrugOrders(patientUuid, prescribedDrugOrders);
public List<IPDDrugOrder> getPrescribedOrders(String visitUuid, Boolean includeActiveVisit, Integer numberOfVisits, Date startDate, Date endDate, Boolean getEffectiveOrdersOnly) {
List<String> visitUuidsList = new ArrayList<>();
visitUuidsList.add(visitUuid);
Visit visit = visitService.getVisitByUuid(visitUuid);
List<DrugOrder> prescribedDrugOrders = drugOrderService.getPrescribedDrugOrders(visitUuidsList, visit.getPatient().getUuid(), includeActiveVisit, numberOfVisits, startDate, endDate, getEffectiveOrdersOnly);
return getIPDDrugOrders(visit.getPatient().getUuid(), prescribedDrugOrders);
}

private List<IPDDrugOrder> getIPDDrugOrders(String patientUuid, List<DrugOrder> drugOrders) {
Expand Down Expand Up @@ -124,4 +142,16 @@ private Collection<Concept> getOrdAttributeConcepts() {
Concept orderAttribute = conceptService.getConceptByName(BahmniOrderAttribute.ORDER_ATTRIBUTES_CONCEPT_SET_NAME);
return orderAttribute == null ? Collections.EMPTY_LIST : orderAttribute.getSetMembers();
}

@Override
public List<Slot> getMedicationSlots(String visitUuid, ServiceType serviceType) {
Visit visit = visitService.getVisitByUuid(visitUuid);
Concept concept = conceptService.getConceptByName(serviceType.conceptName());
Optional<Reference> subjectReference = referenceService.getReferenceByTypeAndTargetUUID(Patient.class.getTypeName(), visit.getPatient().getUuid());

if(!subjectReference.isPresent())
return Collections.emptyList();

return slotService.getSlotsByPatientAndVisitAndServiceType(subjectReference.get(), visit, concept);
}
}

0 comments on commit 9df66f1

Please sign in to comment.