如何在Odoo中实现sale quotation确认自动转delivery/picking、sale order确认自动创建验证Invoice
Odoo两类销售业务自动化功能实现方案
一、销售报价单确认时自动完成交货/拣配单转移操作
支持两种实现路径,可根据业务复杂度选择:
1. 无代码配置方式(基于Odoo自带自动化行动)
- 开启开发者调试模式,进入「设置」-「技术」-「自动化」-「自动行动」菜单
- 新建自动行动,基础配置如下:
- 模型:选择销售订单(sale.order)
- 触发条件:记录更新时
- 触发域:
[('state', 'in', ('sale', 'done'))] - 触发时机:仅在更新时满足条件
- 动作类型选择「执行Python代码」,填入以下逻辑:
for picking in record.picking_ids.filtered(lambda p: p.state not in ('done', 'cancel')): # 确认拣配单 picking.action_confirm() # 自动分配库存 if picking.state == 'assigned': picking.action_assign() # 完成转移 for move in picking.move_ids: move.quantity_done = move.product_uom_qty picking.button_validate()
- 保存自动行动并激活即可生效
2. 自定义代码实现(适合复杂业务场景)
继承sale.order模型,重写action_confirm方法,在原有确认逻辑执行后插入拣配自动处理逻辑:
from odoo import models, api class SaleOrderInherit(models.Model): _inherit = 'sale.order' def action_confirm(self): res = super(SaleOrderInherit, self).action_confirm() for order in self: for picking in order.picking_ids.filtered(lambda p: p.state not in ('done', 'cancel')): picking.action_confirm() picking.action_assign() for move in picking.move_ids: move.quantity_done = move.product_uom_qty picking.button_validate() return res
二、销售订单确认后自动创建并验证发票
同样支持无代码配置和自定义代码两种实现方式:
1. 无代码配置方式(基于Odoo自带自动化行动)
- 进入开发者模式下的「自动行动」菜单,新建自动行动:
- 模型:选择销售订单(sale.order)
- 触发条件:记录更新时
- 触发域:
[('state', '=', 'sale'), ('invoice_status', '=', 'to invoice')]
- 动作类型选择「执行Python代码」,填入以下逻辑:
# 自动创建发票 invoice = record._create_invoices() # 自动验证发票 invoice.action_post()
- 保存并激活即可,该配置仅对需开票的正常订单生效,不会触发退款等异常场景的自动操作
2. 自定义代码实现
可以在上述sale.order的action_confirm方法中追加发票处理逻辑,代码示例:
def action_confirm(self): res = super(SaleOrderInherit, self).action_confirm() # 原有拣配自动处理逻辑省略 for order in self.filtered(lambda o: o.invoice_status == 'to invoice'): invoice = order._create_invoices() invoice.action_post() return res
注意事项
- 自动处理逻辑建议增加异常捕获,避免库存不足、财务配置缺失等异常场景导致订单确认失败
- 多步拣配(如入库→质检→发货)的场景需要适配对应节点的状态判断逻辑
- 如果业务规则要求交货后才开票,需要调整触发逻辑,改为拣配单完成后再触发发票自动创建流程
内容的提问来源于stack exchange,提问作者Parthdlangaliya
相关产品推荐
相关产品推荐

