Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 9284)
@@ -35,5 +35,5 @@
 from waeup.kofa.interfaces import (
     IBatchProcessor, FatalCSVError, IObjectConverter, IUserAccount,
-    IObjectHistory, VALIDATED, IGNORE_MARKER)
+    IObjectHistory, VALIDATED, REGISTERED, IGNORE_MARKER)
 from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.students.interfaces import (
@@ -717,5 +717,8 @@
     factory_name = 'waeup.StudentStudyCourse'
 
-    additional_fields = ['current_session', 'current_level']
+    additional_fields = [
+        'current_session',
+        'current_level',
+        'bypass_validation']
 
     def checkUpdateRequirements(self, obj, row, site):
@@ -729,10 +732,14 @@
         if obj.current_session != row['current_session']:
             return 'Current session does not correspond.'
-        # Check if student is in state REGISTERED
-        if obj.student.state != VALIDATED:
-            return 'Student in wrong state.'
         # Check if new verdict is provided
         if row['current_verdict'] in (IGNORE_MARKER, ''):
             return 'Verdict is missing.'
+        # Check if student is in state REGISTERED or VALIDATED
+        if row.get('bypass_validation') in ('1', 'True', 'TRUE', 'yes'):
+            if obj.student.state not in (VALIDATED, REGISTERED):
+                return 'Student in wrong state.'
+        else:
+            if obj.student.state != VALIDATED:
+                return 'Student in wrong state.'
         return None
 
@@ -749,6 +756,9 @@
             '%s - Verdict updated: %s'
             % (parent.student_id, items_changed))
-        # Fire transition
-        IWorkflowInfo(obj.__parent__).fireTransition('return')
+        # Fire transition depending on student's state
+        if obj.__parent__.state == REGISTERED:
+            IWorkflowInfo(obj.__parent__).fireTransition('bypass_validation')
+        else:
+            IWorkflowInfo(obj.__parent__).fireTransition('return')
         # Update the students_catalog
         notify(grok.ObjectModifiedEvent(obj.__parent__))
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data.csv
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data.csv	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data.csv	(revision 9284)
@@ -3,4 +3,6 @@
 Y777777,Claus,Finau,2,1990-01-03,100001,aa@aa.ng,1234,m,courses validated
 ,Susann,Berson,3,1990-01-04,100002,aa@aa.ng,1234,f,courses validated
-,Else,Mueller,4,1990-01-05,100003,aa@aa.ng,1234,f,courses registered
+,Else,Mueller,4,1990-01-05,100003,aa@aa.ng,1234,f,school fee paid
 X888888,Alfons,Meier,5,1990-01-02,100004,aa@aa.ng,1234,m,courses validated
+X999999,Herbert,Mueller,6,1990-01-02,100005,aa@aa.ng,1234,m,courses registered
+X111111,Fabian,Riester,7,1990-01-02,100006,aa@aa.ng,1234,m,courses validated
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data_update3.csv
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data_update3.csv	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_student_data_update3.csv	(revision 9284)
@@ -3,3 +3,3 @@
 Y777777,,return
 ,3,return
-,4,validate_courses
+,4,register_courses
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studycourse_data.csv
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studycourse_data.csv	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_studycourse_data.csv	(revision 9284)
@@ -6,2 +6,4 @@
 4,,CERT1,2008,200
 5,,CERT1,2008,200
+6,,CERT1,2008,200
+7,,CERT1,2008,200
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_verdict_data.csv
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_verdict_data.csv	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/sample_verdict_data.csv	(revision 9284)
@@ -1,6 +1,8 @@
-matric_number,current_session,current_level,current_verdict
-100000,2008,200,A
-100001,2008,100,B
-100002,2007,200,C
-100003,2008,200,A
-100004,2008,200,
+matric_number,current_session,current_level,current_verdict,bypass_validation
+100000,2008,200,A,0
+100001,2008,100,B,False
+100002,2007,200,C,
+100003,2008,200,A,
+100004,2008,200,,
+100005,2008,200,A,1
+100006,2008,200,A,True
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py	(revision 9284)
@@ -360,5 +360,5 @@
             self.csv_file, STUDENT_HEADER_FIELDS)
         self.assertEqual(num_warns,0)
-        assert len(self.app['students'].keys()) == 6
+        self.assertEqual(len(self.app['students']), 8)
         self.assertEqual(self.app['students']['X666666'].reg_number,'1')
         self.assertEqual(
@@ -612,12 +612,18 @@
         self.assertEqual(student.state, 'returning')
         self.assertEqual(studycourse.current_level, 200)
+        student = self.processor.getParent(
+            dict(matric_number='100005'), self.app)
+        self.assertEqual(studycourse.current_verdict, 'A')
+        self.assertEqual(student.state, 'returning')
+        self.assertEqual(studycourse.current_level, 200)
         content = open(fail_file).read()
         self.assertEqual(
             content,
-            'current_session,current_verdict,matric_number,current_level,--ERRORS--\r\n'
-            '2008,B,100001,100,Current level does not correspond.\r\n'
-            '2007,C,100002,200,Current session does not correspond.\r\n'
-            '2008,A,100003,200,Student in wrong state.\r\n'
-            '2008,<IGNORE>,100004,200,Verdict is missing.\r\n'
+            'current_session,current_verdict,bypass_validation,'
+            'matric_number,current_level,--ERRORS--\r\n'
+            '2008,B,False,100001,100,Current level does not correspond.\r\n'
+            '2007,C,<IGNORE>,100002,200,Current session does not correspond.\r\n'
+            '2008,A,<IGNORE>,100003,200,Student in wrong state.\r\n'
+            '2008,<IGNORE>,<IGNORE>,100004,200,Verdict is missing.\r\n'
             )
         shutil.rmtree(os.path.dirname(fin_file))
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 9283)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 9284)
@@ -164,4 +164,11 @@
 
     Transition(
+        transition_id = 'bypass_validation',
+        title = _('Return and bypass validation'),
+        msg = _("Returned"),
+        source = REGISTERED,
+        destination = RETURNING),
+
+    Transition(
         transition_id = 'reset8',
         title = _('Reset to school fee paid'),
@@ -173,5 +180,5 @@
         transition_id = 'return',
         title = _('Return'),
-        msg = _("Reset to 'returning'"),
+        msg = _("Returned"),
         source = VALIDATED,
         destination = RETURNING),
