Ejemplo n.º 1
0
 def upload_storage(self):
     """将单据数据上载至财企通系统"""
     for bill in self:
         logging.info(u"开始上载票据至财企通系统")
         # 获取财企通前置机地址
         service_url = self.env['ir.values'].get_default(
             'interface.bank.settings', 'feg_add')
         # 封装xml
         str_xml = cqt.package_bill_storage_to_xml(bill)
         logging.info(str_xml)
         result_xml = cqt.send_xml_to_cqtbankservice(str_xml, service_url)
         # 解析xml
         try:
             # 解析报文
             result_json = cqt.xml_to_json(result_xml)
         except KeyError as e:
             raise UserError(u"交易发生KeyError异常!\r\n消息KeyError字段:{}".format(
                 e.message))
         except ExpatError as e:
             raise UserError(u"财企通服务器通信故障!请检查前置机日志输出!\r\n{}".format(
                 e.message))
         result_json = json.loads(result_json.strip())
         efmp = result_json['efmp']
         result = cqt.parsing_result_xml_result(efmp)
         if result['resultCode'] != '0000':
             msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                 result['resultCode'], result['resultMsg'])
             logging.info(msg)
             raise UserError(msg)
         else:
             bill.message_post(body=result['resultMsg'],
                               message_type='notification')
             bill.state = '1'
     return True
Ejemplo n.º 2
0
 def upload_weekly_funding_plan(self):
     logging.info(u"开始上传资金池周计划到财企通系统")
     for plan in self:
         # 获取财企通前置机地址
         service_url = self.env['ir.values'].get_default(
             'interface.bank.settings', 'feg_add')
         # 封装xml
         str_xml = cqt.package_weekly_funding_plan_to_xml(plan)
         logging.info(str_xml)
         result_xml = cqt.send_xml_to_cqtbankservice(str_xml, service_url)
         try:
             # 解析报文
             result_json = cqt.xml_to_json(result_xml)
         except KeyError as e:
             raise UserError(u"交易发生KeyError异常!\r\n消息KeyError字段:{}".format(
                 e.message))
         except ExpatError as e:
             raise UserError(u"财企通服务器通信故障!请检查前置机日志输出!\r\n{}".format(
                 e.message))
         result_json = json.loads(result_json.strip())
         efmp = result_json['efmp']
         result = cqt.parsing_result_xml_result(efmp)
         if result['resultCode'] != '0000':
             msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                 result['resultCode'], result['resultMsg'])
             logging.info(msg)
             raise UserError(msg)
         else:
             message = u"""结果码:(%s),返回消息:(%s)""" % (result['resultCode'],
                                                    result['resultMsg'])
             plan.message_post(body=message, message_type='notification')
             plan.state = '1'
     return True
Ejemplo n.º 3
0
 def search_payment_result(self, payment_from_number):
     """根据查询付款单的编号查询银行付款处理结果
     :param payment_from_number: 付款单编号可多个,用英文逗号隔开
     """
     logging.info(u"查询的付款单据编码为:%s" % payment_from_number)
     number_arrays = payment_from_number.split(',')
     for number in number_arrays:
         payment = self.env['interface.bank.payment'].sudo().search([
             ('form_code', '=', number)
         ])
         if len(payment) != 1:
             raise UserError(u"付款单据编号:%s不存在!" % number)
     # 将付款单据编号封装成xml
     xml_str = cqt.package_query_payment_result_to_xml(number_arrays)
     # 获取财企通前置机地址url
     service_url = self.env['ir.values'].get_default(
         'interface.bank.settings', 'feg_add')
     # 将xml字符串发送到财企通并接受结果xml
     result_xml = cqt.send_xml_to_cqtbankservice(xml_str, service_url)
     # 解析xml
     result_json = cqt.xml_to_json(result_xml)
     result_json = json.loads(result_json.strip())
     efmp = result_json['efmp']
     body = efmp['body']
     result_set = body['resultSet']
     # 封装结果返回到页面
     result_list = list()
     result = result_set['result']
     if isinstance(result, dict):
         try:
             data = {
                 'payment_from_code': result['requestId'],
                 'state_code': result['cmdStatus'],
                 'result_code': result['resultCode'],
                 'message': result['resultMsg'],
             }
             result_list.append(data)
         except KeyError:
             data = {
                 'result_code': result['resultCode'],
                 'message': result['resultMsg'],
             }
             result_list.append(data)
     elif isinstance(result, list):
         for res in result:
             data = {
                 'payment_from_code': res['requestId'],
                 'state_code': res['cmdStatus'],
                 'result_code': res['resultCode'],
                 'message': res['resultMsg'],
             }
             result_list.append(data)
     return result_list
