多公司内部交易里,自动生成采购单看起来像是一个很简单的自动化动作。真正难的部分其实都藏在后面:到底该在哪家公司建、用谁的权限建、行上价格数量怎么换算、两边单据又怎么互相认得。
这篇文章主要参考了以下企业版源码入口:
enterprise/sale_purchase_inter_company_rules/models/sale_order.py
一、这篇功能真正解决什么问题
sale_purchase_inter_company_rules 解决的是同一集团内部销售与采购的文档同步。如果没有这层桥接,一家公司确认销售单后,另一家公司还得手工再打一张采购单,效率低不说,价格、日期和引用也容易错位。
二、核心链路怎么走
1. 销售确认后先判断是否命中公司间规则
_action_confirm() 会先走标准确认,再根据客户对应公司、intercompany_generate_purchase_orders 开关以及 auto_generated 标记判断,要不要继续生成采购单。这里的 auto_generated 很重要,它避免 SO/PO 互相触发时死循环。
2. 真正建单时会切到目标公司的 intercompany user
inter_company_create_purchase_order() 不是用当前销售用户直接建对方公司的 PO,而是切换到 company.intercompany_user_id,并同时切换 company/context。这样做的目的很明确:跨公司同步可以自动化,但权限边界仍然必须清楚。
3. 单据值和行值都会按采购语义重新准备
_prepare_purchase_order_data() 会重建采购单头,包括供应商、币种、付款条件和来源引用;_prepare_purchase_order_line_data() 则把销售行数量和价格换算到采购单位。生成后,系统还会把 PO 名称回填到销售单 client_order_ref,并在配置要求时直接确认采购单。
三、新手最容易踩的坑
- 以为找到对应公司就能自动建单。没有
intercompany_user_id或对方用户没有创建采购权限,链路会直接报错。 - 以为公司间同步只是复制行。实际上单头、付款条件、税位、日期计划都要重新按目标公司语义准备。
- 以为自动建 PO 后两边自然可追。若忽视
client_order_ref、origin message 等回写字段,后续排障会很痛苦。
四、实战落地时最该盯的点
- 上线前先核对每家公司的 intercompany user 与采购权限,不要等首单确认时再暴雷。
- 多公司如果有不同币种或不同 UoM 习惯,要重点验证行级换算是否符合预期。
- 若企业希望自动确认 PO,务必和采购团队对齐风险承受度,因为这相当于把人工审核前移成配置动作。
五、结论
公司间 SO 自动长出 PO,真正难的不是“自动”本身,而是让公司识别、权限切换、采购语义重建和单据追溯同时成立。sale_purchase_inter_company_rules 把这条链做通了,集团内部交易才会真正顺手。
DISCUSSION
评论区