@Test public void shouldAddNewDrugOrderWhenPrnIsTrueWIthNoDosageFrequencyOrDosageInstruction() { EncounterTransaction.DrugOrder drugOrder = new DrugOrderBuilder() .withBasicValues("drug-uuid", "test-concept-uuid", today, today, 3, "", "") .withPrn(true) .build(); Concept drugConcept = new Concept(3); OrderType drugOrderType = new OrderType("Drug Order", "this is a drug order type"); when(orderService.getAllOrderTypes()).thenReturn(asList(drugOrderType)); when(conceptService.getConceptByUuid("test-concept-uuid")).thenReturn(drugConcept); Drug drug = new Drug(); drug.setName("test drug"); when(conceptService.getDrugByUuid("drug-uuid")).thenReturn(drug); encounterDrugOrderServiceHelper.update(encounter, asList(drugOrder)); assertThat(encounter.getOrders().size(), is(1)); org.openmrs.DrugOrder order = (org.openmrs.DrugOrder) encounter.getOrders().iterator().next(); assertEquals(drugConcept, order.getConcept()); assertEquals(drugOrderType, order.getOrderType()); assertEquals(patient, order.getPatient()); assertEquals(encounter, order.getEncounter()); assertEquals(today, order.getStartDate()); assertEquals(today, order.getAutoExpireDate()); assertEquals(drug.getDisplayName(), order.getDrug().getDisplayName()); assertEquals(Double.valueOf(3), order.getDose()); assertEquals(true, order.getPrn()); assertEquals(null, order.getFrequency()); assertEquals(null, order.getUnits()); }
@Test public void shouldAddNewDrugOrder() throws Exception { executeDataSet("shouldAddNewDrugOrder.xml"); String json = "{ \"patientUuid\" : \"a76e8d23-0c38-408c-b2a8-ea5540f01b51\", " + "\"visitTypeUuid\" : \"b45ca846-c79a-11e2-b0c0-8e397087571c\", " + "\"encounterTypeUuid\": \"2b377dba-62c3-4e53-91ef-b51c68899890\", " + "\"encounterDateTime\" : \"2005-01-02T00:00:00.000+0000\", " + "\"testOrders\":[" + "{\"concept\":{ \"uuid\": \"d102c80f-1yz9-4da3-bb88-8122ce8868dd\"}, " + "\"instructions\":\"do it\", \"orderTypeUuid\": \"1a61ef2a-250c-11e3-b832-0800271c1b75\" }]," + "\"drugOrders\":[" + "{\"uuid\": \"4d6fb6e0-4950-426c-9a9b-1f97e6037893\"," + "\"concept\": {\"uuid\": \"29dc4a20-507f-40ed-9545-d47e932483fa\"}," + "\"notes\": \"Take as needed\"," + "\"startDate\": \"2013-09-30T09:26:09.717Z\"," + "\"endDate\": \"2013-10-02T09:26:09.717Z\"," + "\"numberPerDosage\": 1," + "\"dosageInstruction\": {\"uuid\": \"632aa422-2696-11e3-895c-0800271c1b75\"}," + "\"dosageFrequency\": {\"uuid\": \"6302096d-2696-11e3-895c-0800271c1b75\"}," + "\"prn\": true}" + "]}"; EncounterTransaction response = deserialize( handle(newPostRequest("/rest/emrapi/encounter", json)), EncounterTransaction.class); Visit visit = visitService.getVisitByUuid(response.getVisitUuid()); Encounter encounter = visit.getEncounters().iterator().next(); assertEquals(2, encounter.getOrders().size()); List<Order> orders = new ArrayList<Order>(encounter.getOrders()); List<DrugOrder> drugOrders = getOrdersOfType(orders, DrugOrder.class); assertEquals(1, drugOrders.size()); DrugOrder drugOrder = drugOrders.get(0); assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", drugOrder.getPatient().getUuid()); assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", drugOrder.getEncounter().getUuid()); assertEquals("29dc4a20-507f-40ed-9545-d47e932483fa", drugOrder.getConcept().getUuid()); assertEquals("1a61ef2a-250c-11e3-b832-9876541c1b75", drugOrder.getOrderType().getUuid()); assertEquals("Take as needed", drugOrder.getInstructions()); assertEquals(new DateTime("2013-09-30T09:26:09.717Z").toDate(), drugOrder.getStartDate()); assertEquals(new DateTime("2013-10-02T09:26:09.717Z").toDate(), drugOrder.getAutoExpireDate()); assertEquals("6302096d-2696-11e3-895c-0800271c1b75", drugOrder.getFrequency()); assertEquals("632aa422-2696-11e3-895c-0800271c1b75", drugOrder.getUnits()); assertEquals("test drug", drugOrder.getDrug().getDisplayName()); assertEquals(Double.valueOf(1), drugOrder.getDose()); assertEquals(true, drugOrder.getPrn()); List<TestOrder> testOrders = getOrdersOfType(orders, TestOrder.class); assertEquals(1, testOrders.size()); TestOrder testOrder = testOrders.get(0); assertEquals("d102c80f-1yz9-4da3-bb88-8122ce8868dd", testOrder.getConcept().getUuid()); assertEquals("a76e8d23-0c38-408c-b2a8-ea5540f01b51", testOrder.getPatient().getUuid()); assertEquals("f13d6fae-baa9-4553-955d-920098bec08f", testOrder.getEncounter().getUuid()); assertEquals("1a61ef2a-250c-11e3-b832-0800271c1b75", testOrder.getOrderType().getUuid()); assertEquals("do it", testOrder.getInstructions()); }
/* here's the logic for what happens if there is a future regimen: * * * //1. if no drug order of a specific DrugOrder, (create the new order). (OUTCOME1) //2. if DrugOrder, for all DrugOrders: //a. if new start is before old start //NEW ORDER HAS STOP DATE -- create the older as is, and make adjustments: //1. if new end is before or equal to old start (create the new order) (OUTCOME2) //2. if new end is after old start and ( before old end or old end is infinite) //if order is different, adjust the start date of the old order to the end date of the new (create the new order) (OUTCOME3) //if order is same void old order(doesn't matter if old order has infinite stop date or not) (create the new order) (OUTCOME4) //3. if end date is greater than or equal to old end -- void old order (create the new order) (OUTCOME5) //NEW ORDER DOESN'T HAVE STOP DATE //4. orders are different //set end date of new to beginning of old and stop iterating over existing drug orders time sequence (create the new order, modified) (OUTCOME6) //5. orders are the same //delete the old order (create the new order) (OUTCOME7) //b. if start is the same // void existing (create the new order) (OUTCOME8) //c. if start is after existing start //1. if order is after old drug end (create the new order) (OUTCOME9) //2. if order is before old drug end or equal to old drug end or old drug end date is infinite //if orders are the same update the old order with the new, taking the new end date value (Do not create new order) (OUTCOME10) //if orders are different adjust the old to end on new start date (create the new order) (OUTCOME11) * */ public static void setRegimen( Patient patient, Date effectiveDate, Collection<DrugOrder> drugOrders, Concept reasonForChange, Encounter encounterForChange) { RegimenHistory history = getRegimenHistory(patient); Regimen regOnDate = history.getRegimen(effectiveDate); List<Regimen> regAfterDate = history.getRegimensAfter(effectiveDate); OrderService os = Context.getOrderService(); if (encounterForChange != null) { Context.getEncounterService().saveEncounter(encounterForChange); for (DrugOrder drugOrder : drugOrders) { drugOrder.setEncounter(encounterForChange); } } if (!anyRegimens(regAfterDate)) { if (regOnDate == null || regOnDate.getComponents().isEmpty()) { // case: there is no existing regimen on the regimen start date, and there are no new // regimens after this date // go ahead and create the regimen: for (DrugOrder drugOrder : drugOrders) { Context.getOrderService().saveOrder(drugOrder); } } else { // case: there are still open orders and there are no new regimens after this date // first see what existing things we need to stop for (RegimenComponent before : regOnDate.getComponents()) { // stop the old order only if it isn't exactly identical to a new order (excluding // discontinued_date) for (DrugOrder newOrder : drugOrders) { // but either concept or drug is the same if (!before.getDrugOrder().getDiscontinued() && drugOrderMatchesDrugConcept(before.getDrugOrder(), newOrder) && !regimenComponentIsTheSameAsDrugOrderExcludingDates( before.getDrugOrder(), newOrder)) { discontinueOrder(before.getDrugOrder(), effectiveDate, reasonForChange); } } } // now see what new things to start (or extend) for (DrugOrder newOrder : drugOrders) { // create a new order if there isn't already an existing match, // or if there is (excluding discontinued date) you need to extend, or null the stop date boolean alreadyExists = false; for (RegimenComponent before : regOnDate.getComponents()) { if (!before.getDrugOrder().getDiscontinued() && regimenComponentIsTheSameAsDrugOrderExcludingDates( before.getDrugOrder(), newOrder)) { alreadyExists = true; before.getDrugOrder().setDiscontinuedDate(newOrder.getDiscontinuedDate()); before.getDrugOrder().setAutoExpireDate(newOrder.getAutoExpireDate()); before.getDrugOrder().setPrn(newOrder.getPrn()); before.getDrugOrder().setInstructions(newOrder.getInstructions()); os.saveOrder(before.getDrugOrder()); newOrder.setOrderId(before.getDrugOrder().getOrderId()); break; } } if (!alreadyExists) { os.saveOrder(newOrder); } } } } else { // there is a regimen change after the new drug order start date for (DrugOrder newOrder : drugOrders) { boolean saveOrder = false; boolean merged = false; history = getRegimenHistory(patient); List<DrugOrder> existingDrugOrders = getDrugOrdersInOrderByDrugOrConcept(history, newOrder); if (existingDrugOrders.size() == 0) { saveOrder = setSaveOrder(merged); // (OUTCOME1) } else { for (DrugOrder before : existingDrugOrders) { if (newOrder.getStartDate().before(before.getStartDate())) { if (newOrder.getDiscontinuedDate() != null) { if (newOrder.getDiscontinuedDate().before(before.getStartDate()) || newOrder.getDiscontinuedDate().equals(before.getStartDate())) { saveOrder = setSaveOrder(merged); // (OUTCOME2) } else if (newOrder.getDiscontinuedDate().after(before.getStartDate()) && (before.getDiscontinuedDate() == null || newOrder.getDiscontinuedDate().before(before.getDiscontinuedDate()))) { if (!regimenComponentIsTheSameAsDrugOrderExcludingDates(before, newOrder)) { // (OUTCOME3) before.setStartDate(newOrder.getDiscontinuedDate()); os.saveOrder(before); saveOrder = setSaveOrder(merged); } else { // (OUTCOME4) os.voidOrder(before, "overwritten"); saveOrder = setSaveOrder(merged); } } else if (before.getDiscontinuedDate() != null && (newOrder.getDiscontinuedDate().after(before.getDiscontinuedDate()) || newOrder.getDiscontinuedDate().equals(before.getDiscontinuedDate()))) { // (OUTCOME5) os.voidOrder(before, "overwritten"); saveOrder = setSaveOrder(merged); } } else { // new order has infinite end date if (!regimenComponentIsTheSameAsDrugOrderExcludingDates(before, newOrder)) { // (OUTCOME6) newOrder.setDiscontinuedDate(before.getStartDate()); saveOrder = setSaveOrder(merged); break; } else { // (OUTCOME7) os.voidOrder(before, "overwritten"); saveOrder = setSaveOrder(merged); } } } else if (newOrder.getStartDate().equals(before.getStartDate())) { // b // (OUTCOME8) os.voidOrder(before, "overwritten"); saveOrder = setSaveOrder(merged); } else { // c -- start date is after or equal to old end date if (before.getDiscontinuedDate() != null && newOrder.getStartDate().after(before.getDiscontinuedDate())) // 1 // (OUTCOME9) saveOrder = setSaveOrder(merged); if (before.getDiscontinuedDate() == null || newOrder.getStartDate().before(before.getDiscontinuedDate()) || newOrder.getStartDate().equals(before.getDiscontinuedDate())) { // 2 if (regimenComponentIsTheSameAsDrugOrderExcludingDates(before, newOrder)) { // (OUTCOME10) before.setDiscontinuedDate(newOrder.getDiscontinuedDate()); before.setAutoExpireDate(newOrder.getAutoExpireDate()); before.setPrn(newOrder.getPrn()); before.setInstructions(newOrder.getInstructions()); os.saveOrder(before); saveOrder = false; newOrder.setOrderId(before.getOrderId()); merged = true; } else { // (OUTCOME11) before.setDiscontinuedDate(newOrder.getStartDate()); os.saveOrder(before); saveOrder = setSaveOrder(merged); } } } } } if (saveOrder) os.saveOrder(newOrder); } } }