如何在Odoo 15中阻止无库存时自动生成采购订单并实现自定义流程
解决方案建议
1. 给产品添加自定义标记字段
首先在产品模型中新增布尔字段,用于标记需要客户确认后再触发采购的产品:
from odoo import models, fields class ProductTemplate(models.Model): _inherit = 'product.template' require_customer_approval = fields.Boolean(string="需客户确认后采购", default=False)
同时给销售订单新增状态字段,跟踪客户确认进度:
class SaleOrder(models.Model): _inherit = 'sale.order' approval_status = fields.Selection([ ('pending', '待客户确认'), ('approved', '客户已确认'), ('rejected', '客户已拒绝') ], string="审批状态", default='pending')
2. 拦截自动生成采购单的逻辑
重写库存移动的补货触发方法,当产品标记了require_customer_approval时,跳过自动采购逻辑,仅保留库存预留(拣货单)并发送邮件给客户:
from odoo import models class StockMove(models.Model): _inherit = 'stock.move' def _action_launch_stock_rule(self, previous_product_uom_qty=False): # 拆分需要审批和常规的库存移动 approve_moves = self.filtered( lambda m: m.product_id.product_tmpl_id.require_customer_approval ) normal_moves = self - approve_moves # 正常处理无需审批的移动(自动生成采购单) super(StockMove, normal_moves)._action_launch_stock_rule(previous_product_uom_qty) # 处理需审批的移动:仅发送确认邮件,不触发采购 for move in approve_moves: sale_order = move.sale_line_id.order_id if sale_order and sale_order.approval_status == 'pending': # 调用自定义邮件模板发送给客户 email_template = self.env.ref('your_module.email_template_customer_approval') email_template.send_mail(sale_order.id, force_send=True)
3. 客户确认后生成采购单
在销售订单上添加确认按钮,客户通过邮件链接或门户点击后,手动触发补货规则生成采购单:
class SaleOrder(models.Model): _inherit = 'sale.order' def action_confirm_purchase(self): self.write({'approval_status': 'approved'}) # 遍历需审批的订单行,重新触发补货逻辑 for line in self.order_line.filtered( lambda l: l.product_id.product_tmpl_id.require_customer_approval ): # 获取对应未完成的库存移动 moves = self.env['stock.move'].search([ ('sale_line_id', '=', line.id), ('state', 'not in', ['done', 'cancel']) ]) for move in moves: # 重新触发补货规则生成采购单 move._action_launch_stock_rule()
4. 配置客户确认邮件模板
创建邮件模板(通过Odoo后台的邮件模板功能),内容包含销售订单详情和确认按钮链接,链接指向销售订单的action_confirm_purchase方法(或门户端的确认页面)。
关键注意点
- 销售订单确认时,Odoo默认会自动生成拣货单(库存预留),这部分逻辑无需修改,只需拦截补货生成采购单的环节。
- 需给门户用户配置销售订单的访问和确认权限,确保客户能通过邮件链接完成操作。
- 测试时需验证:标记了属性的产品,确认订单后仅生成拣货单、发送邮件,无采购单;客户确认后自动生成对应采购单。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

