Skip to content

Commit ddba2b4

Browse files
TRUNK-6278: Skip visit overlap validation when ending a visit (#4835)
1 parent 2f906f0 commit ddba2b4

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

api/src/main/java/org/openmrs/validator/VisitValidator.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,15 @@ public void validate(Object target, Errors errors) {
111111
// Skipping validation if the patient is not set or not yet persisted
112112
boolean nonExistingPatient = visit.getPatient() == null || visit.getPatient().getId() == null;
113113

114+
Visit existingVisit = Context.getVisitService().getVisitByUuid(visit.getUuid());
115+
116+
boolean endingVisit = existingVisit != null &&
117+
existingVisit.getStopDatetime() == null &&
118+
visit.getStopDatetime() != null
119+
&& existingVisit.getStartDatetime().equals(visit.getStartDatetime());
120+
114121
// check for overlapping visits
115-
if (!nonExistingPatient && disallowOverlappingVisits()) {
122+
if (!nonExistingPatient && disallowOverlappingVisits() && !endingVisit) {
116123
VisitSearchCriteria visitSearchCriteria = new VisitSearchCriteriaBuilder()
117124
.patient(visit.getPatient())
118125
.maxStartDatetime(visit.getStopDatetime())

api/src/test/java/org/openmrs/validator/VisitValidatorTest.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,68 @@ public void validate_shouldRejectOverlappingActiveVisits() {
407407
assertTrue(errors.hasFieldErrors("startDatetime"));
408408
}
409409

410+
/**
411+
* @see VisitValidator#validate(Object, org.springframework.validation.Errors)
412+
* Should skip validation if it is an end visit call and start date is not changed
413+
*/
414+
@Test
415+
public void validate_shouldNotRejectOnVisitOverlapDuringEndVisit() {
416+
417+
// active visit: |---------------->
418+
// overlapping visit: |--|
419+
// ended active visit: |----------|
420+
421+
String activeVisitUuid = "c2639863-cbbe-44bb-986d-8a4820f8ae14";
422+
Visit activeVisit = Context.getVisitService().getVisitByUuid(activeVisitUuid);
423+
424+
String newStopDateTime = "2014-02-06T00:00:00";
425+
426+
// make a clone and update the visit with an end date
427+
Visit updatedVisit = new Visit();
428+
updatedVisit.setVisitId(activeVisit.getVisitId());
429+
updatedVisit.setUuid(activeVisit.getUuid());
430+
updatedVisit.setPatient(activeVisit.getPatient());
431+
updatedVisit.setStartDatetime(activeVisit.getStartDatetime());
432+
updatedVisit.setVisitType(activeVisit.getVisitType());
433+
updatedVisit.setStopDatetime(parseIsoDate(newStopDateTime));
434+
435+
Errors errors = new BindException(updatedVisit, "visit");
436+
new VisitValidator().validate(updatedVisit, errors);
437+
438+
assertFalse(errors.hasFieldErrors("startDatetime"));
439+
}
440+
441+
/**
442+
* @see VisitValidator#validate(Object, org.springframework.validation.Errors)
443+
* Should skip validation if it is an end visit call and start date is not changed
444+
*/
445+
@Test
446+
public void validate_shouldRejectOnVisitOverlapDuringEndVisitWithStartDateUpdated() {
447+
// active visit: |---------------->
448+
// overlapping visit: |--|
449+
// ended active visit: |----------|
450+
451+
String activeVisitUuid = "c2639863-cbbe-44bb-986d-8a4820f8ae14";
452+
Visit activeVisit = Context.getVisitService().getVisitByUuid(activeVisitUuid);
453+
454+
String newStartDateTime = "2014-02-04T00:00:00";
455+
String newStopDateTime = "2014-02-06T00:00:00";
456+
457+
// make a clone and update the visit with an end date
458+
Visit updatedVisit = new Visit();
459+
updatedVisit.setVisitId(activeVisit.getVisitId());
460+
updatedVisit.setUuid(activeVisit.getUuid());
461+
updatedVisit.setPatient(activeVisit.getPatient());
462+
updatedVisit.setVisitType(activeVisit.getVisitType());
463+
updatedVisit.setStartDatetime(parseIsoDate(newStartDateTime));
464+
updatedVisit.setStopDatetime(parseIsoDate(newStopDateTime));
465+
466+
Errors errors = new BindException(updatedVisit, "visit");
467+
new VisitValidator().validate(updatedVisit, errors);
468+
469+
assertTrue(errors.hasFieldErrors("startDatetime"));
470+
}
471+
410472
/**
411473
* @see VisitValidator#validate(Object, org.springframework.validation.Errors)
412474
* This test verifies that updating an existing visit does not result in a rejection

api/src/test/resources/org/openmrs/validator/include/VisitValidatorTest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@
2828
<visit visit_id="10" patient_id="42" visit_type_id="1" date_started="2014-01-04 10:00:00.0" date_stopped="2014-01-04 14:00:00.0" location_id="1" indication_concept_id="5497" creator="1" date_created="2014-01-04 10:00:00.0" voided="false" uuid="7EC61082-9C62-4BBB-9F1B-F4BEA9C2893E"/>
2929
<visit visit_id="11" patient_id="42" visit_type_id="1" date_started="2014-02-05 00:00:00.0" date_stopped="2014-02-11 00:00:00.0" location_id="1" indication_concept_id="5497" creator="1" date_created="2014-02-05 00:00:00.0" voided="true" uuid="3CBB36EA-654C-4C26-9B01-C2D2A1B0426D"/>
3030
<visit visit_id="12" patient_id="43" visit_type_id="1" date_started="2014-01-04 10:00:00.0" location_id="1" indication_concept_id="5497" creator="1" date_created="2014-01-04 10:00:00.0" voided="false" uuid="47841268-0f09-4af9-9033-d547c6adec54"/>
31-
31+
<visit visit_id="13" patient_id="43" visit_type_id="1" date_started="2014-02-05 00:00:00.0" date_stopped="2014-02-11 00:00:00.0" location_id="1" indication_concept_id="5497" creator="1" date_created="2014-02-05 00:00:00.0" voided="false" uuid="05b7edf2-035b-4256-837e-8c9712612fde"/>
32+
<visit visit_id="14" patient_id="43" visit_type_id="1" date_started="2014-02-02 00:00:00.0" location_id="1" indication_concept_id="5497" creator="1" date_created="2014-02-05 00:00:00.0" voided="false" uuid="c2639863-cbbe-44bb-986d-8a4820f8ae14"/>
3233
</dataset>

0 commit comments

Comments
 (0)