Order Extension Module

Overview

This module aims to extend the Order API available in OpenMRS 1.9 and earlier, by building the following features:

  • Support for creating Order Sets, which allow users to pre-define a set of Order templates
  • Support for associating several Orders together in an Order Group
  • Extending the Order and DrugOrder objects with the addition of several new fields
  • New UI components for managing and viewing OrderSets and OrderGroups

Order Set Design

class OrderSet extends BaseOpenmrsMetadata {
  Operator operator;
  Concept indication;
  boolean cyclical
  Integer cycleLengthInDays;
  List<OrderSetMember> members;
}

abstract class OrderSetMember extends BaseOpenmrsObject {
  OrderSet orderSet;
  String title;
  String comment;
  boolean selected;
  Integer relativeStartDay;
  Integer lengthInDays;
  String template;
}

abstract class SingleOrderSetMember extends OrderSetMember {
  abstract OrderType getOrderType();
  Concept concept;
  Concept indication;
  String instructions;
}

class TestOrderSetMember extends SingleOrderSetMember {
  OrderType getOrderType() { test order }
}

class DrugOrderSetMember extends SingleOrderSetMember {
  OrderType getOrderType() { ORDERTYPE_DRUG }
  Drug drug;
  Double dose;
  String units;
  Concept route;
  String frequency;
  boolean asNeeded;
  String administrationInstructions;
}

class NestedOrderSetMember extends OrderSetMember {
  OrderSet nestedOrderSet;
}

Order Group Design

abstract class OrderGroup extends BaseOpenmrsData {
  OrderSet orderSet;
}

class DrugRegimen extends OrderGroup {
  List<ExtendedDrugOrder> members;
  Integer cycleNumber;
}

Order Extensions

interface GroupableOrder extends OpenmrsData {
  Integer getOrderId();
  void setOrderId(Integer orderId);
  Patient getPatient();
  void setPatient(Patient patient);
  OrderType getOrderType();
  void setOrderType(OrderType orderType);
  Concept getConcept();
  void setConcept(Concept concept);
  String getInstructions();
  void setInstructions(String instructions);
  Date getStartDate();
  void setStartDate(Date startDate);
  Date getAutoExpireDate();
  void setAutoExpireDate(Date autoExpireDate);
  Encounter getEncounter();
  void setEncounter(Encounter encounter);
  User getOrderer();
  void setOrderer(User orderer);
  Boolean getDiscontinued();
  void setDiscontinued(Boolean discontinued);
  User getDiscontinuedBy();
  void setDiscontinuedBy(User discontinuedBy);
  Date getDiscontinuedDate();
  void setDiscontinuedDate(Date discontinuedDate);
  Concept getDiscontinuedReason();
  void setDiscontinuedReason(Concept discontinuedReason);
  String getDiscontinuedReasonNonCoded();
  void setDiscontinuedReasonNonCoded(String discontinuedReasonNonCoded);
  String getAccessionNumber();
  void setAccessionNumber(String accessionNumber);
}

class ExtendedOrder extends Order implements GroupableOrder {
  OrderGroup group
}

class ExtendedDrugOrder extends DrugOrder implements GroupableOrder {
  OrderGroup group;
  Concept indication;
  Concept route;
  String administrationInstructions;
}

API

OrderExtensionService extends OpenmrsService {
  OrderSet getOrderSet(Integer id);
  OrderSet getOrderSetByUuid(String uuid);
  List<OrderSet> getNamedOrderSets(boolean includeRetired);
  List<OrderSet> findAvailableOrderSets(String partialName, Concept indication);
  OrderSet saveOrderSet(OrderSet orderSet);
  void purgeOrderSet(OrderSet orderSet);
  OrderSetMember getOrderSetMember(Integer id);
  List<OrderSet> getParentOrderSets(OrderSet orderSet);
  <T extends OrderGroup> T saveOrderGroup(T orderGroup);
  <T extends OrderGroup> List<T> getOrderGroups(Patient patient, Class<T> type);
  void addOrdersForPatient(Patient patient, OrderSet orderSet, Date startDate, Integer numCycles);
  OrderGroup getOrderGroup(Integer id);
  DrugRegimen getDrugRegimen(Integer id);
  Integer getMaxNumberOfCyclesForRegimen(Patient patient, DrugRegimen regimen);
  List<ExtendedDrugOrder> getFutureDrugOrdersOfSameOrderSet(Patient patient, OrderSet orderSet, Date startDate);
  List<DrugRegimen> getFutureDrugRegimensOfSameOrderSet(Patient patient, DrugRegimen drugRegimen, Date startDate);
  List<ExtendedDrugOrder> getExtendedDrugOrders(Patient patient, Concept indication, Date startDateAfter, Date startDateBefore);
}

Screenshots