Ejemplo n.º 4
0
 def search_electronic_receipt_result(self, custNo, custName, slipId,
                                      slipNo, startDate, endDate):
     """查询电子回单信息"""
     # 检查输入的信息是否正确
     logging.info(u"开始查询客户'{}'的电子回单".format(custNo))
     if not custNo and not slipId and not custName and not slipNo:
         raise UserError(u"请输入客户编号或客户名称或电子回单编码或电子回单Id!")
     if not startDate and not endDate:
         raise UserError(u"请选择查询的开始和结束日期!")
     if not custNo:
         payment = self.env['interface.bank.payment'].sudo().search([
             ('partner_id', '=', custName)
         ])
         if payment:
             custNo = payment[0].partner_number
         else:
             raise UserError(u"客户:{}在付款单中不存在客户编号,不能进行查询!".format(custName))
     xml_str = cqt.package_electronic_return_inquiry({
         'offset':
         0,
         'pageSize':
         50,
         'custNo':
         custNo if custNo else '',
         'custName':
         custName if custName else '',
         'slipId':
         slipId if slipId else '',
         'slipNo':
         slipNo if slipNo else '',
         'startDate':
         startDate,
         'endDate':
         endDate,
     })
     logging.info(xml_str)
     # 获取财企通前置机地址
     service_url = self.env['ir.values'].get_default(
         'interface.bank.settings', 'feg_add')
     # 发送报文到前置机
     result_xml = cqt.send_xml_to_cqtbankservice(xml_str, service_url)
     # 解析通用报文
     result = cqt.parsing_general_instruction_messages(result_xml)
     if isinstance(result, dict):
         if result['resultCode'] != '0000':
             msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                 result['resultCode'], result['resultMsg'])
             logging.info(msg)
             raise UserError(msg)
     data = self.create_electronic_dict(result)
     self.env['interface.bank.electronic.receipt.result'].sudo().create(
         data)
     return {'state': True, 'msg': u'查询成功,请手动刷新并查看结果'}
Ejemplo n.º 5
0
 def search_cqt_payment_result(self):
     """查询付款单据(财企通)支付结果"""
     # 将付款单据编号封装成xml
     xml_str = cqt.package_query_payment_result_to_xml([self.form_code])
     # 获取财企通前置机地址url
     service_url = self.env['ir.values'].get_default(
         'interface.bank.settings', 'feg_add')
     if not service_url:
         raise UserError(u"请正确配置财企通前置机地址url")
     # 将xml字符串发送到财企通并接受结果xml
     result_xml = cqt.send_xml_to_cqtbankservice(xml_str, service_url)
     # 解析xml
     result_json = cqt.xml_to_json(result_xml)
     result_json = json.loads(result_json.strip())
     efmp = result_json['efmp']
     body = efmp['body']
     result_set = body['resultSet']
     # 封装结果返回到页面
     result = result_set['result']
     if isinstance(result, dict):
         if result.get('resultCode') != '0000':
             self.write({'state': '03'})
             self.sudo().message_post(body=result.get('resultMsg'),
                                      message_type='notification')
             return False
         # 交易状态14代表支付成功
         if result.get('cmdStatus') == '14':
             self.write({'state': '02'})
             self.sudo().message_post(body=result.get('resultMsg'),
                                      message_type='notification')
         elif result.get('cmdStatus') == '11':
             raise UserError(u"银行已收到信息但暂时未处理,返回信息:'{}'".format(
                 result.get('resultMsg')))
         elif result.get('cmdStatus') == '12':
             raise UserError(u"银行已收到信息正在处理中,返回信息:'{}'".format(
                 result.get('resultMsg')))
         elif result.get('cmdStatus') == '15':
             self.write({'state': '03'})
             self.sudo().message_post(body=result.get('resultMsg'),
                                      message_type='notification')
             # raise UserError(u"银行处理信息失败,返回信息:'{}'".format(result.get('resultMsg')))
         elif result.get('cmdStatus') == '16':
             raise UserError(u"查询指令不存在,返回信息:'{}'".format(
                 result.get('resultMsg')))
