如何继承Odoo15 Payment screen并在_finalizeValidation()中加发票验证
继承Odoo15 POS支付界面的_finalizeValidation()方法实现发票验证
要实现你需要的逻辑,需通过前端组件继承的方式扩展POS的PaymentScreen,具体步骤如下:
1. 创建自定义模块结构
先搭建基础的模块目录:
your_module_name/ ├── __manifest__.py ├── static/ │ └── src/ │ └── js/ │ └── payment_screen_extension.js └── views/ └── assets.xml
2. 编写模块配置文件(manifest.py)
声明模块依赖与基础信息:
{ 'name': 'POS支付发票验证', 'version': '1.0', 'category': 'Point of Sale', 'summary': '支付界面添加发票必填验证', 'depends': ['point_of_sale'], 'data': [ 'views/assets.xml', ], 'installable': True, 'auto_install': False, }
3. 编写JS扩展代码(payment_screen_extension.js)
继承PaymentScreen组件,重写_finalizeValidation方法添加验证逻辑:
odoo.define('your_module_name.payment_screen_extension', function(require) { "use strict"; const PaymentScreen = require('point_of_sale.PaymentScreen'); const Registries = require('point_of_sale.Registries'); const { ErrorDialog } = require('point_of_sale.ErrorDialog'); const PaymentScreenExtension = PaymentScreen => class extends PaymentScreen { async _finalizeValidation() { // 获取当前订单关联的发票 const selectedInvoice = this.currentOrder.invoice_id; // 未选择发票时抛出错误 if (!selectedInvoice) { await this.showPopup(ErrorDialog, { title: '验证失败', body: '请先选择发票再完成支付!', }); return; // 终止后续流程 } // 已选择发票,执行原方法逻辑 await super._finalizeValidation(...arguments); } }; Registries.Component.extend(PaymentScreen, PaymentScreenExtension); return PaymentScreenExtension; });
4. 加载JS资产(assets.xml)
将自定义JS注入POS的前端资源中:
<?xml version="1.0" encoding="utf-8"?> <odoo> <template id="assets_pos_extension" inherit_id="point_of_sale.assets"> <xpath expr="." position="inside"> <script type="text/javascript" src="/your_module_name/static/src/js/payment_screen_extension.js"></script> </xpath> </template> </odoo>
5. 模块部署与测试
- 将模块放入Odoo的addons目录
- 开启开发者模式,更新模块列表
- 安装该模块,重启Odoo并刷新POS界面
- 测试场景:
- 未选择发票点击支付验证:弹出错误提示,无法跳转
- 选择发票后点击验证:正常执行原逻辑,跳转至收据界面
内容的提问来源于stack exchange,提问作者Sidharth Panda
相关产品推荐
相关产品推荐

