## Script (Python) "interswitch_cb"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: interswitch_cb.py 2135 2007-08-21 08:11:16Z henrik $
"""
payment callback
"""
try:
    from Products.zdb import set_trace
except:
    def set_trace():
        pass
import logging
logger = logging.getLogger('Skins.interswitch_cb')
from AccessControl import Unauthorized
import DateTime
if context.portal_membership.isAnonymousUser():
    return None

request = context.REQUEST
students = context.portal_url.getPortalObject().campus.students
wftool = context.portal_workflow
mtool = context.portal_membership
member = mtool.getAuthenticatedMember()
member_id = str(member)
student_id = context.getStudentId()
if student_id is None: # or student_id != member_id:
    logger.info('%s tried to access payment object of %s' % (member_id,student_id))
    referer = request.get('HTTP_REFERER','none')
    logger.info('%s:%s illegal access, referer = %s' % (member_id,student_id,referer))
    real_ip = request.get('HTTP_X_REAL_IP',"none")
    logger.info('%s:%s illegal access, real_x_ip = %s' % (member_id,student_id,real_ip))
    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())

student = getattr(students,student_id)
resp_codes = (("desc","resp_desc"),
              ("resp","resp_code"),
              ("txnRef","pay_reference"),
              ("payRef","resp_pay_reference"),
              ("retRef","retRef"),
              ("cardNum","resp_card_num"),
              ("apprAmt","resp_approved_amount"),
              )
pd = {}
for rc,pdk in resp_codes:
    pd[pdk] = request.get(rc,'')

# for testing purposes
#pd['resp_desc'] = 'Simulated Callback'
#pd['resp_pay_reference'] = 'XXXX'
#pd['resp_code'] = '00'
#pd['resp_card_num'] = '0000'
#pd['resp_approved_amount'] = '10000'

if pd['resp_code'] == '00' and len(pd['resp_approved_amount']) > 4:
    pd['resp_approved_amount'] = pd['resp_approved_amount'][:-2]
else:
    pd['resp_approved_amount'] = '0'

review_state = wftool.getInfoFor(context,'review_state',None)
if pd['resp_code'] == '' and review_state == 'opened':
    logger.info('%s requeried payment %s and got empty response' % (student_id,context.getId()))
    wftool.doActionFor(context,'close')
    return request.RESPONSE.redirect("%s/waeup_document_view" % context.absolute_url())
context.getContent().edit(mapping = pd)
resp = pd['resp_code']

s_brain = context.students_catalog(id=student_id)[0]
session = s_brain.session
next_session, next_session_str = context.getNextSessionId(session)

if  resp == '00':
    if context.getStudentReviewState() == "school_fee_paid":
        logger.info('%s paid school_fee in state school_fee_paid' % (student_id))
    else:
        if next_session == context.getSessionId()[-2:]:
            wftool.doActionFor(student,'pay_school_fee')
        else:
            study_course = getattr(student,'study_course')
            try:
                wftool.doActionFor(study_course,'open')
            except:
                pass
            study_course_doc = study_course.getContent()
            next_level = "%s" % (int(s_brain.level) + 100)
            study_course_doc.edit(mapping= {'current_level': next_level,
                                            'current_session': next_session,})
    logger.info('%s received valid callback' % student_id)
    referer = request.get('HTTP_REFERER','none')
    logger.info('%s valid callback referer = %s' % (student_id,referer))
    real_ip = request.get('HTTP_X_REAL_IP',"none")
    logger.info('%s valid callback real_ip = %s' % (student_id,real_ip))

else:
    logger.info('%s received unsuccessfull callback: %s' % (student_id,pd['resp_desc']))
try:
    wftool.doActionFor(context,'close')
except:
    logger.info('%s no workflow action close' % student_id)


return request.RESPONSE.redirect("%s/waeup_document_view" % context.absolute_url())
