Odoo 采购收货完成时,库存、收货数量和采购单状态是怎么回写的?
很多人以为采购单收货“点一下 Validate 就结束了”,其实背后是一整条从采购单、收货单、stock move 到 qty_received 回写的联动链。本文把这条链拆开讲清。
TOPIC PICKS
很多人以为采购单收货“点一下 Validate 就结束了”,其实背后是一整条从采购单、收货单、stock move 到 qty_received 回写的联动链。本文把这条链拆开讲清。
可以顺着继续读的相邻方向
采购审批取消不是简单改状态。_cancel_approval_request() 会区分 RFQ 仍是 draft 还是已离开草稿:前者自动减量或删单,后者保留采购事实并创建人工处理提醒。
action_create_purchase_orders 的重点不是“创建采购单”,而是按公司、供应商、币种和产品采购单位决定复用哪张 draft RFQ、增量哪一行,并把多个审批请求名串到 origin 里。
approvals_purchase 真正难的不是“审批通过后生成 RFQ”,而是 approval.product.line 先把数量换到采购单位,再按公司与数量选择 seller,最后用 has_no_seller 和 _check_products_vendor 把错误挡在前面。
很多顾问第一次追采购自动补货时都会困惑:同样是 Buy 规则,为什么有的需求会合并进同一张 RFQ,有的会拆开,甚至后续收货 move 还会再次合并?答案分散在 procurement 合并、PO domain 分组、PO line candidate 匹配和 stock move distinct fields 四层逻辑里。
采购现场最常见的疑问之一就是:明明已经部分收货、甚至做了退供应商,为什么 PO 的已收数量、待开票数量和 Billing Status 还在变化?答案不在界面,而在 qty_received、qty_invoiced、in_refund 与 purchase_method 的组合规则里。
很多人把 Odoo Blanket Order 想成“合同总量逐笔释放、每下一个 PO 就自动扣减余额”。源码并不是这么严。它会统计已下单数量,会把价格回写到 supplierinfo,也会在协议结束时清理这些数据,但不会把 Blanket Order 做成强制余额控制引擎。