From 1db23aa958ed94df743583335fdf84d1f9186f68 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 6 Mar 2017 15:55:45 +0100
Subject: [PATCH] finishing past visits added

---
 .../appointment/parse/AppointmentDao.java     | 34 +++++++-
 .../java/smash/appointment/parse/Visit.java   | 10 ++-
 .../appointment/parse/AppointmentDaoTest.java | 77 +++++++++++++++----
 3 files changed, 104 insertions(+), 17 deletions(-)

diff --git a/appointment-import/src/main/java/smash/appointment/parse/AppointmentDao.java b/appointment-import/src/main/java/smash/appointment/parse/AppointmentDao.java
index fa9a57f9..cb965abf 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/AppointmentDao.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/AppointmentDao.java
@@ -1,6 +1,9 @@
 package smash.appointment.parse;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -36,7 +39,7 @@ public class AppointmentDao {
 		this.appointments = appointments;
 	}
 
-	public List<Visit> getVisits() {
+	public List<Visit> getVisits() throws ParseException {
 		List<Visit> result = new ArrayList<>();
 		Map<Subject, List<AppointmentEntry>> subjectAppointments = new HashMap<>();
 		for (AppointmentEntry entry : appointments) {
@@ -51,7 +54,7 @@ public class AppointmentDao {
 		return result;
 	}
 
-	private List<Visit> getVisitsForSubject(Subject subject, List<AppointmentEntry> list) {
+	private List<Visit> getVisitsForSubject(Subject subject, List<AppointmentEntry> list) throws ParseException {
 		Comparator<AppointmentEntry> comparator = new Comparator<AppointmentEntry>() {
 
 			@Override
@@ -87,7 +90,7 @@ public class AppointmentDao {
 				String date = currentVisit.getLastAppointmentDate();
 				if (date.equals(appointmentEntry.getDay().substring(0, 10))) {
 					currentVisit.getLastAppointment().addTypes(appointmentEntry.getTypes());
-					String source = appointmentEntry.getSource() + "\n"+currentVisit.getLastAppointment().getSource();
+					String source = appointmentEntry.getSource() + "\n" + currentVisit.getLastAppointment().getSource();
 					currentVisit.getLastAppointment().setSource(source);
 				} else {
 					currentVisit.addAppointment(appointmentEntry);
@@ -97,9 +100,34 @@ public class AppointmentDao {
 		if (currentVisit.getAppointments().size() > 0) {
 			result.add(currentVisit);
 		}
+		if (shouldBeFinished(currentVisit.getEndDate())) {
+			result.add(createNextVisit(currentVisit));
+		}
 		return result;
 	}
 
+	protected Visit createNextVisit(Visit currentVisit) throws ParseException {
+		Visit visit = new Visit(currentVisit.getSubject());
+		Calendar date = Calendar.getInstance();
+		String dateStr =currentVisit.getStartDate(); 
+		date.setTime(DATE_FORMATTER.parse(dateStr));
+		if (currentVisit.getSubject().getType().equals(SubjectType.CONTROL)) {
+			date.add(Calendar.YEAR, 4);
+		} else {
+			date.add(Calendar.YEAR, 1);
+		}
+		visit.setStartDate(DATE_FORMATTER.format(date.getTime()));
+		return visit;
+	}
+
+	private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd");
+
+	protected boolean shouldBeFinished(String endDate) {
+		Calendar today_minus_two_months = Calendar.getInstance();
+		today_minus_two_months.add(Calendar.MONTH, -2);
+		return DATE_FORMATTER.format(today_minus_two_months.getTime()).compareTo(endDate) > 0;
+	}
+
 	public void addAppointment(AppointmentEntry appointment) {
 		appointments.add(appointment);
 
diff --git a/appointment-import/src/main/java/smash/appointment/parse/Visit.java b/appointment-import/src/main/java/smash/appointment/parse/Visit.java
index 2762806a..b585c524 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/Visit.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/Visit.java
@@ -28,6 +28,8 @@ public class Visit {
 
 	private Subject								 subject;
 	private List<AppointmentEntry> appointments	= new ArrayList<>();
+	
+	private String startDate;
 
 	public Visit(Subject subject) {
 		if (subject==null) {
@@ -75,8 +77,10 @@ public class Visit {
 	public String getStartDate() {
 		if (appointments.size() > 0) {
 			return appointments.get(0).getDay().substring(0, 10);
-		} else {
+		} else if (startDate==null){
 			return "1900-01-01";
+		} else {
+			return startDate;
 		}
 	}
 
@@ -106,4 +110,8 @@ public class Visit {
 		this.subject = subject;
 	}
 
+	public void setStartDate(String newDate) {
+		this.startDate = newDate;
+	}
+
 }
diff --git a/appointment-import/src/test/java/smash/appointment/parse/AppointmentDaoTest.java b/appointment-import/src/test/java/smash/appointment/parse/AppointmentDaoTest.java
index 82dba7fa..98c1a8ad 100644
--- a/appointment-import/src/test/java/smash/appointment/parse/AppointmentDaoTest.java
+++ b/appointment-import/src/test/java/smash/appointment/parse/AppointmentDaoTest.java
@@ -1,13 +1,20 @@
 package smash.appointment.parse;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
+import java.text.ParseException;
+
+import org.apache.log4j.Logger;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
 
 public class AppointmentDaoTest {
+	Logger logger = Logger.getLogger(AppointmentDaoTest.class);
 
 	@AfterClass
 	public static void tearDownAfterClass() throws Exception {
@@ -22,23 +29,23 @@ public class AppointmentDaoTest {
 	}
 
 	@Test
-	public void getVisits() {
+	public void getVisits() throws ParseException {
 		Subject subject1 = new Subject("a", "b", "c", "d");
 		AppointmentEntry appointment = new AppointmentEntry();
 		appointment.setSubject(subject1);
-		appointment.setDay("2016-02-02");
+		appointment.setDay("2026-02-02");
 		appointment.addType(AppointmentType.LEVEL_A);
-		
+
 		AppointmentEntry appointment2 = new AppointmentEntry();
 		appointment2.setSubject(subject1);
-		appointment2.setDay("2016-02-02");
+		appointment2.setDay("2026-02-02");
 		appointment2.addType(AppointmentType.LEVEL_B);
-		
+
 		AppointmentEntry appointment3 = new AppointmentEntry();
 		appointment3.setSubject(subject1);
-		appointment3.setDay("2011-02-02");
+		appointment3.setDay("2021-02-02");
 		appointment3.addType(AppointmentType.LEVEL_A);
-		
+
 		AppointmentDao appointmentDao = new AppointmentDao();
 		appointmentDao.addAppointment(appointment);
 		appointmentDao.addAppointment(appointment2);
@@ -47,23 +54,67 @@ public class AppointmentDaoTest {
 	}
 
 	@Test
-	public void getVisits2() {
+	public void getVisits2() throws ParseException {
 		Subject subject1 = new Subject("a", "b", "c", "d");
 		Subject subject2 = new Subject("a1", "b1", "c1", "d1");
 		AppointmentEntry appointment = new AppointmentEntry();
 		appointment.setSubject(subject1);
-		appointment.setDay("2016-02-02");
+		appointment.setDay("2026-02-02");
 		appointment.addType(AppointmentType.LEVEL_A);
-		
+
 		AppointmentEntry appointment3 = new AppointmentEntry();
 		appointment3.setSubject(subject2);
-		appointment3.setDay("2016-02-02");
+		appointment3.setDay("2026-02-02");
 		appointment3.addType(AppointmentType.LEVEL_B);
-		
+
 		AppointmentDao appointmentDao = new AppointmentDao();
 		appointmentDao.addAppointment(appointment);
 		appointmentDao.addAppointment(appointment3);
 		assertEquals(2, appointmentDao.getVisits().size());
 	}
 
+	@Test
+	public void getShouldBeFinished() {
+		AppointmentDao appointmentDao = new AppointmentDao();
+		assertTrue(appointmentDao.shouldBeFinished("2014-01-01"));
+		assertTrue(appointmentDao.shouldBeFinished("2017-01-01"));
+		assertFalse(appointmentDao.shouldBeFinished("2018-01-01"));
+	}
+
+	@Test
+	public void createNextVisitForControl() throws ParseException {
+		Subject subject = new Subject("a", "b", "c", "d");
+		subject.setType(SubjectType.CONTROL);
+		AppointmentEntry appointment3 = new AppointmentEntry();
+		appointment3.setSubject(subject);
+		appointment3.setDay("2016-02-02");
+		appointment3.addType(AppointmentType.LEVEL_B);
+
+		Visit visit = new Visit(subject);
+		visit.addAppointment(appointment3);
+
+		AppointmentDao appointmentDao = new AppointmentDao();
+		Visit nextVisit = appointmentDao.createNextVisit(visit);
+		assertNotNull(nextVisit);
+		assertTrue(nextVisit.getStartDate().startsWith("2020"));
+	}
+
+	@Test
+	public void createNextVisitForPatient() throws ParseException {
+		Subject subject = new Subject("a", "b", "c", "d");
+		subject.setType(SubjectType.PATIENT);
+		AppointmentEntry appointment3 = new AppointmentEntry();
+		appointment3.setSubject(subject);
+		appointment3.setDay("2016-02-02");
+		appointment3.addType(AppointmentType.LEVEL_B);
+
+		Visit visit = new Visit(subject);
+		visit.addAppointment(appointment3);
+
+		AppointmentDao appointmentDao = new AppointmentDao();
+		Visit nextVisit = appointmentDao.createNextVisit(visit);
+		assertNotNull(nextVisit);
+		assertTrue(nextVisit.getStartDate().startsWith("2017"));
+	}
+
 }
-- 
GitLab