Skip to content

Commit

Permalink
Add service methods for fetching active orders and order history by o…
Browse files Browse the repository at this point in the history
…rder number for a patient - TRUNK-4191

Follow up - TRUNK-4191
  • Loading branch information
wluyima committed Jan 24, 2014
1 parent 68d9064 commit 5188d61
Show file tree
Hide file tree
Showing 8 changed files with 278 additions and 71 deletions.
39 changes: 30 additions & 9 deletions api/src/main/java/org/openmrs/api/OrderService.java
Expand Up @@ -13,6 +13,7 @@
*/
package org.openmrs.api;

import java.util.Date;
import java.util.List;

import org.openmrs.CareSetting;
Expand Down Expand Up @@ -126,7 +127,8 @@ public interface OrderService extends OpenmrsService {

/**
* This searches for orders given the parameters. Most arguments are optional (nullable). If
* multiple arguments are given, the returned orders will match on all arguments.
* multiple arguments are given, the returned orders will match on all arguments. The orders are
* sorted by startDate with the latest coming first
*
* @param orderClassType The type of Order to get (currently only options are Order and
* DrugOrder)
Expand Down Expand Up @@ -161,7 +163,7 @@ public <Ord extends Order> List<Ord> getOrders(Class<Ord> orderClassType, List<P

/**
* Gets all Order objects that use this Concept for a given patient. Orders will be returned in
* the order in which they occurred, i.e. sorted by dateCreated starting with the latest
* the order in which they occurred, i.e. sorted by startDate starting with the latest
*
* @param patient the patient.
* @param concept the concept.
Expand Down Expand Up @@ -191,16 +193,35 @@ public <Ord extends Order> List<Ord> getOrders(Class<Ord> orderClassType, List<P
public List<Order> getOrderHistoryByOrderNumber(String orderNumber);

/**
* Gets all unvoided orders with a null stoppedDate or and are not auto expired. Note this does
* not return discontinuation orders i.e orders where Order.action == DISCONTINUE
* Gets all active orders for the specified patient matching the specified CareSetting, Order
* class as of the specified date. Below is the criteria for determining an active order:
*
* <pre>
* <p>
* - Not voided
* - Not a discontinuation Order i.e one where action != Action#DISCONTINUE
* - startDate is before or equal to asOfDate
* - dateStopped and autoExpireDate are both null OR if it has dateStopped, then it should be
* after asOfDate OR if it has autoExpireDate, then it should be after asOfDate. NOTE: If both
* dateStopped and autoExpireDate are set then dateStopped wins because an order can never
* expire and then stopped later i.e. you stop an order that hasn't yet expired
* <p/>
* <pre/>
*
* @param patient the patient
* @param orderClass the order class
* @param careSetting the care setting
* @param orderClass the order class to match against, this is required
* @param careSetting the care setting, returns all ignoring care setting if value is null
* @param asOfDate defaults to current time
* @return all active orders for given patient parameters
* @should return all active orders for given patient parameters
*/
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting);
* @should return all active orders for the specified patient
* @should return all active orders for the specified patient and care setting
* @should return all active drug orders for the specified patient
* @should return all active test orders for the specified patient
* @should fail if patient is null
* @should return active orders as of the specified date
*/
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting,
Date asOfDate);

/**
* Retrieve care setting by type
Expand Down
8 changes: 5 additions & 3 deletions api/src/main/java/org/openmrs/api/db/OrderDAO.java
Expand Up @@ -13,6 +13,7 @@
*/
package org.openmrs.api.db;

import java.util.Date;
import java.util.List;

import org.openmrs.CareSetting;
Expand Down Expand Up @@ -85,10 +86,11 @@ public <Ord extends Order> List<Ord> getOrders(Class<Ord> orderClassType, List<P
public Long getNextOrderNumberSeedSequenceValue();

/**
* @see org.openmrs.api.OrderService#getActiveOrders(org.openmrs.Patient, java.lang.Class,
* org.openmrs.CareSetting)
* @see org.openmrs.api.OrderService#getActiveOrders(org.openmrs.Patient, Class,
* org.openmrs.CareSetting, java.util.Date)
*/
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting);
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting,
Date asOfDate);

