101 lines
3.8 KiB
Plaintext
101 lines
3.8 KiB
Plaintext
# -*- coding: utf-8 -*-
|
|
"""财务结算单提交审批。"""
|
|
|
|
import datetime
|
|
import json
|
|
|
|
DBNAME = 'kboss'
|
|
|
|
|
|
async def _finance_phone(sor, orgid):
|
|
rows = await sor.sqlExe("""
|
|
SELECT u.mobile
|
|
FROM users u
|
|
LEFT JOIN userrole ur ON u.id=ur.userid
|
|
LEFT JOIN role r ON ur.roleid=r.id
|
|
WHERE r.role='财务'
|
|
AND u.orgid=${orgid}$
|
|
AND ur.del_flg='0'
|
|
AND r.del_flg='0'
|
|
AND u.del_flg='0'
|
|
LIMIT 1
|
|
""", {'orgid': orgid})
|
|
return rows[0]['mobile'] if rows else None
|
|
|
|
|
|
async def finance_settlement_submit(ns={}):
|
|
settlement_id = ns.get('settlement_id') or ns.get('id')
|
|
userid = ns.get('userid') or ns.get('user_id')
|
|
business_name = ns.get('business_name') or '财务结算'
|
|
if not settlement_id or not userid:
|
|
return {'status': False, 'msg': '缺少 settlement_id 或 userid'}
|
|
db = DBPools()
|
|
async with db.sqlorContext(DBNAME) as sor:
|
|
try:
|
|
rows = await sor.R('finance_settlement', {'id': settlement_id, 'del_flg': '0'})
|
|
if not rows:
|
|
return {'status': False, 'msg': '结算单不存在'}
|
|
settlement = rows[0]
|
|
if settlement.get('status') not in ('draft', 'rejected', 'failed'):
|
|
return {'status': False, 'msg': '当前状态不可提交审批'}
|
|
phone = await _finance_phone(sor, settlement.get('accounting_orgid'))
|
|
if not phone:
|
|
return {'status': False, 'msg': '未找到当前机构财务审批人'}
|
|
business_rows = await sor.R('apv_business', {'business_name': business_name, 'del_flg': '0'})
|
|
if not business_rows:
|
|
return {'status': False, 'msg': '审批业务不存在: %s' % business_name}
|
|
form_component = {
|
|
'title': '财务结算审批',
|
|
'detail': {
|
|
'data': '%s %s-%s %s 金额:%s' % (
|
|
settlement.get('counterparty_name'),
|
|
settlement.get('period_start'),
|
|
settlement.get('period_end'),
|
|
settlement.get('counterparty_type'),
|
|
settlement.get('settlement_amount'),
|
|
)
|
|
},
|
|
}
|
|
apv_json = json.dumps({
|
|
'table': 'finance_settlement',
|
|
'settlement_id': settlement_id,
|
|
'settlement_no': settlement.get('settlement_no'),
|
|
}, ensure_ascii=False)
|
|
resp = await issue_approve(
|
|
phone,
|
|
settlement.get('accounting_orgid'),
|
|
userid,
|
|
business_rows[0]['id'],
|
|
form_component,
|
|
settlement.get('counterparty_orgid'),
|
|
settlement_id,
|
|
apv_json,
|
|
)
|
|
if not resp.get('status'):
|
|
return {'status': False, 'msg': '发起审批失败, %s' % resp.get('msg')}
|
|
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
await sor.U('finance_settlement', {
|
|
'id': settlement_id,
|
|
'status': 'approving',
|
|
'approval_status': 'start',
|
|
'approval_id': resp.get('instanceId'),
|
|
'created_by': userid,
|
|
'failure_reason': None,
|
|
'update_at': now_time,
|
|
})
|
|
return {
|
|
'status': True,
|
|
'msg': 'ok',
|
|
'data': {
|
|
'settlement_id': settlement_id,
|
|
'approval_id': resp.get('instanceId'),
|
|
'status': 'approving',
|
|
},
|
|
}
|
|
except Exception as e:
|
|
return {'status': False, 'msg': '提交审批失败, %s' % str(e)}
|
|
|
|
|
|
ret = await finance_settlement_submit(params_kw)
|
|
return ret
|