Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/applicant.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/applicant.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/applicant.py	(revision 10831)
@@ -89,4 +89,8 @@
         history = IObjectHistory(self)
         return history
+
+    @property
+    def special(self):
+        return self.__parent__.prefix.startswith('special')
 
     @property
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 10831)
@@ -60,5 +60,5 @@
 from waeup.kofa.utils.helpers import string_from_bytes, file_size, now
 from waeup.kofa.widgets.datewidget import (
-    FriendlyDateDisplayWidget, FriendlyDateDisplayWidget,
+    FriendlyDateDisplayWidget,
     FriendlyDatetimeDisplayWidget)
 from waeup.kofa.widgets.htmlwidget import HTMLDisplayWidget
@@ -522,9 +522,19 @@
     grok.require('waeup.viewApplication')
     grok.template('applicantdisplaypage')
-    form_fields = grok.AutoFields(IApplicant).omit(
-        'locked', 'course_admitted', 'password', 'suspended')
     label = _('Applicant')
     pnav = 3
     hide_hint = False
+
+    @property
+    def form_fields(self):
+        if self.context.special:
+            form_fields = grok.AutoFields(IApplicant).select(
+                'applicant_id', 'firstname', 'middlename', 'lastname',
+                'reg_number', 'date_of_birth', 'email', 'special_application')
+        else:
+            form_fields = grok.AutoFields(IApplicant).omit(
+                'locked', 'course_admitted', 'password', 'suspended',
+                'special_application')
+        return form_fields
 
     @property
@@ -650,5 +660,6 @@
         container = self.context.__parent__
         payment = createObject(self.factory)
-        error = applicants_utils.setPaymentDetails(container, payment)
+        error = applicants_utils.setPaymentDetails(
+            container, payment, self.context)
         if error is not None:
             self.flash(error)
@@ -796,7 +807,4 @@
     grok.name('manage')
     grok.require('waeup.manageApplication')
-    form_fields = grok.AutoFields(IApplicant)
-    form_fields['student_id'].for_display = True
-    form_fields['applicant_id'].for_display = True
     grok.template('applicanteditpage')
     manage_applications = True
@@ -804,4 +812,17 @@
     display_actions = [[_('Save'), _('Final Submit')],
         [_('Add online payment ticket'),_('Remove selected tickets')]]
+
+    @property
+    def form_fields(self):
+        if self.context.special:
+            form_fields = grok.AutoFields(IApplicant).select(
+                'applicant_id', 'firstname', 'middlename', 'lastname',
+                'reg_number', 'date_of_birth', 'email', 'special_application',
+                'locked')
+        else:
+            form_fields = grok.AutoFields(IApplicant)
+            form_fields['student_id'].for_display = True
+            form_fields['applicant_id'].for_display = True
+        return form_fields
 
     @property
@@ -941,13 +962,22 @@
     grok.name('edit')
     grok.require('waeup.handleApplication')
-    form_fields = grok.AutoFields(IApplicantEdit).omit(
-        'locked', 'course_admitted', 'student_id',
-        'suspended'
-        )
-    form_fields['applicant_id'].for_display = True
-    form_fields['reg_number'].for_display = True
     grok.template('applicanteditpage')
     manage_applications = False
     submit_state = PAID
+
+    @property
+    def form_fields(self):
+        if self.context.special:
+            form_fields = grok.AutoFields(IApplicantEdit).select(
+                'applicant_id', 'firstname', 'middlename', 'lastname',
+                'reg_number', 'date_of_birth', 'email', 'special_application')
+        else:
+            form_fields = grok.AutoFields(IApplicantEdit).omit(
+                'locked', 'course_admitted', 'student_id',
+                'suspended', 'special_application'
+                )
+            form_fields['applicant_id'].for_display = True
+            form_fields['reg_number'].for_display = True
+        return form_fields
 
     @property
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 10831)
@@ -36,5 +36,6 @@
 from waeup.kofa.schema import PhoneNumber
 from waeup.kofa.students.vocabularies import GenderSource, RegNumberSource
-from waeup.kofa.university.vocabularies import AppCatSource, CertificateSource
+from waeup.kofa.university.vocabularies import (
+    AppCatSource, CertificateSource, SpecialApplicationSource)
 
 #: Maximum upload size for applicant passport photographs (in bytes)
