金额为零时如何绕过Register Payment弹窗自动生成发票并标记已付
绕过100%折扣场景下的Register Payment弹窗方案
针对100%折扣后应付总额为0时仍弹出付款弹窗的问题,有三种可行方案实现自动生成发票并标记已付:
1. 前端JS逻辑修改
找到销售订单确认对应的前端JS文件(如sale_order.js),在触发弹窗的代码段中添加总额判断,当amount_total为0时直接执行发票生成与已付标记逻辑,跳过弹窗:
// 改写确认销售订单的触发逻辑 const confirmSale = async function () { if (this.amount_total === 0) { // 自动创建发票 const invoiceId = await this.action_invoice_create(); // 过账发票并标记已付 await this.env['account.move'].browse(invoiceId).action_post(); // 更新订单状态 this.write({state: 'sale'}); } else { // 原有弹窗逻辑保留 this.do_action('account.action_register_payment'); } };
2. 后端Python逻辑扩展
通过继承sale.order模型,在订单确认方法中添加总额判断逻辑,自动完成发票创建与已付标记:
from odoo import api, models class SaleOrder(models.Model): _inherit = 'sale.order' def action_confirm(self): res = super().action_confirm() for order in self: if order.amount_total == 0: # 生成对应发票 invoices = order._create_invoices() if invoices: # 过账发票 invoices.action_post() # 标记发票为已付状态 invoices.write({'payment_state': 'paid'}) return res
3. 无代码自动化配置
利用Odoo内置的自动化动作功能,无需编写代码即可实现:
- 进入设置 > 自动化 > 自动化动作,新建动作
- 模型选择「销售订单」,触发条件设为:
状态 = 已确认且应付总额 = 0 - 动作类型选择「执行Python代码」,填入类似后端逻辑的代码片段,实现自动创建发票并标记已付
注意事项
- 修改核心代码时务必使用继承方式,避免直接修改原文件导致升级兼容问题
- 测试时需覆盖多种100%折扣场景(如含税费、多产品组合等),确保逻辑稳定
- 无代码方案适合非技术人员,配置灵活但功能复杂度有限
内容的提问来源于stack exchange,提问作者art
相关产品推荐
相关产品推荐

