POS调用后端服务器动作生成KHQR - xiaohao0576/odoo-doc GitHub Wiki

在后端创建服务器动作

绑定的model_id是 pos.payment_method

设置本服务器动作的外部ID是bakong.khqr,便于前端调用

bank = record.journal_id.bank_account_id
currency = env.company.currency_id
merchant_name = bank.partner_id.name
amount = env.context['amount']
    
khqr_params = {
    'qr_method':'emv_qr', 
    'amount': amount, 
    'currency': currency, 
    'debtor_partner': False, 
    'free_communication':'', 
    'structured_communication':'' 
} 

khqr_value = bank._get_qr_vals(**khqr_params)

qr_params = {
    'barcode_type':'QR',
    'format':'png',
    'width':200,
    'height':200,
    'humanreadable':1,
    'quiet':0,
    'value':khqr_value
}

khqr_code = env['ir.actions.report'].barcode(**qr_params)

khqr_url = 'data:image/png;base64,' + b64encode(khqr_code).decode()

formatted_amount = amount

if currency.name == 'USD':
    formatted_amount = f'$ {amount:,.2f}'

if currency.name == 'KHR':
    formatted_amount = f'៛ {amount:,.0f}'

action = {
    'merchant_name': merchant_name,
    'formatted_amount': formatted_amount,
    'khqr_value': khqr_value,
    'khqr_url' : khqr_url
}

前端POS调用后端的服务器动作

第一步,先找到服务器动作的ID

bakong_action = await posmodel.data.orm.rpc('/web/action/load',{'action_id':'bakong.khqr'})

第二步,根据找到的ID调用服务器动作,加上需要的参数

pm = window.posmodel.getOrder().payment_ids[0]
await posmodel.data.orm.rpc('/web/action/run',{'action_id':bakong_action.id, 'context':{'active_model':'pos.payment.method','active_id': pm.payment_method_id.id, 'amount':pm.amount}})