先说结论
在分包制造里,很多人最容易犯的错,是把“加工费”理解成一个随便填的附加金额。
但 mrp_subcontracting_account 的源码告诉你,Odoo 不是这么算的。它会在 _cal_price() 里结合:
- 已完成的收货数量
- 已入账的供应商账单价值
- 尚未入账但报价里仍覆盖的价值
然后再得出 extra_cost。
所以这不是拍脑袋分摊,而是在回答:
截至当前收货,这批分包成品到底已经承诺了多少外协加工成本。
为什么只看采购价或只看账单都不够
分包场景天然有时间差:
- PO 先下了
- 收货先发生
- 账单可能晚几天甚至更晚才来
如果你只看 PO 价格,会把未入账承诺和真实结算混在一起;如果你只看账单,又会在账单未到时把分包成品价值低估。
Odoo 这里选择了折中但很实用的方式:
- 先找已 done 的收货 move
- 如果该收货是 subcontract receipt
- 就分别读取账单价值和报价剩余价值
- 两者合起来除以收货数量,形成
extra_cost
源码里最值得注意的一点
逻辑里不是简单用 price_unit,而是:
- 先
_get_value_from_account_move(quantity) - 再
_get_value_from_quotation(quantity - bill_qty)
这意味着 Odoo 在说:
- 已经有正式账单覆盖的那部分,优先信账单
- 账单还没覆盖到的剩余数量,再回退用报价 / PO 价值补齐
这比“全部信报价”或“全部等账单”都更贴近真实经营口径。
为什么这对成本分析很重要
分包制造最怕两种错觉:
- 账单没来,看起来成本很低
- 账单来了又全额补进,期间毛利忽高忽低
extra_cost 的这种混合口径,目的是让成品价值在收货时就更接近真实,而不是一直等财务把所有外协账都做完。
最常见的误区
1. 以为 extra_cost 就是供应商单价
不完全是。它可能综合了账单与报价剩余部分。
2. 以为账单一来之前系统算不出附加成本
可以算,只是其中一部分来自报价回退。
3. 以为收货数量和成本口径天然同步
不是,正因为不同步,才需要这套补齐逻辑。
4. 以为这只是会计报表细节
它会直接影响分包成品成本理解和后续毛利判断。
排错顺序
如果分包成品成本看起来不对,按这个顺序查:
- 最近的 done 收货 move 是否真的是 subcontract receipt
- 当前数量有多少已被供应商账单覆盖
- 未覆盖部分是否还能从报价 / PO 取值
extra_cost是否按收货数量正确分摊- 最后再查产品类别、估值方法与自定义成本逻辑
一句话记忆法
Odoo 分包制造的 extra_cost,不是主观加价,而是“账单已确认部分 + 报价尚未结算部分”的组合口径。
DISCUSSION
评论区