source: main/waeup.fceokene/trunk/src/waeup/fceokene/interswitch/browser.py @ 10009

Last change on this file since 10009 was 9956, checked in by Henrik Bettermann, 12 years ago

Configure acceptance fee payment.

We must not use assertMatches in browser tests when comparing payment amounts and bank account numbers because we need exact comparisons.

  • Property svn:keywords set to Id
File size: 10.9 KB
RevLine 
[7894]1## $Id: browser.py 9956 2013-02-15 11:49:44Z henrik $
2##
3## Copyright (C) 2012 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
[7898]18import httplib
[7894]19import grok
[8281]20from zope.component import getUtility
[9784]21from kofacustom.nigeria.interswitch.browser import (
22    InterswitchPaymentRequestWebservicePageApplicant,
23    InterswitchPaymentRequestWebservicePageStudent
24    )
25from waeup.kofa.browser.layout import KofaPage
[9752]26from waeup.kofa.interfaces import IKofaUtils
[8281]27from waeup.kofa.utils.helpers import to_timezone
[8460]28from waeup.fceokene.students.interfaces import ICustomStudentOnlinePayment
29from waeup.fceokene.applicants.interfaces import ICustomApplicantOnlinePayment
30from waeup.fceokene.interfaces import MessageFactory as _
[7894]31
[8644]32PRODUCT_ID = '83'
[8460]33SITE_NAME = 'fceokene-kofa.waeup.org'
[8641]34PROVIDER_ACCT = '0026781725'
35PROVIDER_BANK_ID = '31'
[8263]36PROVIDER_ITEM_NAME = 'BT Education'
[8460]37INSTITUTION_NAME = 'FCEOkene'
[7894]38CURRENCY = '566'
[9780]39GATEWAY_AMT = 150.0
[8401]40#QUERY_URL = 'https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx'
[8293]41#QUERY_URL = 'https://testwebpay.interswitchng.com/test_paydirect/services/TransactionQueryURL.aspx'
[8385]42POST_ACTION = 'https://webpay.interswitchng.com/paydirect/webpay/pay.aspx'
[8293]43#POST_ACTION = 'https://testwebpay.interswitchng.com/test_paydirect/webpay/pay.aspx'
[7894]44
[8293]45HOST = 'webpay.interswitchng.com'
46#HOST = 'testwebpay.interswitchng.com'
47URL = '/paydirect/services/TransactionQueryWs.asmx'
48#URL = '/test_paydirect/services/TransactionQueryWs.asmx'
[7898]49httplib.HTTPConnection.debuglevel = 0
50
[8256]51class InterswitchPageStudent(KofaPage):
[7894]52    """ View which sends a POST request to the Interswitch
53    CollegePAY payment gateway.
54    """
[8255]55    grok.context(ICustomStudentOnlinePayment)
[7894]56    grok.name('goto_interswitch')
[8256]57    grok.template('student_goto_interswitch')
[7894]58    grok.require('waeup.payStudent')
59    label = _('Submit data to CollegePAY (Interswitch Payment Gateway)')
60    submit_button = _('Submit')
61    action = POST_ACTION
62    site_name = SITE_NAME
63    currency = CURRENCY
[9613]64    pay_item_id = ''
[7894]65    product_id = PRODUCT_ID
66
67    def update(self):
[8256]68        if self.context.p_state == 'paid':
[7894]69            self.flash(_("Payment ticket can't be re-send to CollegePAY."))
70            self.redirect(self.url(self.context, '@@index'))
71            return
[8256]72
[8745]73        student = self.student = self.context.student
74        certificate = getattr(student['studycourse'],'certificate',None)
[8276]75        self.amount_auth = 100 * self.context.amount_auth
[7894]76        xmldict = {}
77        if certificate is not None:
78            xmldict['department'] = certificate.__parent__.__parent__.code
79            xmldict['faculty'] = certificate.__parent__.__parent__.__parent__.code
80        else:
81            xmldict['department'] = None
82            xmldict['faculty'] = None
[9406]83        self.category = getUtility(IKofaUtils).PAYMENT_CATEGORIES[self.context.p_category]
[8281]84        tz = getUtility(IKofaUtils).tzinfo
85        self.local_date_time = to_timezone(
86            self.context.creation_date, tz).strftime("%Y-%m-%d %H:%M:%S %Z")
[8256]87        self.site_redirect_url = self.url(self.context, 'request_webservice')
[8263]88        # Provider data
[9780]89        provider_amt = 1600.0
[8263]90        xmldict['detail_ref'] = self.context.p_id
91        xmldict['provider_acct'] = PROVIDER_ACCT
92        xmldict['provider_bank_id'] = PROVIDER_BANK_ID
93        xmldict['provider_item_name'] = PROVIDER_ITEM_NAME
[9780]94        xmldict['provider_amt'] = 100 * provider_amt
[8263]95        # Institution data
[9780]96        fceokene_split_amt = 1400.0
[9613]97        xmldict['fceokene_acct'] = "0000000000000"
98        xmldict['institution_bank_id'] = '0'
99        xmldict['institution_item_name'] = self.category
100        xmldict['institution_name'] = INSTITUTION_NAME
101        if self.context.p_category == 'schoolfee':
102            self.pay_item_id = '8302'
[9943]103            if student.current_mode in ('nce_sw','prence',):
[9951]104                xmldict['institution_acct'] = "1012044194"
[9613]105                xmldict['institution_bank_id'] = '117'
[9943]106            elif student.current_mode in ('nce_ft',) and \
[9613]107                student['studycourse'].current_verdict == 'O':
[9951]108                xmldict['institution_acct'] = "1012044015"
[9613]109                xmldict['institution_bank_id'] = '117'
[9943]110            elif student.current_mode in ('nce_ft',):
[9951]111                xmldict['institution_acct'] = "1012044015"
[9613]112                xmldict['institution_bank_id'] = '117'
113            elif student.current_mode in ('pd_ft',):
[9951]114                xmldict['institution_acct'] = "1012415659"
[9613]115                xmldict['institution_bank_id'] = '117'
[9780]116            xmldict['fceokene_split'] = 100 * fceokene_split_amt
[9613]117            xmldict['institution_amt'] = 100 * (
[9780]118                self.context.amount_auth - provider_amt -
119                GATEWAY_AMT - fceokene_split_amt)
[9613]120        elif 'maintenance' in self.context.p_category:
[9780]121            fceokene_split_amt = 0.0
122            provider_amt = 0.0
[9613]123            self.pay_item_id = '8300'
124            xmldict['institution_amt'] = 100 * (
[9780]125                self.context.amount_auth - GATEWAY_AMT)
[9613]126            xmldict['institution_acct'] = "1012044132"
[9129]127            xmldict['institution_bank_id'] = '117'
[9956]128        elif self.context.p_category == 'clearance':
129            fceokene_split_amt = 0.0
130            provider_amt = 0.0
131            self.pay_item_id = '8304'
132            xmldict['institution_amt'] = 100 * (
133                self.context.amount_auth - GATEWAY_AMT)
134            xmldict['institution_acct'] = "2003670143"
135            xmldict['institution_bank_id'] = '8'
136
[8263]137        # Interswitch amount is not part of the xml data
[9613]138        if self.context.p_category == 'schoolfee':
139            xmltext = """<payment_item_detail>
[8263]140<item_details detail_ref="%(detail_ref)s" college="%(institution_name)s" department="%(department)s" faculty="%(faculty)s">
141<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" />
[9951]142<item_detail item_id="2" item_name="FCEOkene Split" item_amt="%(fceokene_split)d" bank_id="117" acct_num="1012044039" />
[9129]143<item_detail item_id="3" item_name="%(provider_item_name)s" item_amt="%(provider_amt)d" bank_id="%(provider_bank_id)s" acct_num="%(provider_acct)s" />
[8263]144</item_details>
145</payment_item_detail>""" % xmldict
[9613]146
[9956]147        else:
[9613]148            xmltext = """<payment_item_detail>
149<item_details detail_ref="%(detail_ref)s" college="%(institution_name)s" department="%(department)s" faculty="%(faculty)s">
150<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" />
151</item_details>
152</payment_item_detail>""" % xmldict
153
[8263]154        self.xml_data = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
[9780]155        self.context.provider_amt = provider_amt
156        self.context.gateway_amt = GATEWAY_AMT
157        self.context.thirdparty_amt = fceokene_split_amt
[7894]158        return
159
[8263]160class InterswitchPageApplicant(KofaPage):
[8256]161    """ View which sends a POST request to the Interswitch
162    CollegePAY payment gateway.
163    """
164    grok.context(ICustomApplicantOnlinePayment)
165    grok.require('waeup.payApplicant')
166    grok.template('applicant_goto_interswitch')
[8263]167    grok.name('goto_interswitch')
168    label = _('Submit data to CollegePAY (Interswitch Payment Gateway)')
169    submit_button = _('Submit')
170    action = POST_ACTION
171    site_name = SITE_NAME
172    currency = CURRENCY
[8644]173    pay_item_id = '8303'
[8263]174    product_id = PRODUCT_ID
[8256]175
176    def update(self):
[8263]177        if self.context.p_state != 'unpaid':
178            self.flash(_("Payment ticket can't be re-send to CollegePAY."))
179            self.redirect(self.url(self.context, '@@index'))
180            return
[8831]181        if self.context.__parent__.__parent__.expired \
182            and self.context.__parent__.__parent__.strict_deadline:
[8706]183            self.flash(_("Payment ticket can't be send to CollegePAY. "
184                         "Application period has expired."))
185            self.redirect(self.url(self.context, '@@index'))
186            return
[8256]187        self.applicant = self.context.__parent__
[8276]188        self.amount_auth = 100 * self.context.amount_auth
[8256]189        xmldict = {}
[9406]190        self.category = getUtility(IKofaUtils).PAYMENT_CATEGORIES[self.context.p_category]
[8281]191        tz = getUtility(IKofaUtils).tzinfo
192        self.local_date_time = to_timezone(
193            self.context.creation_date, tz).strftime("%Y-%m-%d %H:%M:%S %Z")
[8256]194        self.site_redirect_url = self.url(self.context, 'request_webservice')
[8641]195        xmldict['detail_ref'] = self.context.p_id
[8263]196        # Provider data
[9780]197        provider_amt = 500.0
198        xmldict['provider_amt'] = 100 * provider_amt
[8263]199        xmldict['provider_acct'] = PROVIDER_ACCT
200        xmldict['provider_bank_id'] = PROVIDER_BANK_ID
201        xmldict['provider_item_name'] = PROVIDER_ITEM_NAME
202        # Institution data
[9780]203        xmldict['institution_amt'] = 100 * (self.context.amount_auth -
204            provider_amt - GATEWAY_AMT)
[9951]205        xmldict['institution_acct'] = '10120445289'
[8641]206        xmldict['institution_bank_id'] = '117'
[8263]207        xmldict['institution_item_name'] = self.context.p_category
208        xmldict['institution_name'] = INSTITUTION_NAME
209        # Interswitch amount is not part of the xml data
210        xmltext = """<payment_item_detail>
211<item_details detail_ref="%(detail_ref)s" college="%(institution_name)s">
212<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" />
213<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" />
214</item_details>
215</payment_item_detail>""" % xmldict
216        self.xml_data = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
[9780]217        self.context.provider_amt = provider_amt
218        self.context.gateway_amt = GATEWAY_AMT
[8256]219        return
220
[7894]221
[9784]222class InterswitchPaymentRequestWebservicePageStudent(
223    InterswitchPaymentRequestWebservicePageStudent):
[7919]224    """ Request webservice view for the CollegePAY gateway
225    """
[8255]226    grok.context(ICustomStudentOnlinePayment)
[9784]227    product_id = PRODUCT_ID
228    gateway_host = HOST
229    gateway_url = URL
[7919]230
[9784]231class InterswitchPaymentRequestWebservicePageApplicant(
232    InterswitchPaymentRequestWebservicePageApplicant):
[8256]233    """ Request webservice view for the CollegePAY gateway
234    """
235    grok.context(ICustomApplicantOnlinePayment)
[9784]236    product_id = PRODUCT_ID
237    gateway_host = HOST
238    gateway_url = URL
Note: See TracBrowser for help on using the repository browser.