Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IPD Treatment Display Control Get API Changes & Edit Drug Chart API Changes #8

Merged
merged 55 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from 54 commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
1a1a1b8
[Ritesh] | 1. Repo set up. 2. Created Slot and Schedule entity 3.Savi…
riteshghiya90 Jul 26, 2023
5624b68
[Ritesh] | 1. Update package name 2. Added Dao and Service layer for …
riteshghiya90 Jul 27, 2023
d660aca
[Ritesh] | 1.Rename Schedule Strategy to MedicationFrequency
riteshghiya90 Jul 28, 2023
f1f7c84
[Ritesh] | 1. Migration for slot. 2. Slot creation from schedule
riteshghiya90 Jul 31, 2023
631e13c
[Ritesh] | 1. Refactor SlotTimeCreationService
riteshghiya90 Aug 2, 2023
b25f1ff
[Ritesh] | 1. Handle time zone issue while creating slots and schedule.
riteshghiya90 Aug 3, 2023
164d2f6
[Ritesh] | 1. Changing the url of saving medication
riteshghiya90 Aug 3, 2023
4dd314d
[Ritesh] | 1. Returning slots
riteshghiya90 Aug 3, 2023
6f705b2
[Ritesh] | Get schedule for Drug chart
riteshghiya90 Aug 3, 2023
6e2b5fb
[Ritesh] | Fix date time issue in slots response
riteshghiya90 Aug 3, 2023
4c85e25
[Ritesh] | Refactoring and Added test
riteshghiya90 Aug 6, 2023
46ea8ce
[Ritesh] | 1. Change for reference id to subject reference id and by …
riteshghiya90 Aug 7, 2023
7a1b137
[Ritesh] | 1. Refactoring ServiceType
riteshghiya90 Aug 7, 2023
02430d8
[Ritesh] | 1. Bug Fix return empty list if now slots are not present …
riteshghiya90 Aug 8, 2023
a30b081
[Ritesh] | 1. Updated README file
riteshghiya90 Aug 8, 2023
b22fb92
[Ritesh] | 1. Fixed time zone issue in test
riteshghiya90 Aug 8, 2023
258bcf2
add. endpoint to get list of IPD medications scheduled for a patient
Arjun-Go Aug 8, 2023
e14c6f3
refactor. endpoint and updated tests in DAO and service classes
Arjun-Go Aug 9, 2023
b543981
Merge branch 'ipd-slot-schedule' into fetch-schedule-for-order
Arjun-Go Aug 10, 2023
bf25de2
refactor. namings for schedule DAO methods
Arjun-Go Aug 21, 2023
83d4321
Merge pull request #2 from Bahmni/fetch-schedule-for-order
Arjun-Go Aug 22, 2023
c95019c
fix. test failures in ScheduleImpl
Arjun-Go Aug 22, 2023
d04db9b
add. changes to create one schedule for a patient
Arjun-Go Nov 20, 2023
49914ba
update. columns in Schedule and Slot table
Arjun-Go Nov 21, 2023
ab1f30c
update. set end date as null
Arjun-Go Nov 21, 2023
84dede0
fix tests for Slot and Schedule Hiberate and DAOs. Updated responses …
Arjun-Go Nov 21, 2023
e065535
fix tests Schedule DAO
Arjun-Go Nov 22, 2023
5478304
remove unnecessary fields
Arjun-Go Nov 22, 2023
9c7a32c
API Change to accomodate Editable Remaining day slot start time for m…
kalai-tw Nov 24, 2023
215fa8d
Kavitha|Kalai Add Change for Medication Administration Save
kalai-tw Nov 29, 2023
64aa18b
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Nov 30, 2023
77606dd
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Dec 1, 2023
14e979c
Kavitha, Kalai | refactored patient reference param
kavitha-sundararajan Dec 1, 2023
9cd90b6
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Dec 1, 2023
3927a48
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Dec 12, 2023
dd0bd15
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Dec 12, 2023
c1ab970
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Dec 13, 2023
6fbfa62
Kavitha, Kalai | add medication administration reference in slot db a…
kavitha-sundararajan Dec 15, 2023
ff0398e
Kavitha|Kalai - Medication Administration Create API Changes
kalai-tw Dec 17, 2023
4911585
Kavitha, Kalai | added provider mapper and time converter
kavitha-sundararajan Dec 18, 2023
1049ce5
Kavitha | add adhoc and refactored scheduled medication administration
kavitha-sundararajan Dec 27, 2023
5e85a0d
Merge branch 'Bahmni-IPD-master' into medication-administration
kavitha-sundararajan Dec 27, 2023
b8c4daa
refactored schedule from medication administration request
kavitha-sundararajan Dec 27, 2023
1dbad33
Kavitha | refactored medication administration request and response
kavitha-sundararajan Dec 27, 2023
1f6bcac
IPD Drug Order Fetch API changes
kalai-tw Dec 27, 2023
cadcc34
Kavitha | refactored annotation to medicationAdministrationNote
kavitha-sundararajan Dec 27, 2023
b624424
Merge remote-tracking branch 'origin/medication-administration' into …
kalai-tw Dec 27, 2023
3ff39a0
Merge remote-tracking branch 'origin/Bahmni-IPD-master' into drug-order
kalai-tw Jan 2, 2024
67d3aeb
IPD Drug Order schedule update API changes
kalai-tw Jan 2, 2024
42d8e11
IPD Drug Order schedule update API changes
kalai-tw Jan 2, 2024
fa9ee29
IPD Drug Order schedule update API changes
kalai-tw Jan 2, 2024
8df08c5
IPD Drug Order schedule update API changes
kalai-tw Jan 3, 2024
1b6c4b5
Fix to convert time to UTC intead of Local Time
kalai-tw Jan 4, 2024
8fb2b19
Kavitha | refactored treatments API to include emergency medications
kavitha-sundararajan Jan 4, 2024
c97cee4
Kavitha,Kalai | add provider as part of drug order response
kavitha-sundararajan Jan 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions api/src/main/java/org/openmrs/module/ipd/api/dao/SlotDAO.java
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 @@ -11,16 +12,18 @@

