You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:45:10