## Script (Python) "search_pins"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: readOnlinePaymentsFromLog.py 1673 2007-04-09 16:01:51Z joachim $
"""
read the successfull epayments from an extract of Z2.log
this extract must be created with

cat /zope/instances/uniben1/log/Z2.log.1 | grep epayment_cb | grep RespCode=00 
> /zope/instances/uniben1/import/successfullepaymentsDDMMYY.log

in /zope/instances/uniben1/import/ are already all files from 25.3.07

"""
import logging
logger = logging.getLogger('Skins.readOnlinePaymentsFromLog')

request = context.REQUEST
session = request.SESSION
response = request.RESPONSE
setheader = request.RESPONSE.setHeader
import DateTime

def rwrite(s):
    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
    response.write('%s<br>\r\n' % s)

wftool = context.portal_workflow
mtool = context.portal_membership
member = mtool.getAuthenticatedMember()
roles = member.getRolesInContext(context)
retcat = context.returning_import
rcat = context.results_import
scat = context.students_catalog
from Products.AdvancedQuery import Eq, Between, Le,In
aq_students = context.students_catalog.evalAdvancedQuery
students_folder = context.portal_url.getPortalObject().campus.students
resp_codes = (("x_RespDesc","resp_desc"),
      ("x_RespPayRef","resp_pay_reference"),
      ("x_RespCode","resp_code"),
      ("x_CardNum","resp_card_num"),
      ("x_ApprAmt","resp_approved_amount"),
      )
count = 0
correct = 0
approved = 0
tas = context.waeup_tool.getCallbacksFromLog('successfullepayments260307.log')
for ta in tas:
    count += 1
    student_id = ta['student_id']
    payment_id = ta['payment_id']
    qs_dict = ta['qs_dict']
    if not students_folder.hasObject(student_id):
        rwrite("no student %s" % student_id)
        continue
    student_obj = getattr(students_folder,student_id)
    if not student_obj.hasObject('payments'):
        rwrite("no payments for student %s" % student_id)
        continue
    payments = getattr(student_obj,'payments')
    if not payments.hasObject(payment_id):
        rwrite("no payment %s for student %s" % (payment_id,student_id))
        continue
    payment_obj = getattr(payments,payment_id)
    payment_doc = payment_obj.getContent()
    pdoc = {}
    for rc,key in resp_codes:
        pdoc[key] = getattr(payment_doc,key)
    readin = {}
    for rc,pdk in resp_codes:
        readin[pdk] = qs_dict.get(rc)[0]
    response_code = readin['resp_code']
    if payment_doc.resp_code != response_code:
        rwrite('"%d","%d","%s","%s","%s","%s"' % (
                                                  count,correct,
                                                  student_id,
                                                  payment_id,
                                                  response_code,
                                                  payment_doc.resp_code
                                                  ))
    elif payment_doc.resp_code == response_code:
        correct +=1
        rwrite('"%d","%d","%s","%s","%s","%s"' % (
                                                  count,correct,
                                                  student_id,
                                                  payment_id,
                                                  response_code,
                                                  payment_doc.resp_code
                                                  ))
    if payment_doc.resp_code == "" and response_code == "00":
        pd = {}
        review_state = wftool.getInfoFor(payment_obj,'review_state',None)
        if review_state != "opened":
            logger.info('payment object of %s closed' % (student_id))
            continue
        review_state = wftool.getInfoFor(student_obj,'review_state',None)
        if review_state != "cleared_and_validated":
            logger.info('%s review_state = %s' % (student_id,review_state))
            continue
        pd['resp_code'] = 'IP'
        pd['resp_desc'] = 'Payment approved by import, %s' % (DateTime.DateTime())
        payment_doc.edit(mapping=pd)
        if payment_doc.type_description.startswith('School Fee'):
            wftool.doActionFor(student_obj,'pay_school_fee')
        logger.info('%s approves epayment for %s by import' % (member,student_id))
        wftool.doActionFor(payment_obj,'close')
        approved += 1
        if approved > 50:
            context.waeup_tool.doCommit()
            logger.info('%s transactions commited' % (approved))
            approved = 0