@Repository
public interface SlotDAO {

Slot getSlot(Integer slotId) throws DAOException;

Slot getSlotByUUID(String uuid) throws DAOException;

Slot saveSlot(Slot slot) throws DAOException;

List<Slot> getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType);
List<Slot> getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType);

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 @@ -47,7 +48,7 @@ public Slot saveSlot(Slot slot) throws DAOException {
@Override
public List<Slot> getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference subject, LocalDate forDate, Concept serviceType) {
Query query = sessionFactory.getCurrentSession()
.createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType");
.createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and YEAR(slot.startDateTime)=:forYear and MONTH(slot.startDateTime)=:forMonth and DAY(slot.startDateTime)=:forDay and slot.serviceType=:serviceType and slot.voided=0");

query.setParameter("subject", subject);
query.setParameter("forYear", forDate.getYear());
Expand All @@ -61,7 +62,7 @@ public List<Slot> getSlotsBySubjectReferenceIdAndForDateAndServiceType(Reference
@Override
public List<Slot> getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType) {
Query query = sessionFactory.getCurrentSession()
.createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.serviceType=:serviceType");
.createQuery("FROM Slot slot WHERE slot.schedule.subject=:subject and slot.serviceType=:serviceType and slot.voided=0");

query.setParameter("subject", subject);
query.setParameter("serviceType", serviceType);
Expand All @@ -75,12 +76,25 @@ public List<Slot> getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Refere
.createQuery("FROM Slot slot " +
"WHERE slot.schedule.subject=:subject and " +
"slot.serviceType=:serviceType and"
+ " slot.order.uuid IN :orderUuids");
+ " slot.order.uuid IN :orderUuids and "
+ "slot.voided = 0");

query.setParameter("subject", subject);
query.setParameter("serviceType", serviceType);
query.setParameter("orderUuids", orderUuids);

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 All @@ -28,4 +28,8 @@ public interface SlotService extends OpenmrsService {
List<Slot> getSlotsBySubjectReferenceIdAndServiceType(Reference subject, Concept serviceType);

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
@@ -1,6 +1,8 @@
package org.openmrs.module.ipd.api.service.impl;

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.Slot;
Expand All @@ -14,6 +16,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;

@Service
Expand Down Expand Up @@ -60,4 +63,19 @@ public List<Slot> getSlotsBySubjectReferenceIdAndServiceType(Reference subject,
public List<Slot> getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(Reference subject, Concept serviceType, List<String> orderUuids) {
return slotDAO.getSlotsBySubjectReferenceIdAndServiceTypeAndOrderUuids(subject, serviceType, orderUuids);
}

@Override
public void voidSlot(Slot slot, String voidReason) throws APIException {
slot.setVoided(true);
slot.setVoidedBy(Context.getAuthenticatedUser());
slot.setDateVoided(new Date());
slot.setVoidReason(voidReason);
slotDAO.saveSlot(slot);
}


@Override
public List<Slot> getSlotsByPatientAndVisitAndServiceType(Reference subject, Visit visit, Concept serviceType) {
return slotDAO.getSlotsByPatientAndVisitAndServiceType(subject, visit, serviceType);
}
}
12 changes: 12 additions & 0 deletions omod/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,18 @@
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.openmrs.module</groupId>
<artifactId>emrapi-api</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.bahmni.module</groupId>
<artifactId>bahmnicore-api</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.bahmni.module</groupId>
<artifactId>medication-administration-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.openmrs.module.ipd.contract;

import lombok.*;
import org.openmrs.module.ipd.model.DrugOrderSchedule;

import java.util.List;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DrugOrderScheduleResponse {

private List<Long> firstDaySlotsStartTime;
private List<Long> dayWiseSlotsStartTime;
private List<Long> remainingDaySlotsStartTime;
private Long slotStartTime;
private Boolean medicationAdministrationStarted;

public static DrugOrderScheduleResponse createFrom(DrugOrderSchedule drugOrderSchedule){
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,37 @@
package org.openmrs.module.ipd.contract;

import lombok.*;
import org.openmrs.module.emrapi.encounter.domain.EncounterTransaction;
import org.openmrs.module.ipd.model.IPDDrugOrder;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IPDDrugOrderResponse {

private EncounterTransaction.DrugOrder drugOrder;
private DrugOrderScheduleResponse drugOrderSchedule;

public static IPDDrugOrderResponse createFrom(IPDDrugOrder ipdDrugOrder) {
IPDDrugOrderResponse ipdDrugOrderResponse= IPDDrugOrderResponse.builder().
drugOrder(ipdDrugOrder.getDrugOrder()).build();
if (ipdDrugOrder.getDrugOrderSchedule() != null){
ipdDrugOrderResponse.setDrugOrderSchedule(DrugOrderScheduleResponse.createFrom(ipdDrugOrder.getDrugOrderSchedule()));
}
return ipdDrugOrderResponse;
}

public boolean equals(Object otherOrder) {
if (otherOrder == null) {
return false;
} else if (!(otherOrder instanceof IPDDrugOrderResponse)) {
return false;
} else {
return super.equals(otherOrder);
}
}


}
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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,20 @@ public static MedicationSlotResponse createFrom(Slot slot) {
.medicationAdministration(MedicationAdministrationResponse.createFrom((slot.getMedicationAdministration())))
.build();
}

public static MedicationSlotResponse createFrom(Slot slot, Representation rep) {
if (rep.equals(Representation.REF))
{
return MedicationSlotResponse.builder()
.id(slot.getId())
.uuid(slot.getUuid())
.serviceType(slot.getServiceType().getName().getName())
.status(slot.getStatus().name())
.startTime(convertLocalDateTimeToUTCEpoc(slot.getStartDateTime()))
.medicationAdministration(MedicationAdministrationResponse.createFrom((slot.getMedicationAdministration())))
.build();
}
return MedicationSlotResponse.createFrom(slot);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,18 @@ public ResponseEntity<Object> createMedicationSchedule(@RequestBody ScheduleMedi
}
}

@RequestMapping(value = "type/medication/edit", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Object> updateMedicationSchedule(@RequestBody ScheduleMedicationRequest scheduleMedicationRequest) {
try {
Schedule schedule = ipdScheduleService.updateMedicationSchedule(scheduleMedicationRequest);
return new ResponseEntity<>(ScheduleMedicationResponse.constructFrom(schedule), OK);
} catch (Exception e) {
log.error("Runtime error while trying to create new schedule", e);
return new ResponseEntity<>(RestUtil.wrapErrorResponse(e, e.getMessage()), BAD_REQUEST);
}
}

@RequestMapping(value = "type/medication", method = RequestMethod.GET, params = {"patientUuid", "forDate"})
@ResponseBody
public ResponseEntity<Object> getMedicationSlotsByDate(@RequestParam(value = "patientUuid") String patientUuid,
Expand Down
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@
import org.openmrs.module.ipd.api.model.MedicationAdministration;
import org.openmrs.module.ipd.api.model.MedicationAdministrationNote;
import org.openmrs.module.ipd.api.model.MedicationAdministrationPerformer;
import org.openmrs.module.ipd.contract.MedicationAdministrationNoteRequest;
import org.openmrs.module.ipd.contract.MedicationAdministrationPerformerRequest;
import org.openmrs.module.ipd.contract.MedicationAdministrationRequest;
import org.openmrs.module.ipd.contract.MedicationAdministrationResponse;
import org.openmrs.module.ipd.contract.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.openmrs.module.ipd.model;

import lombok.*;
import org.openmrs.module.ipd.api.model.Slot;

import java.util.List;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DrugOrderSchedule {

private List<Long> firstDaySlotsStartTime;
private List<Long> dayWiseSlotsStartTime;
private List<Long> remainingDaySlotsStartTime;
private Long slotStartTime;
private List<Slot> slots;

}
21 changes: 21 additions & 0 deletions omod/src/main/java/org/openmrs/module/ipd/model/IPDDrugOrder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.openmrs.module.ipd.model;

import lombok.*;
import org.openmrs.module.emrapi.encounter.domain.EncounterTransaction.DrugOrder;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IPDDrugOrder {

private DrugOrder drugOrder;
private DrugOrderSchedule drugOrderSchedule;

public static IPDDrugOrder createFrom(DrugOrder drugOrder,DrugOrderSchedule drugOrderSchedule){
return IPDDrugOrder.builder().
drugOrder(drugOrder).
drugOrderSchedule(drugOrderSchedule).
build();
}
}
Loading
Loading