Skip to content

Commit

Permalink
sukreet | BDSHR-566 |finding or initializing event based on period if…
Browse files Browse the repository at this point in the history
… present.
  • Loading branch information
sukreet committed May 24, 2016
1 parent 55f79e3 commit d5b7fe5
Show file tree
Hide file tree
Showing 10 changed files with 370 additions and 42 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.openmrs.module.fhir.mapper.emr;

import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
import ca.uhn.fhir.model.dstu2.valueset.EncounterClassEnum;
import org.apache.commons.collections4.CollectionUtils;
import org.openmrs.*;
Expand Down Expand Up @@ -96,4 +97,9 @@ private VisitType identifyVisitTypeByName (List < VisitType > allVisitTypes, Str
}
return encVisitType;
}

public PeriodDt getVisitPeriod(ShrEncounterBundle shrEncounterBundle) {
ca.uhn.fhir.model.dstu2.resource.Encounter fhirEncounter = FHIRBundleHelper.getEncounter(shrEncounterBundle.getBundle());
return fhirEncounter.getPeriod();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package org.openmrs.module.shrclient.service;

import org.apache.commons.lang3.time.DateUtils;
import org.joda.time.DateTime;
import org.openmrs.*;
import org.openmrs.api.VisitService;
import org.openmrs.module.fhir.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand All @@ -20,46 +22,80 @@ public VisitLookupService(VisitService visitService) {
this.visitService = visitService;
}

public Visit findOrInitializeVisit(Patient patient, Date visitDate, VisitType visitType, Location location) {
Visit applicableVisit = getVisitForPatientWithinDates(visitType, patient, location, visitDate);
public Visit findOrInitializeVisit(Patient patient, Date encounterDate, VisitType visitType, Location location, Date visitStartDate, Date visitStopDate) {
Visit applicableVisit = getApplicableVisit(patient, encounterDate, visitType, location, visitStartDate);
if (applicableVisit != null) {
return applicableVisit;
return modifiedVisit(applicableVisit, visitStopDate, encounterDate);
}
if (visitStartDate == null) {
visitStartDate = encounterDate;
}
Visit visit = new Visit();
visit.setPatient(patient);
visit.setVisitType(visitType);
visit.setStartDatetime(visitDate);
visit.setStartDatetime(visitStartDate);
visit.setEncounters(new HashSet<Encounter>());
visit.setUuid(UUID.randomUUID().toString());
visit.setLocation(location);

Visit nextVisit = getVisitForPatientForNearestStartDate(patient, visitDate);
DateTime startTime = new DateTime(visitDate);
Visit nextVisit = getVisitForPatientForNearestStartDate(patient, visitStartDate);
DateTime startTime = new DateTime(visitStartDate);
if (nextVisit == null) {
stopVisitAtEndOfDay(visit, startTime);
stopVisitWhenSuitable(visit, startTime, visitStopDate);
} else {
stopVisitBeforeStartOfNextVisit(visit, nextVisit, startTime);
}
return visit;
}

private Visit getApplicableVisit(Patient patient, Date encounterDate, VisitType visitType, Location location, Date visitStartDate) {
if (visitStartDate == null) {
return getApplicableVisitForEncounterDate(visitType, patient, location, encounterDate);
}
return getApplicableVisitForVisitStartDate(visitType, patient, location, visitStartDate);
}


private Visit modifiedVisit(Visit applicableVisit, Date visitStopDate, Date encounterDate) {
if (visitStopDate == null) {
Date today = new DateTime().toDate();
if (DateUtils.isSameDay(encounterDate, today))
visitStopDate = DateUtil.aSecondBefore(today);
else
visitStopDate = getEndOfDay(new DateTime(encounterDate)).toDate();
}
applicableVisit.setStopDatetime(visitStopDate);
return applicableVisit;
}


private void stopVisitBeforeStartOfNextVisit(Visit visit, Visit nextVisit, DateTime startTime) {
DateTime nextVisitStartTime = new DateTime(nextVisit.getStartDatetime());
DateTime visitStopDate = startTime.withTime(23, 59, 59, 000);
boolean isEndTimeBeforeNextVisitStart = visitStopDate.isBefore(nextVisitStartTime);
if (!isEndTimeBeforeNextVisitStart) {
DateTime visitStopDate = getEndOfDay(startTime);
if (!visitStopDate.isBefore(nextVisitStartTime)) {
visitStopDate = nextVisitStartTime.minusSeconds(1);
}
visit.setStopDatetime(visitStopDate.toDate());
}

private void stopVisitAtEndOfDay(Visit visit, DateTime startTime) {
Date stopTime = startTime.withTime(23, 59, 59, 000).toDate();
private DateTime getEndOfDay(DateTime startTime) {
return startTime.withTime(23, 59, 59, 000);
}

private void stopVisitWhenSuitable(Visit visit, DateTime startTime, Date stopTime) {
if (stopTime == null) {
stopTime = getEndOfDay(startTime).toDate();
Date currentDateTime = new DateTime().toDate();
if (DateUtils.isSameDay(startTime.toDate(), currentDateTime)) {
stopTime = DateUtil.aSecondBefore(currentDateTime);
}
}
visit.setStopDatetime(stopTime);
}

private Visit getVisitForPatientForNearestStartDate(Patient patient, Date startTime) {
List<Visit> visits = visitService.getVisits(null, Arrays.asList(patient), null, null, startTime, null, null, null, null, true, false);
private Visit getVisitForPatientForNearestStartDate(Patient patient, Date startDate) {
Date maxEndDate = getEndOfDay(new DateTime(startDate)).toDate();
List<Visit> visits = visitService.getVisits(null, Arrays.asList(patient), null, null, startDate, null, null, maxEndDate, null, true, false);
if (visits.isEmpty()) {
return null;
}
Expand All @@ -72,9 +108,15 @@ public int compare(Visit v1, Visit v2) {
return visits.get(0);
}

private Visit getVisitForPatientWithinDates(VisitType visitType, Patient patient, Location location, Date startTime) {
private Visit getApplicableVisitForEncounterDate(VisitType visitType, Patient patient, Location location, Date startTime) {
List<Visit> visits = visitService.getVisits(Arrays.asList(visitType), Arrays.asList(patient),
Arrays.asList(location), null, null, startTime, startTime, null, null, true, false);
return visits.isEmpty() ? null : visits.get(0);
}

private Visit getApplicableVisitForVisitStartDate(VisitType visitType, Patient patient, Location location, Date visitStartDate) {
List<Visit> visits = visitService.getVisits(Arrays.asList(visitType), Arrays.asList(patient),
Arrays.asList(location), null, visitStartDate, visitStartDate, null, null, null, true, false);
return visits.isEmpty() ? null : visits.get(0);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.openmrs.module.shrclient.service.impl;

import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.dstu2.resource.Composition;
import com.sun.syndication.feed.atom.Category;
Expand Down Expand Up @@ -108,7 +109,8 @@ public void createOrUpdateEncounter(Patient emrPatient, EncounterEvent encounter
org.openmrs.Encounter newEmrEncounter = fhirMapper.map(emrPatient, shrEncounterBundle, systemProperties);

VisitType visitType = fhirMapper.getVisitType(shrEncounterBundle);
Visit visit = visitLookupService.findOrInitializeVisit(emrPatient, newEmrEncounter.getEncounterDatetime(), visitType , newEmrEncounter.getLocation());
PeriodDt visitPeriod = fhirMapper.getVisitPeriod(shrEncounterBundle);
Visit visit = visitLookupService.findOrInitializeVisit(emrPatient, newEmrEncounter.getEncounterDatetime(), visitType , newEmrEncounter.getLocation(), visitPeriod.getStart(),visitPeriod.getEnd() );
visit.addEncounter(newEmrEncounter);

//identify location, provider(s), visit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@
import org.openmrs.*;
import org.openmrs.api.*;
import org.openmrs.module.fhir.mapper.emr.FHIRMapper;
import org.openmrs.api.EncounterService;
import org.openmrs.api.PatientService;
import org.openmrs.api.ProviderService;
import org.openmrs.api.VisitService;
import org.openmrs.module.fhir.utils.DateUtil;
import org.openmrs.module.fhir.utils.FHIRBundleHelper;
import org.openmrs.module.shrclient.advice.SHREncounterEventService;
Expand Down Expand Up @@ -72,7 +76,6 @@ public class EMREncounterServiceIT extends BaseModuleWebContextSensitiveTest {

private EMREncounterService emrEncounterService;


@Before
public void setUp() throws Exception {
initMocks();
Expand Down Expand Up @@ -102,8 +105,9 @@ public void shouldSaveEncounter() throws Exception {
assertNotNull(encounter.getEncounterProviders());
assertEquals("Bahmni", encounter.getLocation().getName());

assertNotNull(encounter.getVisit());
assertNotNull(encounter.getVisit().getUuid());
Visit createdEncounterVisit = encounter.getVisit();
assertNotNull(createdEncounterVisit);
assertNotNull((createdEncounterVisit).getUuid());
assertEquals("50ab30be-98af-4dfd-bd04-5455937c443f", encounter.getLocation().getUuid());
}

Expand Down Expand Up @@ -359,11 +363,11 @@ public void shouldSaveAMedicationOrderWithoutDoseRoutes() throws Exception {
}

@Test
public void shouldUpdateTheSameEncounter() throws Exception {
public void shouldUpdateTheSameEncounterAndVisit() throws Exception {
executeDataSet("testDataSets/shrClientEncounterReverseSyncTestDS.xml");
Patient patient = patientService.getPatient(1);
String shrEncounterId = "shr-enc-id";
List<EncounterEvent> events = getEncounterEvents(shrEncounterId, "encounterBundles/dstu2/diagnosisConditions.xml");
List<EncounterEvent> events = getEncounterEvents(shrEncounterId, "encounterBundles/dstu2/diagnosisConditionsUpdate.xml");

Date currentTime = new Date();
Date tenMinutesAfter = getDateTimeAfterNMinutes(currentTime, 10);
Expand All @@ -372,6 +376,11 @@ public void shouldUpdateTheSameEncounter() throws Exception {
category.setTerm(ENCOUNTER_UPDATED_CATEGORY_TAG + ":" + DateUtil.toISOString(currentTime));
events.get(0).setCategories(asList(category));

Visit initialVisit = visitService.getVisit(1);
String initialVisitUuid = initialVisit.getUuid();
assertEquals(DateUtil.parseDate("2014-07-10 00:00:00"), initialVisit.getStartDatetime());
assertEquals(DateUtil.parseDate("2014-07-11 23:59:59"), initialVisit.getStopDatetime());

emrEncounterService.createOrUpdateEncounters(patient, events);
EncounterIdMapping mapping = (EncounterIdMapping) idMappingRepository.findByExternalId(shrEncounterId, ENCOUNTER);
String encounterUUID = mapping.getInternalId();
Expand All @@ -383,10 +392,15 @@ public void shouldUpdateTheSameEncounter() throws Exception {

emrEncounterService.createOrUpdateEncounters(patient, events);
mapping = (EncounterIdMapping) idMappingRepository.findByExternalId(shrEncounterId, ENCOUNTER);
Encounter encounter2 = encounterService.getEncounterByUuid(mapping.getInternalId());
Encounter encounter = encounterService.getEncounterByUuid(mapping.getInternalId());

assertEquals(encounterUUID, encounter2.getUuid());
assertEquals(initialVisitUuid, encounter.getVisit().getUuid());
assertEquals(encounterUUID, encounter.getUuid());
assertTrue(firstServerUpdateDateTime.before(mapping.getServerUpdateDateTime()));

Visit finalVisit = visitService.getVisit(1);
assertEquals(DateUtil.parseDate("2014-07-10 00:00:00"), finalVisit.getStartDatetime());
assertEquals(DateUtil.parseDate("2014-07-27 16:05:09"), finalVisit.getStopDatetime());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.openmrs.module.shrclient.service;

import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
import ca.uhn.fhir.model.dstu2.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.dstu2.resource.Composition;
Expand Down Expand Up @@ -138,8 +139,8 @@ public void shouldSyncNonConfidentialEncounter() throws Exception {
shrProperties.put(SHR_REFERENCE_PATH, "http://shr.com/");
shrProperties.put(SHR_PATIENT_ENC_PATH_PATTERN, "/patients/%s/encounters");
when(mockPropertiesReader.getShrProperties()).thenReturn(shrProperties);
when(mockVisitLookupService.findOrInitializeVisit(eq(emrPatient), any(Date.class), any(VisitType.class), any(Location.class))).thenReturn(new Visit());

when(mockFhirmapper.getVisitPeriod(any(ShrEncounterBundle.class))).thenReturn(new PeriodDt());
when(mockVisitLookupService.findOrInitializeVisit(eq(emrPatient), any(Date.class), any(VisitType.class), any(Location.class), any(Date.class), any(Date.class))).thenReturn(new Visit());
emrEncounterService.createOrUpdateEncounter(emrPatient, encounterEvent);

verify(mockFhirmapper, times(1)).map(eq(emrPatient), any(ShrEncounterBundle.class), any(SystemProperties.class));
Expand Down Expand Up @@ -233,7 +234,8 @@ public void shouldSyncAnEncounterIfUpdatedLater() throws Exception {
shrProperties.put(SHR_REFERENCE_PATH, "http://shr.com/");
shrProperties.put(SHR_PATIENT_ENC_PATH_PATTERN, "/patients/%s/encounters");
when(mockPropertiesReader.getShrProperties()).thenReturn(shrProperties);
when(mockVisitLookupService.findOrInitializeVisit(eq(emrPatient), any(Date.class), any(VisitType.class), any(Location.class))).thenReturn(new Visit());
when(mockFhirmapper.getVisitPeriod(any(ShrEncounterBundle.class))).thenReturn(new PeriodDt());
when(mockVisitLookupService.findOrInitializeVisit(eq(emrPatient), any(Date.class), any(VisitType.class), any(Location.class), any(Date.class) ,any(Date.class) )).thenReturn(new Visit());

emrEncounterService.createOrUpdateEncounter(emrPatient, encounterEvent);
verify(mockFhirmapper, times(1)).map(eq(emrPatient), any(ShrEncounterBundle.class), any(SystemProperties.class));
Expand Down Expand Up @@ -272,7 +274,8 @@ public void shouldNotSaveOrderIfAlreadySaved() throws Exception {
shrProperties.put(SHR_REFERENCE_PATH, "http://shr.com/");
shrProperties.put(SHR_PATIENT_ENC_PATH_PATTERN, "/patients/%s/encounters");
when(mockPropertiesReader.getShrProperties()).thenReturn(shrProperties);
when(mockVisitLookupService.findOrInitializeVisit(eq(emrPatient), any(Date.class), any(VisitType.class), any(Location.class))).thenReturn(new Visit());
when(mockFhirmapper.getVisitPeriod(any(ShrEncounterBundle.class))).thenReturn(new PeriodDt());
when(mockVisitLookupService.findOrInitializeVisit(eq(emrPatient), any(Date.class), any(VisitType.class), any(Location.class), any(Date.class) ,any(Date.class) )).thenReturn(new Visit());

emrEncounterService.createOrUpdateEncounter(emrPatient, encounterEvent);
verify(mockFhirmapper, times(1)).map(eq(emrPatient), any(ShrEncounterBundle.class), any(SystemProperties.class));
Expand Down
Loading

0 comments on commit d5b7fe5

Please sign in to comment.