@@ -442,4 +443,10 @@
         )
 
+    special_application = schema.Choice(
+        title = _(u'Special Application'),
+        source = SpecialApplicationSource(),
+        required = False,
+        )
+
 class IApplicant(IApplicantBaseData):
     """An applicant.
@@ -497,4 +504,9 @@
         readonly = True,
         )
+    special_application = schema.Choice(
+        title = _(u'Special Application'),
+        source = SpecialApplicationSource(),
+        required = True,
+        )
 
 IApplicantEdit['email'].order = IApplicantEdit[
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 10831)
@@ -868,4 +868,62 @@
             in logcontent)
         return
+
+
+    def test_pay_special_fee(self):
+        # Add special application container
+        container_name = u'special%s' % session_1
+        applicantscontainer = ApplicantsContainer()
+        applicantscontainer.code = container_name
+        applicantscontainer.prefix = 'special'
+        applicantscontainer.year = session_1
+        applicantscontainer.title = u'This is a special app container'
+        applicantscontainer.application_category = 'no'
+        applicantscontainer.mode = 'create'
+        applicantscontainer.strict_deadline = True
+        delta = timedelta(days=10)
+        applicantscontainer.startdate = datetime.now(pytz.utc) - delta
+        applicantscontainer.enddate = datetime.now(pytz.utc) + delta
+        self.app['applicants'][container_name] = applicantscontainer
+        # Add an applicant
+        applicant = createObject('waeup.Applicant')
+        # reg_number is the only field which has to be preset here
+        # because managers are allowed to edit this required field
+        applicant.reg_number = u'12345'
+        self.app['applicants'][container_name].addApplicant(applicant)
+        IUserAccount(
+            self.app['applicants'][container_name][
+            applicant.application_number]).setPassword('apwd')
+        # Add session configuration object
+        configuration = SessionConfiguration()
+        configuration.academic_session = session_1
+        configuration.transcript_fee = 200.0
+        self.app['configuration'].addSessionConfiguration(configuration)
+        # Login
+        self.browser.open(self.login_path)
+        self.browser.getControl(
+            name="form.login").value = applicant.applicant_id
+        self.browser.getControl(name="form.password").value = 'apwd'
+        self.browser.getControl("Login").click()
+        self.browser.getLink("Edit application record").click()
+        self.browser.getControl(name="form.firstname").value = 'John'
+        self.browser.getControl(name="form.middlename").value = 'Anthony'
+        self.browser.getControl(name="form.lastname").value = 'Tester'
+        self.browser.getControl(name="form.special_application").value = [
+            'transcript']
+        self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
+        #self.browser.getControl(name="form.sex").value = ['m']
+        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
+        self.browser.getControl("Save").click()
+        self.browser.getControl("Add online payment ticket").click()
+        self.assertMatches('...Payment ticket created...',
+                           self.browser.contents)
+        self.assertTrue(
+            '<span>Transcript Fee</span>' in self.browser.contents)
+        self.assertTrue(
+            'This is a special app container' in self.browser.contents)
+        self.assertTrue(
+            '<span>200.0</span>' in self.browser.contents)
+        return
+
 
     def test_duplicate_choice(self):
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_export.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_export.py	(revision 10831)
@@ -142,5 +142,5 @@
             'course_admitted,date_of_birth,display_fullname,email,firstname,'
             'history,lastname,locked,middlename,notice,password,phone,'
-            'reg_number,sex,state,'
+            'reg_number,sex,special_application,state,'
             'student_id,suspended,container_code\r\n'
             'dp2011_654321,,654321,,,,,Anna Tester,,Anna,'
@@ -148,5 +148,5 @@
         self.assertTrue(
             'Application initialized by system\'],Tester,'
-            '0,,,,,,,initialized,,0,dp2011\r\n'
+            '0,,,,,,,,initialized,,0,dp2011\r\n'
             in result)
         return
@@ -166,5 +166,5 @@
             'course_admitted,date_of_birth,display_fullname,email,firstname,'
             'history,lastname,locked,middlename,notice,password,phone,'
-            'reg_number,sex,state,'
+            'reg_number,sex,special_application,state,'
             'student_id,suspended,container_code\r\n'
             'dp2011_654321,,654321,CERT1,CERT1,CERT1,1981-02-04#,'
@@ -174,5 +174,5 @@
             'Application initialized by system\'],'
             'Tester,0,M.,"Some notice\nin lines.",any password,'
-            '+234-123-12345#,123456,f,initialized,,0,dp2011\r\n'
+            '+234-123-12345#,123456,f,,initialized,,0,dp2011\r\n'
             in result)
 
@@ -190,5 +190,5 @@
             'course_admitted,date_of_birth,display_fullname,email,firstname,'
             'history,lastname,locked,middlename,notice,password,phone,'
-            'reg_number,sex,state,'
+            'reg_number,sex,special_application,state,'
             'student_id,suspended,container_code\r\n'
             'dp2011_654321,,654321,CERT1,CERT1,CERT1,1981-02-04#,'
@@ -198,5 +198,5 @@
             'Application initialized by system\'],'
             'Tester,0,M.,"Some notice\nin lines.",any password,'
-            '+234-123-12345#,123456,f,initialized,,0,dp2011\r\n'
+            '+234-123-12345#,123456,f,,initialized,,0,dp2011\r\n'
             in result)
         return
@@ -212,5 +212,5 @@
             'course_admitted,date_of_birth,display_fullname,email,firstname,'
             'history,lastname,locked,middlename,notice,password,phone,'
-            'reg_number,sex,state,'
+            'reg_number,sex,special_application,state,'
             'student_id,suspended,container_code\r\n'
             'dp2011_654321,,654321,CERT1,CERT1,CERT1,1981-02-04#,'
@@ -220,5 +220,5 @@
             'Application initialized by system\'],'
             'Tester,0,M.,"Some notice\nin lines.",any password,'
-            '+234-123-12345#,123456,f,initialized,,0,dp2011\r\n'
+            '+234-123-12345#,123456,f,,initialized,,0,dp2011\r\n'
             in result)
         # In empty container no applicants are exported
@@ -233,5 +233,6 @@
             'course2,course_admitted,date_of_birth,display_fullname,email,'
             'firstname,history,lastname,locked,middlename,notice,password,'
-            'phone,reg_number,sex,state,student_id,suspended,container_code\r\n'
-            in result)
-        return
+            'phone,reg_number,sex,special_application,state,student_id,'
+            'suspended,container_code\r\n'
+            in result)
+        return
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/utils.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/utils.py	(revision 10831)
@@ -35,4 +35,5 @@
     APP_TYPES_DICT = {
       'app': ['General Studies', 'APP'],
+      'special': ['Special Application', 'SPE'],
       }
 
@@ -42,5 +43,5 @@
       }
 
-    def setPaymentDetails(self, container, payment):
+    def setPaymentDetails(self, container, payment, applicant):
         """Set the payment data of an applicant.
         """
@@ -56,8 +57,12 @@
                 return _(u'Session configuration object is not available.')
             payment.amount_auth = session_config.application_fee
+            payment.p_category = 'application'
+        if container.prefix.startswith('special'):
+            fee_name = applicant.special_application + '_fee'
+            payment.amount_auth = getattr(session_config, fee_name, 0.0)
+            payment.p_category = applicant.special_application
         payment.p_id = "p%s" % timestamp
         payment.p_item = container.title
         payment.p_session = container.year
-        payment.p_category = 'application'
         return None
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/university/vocabularies.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/university/vocabularies.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/university/vocabularies.py	(revision 10831)
@@ -121,2 +121,9 @@
     def getTitle(self, context, value):
         return "%s - %s" % (value.code, value.title)
+
+class SpecialApplicationSource(ContextualDictSourceFactoryBase):
+    """A special application source delivers all types of
+    applications which are not linked with certificates.
+    """
+    #: name of dict to deliver from kofa utils.
+    DICT_NAME = 'SPECIAL_APP_DICT'
Index: main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 10830)
+++ main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 10831)
@@ -150,5 +150,9 @@
         'regular': 'Regular Hostel',
         'blocked': 'Blocked Hostel',
-        'pd': 'Postgraduate Hostel'
+        'pg': 'Postgraduate Hostel'
+        }
+
+    SPECIAL_APP_DICT = {
+        'transcript': 'Transcript Fee Payment',
         }
 
