Index: main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/interfaces.py
===================================================================
--- main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/interfaces.py	(revision 15011)
+++ main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/interfaces.py	(revision 15013)
@@ -49,8 +49,26 @@
         )
 
+    late_registration_fee = schema.Float(
+        title = _(u'Late Course Reg. Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    transcript_fee = schema.Float(
+        title = _(u'Transcript Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    transfer_fee = schema.Float(
+        title = _(u'Transfer Fee'),
+        default = 0.0,
+        required = False,
+        )
+
     # Additional fees in custom package add here
 
-    logbook_fee = schema.Float(
-        title = _(u'Logbook Fee'),
+    logbool_combo_fee = schema.Float(
+        title = _(u'Logbook Combo Fee'),
         default = 0.0,
         required = False,
@@ -59,4 +77,10 @@
     ict_entre_fee = schema.Float(
         title = _(u'ICT & Entrepreneur Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    siwess_combo_fee = schema.Float(
+        title = _(u'SIWESS Combo Fee'),
         default = 0.0,
         required = False,
Index: main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/students/studylevel.py
===================================================================
--- main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/students/studylevel.py	(revision 15011)
+++ main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/students/studylevel.py	(revision 15013)
@@ -52,16 +52,32 @@
 
 class CustomCourseTicket(CourseTicket):
-    """This is a course ticket which allows the
-    student to attend the course. Lecturers will enter scores and more at
-    the end of the term.
-
-    A course ticket contains a copy of the original course and
-    course referrer data. If the courses and/or their referrers are removed, the
-    corresponding tickets remain unchanged. So we do not need any event
-    triggered actions on course tickets.
+    """
     """
     grok.implements(ICustomCourseTicket, IStudentNavigation)
     grok.provides(ICustomCourseTicket)
 
+    @property
+    def _getGradeWeightFromScore(self):
+        """EdoPoly Course Grading System
+        """
+        if self.total_score is None:
+            return (None, None)
+        if self.total_score >= 75:
+            return ('AA',4)
+        if self.total_score >= 70:
+            return ('A',3.5)
+        if self.total_score >= 65:
+            return ('AB',3.25)
+        if self.total_score >= 60:
+            return ('B',3.0)
+        if self.total_score >= 55:
+            return ('BC',2.75)
+        if self.total_score >= 50:
+            return ('C',2.5)
+        if self.total_score >= 45:
+            return ('CD',2.25)
+        if self.total_score >= 40:
+            return ('D',2)
+        return ('F',0)
 
 CustomCourseTicket = attrs_to_fields(CustomCourseTicket)
Index: main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/students/utils.py
===================================================================
--- main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/students/utils.py	(revision 15011)
+++ main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/students/utils.py	(revision 15013)
@@ -31,11 +31,54 @@
     STUDENT_ID_PREFIX = u'U'
 
-    def GPABoundaries(self, faccode=None, depcode=None, certcode=None):
-        return ((1, 'Fail'),
-               (1.5, 'Pass'),
-               (2.4, '3rd Class'),
-               (3.5, '2nd Class Lower'),
-               (4.5, '2nd Class Upper'),
-               (5, '1st Class'))
+    def GPABoundaries(self, faccode=None, depcode=None,
+                            certcode=None, student=None):
+        if student and student.current_mode.startswith('dp'):
+                return ((1, 'IRNS / NER / NYV'),
+                        (2, 'Pass'),
+                        (2.5, 'Lower Credit'),
+                        (3, 'Upper Credit'),
+                        (3.5, 'Distinction'))
+        elif student:
+            return ((1, 'FRNS / NER / NYV'),
+                    (1.5, 'Pass'),
+                    (2.4, '3rd Class Honours'),
+                    (3.5, '2nd Class Honours Lower Division'),
+                    (4.5, '2nd Class Honours Upper Division'),
+                    (5, '1st Class Honours'))
+        # Session Results Presentations depend on certificate
+        results = None
+        if certcode:
+            cat = queryUtility(ICatalog, name='certificates_catalog')
+            results = list(
+                cat.searchResults(code=(certcode, certcode)))
+        if results and results[0].study_mode.startswith('dp'):
+            return ((1, 'IRNS / NER / NYV'),
+                    (2, 'Pass'),
+                    (2.5, 'Lower Credit'),
+                    (3, 'Upper Credit'),
+                    (3.5, 'Distinction'))
+        else:
+            return ((1, 'FRNS / NER / NYV'),
+                    (1.5, 'Pass'),
+                    (2.4, '3rd Class Honours'),
+                    (3.5, '2nd Class Honours Lower Division'),
+                    (4.5, '2nd Class Honours Upper Division'),
+                    (5, '1st Class Honours'))
+
+    def getClassFromCGPA(self, gpa, student):
+        gpa_boundaries = self.GPABoundaries(student=student)
+        if gpa < gpa_boundaries[0][0]:
+            return 0, gpa_boundaries[0][1]
+        if gpa < gpa_boundaries[1][0]:
+            return 1, gpa_boundaries[1][1]
+        if gpa < gpa_boundaries[2][0]:
+            return 2, gpa_boundaries[2][1]
+        if gpa < gpa_boundaries[3][0]:
+            return 3, gpa_boundaries[3][1]
+        if gpa < gpa_boundaries[4][0]:
+            return 4, gpa_boundaries[4][1]
+        if gpa <= gpa_boundaries[5][0]:
+            return 5, gpa_boundaries[5][1]
+        return 'N/A'
 
     def setPaymentDetails(self, category, student,
@@ -130,8 +173,10 @@
             else:
                 return _(u'No bed allocated.'), None
-        elif category == 'logbook':
-            amount = academic_session.logbook_fee
+        elif category == 'logbook_combo':
+            amount = academic_session.logbook_combo_fee
         elif category == 'ict_entre':
             amount = academic_session.ict_entre_fee
+        elif category == 'siwess_combo':
+            amount = academic_session.siwess_combo_fee
         if amount in (0.0, None):
             return _('Amount could not be determined.'), None
Index: main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/utils/utils.py
===================================================================
--- main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/utils/utils.py	(revision 15011)
+++ main/kofacustom.edopoly/trunk/src/kofacustom/edopoly/utils/utils.py	(revision 15013)
@@ -26,5 +26,5 @@
 
     PAYMENT_CATEGORIES = {
-        'schoolfee': 'School Fee',
+        'schoolfee': 'Tuition Fee',
         'clearance': 'Acceptance Fee',
         'bed_allocation': 'Accommodation Booking Fee',
@@ -32,5 +32,6 @@
         'application': 'Application Fee',
         'ict_entre': 'ICT & Entrepreneur Fee',
-        'logbook': 'Logbook Fee',
+        'logbook_combo': 'Logbook Combo Fee',
+        'siwess_combo': 'SIWESS Combo Fee'
         }
 
