Index: main/waeup.custom/trunk/src/waeup/custom/interswitch/__init__.py
===================================================================
--- main/waeup.custom/trunk/src/waeup/custom/interswitch/__init__.py	(revision 7897)
+++ main/waeup.custom/trunk/src/waeup/custom/interswitch/__init__.py	(revision 7897)
@@ -0,0 +1,1 @@
+# Make this a package.
Index: main/waeup.custom/trunk/src/waeup/custom/interswitch/browser.py
===================================================================
--- main/waeup.custom/trunk/src/waeup/custom/interswitch/browser.py	(revision 7897)
+++ main/waeup.custom/trunk/src/waeup/custom/interswitch/browser.py	(revision 7897)
@@ -0,0 +1,202 @@
+## $Id$
+##
+## Copyright (C) 2012 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+from datetime import datetime
+from urllib import urlencode
+import grok
+from waeup.kofa.browser.layout import KofaPage, UtilityView
+from waeup.kofa.accesscodes import create_accesscode
+from waeup.kofa.students.interfaces import IStudentOnlinePayment
+from waeup.kofa.students.browser import write_log_message
+from waeup.kofa.students.viewlets import RequestCallbackActionButton
+from waeup.custom.interfaces import MessageFactory as _
+
+PRODUCT_ID = '57'
+SITE_NAME = 'xyz.waeup.org'
+PROVIDER_ACCT = '2345'
+PROVIDER_BANK_ID = '8'
+PROVIDER_ITEM_NAME = 'Kofa Provider Fee'
+INSTITUTION_ACCT = '1234'
+INSTITUTION_BANK_ID = '9'
+INSTITUTION_NAME = 'Sample University'
+CURRENCY = '566'
+PAY_ITEM_ID = '5700'
+QUERY_URL =   'https://testwebpay.interswitchng.com/test_paydirect/services/TransactionQueryURL.aspx'
+POST_ACTION = 'https://testwebpay.interswitchng.com/test_paydirect/webpay/pay.aspx'
+
+class InterswitchActionButton(RequestCallbackActionButton):
+    grok.order(2)
+    icon = 'actionicon_pay.png'
+    text = _('CollegePAY')
+    target = 'goto_interswitch'
+
+    @property
+    def target_url(self):
+        if self.context.p_state != 'unpaid':
+            return ''
+        return self.view.url(self.view.context, self.target)
+
+class InterswitchRequestCallbackActionButton(RequestCallbackActionButton):
+    grok.order(3)
+    icon = 'actionicon_call.png'
+    text = _('Request CollegePAY callback')
+
+    def target_url(self):
+        if self.context.p_state == 'paid':
+            return ''
+        site_redirect_url = self.view.url(self.view.context, 'callback')
+        args = {
+            'transRef':self.context.p_id,
+            'prodID':PRODUCT_ID,
+            'redirectURL':site_redirect_url}
+        return QUERY_URL + '?%s' % urlencode(args)
+
+class InterswitchPage(KofaPage):
+    """ View which sends a POST request to the Interswitch
+    CollegePAY payment gateway.
+    """
+    grok.context(IStudentOnlinePayment)
+    grok.name('goto_interswitch')
+    grok.template('goto_interswitch')
+    grok.require('waeup.payStudent')
+    label = _('Submit data to CollegePAY (Interswitch Payment Gateway)')
+    submit_button = _('Submit')
+    action = POST_ACTION
+    site_name = SITE_NAME
+    currency = CURRENCY
+    pay_item_id = PAY_ITEM_ID
+    product_id = PRODUCT_ID
+
+    def update(self):
+        if self.context.p_state != 'unpaid':
+            self.flash(_("Payment ticket can't be re-send to CollegePAY."))
+            self.redirect(self.url(self.context, '@@index'))
+            return
+        self.student = self.context.getStudent()
+        self.amount = (self.context.amount_auth + self.context.surcharge_1 +
+            self.context.surcharge_2 + self.context.surcharge_3)
+        self.amount_100 = 100 * self.amount
+        self.local_date_time = str(self.context.creation_date)
+        self.site_redirect_url = self.url(self.context, 'callback')
+        certificate = getattr(self.student['studycourse'],'certificate',None)
+        xmldict = {}
+        if certificate is not None:
+            xmldict['department'] = certificate.__parent__.__parent__.code
+            xmldict['faculty'] = certificate.__parent__.__parent__.__parent__.code
+        else:
+            xmldict['department'] = None
+            xmldict['faculty'] = None
+        xmldict['detail_ref'] = self.context.p_id
+        xmldict['provider_amt'] = 100 * self.context.surcharge_1
+        xmldict['provider_acct'] = PROVIDER_ACCT
+        xmldict['provider_bank_id'] = PROVIDER_BANK_ID
+        xmldict['provider_item_name'] = PROVIDER_ITEM_NAME
+        xmldict['institution_amt'] = 100 * self.context.amount_auth
+        xmldict['institution_acct'] = INSTITUTION_ACCT
+        xmldict['institution_bank_id'] = INSTITUTION_BANK_ID
+        xmldict['institution_item_name'] = self.context.p_category
+        xmldict['institution_name'] = INSTITUTION_NAME
+        # Interswitch amount is not part of the xml data
+        xmltext = """<payment_item_detail>
+<item_details detail_ref="%(detail_ref)s" college="%(institution_name)s" department="%(department)s" faculty="%(faculty)s">
+<item_detail item_id="1" item_name="%(institution_item_name)s" item_amt="%(institution_amt)d" bank_id="%(institution_bank_id)s" acct_num="%(institution_acct)s" />
+<item_detail item_id="2" item_name="%(provider_item_name)s" item_amt="%(provider_amt)d" bank_id="%(provider_bank_id)s" acct_num="%(provider_acct)s" />
+</item_details>
+</payment_item_detail>""" % xmldict
+        self.xml_data = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
+        return
+
+class OnlinePaymentCallbackPage(UtilityView, grok.View):
+    """ Callback view for the CollegePAY gateway
+    """
+    grok.context(IStudentOnlinePayment)
+    grok.name('callback')
+    grok.require('waeup.payStudent')
+
+    # This view is not yet working for offline querying transactions
+    # since the query string differs from the query string sent after
+    # posting transactions. This Interswitch bug must be removed first.
+    # Alternatively, we could use the webservice only and replace
+    # the RequestCallbackActionButton by a RequestWebserviceActionButton
+
+    def update(self):
+        if self.context.p_state == 'paid':
+            self.flash(_('This ticket has already been paid.'))
+            return
+        student = self.context.getStudent()
+        query = self.request.form
+        # Should be logged instead of printed
+        print query
+        if query.get('resp', None) != '00':
+            self.flash(_('Unsuccessful callback: ${a}',
+                mapping = {'a': query.get('desc', _('Incomplete query string.'))}))
+            write_log_message(self,'invalid callback: %s' % self.context.p_id)
+            self.context.r_card_num = query.get('cardNum', None)
+            self.context.r_code = query.get('resp', None)
+            self.context.p_state = 'failed'
+            return
+
+        if query.get('apprAmt', None) != str(self.context.amount_auth):
+            self.flash(_('Wrong amount'))
+            write_log_message(self,'wrong amount: %s' % self.context.p_id)
+            self.context.r_card_num = query.get('cardNum', None)
+            self.context.r_code = query.get('resp', None)
+            self.context.p_state = 'failed'
+            return
+
+        # Add webservice validation
+
+
+        write_log_message(self,'valid callback: %s' % self.context.p_id)
+        self.context.r_amount_approved = self.context.amount_auth
+        self.context.r_card_num = query.get('cardNum', None)
+        self.context.r_code = query.get('resp', None)
+        self.context.r_desc = query.get('desc', None)
+        self.context.r_pay_reference  = query.get('payRef', None)
+        self.context.p_state = 'paid'
+        self.context.payment_date = datetime.now()
+
+        if self.context.p_category == 'clearance':
+            # Create CLR access code
+            pin, error = create_accesscode('CLR',0,student.student_id)
+            if error:
+                self.flash(_('Valid callback received. ${a}',
+                    mapping = {'a':error}))
+                return
+            self.context.ac = pin
+        elif self.context.p_category == 'schoolfee':
+            # Create SFE access code
+            pin, error = create_accesscode('SFE',0,student.student_id)
+            if error:
+                self.flash(_('Valid callback received. ${a}',
+                    mapping = {'a':error}))
+                return
+            self.context.ac = pin
+        elif self.context.p_category == 'bed_allocation':
+            # Create HOS access code
+            pin, error = create_accesscode('HOS',0,student.student_id)
+            if error:
+                self.flash(_('Valid callback received. ${a}',
+                    mapping = {'a':error}))
+                return
+            self.context.ac = pin
+        self.flash(_('Valid callback received.'))
+        return
+
+    def render(self):
+        self.redirect(self.url(self.context, '@@index'))
+        return
Index: main/waeup.custom/trunk/src/waeup/custom/interswitch/browser_templates/goto_interswitch.pt
===================================================================
--- main/waeup.custom/trunk/src/waeup/custom/interswitch/browser_templates/goto_interswitch.pt	(revision 7897)
+++ main/waeup.custom/trunk/src/waeup/custom/interswitch/browser_templates/goto_interswitch.pt	(revision 7897)
@@ -0,0 +1,79 @@
+<form i18n:domain="waeup.kofa"
+  tal:attributes="action view/action" method="POST">
+
+  <p i18n:translate="">
+    These data will be submitted to the CollegePAY payment gateway,
+    please check:
+  </p>
+
+  <table class="form-table" i18n:domain="waeup.kofa">
+    <thead>
+    </thead>
+    <tbody>
+      <tr>
+        <td i18n:translate="" class="fieldname">
+          Total Amount Authorized:</td>
+        <td>
+          <span tal:replace="view/amount">AMOUNT</span>
+        </td>
+      </tr>
+      <tr>
+        <td i18n:translate="" class="fieldname">
+          Transaction Reference:</td>
+        <td>
+          <span tal:replace="view/context/p_id">TXNREF</span>
+        </td>
+      </tr>
+      <tr>
+        <td i18n:translate="" class="fieldname">
+          Customer Id:</td>
+        <td>
+          <span tal:replace="view/student/student_id">CUSTID</span>
+        </td>
+      </tr>
+      <tr>
+        <td i18n:translate="" class="fieldname">
+          Customer Name:</td>
+        <td>
+          <span tal:replace="view/student/display_fullname">CUSTNAME</span>
+        </td>
+      </tr>
+      <tr>
+        <td i18n:translate="" class="fieldname">
+          Payment Item:</td>
+        <td>
+          <span tal:replace="view/context/p_item">PAYMENTITEM</span>
+        </td>
+      </tr>
+      <tr>
+        <td i18n:translate="" class="fieldname">
+          Payment Category:</td>
+        <td>
+          <span tal:replace="view/context/p_category">PAYMENTCATEGORY</span>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+
+  <input type="hidden" name="product_id" tal:attributes="value view/product_id" />
+  <input type="hidden" name="currency" tal:attributes="value view/currency" />
+  <input type="hidden" name="pay_item_id" tal:attributes="value view/pay_item_id" />
+  <input type="hidden" name="site_redirect_url" tal:attributes="value view/site_redirect_url" />
+  <input type="hidden" name="site_name" tal:attributes="value view/site_name" />
+  <input type="hidden" name="local_date_time" tal:attributes="value view/local_date_time" />
+  <input type="hidden" name="amount" tal:attributes="value view/amount_100" />
+
+  <input type="hidden" name="txn_ref" tal:attributes="value view/context/p_id" />
+  <input type="hidden" name="cust_id_desc" tal:attributes="value view/context/p_item" />
+  <input type="hidden" name="pay_item_name" tal:attributes="value view/context/p_category" />
+
+  <input type="hidden" name="cust_id" tal:attributes="value view/student/student_id" />
+  <input type="hidden" name="cust_name" tal:attributes="value view/student/display_fullname" />
+
+
+  <input type="hidden" name="payment_params" value="college_split" />
+  <span tal:replace="structure view/xml_data"></span>
+
+  <input type="submit" class="btn" tal:attributes="value view/submit_button"/>
+
+</form>
Index: main/waeup.custom/trunk/src/waeup/custom/interswitch/tests.py
===================================================================
--- main/waeup.custom/trunk/src/waeup/custom/interswitch/tests.py	(revision 7897)
+++ main/waeup.custom/trunk/src/waeup/custom/interswitch/tests.py	(revision 7897)
@@ -0,0 +1,80 @@
+## $Id$
+##
+## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+from hurry.workflow.interfaces import IWorkflowState
+from waeup.kofa.students.tests.test_browser import StudentsFullSetup
+from waeup.custom.testing import FunctionalLayer
+
+class StudentUITests(StudentsFullSetup):
+    """Tests for customized student class views and pages
+    """
+
+    layer = FunctionalLayer
+
+    def callback_url(self, payment_url, resp, apprAmt):
+        return payment_url + (
+            '/callback?echo=' +
+            '&resp=%s' +
+            '&desc=Something went wrong' +
+            '&txnRef=p1331792385335' +
+            '&payRef=' + '&retRef=' +
+            '&cardNum=0' +
+            '&apprAmt=%s' +
+            '&url=http://xyz') % (resp, apprAmt)
+
+    def test_manage_payments(self):
+
+        # Managers can add online payment tickets
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.payments_student_path)
+        IWorkflowState(self.student).setState('cleared')
+        self.browser.open(self.payments_student_path + '/addop')
+        self.browser.getControl("Create ticket").click()
+        self.assertMatches('...ticket created...',
+                           self.browser.contents)
+        ctrl = self.browser.getControl(name='val_id')
+        value = ctrl.options[0]
+        self.browser.getLink(value).click()
+        self.assertMatches('...Amount Authorized...',
+                           self.browser.contents)
+        payment_url = self.browser.url
+        
+        # Manager can access InterswitchForm
+        self.browser.getLink("CollegePAY", index=0).click()
+        self.assertMatches('...Total Amount Authorized:...',
+                           self.browser.contents)
+        self.assertMatches(
+            '...<input type="hidden" name="amount" value="4000000" />...',
+            self.browser.contents)
+
+        # Manager can call callback manually
+        self.browser.open(self.callback_url(payment_url, 'XX', '300'))
+        self.assertMatches('...Unsuccessful callback: Something went wrong...',
+                          self.browser.contents)
+        self.assertMatches('...Failed...',
+                           self.browser.contents)
+        self.browser.open(payment_url + '/callback')
+        self.assertMatches('...Unsuccessful callback: Incomplete query string...',
+                          self.browser.contents)
+        self.assertMatches('...Failed...',
+                           self.browser.contents)
+        self.browser.open(self.callback_url(payment_url, '00', '300'))
+        self.assertMatches('...Wrong amount...',
+                          self.browser.contents)
+        self.browser.open(self.callback_url(payment_url, '00', '40000'))
+        self.assertMatches('...Valid callback received...',
+                          self.browser.contents)
Index: main/waeup.custom/trunk/src/waeup/custom/students/interswitch.py
===================================================================
--- main/waeup.custom/trunk/src/waeup/custom/students/interswitch.py	(revision 7896)
+++ 	(revision )
@@ -1,202 +1,0 @@
-## $Id$
-##
-## Copyright (C) 2012 Uli Fouquet & Henrik Bettermann
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-##
-from datetime import datetime
-from urllib import urlencode
-import grok
-from waeup.kofa.browser.layout import KofaPage, UtilityView
-from waeup.kofa.accesscodes import create_accesscode
-from waeup.kofa.students.interfaces import IStudentOnlinePayment
-from waeup.kofa.students.browser import write_log_message
-from waeup.kofa.students.viewlets import RequestCallbackActionButton
-from waeup.custom.interfaces import MessageFactory as _
-
-PRODUCT_ID = '57'
-SITE_NAME = 'xyz.waeup.org'
-PROVIDER_ACCT = '2345'
-PROVIDER_BANK_ID = '8'
-PROVIDER_ITEM_NAME = 'Kofa Provider Fee'
-INSTITUTION_ACCT = '1234'
-INSTITUTION_BANK_ID = '9'
-INSTITUTION_NAME = 'Sample University'
-CURRENCY = '566'
-PAY_ITEM_ID = '5700'
-QUERY_URL =   'https://testwebpay.interswitchng.com/test_paydirect/services/TransactionQueryURL.aspx'
-POST_ACTION = 'https://testwebpay.interswitchng.com/test_paydirect/webpay/pay.aspx'
-
-class InterswitchActionButton(RequestCallbackActionButton):
-    grok.order(2)
-    icon = 'actionicon_pay.png'
-    text = _('CollegePAY')
-    target = 'goto_interswitch'
-
-    @property
-    def target_url(self):
-        if self.context.p_state != 'unpaid':
-            return ''
-        return self.view.url(self.view.context, self.target)
-
-class InterswitchRequestCallbackActionButton(RequestCallbackActionButton):
-    grok.order(3)
-    icon = 'actionicon_call.png'
-    text = _('Request CollegePAY callback')
-
-    def target_url(self):
-        if self.context.p_state == 'paid':
-            return ''
-        site_redirect_url = self.view.url(self.view.context, 'callback')
-        args = {
-            'transRef':self.context.p_id,
-            'prodID':PRODUCT_ID,
-            'redirectURL':site_redirect_url}
-        return QUERY_URL + '?%s' % urlencode(args)
-
-class InterswitchPage(KofaPage):
-    """ View which sends a POST request to the Interswitch
-    CollegePAY payment gateway.
-    """
-    grok.context(IStudentOnlinePayment)
-    grok.name('goto_interswitch')
-    grok.template('goto_interswitch')
-    grok.require('waeup.payStudent')
-    label = _('Submit data to CollegePAY (Interswitch Payment Gateway)')
-    submit_button = _('Submit')
-    action = POST_ACTION
-    site_name = SITE_NAME
-    currency = CURRENCY
-    pay_item_id = PAY_ITEM_ID
-    product_id = PRODUCT_ID
-
-    def update(self):
-        if self.context.p_state != 'unpaid':
-            self.flash(_("Payment ticket can't be re-send to CollegePAY."))
-            self.redirect(self.url(self.context, '@@index'))
-            return
-        self.student = self.context.getStudent()
-        self.amount = (self.context.amount_auth + self.context.surcharge_1 +
-            self.context.surcharge_2 + self.context.surcharge_3)
-        self.amount_100 = 100 * self.amount
-        self.local_date_time = str(self.context.creation_date)
-        self.site_redirect_url = self.url(self.context, 'callback')
-        certificate = getattr(self.student['studycourse'],'certificate',None)
-        xmldict = {}
-        if certificate is not None:
-            xmldict['department'] = certificate.__parent__.__parent__.code
-            xmldict['faculty'] = certificate.__parent__.__parent__.__parent__.code
-        else:
-            xmldict['department'] = None
-            xmldict['faculty'] = None
-        xmldict['detail_ref'] = self.context.p_id
-        xmldict['provider_amt'] = 100 * self.context.surcharge_1
-        xmldict['provider_acct'] = PROVIDER_ACCT
-        xmldict['provider_bank_id'] = PROVIDER_BANK_ID
-        xmldict['provider_item_name'] = PROVIDER_ITEM_NAME
-        xmldict['institution_amt'] = 100 * self.context.amount_auth
-        xmldict['institution_acct'] = INSTITUTION_ACCT
-        xmldict['institution_bank_id'] = INSTITUTION_BANK_ID
-        xmldict['institution_item_name'] = self.context.p_category
-        xmldict['institution_name'] = INSTITUTION_NAME
-        # Interswitch amount is not part of the xml data
-        xmltext = """<payment_item_detail>
-<item_details detail_ref="%(detail_ref)s" college="%(institution_name)s" department="%(department)s" faculty="%(faculty)s">
-<item_detail item_id="1" item_name="%(institution_item_name)s" item_amt="%(institution_amt)d" bank_id="%(institution_bank_id)s" acct_num="%(institution_acct)s" />
-<item_detail item_id="2" item_name="%(provider_item_name)s" item_amt="%(provider_amt)d" bank_id="%(provider_bank_id)s" acct_num="%(provider_acct)s" />
-</item_details>
-</payment_item_detail>""" % xmldict
-        self.xml_data = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
-        return
-
-class OnlinePaymentCallbackPage(UtilityView, grok.View):
-    """ Callback view for the CollegePAY gateway
-    """
-    grok.context(IStudentOnlinePayment)
-    grok.name('callback')
-    grok.require('waeup.payStudent')
-
-    # This view is not yet working for offline querying transactions
-    # since the query string differs from the query string sent after
-    # posting transactions. This Interswitch bug must be removed first.
-    # Alternatively, we could use the webservice only and replace
-    # the RequestCallbackActionButton by a RequestWebserviceActionButton
-
-    def update(self):
-        if self.context.p_state == 'paid':
-            self.flash(_('This ticket has already been paid.'))
-            return
-        student = self.context.getStudent()
-        query = self.request.form
-        # Should be logged instead of printed
-        print query
-        if query.get('resp', None) != '00':
-            self.flash(_('Unsuccessful callback: ${a}',
-                mapping = {'a': query.get('desc', _('Incomplete query string.'))}))
-            write_log_message(self,'invalid callback: %s' % self.context.p_id)
-            self.context.r_card_num = query.get('cardNum', None)
-            self.context.r_code = query.get('resp', None)
-            self.context.p_state = 'failed'
-            return
-
-        if query.get('apprAmt', None) != str(self.context.amount_auth):
-            self.flash(_('Wrong amount'))
-            write_log_message(self,'wrong amount: %s' % self.context.p_id)
-            self.context.r_card_num = query.get('cardNum', None)
-            self.context.r_code = query.get('resp', None)
-            self.context.p_state = 'failed'
-            return
-
-        # Add webservice validation
-
-
-        write_log_message(self,'valid callback: %s' % self.context.p_id)
-        self.context.r_amount_approved = self.context.amount_auth
-        self.context.r_card_num = query.get('cardNum', None)
-        self.context.r_code = query.get('resp', None)
-        self.context.r_desc = query.get('desc', None)
-        self.context.r_pay_reference  = query.get('payRef', None)
-        self.context.p_state = 'paid'
-        self.context.payment_date = datetime.now()
-
-        if self.context.p_category == 'clearance':
-            # Create CLR access code
-            pin, error = create_accesscode('CLR',0,student.student_id)
-            if error:
-                self.flash(_('Valid callback received. ${a}',
-                    mapping = {'a':error}))
-                return
-            self.context.ac = pin
-        elif self.context.p_category == 'schoolfee':
-            # Create SFE access code
-            pin, error = create_accesscode('SFE',0,student.student_id)
-            if error:
-                self.flash(_('Valid callback received. ${a}',
-                    mapping = {'a':error}))
-                return
-            self.context.ac = pin
-        elif self.context.p_category == 'bed_allocation':
-            # Create HOS access code
-            pin, error = create_accesscode('HOS',0,student.student_id)
-            if error:
-                self.flash(_('Valid callback received. ${a}',
-                    mapping = {'a':error}))
-                return
-            self.context.ac = pin
-        self.flash(_('Valid callback received.'))
-        return
-
-    def render(self):
-        self.redirect(self.url(self.context, '@@index'))
-        return
Index: main/waeup.custom/trunk/src/waeup/custom/students/tests/test_interswitch.py
===================================================================
--- main/waeup.custom/trunk/src/waeup/custom/students/tests/test_interswitch.py	(revision 7896)
+++ 	(revision )
@@ -1,80 +1,0 @@
-## $Id$
-##
-## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-##
-from hurry.workflow.interfaces import IWorkflowState
-from waeup.kofa.students.tests.test_browser import StudentsFullSetup
-from waeup.custom.testing import FunctionalLayer
-
-class StudentUITests(StudentsFullSetup):
-    """Tests for customized student class views and pages
-    """
-
-    layer = FunctionalLayer
-
-    def callback_url(self, payment_url, resp, apprAmt):
-        return payment_url + (
-            '/callback?echo=' +
-            '&resp=%s' +
-            '&desc=Something went wrong' +
-            '&txnRef=p1331792385335' +
-            '&payRef=' + '&retRef=' +
-            '&cardNum=0' +
-            '&apprAmt=%s' +
-            '&url=http://xyz') % (resp, apprAmt)
-
-    def test_manage_payments(self):
-
-        # Managers can add online payment tickets
-        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
-        self.browser.open(self.payments_student_path)
-        IWorkflowState(self.student).setState('cleared')
-        self.browser.open(self.payments_student_path + '/addop')
-        self.browser.getControl("Create ticket").click()
-        self.assertMatches('...ticket created...',
-                           self.browser.contents)
-        ctrl = self.browser.getControl(name='val_id')
-        value = ctrl.options[0]
-        self.browser.getLink(value).click()
-        self.assertMatches('...Amount Authorized...',
-                           self.browser.contents)
-        payment_url = self.browser.url
-        
-        # Manager can access InterswitchForm
-        self.browser.getLink("CollegePAY", index=0).click()
-        self.assertMatches('...Total Amount Authorized:...',
-                           self.browser.contents)
-        self.assertMatches(
-            '...<input type="hidden" name="amount" value="4000000" />...',
-            self.browser.contents)
-
-        # Manager can call callback manually
-        self.browser.open(self.callback_url(payment_url, 'XX', '300'))
-        self.assertMatches('...Unsuccessful callback: Something went wrong...',
-                          self.browser.contents)
-        self.assertMatches('...Failed...',
-                           self.browser.contents)
-        self.browser.open(payment_url + '/callback')
-        self.assertMatches('...Unsuccessful callback: Incomplete query string...',
-                          self.browser.contents)
-        self.assertMatches('...Failed...',
-                           self.browser.contents)
-        self.browser.open(self.callback_url(payment_url, '00', '300'))
-        self.assertMatches('...Wrong amount...',
-                          self.browser.contents)
-        self.browser.open(self.callback_url(payment_url, '00', '40000'))
-        self.assertMatches('...Valid callback received...',
-                          self.browser.contents)