/**
* Get care setting by type
Expand Down
Expand Up @@ -13,6 +13,7 @@
*/
package org.openmrs.api.db.hibernate;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
Expand All @@ -21,6 +22,8 @@
import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Restrictions;
import org.openmrs.CareSetting;
import org.openmrs.Concept;
Expand Down Expand Up @@ -122,7 +125,7 @@ public <Ord extends Order> List<Ord> getOrders(Class<Ord> orderClassType, List<P
if (encounters.size() > 0)
crit.add(Restrictions.in("encounter", encounters));

crit.addOrder(org.hibernate.criterion.Order.desc("dateCreated"));
crit.addOrder(org.hibernate.criterion.Order.desc("startDate"));

return crit.list();
}
Expand Down Expand Up @@ -193,18 +196,38 @@ public Long getNextOrderNumberSeedSequenceValue() {

/**
* @see org.openmrs.api.db.OrderDAO#getActiveOrders(org.openmrs.Patient, Class,
* org.openmrs.CareSetting)
* org.openmrs.CareSetting, java.util.Date)
*/
@SuppressWarnings("unchecked")
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting) {
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting,
Date asOfDate) {

Criteria crit = sessionFactory.getCurrentSession().createCriteria(orderClass);

crit.add(Restrictions.eq("patient", patient));
crit.add(Restrictions.eq("careSetting", careSetting));
if (careSetting != null) {
crit.add(Restrictions.eq("careSetting", careSetting));
}

//See javadocs on OrderService#getActiveOrders for the description of an active Order
crit.add(Restrictions.ne("action", Action.DISCONTINUE));
crit.add(Restrictions.isNull("dateStopped"));
crit.add(Restrictions.isNull("autoExpireDate"));
crit.add(Restrictions.eq("voided", false));

Criterion startDateEqualToOrBeforeAsOfDate = Restrictions.le("startDate", asOfDate);
crit.add(startDateEqualToOrBeforeAsOfDate);

Disjunction dateStoppedAndAutoExpDateDisjunction = Restrictions.disjunction();
Criterion stopAndAutoExpDateAreBothNull = Restrictions.and(Restrictions.isNull("dateStopped"), Restrictions
.isNull("autoExpireDate"));
dateStoppedAndAutoExpDateDisjunction.add(stopAndAutoExpDateAreBothNull);

Criterion dateStoppedEqualToOrAfterAsOfDate = Restrictions.and(Restrictions.isNull("dateStopped"), Restrictions.ge(

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa Jan 27, 2014

Member

Should it be named autoExpireDateEqualToOrAfterAsOfDate instead of dateStoppedEqualToOrAfterAsOfDate? :)

"autoExpireDate", asOfDate));
dateStoppedAndAutoExpDateDisjunction.add(dateStoppedEqualToOrAfterAsOfDate);

dateStoppedAndAutoExpDateDisjunction.add(Restrictions.ge("dateStopped", asOfDate));

crit.add(dateStoppedAndAutoExpDateDisjunction);

return crit.list();
}
Expand Down
15 changes: 11 additions & 4 deletions api/src/main/java/org/openmrs/api/impl/OrderServiceImpl.java
Expand Up @@ -241,13 +241,20 @@ public List<Order> getOrderHistoryByOrderNumber(String orderNumber) {
}

/**
* @see org.openmrs.api.OrderService#getActiveOrders(org.openmrs.Patient, java.lang.Class,
* org.openmrs.CareSetting)
* @see org.openmrs.api.OrderService#getActiveOrders(org.openmrs.Patient, Class,
* org.openmrs.CareSetting, java.util.Date)
*/
@Override
@Transactional(readOnly = true)
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting) {
return dao.getActiveOrders(patient, orderClass, careSetting);
public <Ord extends Order> List<Ord> getActiveOrders(Patient patient, Class<Ord> orderClass, CareSetting careSetting,
Date asOfDate) {
if (patient == null) {
throw new IllegalArgumentException("Patient is required when fetch active orders");

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa Jan 27, 2014

Member

fetching

}
if (asOfDate == null) {
asOfDate = new Date();
}
return dao.getActiveOrders(patient, orderClass, careSetting, asOfDate);
}

/**
Expand Down
9 changes: 6 additions & 3 deletions api/src/test/java/org/openmrs/OrderEntryTest.java
Expand Up @@ -22,6 +22,8 @@
import org.openmrs.test.BaseContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;

/**
* Contains end to end tests for order entry operations i.g placing, discontinuing revising an order
*/
Expand All @@ -41,15 +43,16 @@ public class OrderEntryTest extends BaseContextSensitiveTest {
@Test
public void shouldPlaceATestOrder() throws Exception {
executeDataSet(ORDER_ENTRY_DATASET_XML);
Patient patient = patientService.getPatient(2);
Patient patient = patientService.getPatient(7);
CareSetting careSetting = orderService.getCareSetting(1);
assertEquals(0, orderService.getActiveOrders(patient, TestOrder.class, careSetting).size());
assertEquals(0, orderService.getActiveOrders(patient, TestOrder.class, careSetting, null).size());

//place test order, should call OrderService.placeOrder
TestOrder order = new TestOrder();
order.setPatient(patient);
order.setConcept(conceptService.getConcept(5497));
order.setCareSetting(careSetting);
order.setStartDate(new Date());
order.setClinicalHistory("Patient had a negative reaction to the test in the past");
order.setLaterality(TestOrder.Laterality.BILATERAL);
order.setFrequency(orderService.getOrderFrequency(1));
Expand All @@ -58,6 +61,6 @@ public void shouldPlaceATestOrder() throws Exception {

orderService.saveOrder(order);

assertEquals(1, orderService.getActiveOrders(patient, TestOrder.class, careSetting).size());
assertEquals(1, orderService.getActiveOrders(patient, TestOrder.class, careSetting, null).size());
}
}

0 comments on commit 5188d61

Please sign in to comment.