Index: main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 12874)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 12882)
@@ -607,5 +607,24 @@
 
 class CourseTicketProcessor(StudentProcessorBase):
-    """A batch processor for ICourseTicket objects.
+    """The Course Ticket Processor imports course tickets, the subobjects
+    of student study levels (= course lists).
+
+    An imported course ticket contains a copy of the original course data.
+    During import only a few attributes can be set/overwritten.
+
+    Like all other student data importers, this processor also requires
+    either `student_id`, `reg_number` or `matric_number` to find the student.
+    Then  it needs `level` and `code` to localize the course ticket.
+
+    `checkConversion` first searches the courses catalog for the imported
+    `code` and ensures that a course with such a code really exists
+    in the academic section. It furthermore checks if `level_session` in
+    the row corresponds with the session of the parent student
+    study level object. It fails if one of the conditions is not met.
+
+    In create mode `fcode`, `dcode`, `title`, `credits`, `passmark` and
+    `semester` are taken from the course found in the academic section.
+    These attributes can nevermore be changed, neither via the user interface
+    nor by import.
     """
     grok.implements(IBatchProcessor)
@@ -710,5 +729,16 @@
 
 class StudentOnlinePaymentProcessor(StudentProcessorBase):
-    """A batch processor for IStudentOnlinePayment objects.
+    """The Course Ticket Processor imports student payment tickets. The
+    tickets are located in the ``payments`` subfolder of the student
+    container. The only additional locator is `p_id`, the object id.
+
+    The `checkConversion` method checks the format of the payment identifier.
+    In create mode it does also ensures that same p_id does not exist
+    elsewhere. It must be portal-wide unique.
+
+    When adding a payment ticket, the `addEntry` method checks if the same
+    payment has already been made. It compares `p_category` and `p_session`
+    in the row with the corresponding attributes  of existing payment
+    tickets in state ``paid``. If they match, a `DuplicationError` is raised.
     """
     grok.implements(IBatchProcessor)
@@ -782,5 +812,4 @@
         p_id = row['p_id'].strip('#')
         # Requirement added on 19/02/2015: same payment must not exist.
-        #if not None in (obj.p_category, obj.p_session):
         if self.samePaymentMade(student, obj.p_category, obj.p_session):
             raise DuplicationError('Same payment has already been made.')
@@ -846,7 +875,32 @@
 
 class StudentVerdictProcessor(StudentStudyCourseProcessor):
-    """A special batch processor for verdicts.
-
-    Import verdicts and perform workflow transitions.
+    """The Student Verdict Processor inherits from the Student Study
+    Course Processor. It's a pure updater. Import step 2 raises a warning
+    message if a datacenter manager tries to select another mode.
+    But it does more than only overwriting study course attributes.
+
+    The Student Verdict Processor is the only processor which cannot be
+    used for restoring data. Purpose is to announce a verdict at the end of
+    each academic session. The processor does not only import a verdict,
+    it also conditions the student data so that the student can pay for the
+    next session and proceed to the next study level.
+
+    The `checkUpdateRequirements` method ensures that the imported data
+    really correspond to the actual state of the student.
+    `current_level` and `current_session` in the row must be on par
+    with the attributes of the study course object. Thus, the processor
+    does not use these values to overwrite the attributes of the study course
+    but to control that the verdict is really meant for the current session of
+    the student. The verdict is only imported if a corresponding study level
+    object exists and the student is in the right registration state,
+    either ``courses validated`` or ``courses registered``. Course registration
+    can be bypassed by setting `bypass_validation` to ``True``.
+
+    The `updateEntry` method does not only update the current verdict of
+    the student study course, it also updates the matching student study
+    level object. It saves the current verdict as `level_verdict` and sets
+    the `validated_by` and `validation_date` attributes, whereas `validated_by` 
+    is taken from the row of the import file and `validation_date` is set to the
+    actual UTC datetime. Finally, the student is moved to state ``returning``.
     """
 
@@ -893,5 +947,5 @@
             obj, vals_to_set, site, filename)
         parent = self.getParent(row, site)
-        # Set current_vedict in corresponding studylevel
+        # Set current_verdict in corresponding studylevel
         level_string = str(obj.current_level)
         obj[level_string].level_verdict = row['current_verdict']
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 12874)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 12882)
@@ -257,8 +257,7 @@
 
     A course ticket contains a copy of the original course and
-    certificate course data. If the courses and/or the referrin certificate
+    certificate course data. If the courses and/or the referring certificate
     courses are removed, the corresponding tickets remain unchanged.
-    So we do not need any event
-    triggered actions on course tickets.
+    So we do not need any event triggered actions on course tickets.
     """
     grok.implements(ICourseTicket, IStudentNavigation)