Ejemplo n.º 6
0
 def search_daily_fund_plan(self):
     """查询日资金计划function"""
     logging.info(u"开始查询日资金计划")
     # 获取财企通前置机地址
     service_url = self.env['ir.values'].get_default(
         'interface.bank.settings', 'feg_add')
     str_xml = cqt.package_daily_fund_plan_to_xml(self)
     logging.info(str_xml)
     result_xml = cqt.send_xml_to_cqtbankservice(str_xml, service_url)
     # 解析报文
     result_json = cqt.xml_to_json(result_xml)
     result_json = json.loads(result_json.strip())
     efmp = result_json['efmp']
     result = False
     try:
         header = efmp['header']
     except KeyError:
         result = cqt.parsing_result_xml_result(efmp)
         msg = u"""查询发生错误,消息为:(%s)""" % result['resultMsg']
         logging.info(msg)
         raise UserError(msg)
     try:
         if header['resultCode'] != '0000':
             msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                 header['resultCode'], header['resultMsg'])
             logging.info(msg)
             raise UserError(msg)
     except KeyError:
         logging.info(header)
     result = cqt.parsing_result_xml_result(efmp)
     if isinstance(result, dict):
         try:
             if result['resultCode'] != '0000':
                 msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                     result['resultCode'], result['resultMsg'])
                 logging.info(msg)
                 raise UserError(msg)
         except KeyError:
             logging.debug(result)
     self.create_search_result(result)
Ejemplo n.º 7
0
 def parsing_general_instruction_messages(self, result_xml):
     """解析异步指令通用响应报文
     :param result_xml: 结果xml
     :return dict: 返回结果字典
     """
     result_json = cqt.xml_to_json(result_xml)
     result_json = json.loads(result_json.strip())
     efmp = result_json['efmp']
     body = efmp['body']
     result_set = body['resultSet']
     result = result_set['result']
     if isinstance(result, dict):
         return result
Ejemplo n.º 8
0
 def summit_payment(self):
     """确认付款功能函数"""
     # 获取付款单对象
     payment = self.env['interface.bank.payment'].browse(self.env.context.get('active_id', False))
     msg = False
     # 判断选择银行
     if self.bank_type == '00':
         # 判断功能类型
         payment_type = self.payment_type
         # 获取财企通前置机地址
         service_url = self.env['ir.values'].get_default('interface.bank.settings', 'feg_add')
         if payment_type == '0':
             logging.info(u"付款类型为--付款--")
             efmp_xml = cqt.package_payment_to_xml(payment=payment, public_account=self.public_account_id)
             logging.info(efmp_xml)
             # 发送报文到前置机
             result_xml = cqt.send_xml_to_cqtbankservice(efmp_xml, service_url)
         elif payment_type == '1':
             logging.info(u"付款类型为--银行账户付款--")
             # 因银行账户付款接口需要传递收款方的详细信息,所以在生成xml前先检查付款单的数据是否齐全
             self.check_payment_fields(payment)
             efmp_xml = cqt.package_bank_account_payment_to_xml(payment, self.public_account_id)
             logging.info(efmp_xml)
             # 发送报文到前置机
             # 将xml字符串发送到财企通并接受结果xml
             result_xml = cqt.send_xml_to_cqtbankservice(efmp_xml, service_url)
         elif payment_type == '2':
             logging.info(u"付款类型为--付款代理接口--")
             efmp_xml = cqt.package_agent_payment_to_xml(payment, self.public_account_id)
             logging.info(efmp_xml)
             # 发送报文到前置机
             result_xml = cqt.send_xml_to_cqtbankservice(efmp_xml, service_url)
         # 解析xml
         try:
             result_data = self.parsing_general_instruction_messages(result_xml)
             self.check_execution_result(result_data, payment)
         except KeyError as e:
             raise UserError(u"交易发生KeyError异常!\r\n消息KeyError字段:{}".format(e.message))
         except ExpatError as e:
             raise UserError(u"财企通服务器通信故障!请检查前置机日志输出!\r\n{}".format(e.message))
     # 回写付款单状态
     payment_data = {
         'bank_type': self.bank_type,
         'public_account_id': self.public_account_id.id,
         'payment_type': self.payment_type,
     }
     payment.sudo().write(payment_data)
     self.create_interface_bank_payment_log(payment, msg)
