#-*- mode: python; mode: fold -*- from Globals import InitializeClass from AccessControl import ClassSecurityInfo from Products.CMFCore.utils import UniqueObject, getToolByName from Products.CMFCore.permissions import View from Products.CMFCore.permissions import ModifyPortalContent from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder #from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument from Products.CPSDocument.CPSDocument import CPSDocument from Products.CPSCore.CPSBase import CPSBaseBTreeFolder as BaseBTreeFolder from Products.WAeUP_SRP.WAeUPTables import AccommodationTable import Globals import DateTime import logging import re p_home = Globals.package_home(globals()) i_home = Globals.INSTANCE_HOME class PaymentsFolder(CPSDocument): ###( """ WAeUP PaymentsFolder containing Payment objects """ meta_type = 'PaymentsFolder' portal_type = meta_type security = ClassSecurityInfo() #security.declareProtected(View,"Title") #def Title(self): # """compose title""" # return "Payments" security.declareProtected(View,"updatePayments") def updatePayments(self,force = None): """upgrade all payments in folder""" logger = logging.getLogger('Payment.PaymentsFolder.updatePayments') #import pdb;pdb.set_trace() for payment in self.aq_parent.objectValues(): student_record = self.students_catalog.getRecordByKey(self.getStudentId()) payment['updatePayment'](student_record,force=force) InitializeClass(PaymentsFolder) def addPaymentsFolder(container, id, REQUEST=None, **kw): """Add a PaymentsFolder.""" ob = PaymentsFolder(id, **kw) return CPSBase_adder(container, ob, REQUEST=REQUEST) ###) class Payment(CPSDocument): ###( """ WAeUP Payment containing Nothing """ meta_type = 'Payment' portal_type = meta_type security = ClassSecurityInfo() # security.declareProtected(View,"Title") # def Title(self): # """compose title""" # content = self.getContent() # description = getattr(content,'type_description','') # d = getattr(content,'date','') # #pay_date = "%s/%s/%s %s:%s:%s" %(d[:2],d[2:4],d[4:6],d[6:8],d[8:10],d[10:]) # pay_date = d.strftime("%d/%m/%y %H:%M:%S") # amount = getattr(content,'amount','') # if not (description or pay_date or amount): # return self.getId() # return "%(description)s, Naira %(amount)s, %(pay_date)s" % vars() #security.declareProtected(View,"Title") #def Title(self): # """compose title""" # payment = self.getContent() # vocabularies = self.portal_vocabularies # if payment.status == 'invalid': # return "Invalid Payment, Naira %s, %s" % (payment.amount, # payment.date.strftime("%d/%m/%y %H:%M:%S")) # return "%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")) # update Payment is no longer necessary security.declareProtected(View,"updatePayment") def updatePayment(self,student_record,force=None): logger = logging.getLogger('Payment.Payment.updatePayment') doc = self.getContent() status = getattr(doc,'status',None) type_description = getattr(doc,'type_description',None) ## should not be done online for all started objects (too many conflict errors) if status and status != 'started' and not type_description.startswith('Transfer') and not force: #if status and not force: return wftool = self.portal_workflow d = {} #d['key'] = self.getId() d['amount'] = doc.amount category = '' if doc.type_description.startswith('School'): category = 'schoolfee' sp = doc.type_description.rfind('/') d['session_id'] = doc.type_description[sp-2:sp] d['category'] = category # zb. schoolfee if doc.type_description.startswith('Transfer'): category = 'transfer' sp = doc.type_description.rfind('/') d['session_id'] = doc.type_description[sp-2:sp] d['category'] = category # zb. schoolfee while True: if doc.resp_code == "SC": p_type = "sc" p_status = "paid" if type(doc.order_id) != type(''): d['order_id'] = str(doc.order_id) break #if self.order_id.startswith('p'): # try: # self.payments_catalog.deleteRecord(self.order_id) # except: # pass # d['order_id'] = "%s%s" % (student_record.id[1:],self.aq_parent.getId()[1:]) p_type = "online" if doc.resp_code in ("00","IP","AP"): p_status = "paid" elif doc.resp_code == '': p_status = "started" else: p_status = "failed" # don't set order_id it is already correct break d['type'] = p_type # scratch card d['item'] = getattr(student_record,'course','') d['status'] = p_status # d['resp_approved_amount'] = getattr(doc,'resp_approved_amount',None) # d['resp_pay_reference'] = doc.resp_pay_reference # d['resp_desc'] = doc.resp_desc # d['resp_code'] = doc.resp_code # d['resp_card_num'] = doc.resp_card_num # d['date'] = getattr(doc,'date',None) review_state = wftool.getInfoFor(self.aq_parent,'review_state',None) if review_state == "closed": wftool.doActionFor(self.aq_parent,'open') doc.edit(mapping = d) if review_state == "closed": wftool.doActionFor(self.aq_parent,'close') logger.info('updated student %s payment %s' % (student_record.id,self.aq_parent.getId())) InitializeClass(Payment) def addPayment(container, id, REQUEST=None, **kw): """Add a Payment.""" ob = Payment(id, **kw) return CPSBase_adder(container, ob, REQUEST=REQUEST) ###)