Index: /main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py	(revision 10448)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py	(revision 10449)
@@ -676,4 +676,10 @@
         )
 
+    transcript_fee = schema.Float(
+        title = _(u'Transcript Fee'),
+        default = 0.0,
+        required = False,
+        )
+
     clearance_enabled = schema.Bool(
         title = _(u'Clearance enabled'),
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py	(revision 10448)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/payments.py	(revision 10449)
@@ -92,4 +92,11 @@
                 return error
             self.ac = pin
+        elif self.p_category == 'transcript':
+            # Create TSC access code
+            pin, error = create_accesscode(
+                'TSC',0,self.amount_auth,student.student_id)
+            if error:
+                return error
+            self.ac = pin
         return None
 
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 10448)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 10449)
@@ -190,4 +190,5 @@
         configuration.academic_session = 2004
         configuration.clearance_fee = 3456.0
+        configuration.transcript_fee = 4567.0
         configuration.booking_fee = 123.4
         configuration.maint_fee = 987.0
@@ -980,4 +981,31 @@
         self.assertEqual(ac.owner, self.student_id)
         self.assertEqual(ac.cost, 3456.0)
+
+        # Managers can add online transcript payment tickets
+        self.browser.open(self.payments_path + '/addop')
+        self.browser.getControl(name="form.p_category").value = ['transcript']
+        self.browser.getControl("Create ticket").click()
+        self.assertMatches('...ticket created...',
+                           self.browser.contents)
+
+        # Managers can approve the payment
+        self.assertEqual(len(self.app['accesscodes']['TSC-0']),0)
+        ctrl = self.browser.getControl(name='val_id')
+        value = ctrl.options[2] # The clearance payment is the third in the table
+        self.browser.getLink(value).click()
+        self.browser.open(self.browser.url + '/approve')
+        self.assertMatches('...Payment approved...',
+                          self.browser.contents)
+        expected = '''...
+        <td>
+          <span>Paid</span>
+        </td>...'''
+        self.assertMatches(expected,self.browser.contents)
+        # The new CLR-0 pin has been created
+        self.assertEqual(len(self.app['accesscodes']['TSC-0']),1)
+        pin = self.app['accesscodes']['TSC-0'].keys()[0]
+        ac = self.app['accesscodes']['TSC-0'][pin]
+        self.assertEqual(ac.owner, self.student_id)
+        self.assertEqual(ac.cost, 4567.0)
         return
 
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 10448)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 10449)
@@ -416,4 +416,6 @@
                 portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
                 p_item = trans(_('no bed allocated'), portal_language)
+        elif category == 'transcript':
+            amount = academic_session.transcript_fee
         if amount in (0.0, None):
             return _('Amount could not be determined.'), None
Index: /main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 10448)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 10449)
@@ -161,4 +161,5 @@
         'gown': 'Gown Hire Fee',
         'application': 'Application Fee',
+        'transcript': 'Transcript Fee',
         }
 
