Index: WAeUP_SRP/trunk/skins/waeup_ois/demand_slip.pt
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/demand_slip.pt	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/demand_slip.pt	(revision 3712)
@@ -0,0 +1,37 @@
+<metal:body use-macro="here/slip_template/macros/master">    
+<metal:main fill-slot="main"                 tal:define="info options/info">      
+<span tal:condition="python: not info">        
+    <span tal:content="here/illegal_view" />      
+</span>             
+<span tal:condition="python: info">        <h3>Demand for Payment</h3>        <br />        
+    <table tal:define="student info/student">        
+
+        <tr>        
+            <td width="100px">Payment:</td>        
+            <td tal:content="info/type_description"></td>      
+        </tr>      
+
+
+        <tr>          
+            <td width="220px">Name:</td>            <td>
+                <span tal:content="student/name" /></td>        
+        </tr>        
+        <tr>          
+            <td>Student Id:</td>          
+            <td tal:content="student/id" />        
+        </tr>                 
+          
+        <tr>          
+            <td>Registration Number:</td>          
+            <td tal:content="student/matric_no" />        
+        </tr>                      
+                
+        <tr>        
+            <td >Amount:</td>       
+             <td> Naira 
+                <span tal:content="info/amount" /></td>      
+        </tr>                         
+    </table>                                        
+</span>    
+</metal:main>
+</metal:body>
Index: WAeUP_SRP/trunk/skins/waeup_ois/getPaymentsFolderInfo.py
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/getPaymentsFolderInfo.py	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/getPaymentsFolderInfo.py	(revision 3712)
@@ -0,0 +1,131 @@
+## Script (Python) "getPaymentsFolderInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: getPaymentsFolderInfo.py 2480 2007-10-30 15:23:25Z joachim $
+"""
+Info for the PaymentsFolder
+"""
+from Products.AdvancedQuery import Eq, Between, Le,In
+
+mtool = context.portal_membership
+wftool = context.portal_workflow
+member = mtool.getAuthenticatedMember()
+payments_catalog = context.payments_catalog
+aq_payments = payments_catalog.evalAdvancedQuery
+if mtool.isAnonymousUser():
+    return None
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+
+def cmp_id(a,b):
+    s1 = "%(id)s" % a
+    s2 = "%(id)s" % b
+    if s1 == s2:
+        return 0
+    if s1 > s2:
+        return 1
+    return -1
+
+import DateTime
+request = context.REQUEST
+#students = context.portal_url.getPortalObject().campus.students
+student_id = context.getStudentId()
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+#student = getattr(students,student_id)
+student_record = context.students_catalog.getRecordByKey(student_id)
+
+
+info = {}
+is_so = info['is_so'] = context.isSectionOfficer()
+is_student = info['is_student'] = context.isStudent()
+info['student_name'] = student_record.name
+info['query_url'] = "https://webpay.interswitchng.com/paydirect/services/TransactionQueryURL.aspx"
+review_state = info['review_state'] = student_record.review_state
+parttime = student_record.mode and student_record.mode.endswith('_pt')
+fulltime = student_record.mode and student_record.mode.endswith('_ft')
+
+
+session = student_record.session
+next_info = context.getNextInfo(student_record)
+info['next_session'] = next_info['next_session_id']
+info['next_session_str'] = next_info['next_session_str']
+info['payment_method'] = ""
+info['reasons'] = next_info['reasons']
+
+# begin customization
+
+if review_state == 'cleared_and_validated':
+    info['payment_method'] = "online_payment"
+#elif review_state == 'cleared_and_validated' and session == '07':
+#    info['payment_method'] = "sc_payment"
+elif review_state == 'returning' and info['next_session'] != session:
+    info['payment_method'] = "online_payment"
+info['prod_id'] = '105'
+
+# end customization
+
+info['student_name'] = student_record.name
+payments_path = "%s/campus/students/%s/payments" % (context.portal_url(),student_id)
+payments = []
+payment_records = aq_payments(Eq('student_id',student_id)) # & Eq('session_id',student_record.session))
+vocabularies = context.portal_vocabularies
+paid_fees = []
+for payment in payment_records:
+    if payment.status == "paid":
+        paid_fees += "%s_%s" % (payment.category,payment.session_id),
+#info['pf'] = paid_fees
+for payment in payment_records:
+    row = {}
+    row['id'] = payment.key
+    if payment.status == 'invalid':
+        row['title'] = "Invalid Payment, Naira %s, %s" % (payment.amount,
+                                                          payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    else:
+        row['title'] = "%s for Session %s, Naira %s, %s" % (vocabularies.payment_categories.get(payment.category),
+                                                            vocabularies.sessions.get(payment.session_id),
+                                                            payment.amount,
+                                                            payment.date.strftime("%d/%m/%y %H:%M:%S"))
+    oid = payment.order_id
+    onr = oid.rfind('-')+1
+    if onr > 0:
+        start_pos = onr
+    else:
+        start_pos = 6
+    url = row['url'] = "%s/p%s" % (payments_path,oid[start_pos:])
+    row['is_requeryable'] = "%s_%s" % (payment.category,payment.session_id) not in paid_fees and not payment.resp_desc and payment.type == 'online'# or str(member) in ('admin',)  # customized too
+    row['is_approvable'] = is_so and row['is_requeryable'] and payment.category == 'schoolfee' # does not make sense for maintenance
+    row['resp_desc'] = payment.resp_desc or 'Payment Process Interrupted'
+    row['trans_ref'] = payment.order_id
+    if row['is_requeryable']:
+        row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        if payment.category == 'schoolfee':
+#            row['callback_url'] = "%(url)s/interswitch_cb" % row
+#        elif payment.category == 'hostel_maintenance':
+#            row['callback_url'] = "%(url)s/interswitch_acco_cb" % row
+#        else:
+        href = '%(query_url)s' % info
+        href += '?transRef=%(trans_ref)s' % row
+        href += '&prodID=%(prod_id)s' % info
+        href += '&redirectURL=%(callback_url)s' % row
+        row['href'] = href
+    if payment.status == 'paid':
+        row['confirmed'] = 'active'
+    else:
+        row['confirmed'] = 'unsuccessful'
+    row['is_editable'] = is_so and (row['confirmed'] == 'active')
+    payments.append(row)
+
+payments.sort(cmp_id)
+info['payments'] = payments
+return info
+
Index: WAeUP_SRP/trunk/skins/waeup_ois/getSchoolFee.py
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/getSchoolFee.py	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/getSchoolFee.py	(revision 3712)
@@ -0,0 +1,54 @@
+## Script (Python) "getSchoolFee"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=brain=None
+##title=
+##
+# $Id: getSchoolFee.py 2534 2007-11-05 06:37:12Z henrik $
+"""
+return SchoolFee
+"""
+
+
+d = {}
+
+if brain.mode == 'ug_sw':  
+    if str(brain.level) == '100':    # both 100 fresh and 100 returning who register for 200
+        d['all'] = 35000
+    else:
+        d['all'] = 30000
+elif brain.mode == 'pg_sw':  
+    d['all'] = 35000
+elif brain.mode == 'dp_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 40000
+    else:
+        d['all'] = 35000
+elif brain.mode == 'ug_pt':  
+    if str(brain.level) == '100' and brain.review_state == 'cleared_and_validated':    # only 100 fresh 
+        d['all'] = 50000
+    else:
+        d['all'] = 45000
+elif brain.mode == 'pg_pt':  
+    if str(brain.level) == '600' and brain.review_state == 'cleared_and_validated':    # only 600 fresh 
+        d['all'] = 60000
+    elif str(brain.level) == '600' and brain.verdict == 'C':                           # 600 repeaters
+        d['all'] = 55000
+    elif str(brain.level) == '600':                                                    # going to register for 700
+        d['all'] = 75000        
+    else:
+        d['all'] = 65000
+else:
+    d['all'] = 0
+
+
+next_info = context.getNextInfo(brain)
+next_session_str = next_info['next_session_str']
+d['next_session_id'] = next_info['next_session_id']
+d['description'] = "School Fee for Session %s" % next_session_str
+
+return d
+
Index: WAeUP_SRP/trunk/skins/waeup_ois/goto_interswitch_form.pt
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/goto_interswitch_form.pt	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/goto_interswitch_form.pt	(revision 3712)
@@ -0,0 +1,52 @@
+<metal:body use-macro="here/main_template/macros/master">
+    <metal:main fill-slot="main"
+                tal:define="info options/info">
+                
+        <h3>Authorize Online Payment! </h3>
+        <br />
+                
+      <form method="post" action="pay_online"
+            tal:attributes="action info/action ">
+      <span tal:repeat="arg python:info['args'].items()"
+            tal:omit-tag="">
+          <input type="hidden" tal:attributes="name python:arg[0];value python:arg[1]" />
+      </span>          
+      
+      <span tal:replace = "structure info/xml_data" /> 
+      
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+          <tr>
+            <td >
+            Surcharge:
+            </td>
+            <td> Naira <span tal:content="info/surcharge" /></td>
+          </tr>          
+      
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Proceed to Interswitch Payment Gateway" 
+               />
+      </form>
+    </metal:main>
+</metal:body>
+
Index: WAeUP_SRP/trunk/skins/waeup_ois/interswitch_form.pt
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/interswitch_form.pt	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/interswitch_form.pt	(revision 3712)
@@ -0,0 +1,41 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info options/info">
+    <h3>Confirm Your Payment Data! </h3>
+    <br />
+    <span tal:condition="not: info/payment_possible">
+      No payment information for your course available.
+    </span>
+    <span tal:condition="info/payment_possible">
+      <form method="post" action="pay_interswitch">
+        <table>
+          <tr>
+            <td width="100px">
+            Payment:</td>
+            <td tal:content="info/type_description"></td>
+          </tr>
+          <tr>
+            <td>
+            Name:
+            </td>
+            <td tal:content="info/pay_bill_to" />
+          </tr>
+          <tr>
+            <td >
+            Amount:
+            </td>
+            <td> Naira <span tal:content="info/amount" /></td>
+          </tr>
+        </table>
+        <br />
+        <input type="submit" 
+               class="standalone" 
+               name="goto_bank" 
+               value="Confirm" 
+               />
+
+      </form>
+    </span>
+    </metal:main>
+</metal:body>
+
Index: WAeUP_SRP/trunk/skins/waeup_ois/pay_interswitch.py
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/pay_interswitch.py	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/pay_interswitch.py	(revision 3712)
@@ -0,0 +1,170 @@
+## Script (Python) "pay_online"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=
+##title=
+##
+# $Id: pay_interswitch.py 2619 2007-11-10 17:39:36Z henrik $
+"""
+pay online
+"""
+from urllib import urlencode
+import logging
+logger = logging.getLogger('Skins.pay_interswitch')
+import DateTime
+
+if context.portal_membership.isAnonymousUser():
+    return None
+
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+wftool = context.portal_workflow
+students = context.portal_url.getPortalObject().campus.students
+
+
+student_id = context.getStudentId()
+student = getattr(students,student_id)
+
+student_record = context.students_catalog.getRecordByKey(student_id)
+#amount,description = context.getSchoolFee(student_record.faculty,student_record.session,student_record.course)
+info = {}
+info['student'] = student_record
+info['payment_possible'] = False
+info['amount'] = '0'
+info['bank'] = ''
+info['type_description'] = ''
+info['pay_bill_to'] = ''
+fee_dict = context.getSchoolFee(student_record)
+fulltime = student_record.mode.endswith('_ft')
+
+if not fee_dict:
+    return context.interswitch_form(info=info)
+
+info['site_id'] = '105'
+info['currency_id'] = '566'
+pay_item_id = "10500"
+
+#info['type_code'] = sbrain.course  #type_code is redundant and will be removed soon
+info['bank'] = ''
+info['payment_possible'] = True
+info['type_description'] = fee_dict['description']
+info['pay_bill_to'] = student_record.name
+info['student_id'] = student_id
+info['student_name'] = student_record.name
+info['type'] = 'online'
+info['status'] = 'started'
+info['session_id'] = fee_dict['next_session_id']
+info['item'] = student_record.course
+info['category'] = 'schoolfee'
+info['student_email'] = student_record.email
+now = DateTime.DateTime()
+info['date'] = now
+info['pay_ship_to'] = "Adekunle Ajasin University"
+timestamp = "%d" % int(now.timeTime()*1000)
+info['order_id'] = "%s%s" % (student_id[1:],timestamp)
+p_id = "p%s" % timestamp
+
+
+info['surcharge'] = interswitch_amount = '150'
+info['amount'] = amount = fee_dict['all']
+total_amount = 100*int(amount) + 100*int(interswitch_amount)
+
+
+if student_id is None:
+    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if True:
+    info['action'] = "https://webpay.interswitchng.com/paydirect/webpay/pay.aspx"
+else:
+    #pass
+    #return None
+    info['action'] = "%s/payments/%s/simulate_callback" % (student.absolute_url(),p_id)
+
+
+if "payments" not in student.objectIds():
+    student.invokeFactory('PaymentsFolder','payments')
+    payments = getattr(student,'payments')
+    d = {}
+    d['Title'] = 'Payments'
+    payments.getContent().edit(mapping=d)
+    wftool.doActionFor(payments,'open')
+else:
+    payments = getattr(student,'payments')
+if request.has_key('epayment'):
+    return context.interswitch_form(info=info)
+
+# for OIS only
+if request.has_key('demand'):
+    return context.demand_slip(info=info)
+
+payments.invokeFactory('Payment', p_id)
+payment = getattr(payments,p_id)
+wftool.doActionFor(payment,'open')
+d = {}
+d.update(info)
+payment.getContent().edit(mapping=d)
+
+
+info['callback_url'] = "%s/payments/%s/interswitch_cb?echo=%s" % (student.absolute_url(),
+                                                                  p_id,
+                                                                  p_id)
+
+logger.info('%(student_id)s initiated online school fee payment with order_id %(order_id)s and callback url %(callback_url)s' % info)
+payment_fields = (('product_id','site_id'),
+                  ('site_redirect_url','callback_url'),
+                  ('Currency','currency_id'),
+                  ('cust_id','student_id'),
+                  ('cust_id_desc','type_description'),
+                  ('cust_name','student_name'),
+                  ('txn_ref','order_id'),
+                  ('Amount','amount'),
+                  )
+args = {}
+for arg,field in payment_fields:
+    args[arg] = info[field]
+
+bt_amount = 4000
+
+aaua_amount = amount - bt_amount
+xmldict = {}
+xmldict['detail_ref'] = args['txn_ref']
+xmldict['department'] = student_record.department
+xmldict['faculty'] = student_record.faculty
+xmldict['aaua_amount'] = "%d" % int(100*aaua_amount)
+xmldict['bt_amount'] = "%d" % int(100*bt_amount)
+if student_record.mode.endswith('_pt'):
+    xmldict['aaua_acct'] = "0321100000000046"
+elif student_record.mode.endswith('_sw'):
+    xmldict['aaua_acct'] = "0321100000000056"
+else:
+    xmldict['aaua_acct'] = "0000000000000000"
+
+
+xmltext = """<payment_item_detail>
+<item_details detail_ref="%(detail_ref)s" college="AAUA" department="%(department)s" faculty="%(faculty)s">
+<item_detail item_id="1" item_name="AAUA" item_amt="%(aaua_amount)s" bank_id="89" acct_num="%(aaua_acct)s" />
+<item_detail item_id="2" item_name="BT" item_amt="%(bt_amount)s" bank_id="117" acct_num="6012015294" />
+</item_details>
+</payment_item_detail>""" % xmldict
+
+info['xml_data'] = """<input type="hidden" name="xml_data" value='%s'  />""" % xmltext
+
+args['Amount'] = "%d" % (total_amount)
+args['site_name'] = "aaua.waeup.org"
+args['cust_name_desc'] = "Student Name"
+args['pay_item_id'] = pay_item_id
+args['pay_item_name'] = "AAUA Tuition Payments"
+args['payment_params'] = 'college_split'
+#args['xml_data'] = ''
+#args['xml_data'] = xmltext   # info['xml_data']can be used instead
+info['args'] = args
+
+return context.goto_interswitch_form(info=info)
+
Index: WAeUP_SRP/trunk/skins/waeup_ois/payments_view.pt
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_ois/payments_view.pt	(revision 3712)
+++ WAeUP_SRP/trunk/skins/waeup_ois/payments_view.pt	(revision 3712)
@@ -0,0 +1,100 @@
+<metal:body use-macro="here/main_template/macros/master">
+  <metal:main fill-slot="main"
+              tal:define="info context/getPaymentsFolderInfo;">
+    <span tal:condition="not: info">
+      <span tal:content="here/illegal_view" />
+    </span>
+    <span tal:condition="info" tal:omit-tag="">
+      <span tal:define= " rows info/payments;
+      review_state info/review_state;
+      is_student info/is_student;
+      s_name info/student_name;"
+      >
+        <a href=""
+           tal:attributes="href string:${context/aq_parent/absolute_url}">
+          <img tal:attributes="src string:${here/portal_url}/arrow_up.gif"/>
+          Up one level
+        </a>
+        <h3> 
+          <span tal:condition="not:is_student" tal:omit-tag="">
+            <span tal:content="s_name" />:</span>
+          <span tal:condition="is_student" tal:omit-tag="">My</span> Payments
+        </h3>
+        <br />
+        <table class="registration" width="100%">
+          <tr>
+            <th>Description, Amount, Date</th>
+            <th>Response</th>
+            <th>Transaction Code</th>
+          </tr>
+          <tr tal:repeat="row rows"
+              tal:attributes="class python:test(repeat['row'].even(), 'even ajaxtd', 'odd ajaxtd')">
+            <td style="white-space:normal" tal:attributes="class string:${row/confirmed}">
+              <a style="white-space:normal"  target="slip" href="" 
+                 tal:attributes="href string:${row/url}/payment_receipt"
+                 onclick="javascript:window.open('','slip','width=600, height=700, directories=no, toolbar=no, location=no, menubar=yes, scrollbars=yes, status=no, resizable=no, dependent=no')">
+                <strong tal:content="row/title" /></a> 
+            </td>
+            <td style="white-space:normal" tal:content="row/resp_desc" />
+            <td tal:content="row/trans_ref" />
+            <td>
+              <a tal:condition="row/is_approvable"
+                 tal:attributes="href string:${row/url}/approve_epayment;
+                 onclick python:'return window.confirm(\'%s\')' %(cpsmcat('Are you sure? You will not be able to undo the approval.'), );"
+                 >
+                [approve]
+              </a>             
+            </td>
+            <td>
+              <a tal:condition="row/is_requeryable"
+                 tal:attributes="href row/href;
+                 onclick python:'return window.confirm(\'%s\')' %(cpsmcat('Are you sure?'), );"
+                 >
+                [requery]
+              </a>             
+            </td>
+            <td>
+              <a tal:condition="row/is_editable"
+                href="edit" tal:attributes="href string:${row/url}/external_edit_form"
+                target="edit"
+                onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')"
+                >
+                [edit]
+              </a>             
+            </td>            
+          </tr>
+        </table>
+        <br />
+        <div>
+          <form tal:condition="python: info.get('payment_method') == 'online_payment'" 
+                tal:attributes="action string: ${context/absolute_url}/pay_interswitch" method="post" class="group">
+            <input type="submit" name="epayment" 
+                   class="context" 
+                   value="Initiate School Fee Online Payment" 
+                   />
+            <input type="submit" 
+                   class="standalone" 
+                   name="demand" 
+                   value="Demand for Payment" 
+                   />                      
+          </form>  
+          <form tal:condition="python: info.get('payment_method') == 'sc_payment'" 
+                tal:attributes="action string: ${context/absolute_url}/pay_by_sc" method="post" class="group">
+            <input type="hidden" name="paid_session" 
+                   tal:attributes="value info/next_session"
+                   />
+            <input type="submit" name="epayment" 
+                   class="context" 
+                   value="Pay School Fee by Scratch Card"
+                   tal:attributes="value string:Pay ${info/next_session_str} School Fee by Scratch Card"
+                   />
+          </form>          
+          <div tal:condition="info/reasons">
+            <font color="red" tal:content="info/reasons"></font>
+            <br /><br />
+          </div>
+        </div>        
+      </span>
+    </span>
+  </metal:main>
+</metal:body>
