Skip to content

Commit eab4d6a

Browse files
authored
TRUNK-6569 - Encounter Service should validate against invalid order … (#5838)
1 parent 9b9d66a commit eab4d6a

File tree

5 files changed

+79
-20
lines changed

5 files changed

+79
-20
lines changed

api/src/main/java/org/openmrs/api/impl/EncounterServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.openmrs.util.OpenmrsConstants;
5151
import org.openmrs.util.OpenmrsUtil;
5252
import org.openmrs.util.PrivilegeConstants;
53+
import org.openmrs.validator.ValidateUtil;
5354
import org.springframework.transaction.annotation.Transactional;
5455

5556
/**
@@ -174,6 +175,11 @@ public Encounter saveEncounter(Encounter encounter) throws APIException {
174175
if (o.getOrderId() == null) {
175176
Context.getOrderService().saveOrder(o, null);
176177
}
178+
else {
179+
// Since orders are only saved via the OrderService if they are new,
180+
// we need to explicitly re-validate any existing orders
181+
ValidateUtil.validate(o);
182+
}
177183
}
178184

179185
// save the Obs

api/src/test/java/org/openmrs/OrderEntryIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ public void shouldAllowEditingADiscontinuationOrder() {
324324
List<Order> originalPatientOrders = orderService.getAllOrdersByPatient(originalDCOrder.getPatient());
325325
final Order previousOrder = originalDCOrder.getPreviousOrder();
326326
assertNotNull(previousOrder);
327-
final Date newStartDate = originalDCOrder.getEncounter().getEncounterDatetime();
327+
final Date newStartDate = originalDCOrder.getDateActivated();
328328

329329
Order newDcOrder = originalDCOrder.cloneForRevision();
330330
newDcOrder.setEncounter(originalDCOrder.getEncounter());

api/src/test/java/org/openmrs/api/EncounterServiceTest.java

Lines changed: 67 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.openmrs.api;
1111

1212
import static org.hamcrest.MatcherAssert.assertThat;
13+
import static org.hamcrest.Matchers.containsString;
1314
import static org.hamcrest.Matchers.empty;
1415
import static org.hamcrest.Matchers.is;
1516
import static org.hamcrest.Matchers.nullValue;
@@ -293,7 +294,7 @@ public void saveEncounter_shouldUpdateEncounterSuccessfully() {
293294
// file
294295
Location loc2 = new Location(2);
295296
EncounterType encType2 = new EncounterType(2);
296-
Date d2 = new Date();
297+
Date d2 = DateUtils.addDays(origDate, 10);
297298
Patient pat2 = new Patient(2);
298299

299300
encounter.setLocation(loc2);
@@ -586,19 +587,30 @@ public void purgeEncounter_shouldCascadePurgeToObsAndOrders() {
586587

587588
// fetch the encounter to delete from the db
588589
Encounter encounterToDelete = es.getEncounter(1);
590+
List<Integer> existingObsIds = new ArrayList<>();
591+
List<Integer> existingOrderIds = new ArrayList<>();
592+
for (Obs o : encounterToDelete.getAllObs(true)) {
593+
existingObsIds.add(o.getObsId());
594+
}
595+
for (Order o : encounterToDelete.getOrders()) {
596+
existingOrderIds.add(o.getOrderId());
597+
}
589598

590599
es.purgeEncounter(encounterToDelete, true);
591600

592601
// try to refetch the encounter. should get a null object
593602
Encounter e = es.getEncounter(encounterToDelete.getEncounterId());
594603
assertNull(e, "We shouldn't find the encounter after deletion");
595604

596-
ObsService obsService = Context.getObsService();
597-
assertNull(obsService.getObs(1));
598-
assertNull(obsService.getObs(2));
599-
assertNull(obsService.getObs(3));
600-
601-
assertNull(Context.getOrderService().getOrder(1));
605+
assertFalse(existingObsIds.isEmpty());
606+
for (Integer obsId : existingObsIds) {
607+
assertNull(Context.getObsService().getObs(obsId));
608+
}
609+
610+
assertFalse(existingOrderIds.isEmpty());
611+
for (Integer orderId : existingOrderIds) {
612+
assertNull(Context.getOrderService().getOrder(orderId));
613+
}
602614
}
603615

604616
/**
@@ -681,7 +693,7 @@ public void saveEncounter_shouldOnlyCascadeTheObsdatetimesToObsWithDifferentInit
681693
assertNotNull(obsWithDifferentDateBefore);
682694
assertEquals(2, obsWithSameDateBefore.size());
683695

684-
Date newDate = new Date();
696+
Date newDate = DateUtils.addDays(enc.getEncounterDatetime(), 10);
685697
enc.setEncounterDatetime(newDate);
686698

687699
// save the encounter. The obs should pick up the encounter's date
@@ -1026,11 +1038,20 @@ public void voidEncounter_shouldCascadeToOrders() {
10261038

10271039
// get a nonvoided encounter that has some obs
10281040
Encounter encounter = encounterService.getEncounter(1);
1041+
List<Integer> orderIds = new ArrayList<>();
1042+
for (Order order : encounter.getOrders()) {
1043+
orderIds.add(order.getOrderId());
1044+
assertFalse(order.getVoided());
1045+
}
1046+
assertFalse(orderIds.isEmpty());
1047+
10291048
encounterService.voidEncounter(encounter, "Just Testing");
10301049

1031-
Order order = Context.getOrderService().getOrder(1);
1032-
assertTrue(order.getVoided());
1033-
assertEquals("Just Testing", order.getVoidReason());
1050+
for (Integer orderId : orderIds) {
1051+
Order order = Context.getOrderService().getOrder(orderId);
1052+
assertTrue(order.getVoided());
1053+
assertEquals("Just Testing", order.getVoidReason());
1054+
}
10341055
}
10351056

10361057
/**
@@ -1238,9 +1259,10 @@ public void getEncounters_shouldGetEncountersOnOrAfterDate() throws ParseExcepti
12381259
.setIncludeVoided(false).createEncounterSearchCriteria();
12391260
encounters = Context.getEncounterService().getEncounters(encounterSearchCriteria);
12401261
assertEquals(4, encounters.size());
1241-
assertEquals(3, encounters.get(0).getEncounterId().intValue());
1242-
assertEquals(4, encounters.get(1).getEncounterId().intValue());
1243-
assertEquals(5, encounters.get(2).getEncounterId().intValue());
1262+
assertEquals(6, encounters.get(0).getEncounterId().intValue());
1263+
assertEquals(3, encounters.get(1).getEncounterId().intValue());
1264+
assertEquals(4, encounters.get(2).getEncounterId().intValue());
1265+
assertEquals(5, encounters.get(3).getEncounterId().intValue());
12441266
}
12451267

12461268
/**
@@ -3243,6 +3265,37 @@ public void shouldSaveMultipleOrderGroupsIfDifferentOrdersHaveDifferentOrderGrou
32433265

32443266
assertEquals(2, orderGroups.size(), "Two New Order Groups Get Saved");
32453267
}
3268+
3269+
@Test
3270+
public void shouldFailToSaveEncounterIfChangesWouldResultInInvalidOrders() {
3271+
Date today = new Date();
3272+
Date yesterday = DateUtils.addDays(today, -1);
3273+
executeDataSet(ORDER_SET);
3274+
Encounter encounter = new Encounter();
3275+
encounter.setPatient(Context.getPatientService().getPatient(3));
3276+
encounter.setEncounterType(Context.getEncounterService().getEncounterType(1));
3277+
encounter.setEncounterDatetime(yesterday);
3278+
3279+
Order order = new OrderBuilder().withAction(Order.Action.NEW).withPatient(3).withConcept(1000)
3280+
.withCareSetting(1).withOrderer(1).withDateActivated(yesterday)
3281+
.withOrderType(17).withUrgency(Order.Urgency.ROUTINE).build();
3282+
3283+
encounter.addOrder(order);
3284+
Context.getEncounterService().saveEncounter(encounter);
3285+
3286+
encounter.setEncounterDatetime(today);
3287+
ValidationException validationError = null;
3288+
try {
3289+
Context.getEncounterService().saveEncounter(encounter);
3290+
}
3291+
catch (ValidationException e) {
3292+
validationError = e;
3293+
}
3294+
assertNotNull(validationError);
3295+
String expectedError = "dateActivated: Date activated cannot be before that of the associated encounter";
3296+
assertThat(validationError.getMessage(), containsString(expectedError));
3297+
3298+
}
32463299

32473300
@Test
32483301
public void saveEncounter_shouldCascadeSaveToContainedAllergies() {

api/src/test/resources/org/openmrs/api/include/EncounterServiceTest-initialData.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
<encounter encounter_id="2" encounter_type="1" form_id="1" encounter_datetime="2008-01-01 00:00:00.0" patient_id="3" location_id="1" creator="1" date_created="2008-02-01 00:00:00.0" voided="1" voided_by="1" date_voided="2008-02-01 00:00:00.0" void_reason="Because" uuid="33d70956-b359-452a-b3da-b69c8ab459ce"/>
6262
<encounter_provider encounter_provider_id="1" encounter_id="2" provider_id="2" encounter_role_id="2" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="c92be2b5-b167-4c3b-9bab-5f8c01ae727a" />
6363
<obs obs_id="4" status="FINAL" person_id="3" encounter_id="2" concept_id="1" obs_datetime="2005-01-01 00:00:00.0" location_id="1" value_numeric="1.0" creator="1" date_created="2006-02-10 15:57:35.0" voided="1" voided_by="1" date_voided="2008-02-01 00:00:00.0" void_reason="Because" uuid="8f92ca37-9aee-4834-a1e4-26cd517421da"/>
64-
<orders order_id="2" order_type_id="2" order_number="2" urgency="ROUTINE" patient_id="3" encounter_id="2" concept_id="1" date_activated="2012-08-19 00:00:00.0" orderer="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="1" voided_by="1" date_voided="2008-02-01 00:00:00.0" void_reason="Because" uuid="81bc39d2-9a62-46b1-9df6-c35d3cb29e08" order_action="NEW" care_setting="1"/>
64+
<orders order_id="10001" order_type_id="17" order_number="2" urgency="ROUTINE" patient_id="3" encounter_id="2" concept_id="1" date_activated="2012-08-19 00:00:00.0" orderer="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="1" voided_by="1" date_voided="2008-02-01 00:00:00.0" void_reason="Because" uuid="81bc39d2-9a62-46b1-9df6-c35d3cb29e08" order_action="NEW" care_setting="1"/>
6565
<encounter_diagnosis diagnosis_id="2" encounter_id="2" patient_id="3" diagnosis_non_coded="Fever" certainty="CONFIRMED" dx_rank="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="1" voided_by="1" date_voided="2008-02-01 00:00:00.0" void_reason="Because" uuid="0d86e8b4-2f33-495e-aa22-6954785e4e9d"/>
6666

6767
<!-- A real non-voided encounter -->
@@ -72,7 +72,7 @@
7272
<!-- this obs datetime is intentionally different than the encounter datetime above -->
7373
<obs obs_id="3" status="FINAL" person_id="3" encounter_id="1" concept_id="1" obs_datetime="2006-01-01 00:00:00.0" location_id="1" value_numeric="3.0" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="544c0a4c-fdbf-4eb8-be4b-8fde603a76f7"/>
7474

75-
<orders order_id="1" order_type_id="2" order_number="1" urgency="ROUTINE" patient_id="3" encounter_id="1" date_activated="2012-08-19 00:00:00.0" concept_id="1" orderer="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="0d86e8b4-2f33-495e-aa22-6954785e4e9e" order_action="NEW" care_setting="1"/>
75+
<orders order_id="10002" order_type_id="17" order_number="1" urgency="ROUTINE" patient_id="3" encounter_id="1" date_activated="2012-08-19 00:00:00.0" concept_id="1" orderer="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="0d86e8b4-2f33-495e-aa22-6954785e4e9e" order_action="NEW" care_setting="1"/>
7676

7777
<encounter_diagnosis diagnosis_id="1" encounter_id="1" patient_id="3" diagnosis_non_coded="Fever" certainty="CONFIRMED" dx_rank="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="0d86e8b4-2f33-495e-aa22-6954785e4e9f"/>
7878

@@ -85,7 +85,7 @@
8585
<!-- a voided encounter with a mismatched order.patient_id -->
8686
<encounter encounter_id="16" encounter_type="1" form_id="1" encounter_datetime="2007-01-01 00:00:00.0" patient_id="3" location_id="1" visit_id="1" creator="1" date_created="2009-01-01 00:00:00.0" date_changed="2010-01-01 00:00:00.0" voided="1" void_reason="testing" uuid="929809cc-8ef7-11e0-a7a1-91c116298e4b"/>
8787
<encounter_provider encounter_provider_id="4" encounter_id="16" provider_id="1" encounter_role_id="2" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="0d9b354c-e6fd-11e0-be7d-593b1cdbf439" />
88-
<orders order_id="10" order_type_id="2" order_number="10" urgency="ROUTINE" patient_id="2" encounter_id="15" concept_id="1" orderer="1" creator="1" date_activated="2012-08-19 00:00:00.0" date_created="2006-03-11 15:57:35.0" voided="false" uuid="bf003896-2caf-42ef-8cfa-5ad29a11661f" order_action="NEW" care_setting="1"/>
88+
<orders order_id="10" order_type_id="17" order_number="10" urgency="ROUTINE" patient_id="2" encounter_id="15" concept_id="1" orderer="1" creator="1" date_activated="2012-08-19 00:00:00.0" date_created="2006-03-11 15:57:35.0" voided="false" uuid="bf003896-2caf-42ef-8cfa-5ad29a11661f" order_action="NEW" care_setting="1"/>
8989

9090
<visit visit_id="1" visit_type_id="2" date_started="2001-01-01 00:00:00.0" patient_id="3" location_id="1" creator="1" date_created="2005-01-01 00:00:00.0" voided="0" uuid="7fffd6b9-0970-4967-88c7-0b7b50f12ab9"/>
9191
<global_property property="visits.assignmentHandler" property_value="" description="Set to the name of the class responsible for assigning visits to encounters." uuid="7fffd6b9-0970-4967-88c7-0b7b50f12cc6"/>

api/src/test/resources/org/openmrs/include/standardTestDataset.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@
339339
<encounter_provider encounter_provider_id="2" encounter_id="4" provider_id="1" encounter_role_id="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="1609ac3f-090c-4b1c-a497-4c307e24c5dd" />
340340
<encounter encounter_id="5" encounter_type="1" patient_id="7" location_id="2" form_id="1" encounter_datetime="2008-08-19 00:00:00.0" creator="1" date_created="2008-08-19 12:34:40.0" voided="false" uuid="e403fafb-e5e4-42d0-9d11-4f52e89d148c"/>
341341
<encounter_provider encounter_provider_id="3" encounter_id="5" provider_id="1" encounter_role_id="1" creator="1" date_created="2006-03-11 15:57:35.0" voided="false" uuid="2417c6c5-77a4-41b0-b7eb-564e163e55e4" />
342-
<encounter encounter_id="6" encounter_type="1" patient_id="2" location_id="2" form_id="1" visit_id="6" encounter_datetime="2008-08-19 00:00:00.1" creator="1" date_created="2008-08-19 12:34:40.0" voided="false" uuid="y403fafb-e5e4-42d0-9d11-4f52e89d123r"/>
342+
<encounter encounter_id="6" encounter_type="1" patient_id="2" location_id="2" form_id="1" visit_id="6" encounter_datetime="2007-12-01 00:00:00.1" creator="1" date_created="2008-08-19 12:34:40.0" voided="false" uuid="y403fafb-e5e4-42d0-9d11-4f52e89d123r"/>
343343
<encounter_provider encounter_provider_id="4" encounter_id="6" provider_id="1" encounter_role_id="1" creator="1" date_created="2008-08-19 00:00:00.0" voided="false" uuid="4527c6c5-77a4-41b0-b7eb-564e163e55e5" />
344344
<concept_proposal concept_proposal_id="1" original_text="I want this concept but I can't have it" state="REJECT" encounter_id="3" obs_concept_id="4" creator="1" date_created="2009-06-03 13:55:12.0" uuid="57a68666-5067-11de-80cb-001e378eb67e"/>
345345
<concept_proposal concept_proposal_id="2" original_text="unmapped concept proposal" state="UNMAPPED" encounter_id="3" creator="1" date_created="2010-12-21 08:41:10.0" uuid="af4ae460-0e2b-11e0-a94b-469c3c5a0c2f"/>
@@ -398,7 +398,7 @@
398398
<drug_order order_id="111" drug_inventory_id="3" dose="325.0" dose_units="50" as_needed="false" frequency="1" dosing_type="org.openmrs.SimpleDosingInstructions" route="22" quantity="1.0" quantity_units="51" num_refills="10" dispense_as_written="0" />
399399
<drug_order order_id="2" drug_inventory_id="2" dose="1.0" dose_units="51" as_needed="false" frequency="1" dosing_type="org.openmrs.SimpleDosingInstructions" route="22" quantity="1.0" quantity_units="51" num_refills="10" dispense_as_written="0" />
400400
<drug_order order_id="22" drug_inventory_id="2" as_needed="0" brand_name="some brand name" dispense_as_written="1" />
401-
<drug_order order_id="222" drug_inventory_id="2" as_needed="0" dispense_as_written="0" />
401+
<drug_order order_id="222" drug_inventory_id="2" as_needed="0" dispense_as_written="0" dosing_type="org.openmrs.FreeTextDosingInstructions" dosing_instructions="As directed" />
402402
<drug_order order_id="3" drug_inventory_id="2" dose="2.0" dose_units="51" as_needed="false" frequency="1" dosing_type="org.openmrs.SimpleDosingInstructions" route="22" quantity="1.0" quantity_units="51" num_refills="10" dispense_as_written="0" />
403403
<drug_order order_id="4" drug_inventory_id="3" dose="325.0" dose_units="50" as_needed="false" frequency="1" dosing_type="org.openmrs.SimpleDosingInstructions" route="22" quantity="1.0" quantity_units="51" num_refills="10" dispense_as_written="0" />
404404
<drug_order order_id="44" drug_inventory_id="3" as_needed="0" dispense_as_written="0" />

0 commit comments

Comments
 (0)