Ejemplo n.º 9
0
 def search_account_bal_new(self, s_type, account_id, external_id):
     """开始查询账户余额"""
     accounts = self.env['bank.public.accounts'].sudo().search([
         ('id', '=', account_id)
     ])
     externals = self.env['bank.external.accounts'].sudo().search([
         ('id', '=', external_id)
     ])
     logging.info(u"开始查询账户余额")
     # 获取财企通前置机地址
     service_url = self.env['ir.values'].get_default(
         'interface.bank.settings', 'feg_add')
     str_xml = False
     if s_type == '20005':
         logging.info(u"查询内部银行账户余额!")
         str_xml = cqt.package_query_internal_account_balance(accounts[0])
     elif s_type == '20009':
         logging.info(u"查询银行账户余额!")
         str_xml = cqt.package_search_bank_account_balance(externals[0])
     elif s_type == '20019':
         logging.info(u"查询头寸账户余额!")
         str_xml = cqt.package_search_money_supply_account_balance(
             accounts[0])
     logging.info(str_xml)
     result_xml = cqt.send_xml_to_cqtbankservice(str_xml, service_url)
     if result_xml:
         # 解析报文
         try:
             result_json = cqt.xml_to_json(result_xml)
         except ExpatError:
             raise UserError(u"解析结果错误!通常是由于前置机接口地址不正确而导致的!")
         result_json = json.loads(result_json.strip())
         efmp = result_json['efmp']
         header = False
         result = False
         try:
             header = efmp['header']
         except KeyError:
             result = cqt.parsing_result_xml_result(efmp)
             msg = u"""查询发生错误,消息为:(%s)""" % result['resultMsg']
             logging.info(msg)
             raise UserError(msg)
         try:
             if header['resultCode'] != '0000':
                 msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                     header['resultCode'], header['resultMsg'])
                 logging.info(msg)
                 raise UserError(msg)
         except KeyError:
             logging.info(header)
         result = cqt.parsing_result_xml_result(efmp)
         if isinstance(result, dict):
             try:
                 if result['resultCode'] != '0000':
                     msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                         result['resultCode'], result['resultMsg'])
                     logging.info(msg)
                     raise UserError(msg)
             except KeyError:
                 logging.debug(result)
         # 创建结果data
         data = self.get_result_data(result, header, s_type)
         return data['line_ids']
Ejemplo n.º 10
0
 def search_account_transaction_details(self):
     """开始查询账户交易明细"""
     # 获取财企通前置机地址
     service_url = self.env['ir.values'].get_default(
         'interface.bank.settings', 'feg_add')
     xml_str = False
     result_xml = False
     result = False
     # 根据不同类型获取不同的xml
     if self.s_type == '20003':
         logging.info(u"开始查询内部账户交易明细")
         xml_str = cqt.package_query_internal_account_transaction_details_to_xml(
             self.account_id, self)
     elif self.s_type == '20007':
         logging.info(u"开始查询银行账户交易明细")
         xml_str = cqt.package_query_bank_account_transaction_details(
             self.external_id, self)
     elif self.s_type == '20017':
         logging.info(u"开始查询头寸账户交易明细")
         xml_str = cqt.package_query_position_account_transaction_details(
             self.account_id, self)
     logging.info(xml_str)
     # 发送报文到前置机
     if xml_str:
         result_xml = cqt.send_xml_to_cqtbankservice(xml_str, service_url)
     if result_xml:
         # 解析报文
         result_json = cqt.xml_to_json(result_xml)
         result_json = json.loads(result_json.strip())
         efmp = result_json['efmp']
         try:
             header = efmp['header']
         except KeyError:
             result = cqt.parsing_result_xml_result(efmp)
             msg = u"""查询发生错误,消息为:(%s)""" % result['resultMsg']
             logging.info(msg)
             raise UserError(msg)
         try:
             if header['resultCode'] != '0000':
                 msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                     header['resultCode'], header['resultMsg'])
                 logging.info(msg)
                 raise UserError(msg)
         except KeyError:
             logging.info(header)
         result = cqt.parsing_result_xml_result(efmp)
         if isinstance(result, dict):
             try:
                 if result['resultCode'] != '0000':
                     msg = u"""执行失败!反馈代码: (%s),反馈消息: (%s)""" % (
                         result['resultCode'], result['resultMsg'])
                     logging.debug(msg)
                     raise UserError(msg)
             except KeyError:
                 logging.debug(result)
         data = self.create_serach_account_transaction(result, self, header)
         transaction = self.env['bank.search.account.transaction'].sudo(
         ).create(data)
         return {
             'type': 'ir.actions.act_window',
             'view_type': 'form',
             'view_mode': 'form',
             'res_model': 'bank.search.account.transaction',
             'res_id': transaction.id,
         }
