source: WAeUP_SRP/trunk/skins/waeup_uniben/pay_interswitch.py @ 8318

Last change on this file since 8318 was 8318, checked in by Henrik Bettermann, 13 years ago

Uups, returning students and new students must be treated differently when adding late payment fees.

  • Property svn:keywords set to Id
File size: 7.6 KB
Line 
1##Script (Python) "pay_online"
2##bind container=container
3##bind context=context
4##bind namespace=
5##bind script=script
6##bind subpath=traverse_subpath
7##parameters=
8##title=
9##
10# $Id: pay_interswitch.py 8318 2012-04-30 15:18:10Z henrik $
11"""
12pay online
13"""
14from urllib import urlencode
15import logging
16logger = logging.getLogger('Skins.pay_interswitch')
17import DateTime
18
19if context.portal_membership.isAnonymousUser():
20    return None
21
22try:
23    from Products.zdb import set_trace
24except:
25    def set_trace():
26        pass
27request = context.REQUEST
28wftool = context.portal_workflow
29students = context.portal_url.getPortalObject().campus.students
30
31
32student_id = context.getStudentId()
33student = getattr(students,student_id)
34
35student_record = context.students_catalog.getRecordByKey(student_id)
36#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
37info = {}
38info['student'] = student_record
39info['payment_possible'] = False
40info['amount'] = '0'
41info['bank'] = ''
42info['type_description'] = ''
43info['pay_bill_to'] = ''
44fee_dict = context.getSchoolFee(student_record)
45
46fulltime = student_record.mode.endswith('_ft')
47new = student_record.review_state == 'cleared_and_validated'
48returning = student_record.review_state == 'returning'
49if not fee_dict or not (new or returning):
50    return context.interswitch_form(info=info)
51info['site_id'] = '57'
52info['currency_id'] = '566'
53if new:
54    amount = info['amount'] = fee_dict['new']
55elif returning:
56    amount = info['amount'] = fee_dict['returning']
57
58if new and int(student_record.session) < 11:
59    amount_int = int(amount)
60    amount_int += 5000
61    amount = info['amount'] = '%d' % (amount_int)
62if returning and int(student_record.session) < 10:
63    amount_int = int(amount)
64    amount_int += 5000
65    amount = info['amount'] = '%d' % (amount_int)
66
67if fulltime:
68    pay_item_id = "5700"
69    info['bank'] = ''
70else:
71    pay_item_id = "5701"
72    info['bank'] = ''
73info['surcharge'] = '0'  # Uniben doesn't show the surcharge on the slip
74info['payment_possible'] = True
75info['type_description'] = fee_dict['description']
76info['pay_bill_to'] = student_record.name
77info['pay_ship_to'] = "University of Benin"
78info['student_id'] = student_id
79info['student_name'] = student_record.name
80info['student_email'] = student_record.email
81#info['session_id'] = student_record.session   # this holds only for new students und must be replaced when also previous session students will pay online !!!!!!
82info['session_id'] = fee_dict['next_session_id']
83info['type'] = 'online'
84info['status'] = 'started'
85info['item'] = student_record.course
86info['category'] = 'schoolfee'
87now = DateTime.DateTime()
88info['date'] = now
89timestamp = "%d" % int(now.timeTime()*1000)
90info['order_id'] = "%s%s" % (student_id[1:],timestamp)
91p_id = "p%s" % timestamp
92
93if student_id is None:
94    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
95
96# old: https://webpay.interswitchng.com/paydirect/webpay/pay.aspx
97
98if True or context.portal_url().find('uniben-demo.waeup.org') >-1 or\
99   context.portal_url().find('uniben.waeup.org') >-1:
100    #info['action'] = "https://webpay.interswitchng.com/test_paydirect/webpay/pay.aspx"
101    info['action'] = "https://webpay.interswitchng.com/webpayv4/webpay/pay.aspx"
102else:
103    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
104
105
106if "payments" not in student.objectIds():
107    student.invokeFactory('PaymentsFolder','payments')
108    payments = getattr(student,'payments')
109    d = {}
110    d['Title'] = 'Payments'
111    payments.getContent().edit(mapping=d)
112    wftool.doActionFor(payments,'open')
113else:
114    payments = getattr(student,'payments')
115if request.has_key('epayment'):
116    return context.interswitch_form(info=info)
117
118
119payments.invokeFactory('Payment', p_id)
120payment = getattr(payments,p_id)
121wftool.doActionFor(payment,'open')
122d = {}
123d.update(info)
124payment.getContent().edit(mapping=d)
125info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
126                                                                  p_id,
127                                                                  p_id)
128
129logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
130payment_fields = (('product_id','site_id'),
131                  ('site_redirect_url','callback_url'),
132                  ('Currency','currency_id'),
133                  ('cust_id','student_id'),
134                  ('cust_id_desc','type_description'),
135                  ('cust_name','student_name'),
136                  ('txn_ref','order_id'),
137                  ('Amount','amount'),
138                  )
139args = {}
140for arg,field in payment_fields:
141    args[arg] = info[field]
142itotal = int(amount)*100
143
144#BT Amount Varies
145if student_record.mode.endswith('_ft') and student_record.review_state == 'return':
146        bt_amount = 60000
147else:
148        bt_amount = 150000
149#Interswitch amount 150 naira
150interswitch_amount = 15000
151uniben_amount = itotal - bt_amount - interswitch_amount
152xmldict = {}
153xmldict['detail_ref'] = args['txn_ref']
154xmldict['department'] = student_record.department
155xmldict['faculty'] = student_record.faculty
156xmldict['bt_amt'] = "%d" % bt_amount
157xmldict['uniben_amt'] = "%d" % uniben_amount
158
159#Full and Part-time students School Fees go into different Accounts
160
161if student_record.mode.endswith('_ft'):
162        #post-grad full-time students of all faculties
163        if student_record.level in ('700','710','800','810','900','910'):
164            xmldict['uniben_acct'] = "1012842833"
165            xmldict['bank_id'] = '117'
166        #all other part-time students depending on faculty     
167        elif student_record.faculty in ('SSC','LAW','MED'):
168            xmldict['uniben_acct'] = "0005986938"
169            xmldict['bank_id'] = '31'
170        elif student_record.faculty in ('ENG','PSC','PHA'):
171            xmldict['uniben_acct'] = "0014413973"
172            xmldict['bank_id'] = '129'
173        elif student_record.faculty in ('LSC','DEN','AGR'):
174            xmldict['uniben_acct'] = "1012801319"
175            xmldict['bank_id'] = '117'
176        elif student_record.faculty in ('ART','EDU','MGS','BMS'):
177            xmldict['uniben_acct'] = "6220027556"
178            xmldict['bank_id'] = '51'
179elif student_record.mode.endswith('_pt'):
180        #post-grad part-time students of all faculties
181        if student_record.level in ('700','710','800','810','900','910'):
182            xmldict['uniben_acct'] = "0023708207"
183            xmldict['bank_id'] = '72'
184        #all other part-time students depending on faculty     
185        elif student_record.faculty in ('ENG','LAW','MGS'):
186            xmldict['uniben_acct'] = "2019006824"
187            xmldict['bank_id'] = '8'
188        elif student_record.faculty in ('IPA','PHA','SSC','AGR','EDU'):
189            xmldict['uniben_acct'] = "0122012109"
190            xmldict['bank_id'] = '16' 
191
192
193xmltext = """<payment_item_detail>
194<item_details detail_ref="%(detail_ref)s" college="UNIBEN" department="%(department)s" faculty="%(faculty)s">
195<item_detail item_id="1" item_name="UNIBEN School Fee" item_amt="%(uniben_amt)s" bank_id="%(bank_id)s" acct_num="%(uniben_acct)s" />
196<item_detail item_id="2" item_name="BT" item_amt="%(bt_amt)s" bank_id="89" acct_num="0061001000021095" />
197</item_details>
198</payment_item_detail>""" % xmldict
199
200info['xml_data'] = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
201
202args['Amount'] = "%d" % (itotal)
203args['site_name'] = "uniben.waeup.org"
204args['cust_name_desc'] = "Student Name"
205args['pay_item_id'] = pay_item_id
206args['pay_item_name'] = "UNIBEN Tuition Payments"
207args['payment_params'] = 'college_split'
208#args['xml_data'] = ''
209#args['xml_data'] = xmltext   # info['xml_data']can be used instead
210info['args'] = args
211
212return context.goto_interswitch_form(info=info)
Note: See TracBrowser for help on using the repository browser.