From b29b695a49c7a8e3648f59fcd2c93091e453a8bd Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 30 Oct 2017 15:08:08 +0100
Subject: [PATCH] follow up visit start date is computed based on the first
 visit (not previous)

---
 smash/web/models/visit.py            |  9 +++++---
 smash/web/tests/models/test_visit.py | 33 +++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/smash/web/models/visit.py b/smash/web/models/visit.py
index e11b52d7..1f491319 100644
--- a/smash/web/models/visit.py
+++ b/smash/web/models/visit.py
@@ -52,11 +52,14 @@ class Visit(models.Model):
         self.save()
 
         if (not self.subject.dead) and (not self.subject.resigned):
-            visit_started = self.datetime_begin
+            visit_started = Visit.objects.filter(subject=self.subject).filter(visit_number=1)[0].datetime_begin
+            follow_up_number = Visit.objects.filter(subject=self.subject).count() + 1
 
-            time_to_next_visit = datetime.timedelta(days=365)
+            delta_days = 365
             if self.subject.type == SUBJECT_TYPE_CHOICES_CONTROL:
-                time_to_next_visit = datetime.timedelta(days=365 * 3 + 366)
+                delta_days = 365 * 3 + 366
+
+            time_to_next_visit = datetime.timedelta(days=delta_days * (follow_up_number - 1))
 
             Visit.objects.create(
                 subject=self.subject,
diff --git a/smash/web/tests/models/test_visit.py b/smash/web/tests/models/test_visit.py
index 835b7a66..f4a23134 100644
--- a/smash/web/tests/models/test_visit.py
+++ b/smash/web/tests/models/test_visit.py
@@ -1,7 +1,11 @@
+import datetime
+
 from django.test import TestCase
 
-from web.tests.functions import create_subject, create_visit
+from web.models.constants import SUBJECT_TYPE_CHOICES_PATIENT
 from web.models import Visit
+from web.tests.functions import create_subject, create_visit
+from web.views.notifications import get_today_midnight_date
 
 
 class VisitModelTests(TestCase):
@@ -36,6 +40,33 @@ class VisitModelTests(TestCase):
         visit_count = Visit.objects.filter(subject=subject).count()
         self.assertEquals(1, visit_count)
 
+    def test_mark_as_finished_for_follow_up_visit(self):
+        subject = create_subject()
+        subject.type = SUBJECT_TYPE_CHOICES_PATIENT
+        subject.save()
+        visit = create_visit(subject)
+
+        visit.mark_as_finished()
+
+        follow_up_visit = Visit.objects.filter(subject=subject).filter(visit_number=2)[0]
+        follow_up_visit.datetime_begin = visit.datetime_begin + datetime.timedelta(days=133)
+        follow_up_visit.datetime_end = visit.datetime_begin + datetime.timedelta(days=170)
+        follow_up_visit.save()
+
+        follow_up_visit.mark_as_finished()
+
+        visit_count = Visit.objects.filter(subject=subject).count()
+        self.assertEquals(3, visit_count)
+
+        new_follow_up = Visit.objects.filter(subject=subject).filter(visit_number=3)[0]
+
+        # check if follow up date is based on the first visit date
+        self.assertTrue(visit.datetime_begin + datetime.timedelta(days=365 * 2 - 1) < new_follow_up.datetime_begin)
+
     def test_visit_to_string(self):
         visit = create_visit(create_subject())
         self.assertIsNotNone(str(visit))
+
+    def test_visit_to_unicode(self):
+        visit = create_visit(create_subject())
+        self.assertIsNotNone(unicode(visit))
-- 
GitLab