Ejemplo n.º 11
0
 def automate_update_payment_state(self):
     """自动更新银行付款单状态
     1.获取所有状态为银行确认的付款单
     2.将获取到的付款单编码进行xml封装并发送到银行
     3.解析银行返回的结果
     4.根据结果对相应的单据做单据操作
     """
     logging.info(u"开始定时拉取银行付款状态自动任务...")
     # 通过财企通付款的的单据
     search_sql = """SELECT array_agg(form_code) FROM interface_bank_payment WHERE state='01' AND payment_type='0' OR payment_type='1' OR payment_type='2' """
     logging.info(search_sql)
     cr = self.env.cr
     cr.execute(search_sql)
     rel_results = cr.fetchall()
     for rel in rel_results:
         if not rel[0]:
             break
         logging.info(rel[0])
         xml_str = self.serach_payment_result(rel[0])
         logging.info(xml_str)
         service_url = self.env['ir.values'].get_default(
             'interface.bank.settings', 'feg_add')
         result_xml = cqt.send_xml_to_cqtbankservice(xml_str, service_url)
         result_json = cqt.xml_to_json(result_xml)
         result_json = json.loads(result_json.strip())
         efmp = result_json['efmp']
         body = efmp['body']
         result_set = body['resultSet']
         result = result_set['result']
         if isinstance(result, dict):
             msg = u"""查询单据结果-结果代码:%s,结果说明: %s""" % (result['resultCode'],
                                                     result['resultMsg'])
             try:
                 # 判断指令状态
                 if result['cmdStatus'] == '12':
                     msg = u"""单据%s,付款状态为(正在处理中),返回消息为:%s""" % (
                         result['requestId'], result['resultMsg'])
                     self.alter_payment_state(form_code=result['requestId'],
                                              state=result['cmdStatus'],
                                              msg=msg)
                 elif result['cmdStatus'] == '14':
                     msg = u"""单据%s,付款状态为(处理成功),返回消息为:%s""" % (
                         result['requestId'], result['resultMsg'])
                     self.alter_payment_state(form_code=result['requestId'],
                                              state=result['cmdStatus'],
                                              msg=msg)
                 elif result['cmdStatus'] == '15':
                     msg = u"""单据%s,付款状态为(处理失败),返回消息为:%s""" % (
                         result['requestId'], result['resultMsg'])
                     self.alter_payment_state(form_code=result['requestId'],
                                              state=result['cmdStatus'],
                                              msg=msg)
                 else:
                     msg = u"""自动任务: 单据%s,付款状态为(指令不存在 或 已收到未处理),返回消息为:%s""" % (
                         result['requestId'], result['resultMsg'])
                     self.alter_payment_state(form_code=result['requestId'],
                                              state=result['cmdStatus'],
                                              msg=msg)
                 logging.info(msg)
                 self.create_interface_bank_payment_log(
                     result['requestId'], msg)
             except KeyError:
                 logging.info(msg)
                 self.create_interface_bank_payment_log(
                     result['requestId'], msg)
         if isinstance(result, list):
             for res in result:
                 msg = u"""查询单据结果-结果代码:%s,结果说明: %s""" % (res['resultCode'],
                                                         res['resultMsg'])
                 # 判断指令状态
                 try:
                     if res['cmdStatus'] == '12':
                         msg = u"""单据%s,付款状态为(正在处理中),返回消息为:%s""" % (
                             res['requestId'], res['resultMsg'])
                         self.alter_payment_state(
                             form_code=res['requestId'],
                             state=res['cmdStatus'],
                             msg=msg)
                     elif res['cmdStatus'] == '14':
                         msg = u"""单据%s,付款状态为(处理成功),返回消息为:%s""" % (
                             res['requestId'], res['resultMsg'])
                         self.alter_payment_state(
                             form_code=res['requestId'],
                             state=res['cmdStatus'],
                             msg=msg)
                     elif res['cmdStatus'] == '15':
                         msg = u"""单据%s,付款状态为(处理失败),返回消息为:%s""" % (
                             res['requestId'], res['resultMsg'])
                         self.alter_payment_state(
                             form_code=res['requestId'],
                             state=res['cmdStatus'],
                             msg=msg)
                     else:
                         msg = u"""自动任务: 单据%s,付款状态为(指令不存在 或 已收到未处理),返回消息为:%s""" % (
                             res['requestId'], res['resultMsg'])
                         self.alter_payment_state(
                             form_code=res['requestId'],
                             state=res['cmdStatus'],
                             msg=msg)
                     logging.info(msg)
                     self.create_interface_bank_payment_log(
                         res['requestId'], msg)
                 except KeyError:
                     logging.info(msg)
                     self.create_interface_bank_payment_log(
                         res['requestId'], msg)
     logging.info(u"结束定时拉取银行付款状态任务...")
     return True