手工收货

Odoo 服务和耗材采购为什么“收货数量”能手工改:qty_received_method 的真实边界

从 qty_received_method、qty_received_manual 和 _inverse_qty_received 出发,解释为什么服务类采购允许手工维护收货数量。

采购
进阶 开发者 1 分钟阅读
0 评论 1 点赞 0 收藏 12 阅读

先说结论

不是所有采购行的“收货数量”都应该由库存自动驱动。

对服务、耗材这类采购,Odoo 允许你手工维护 qty_received,因为它们未必真的走仓库收货流程。

这时真正控制边界的,是:

  • qty_received_method
  • qty_received_manual
  • qty_received 的 inverse 逻辑

为什么服务类采购需要手工收货

服务没有实际入库动作,但业务上仍然需要知道:

  • 这项服务是不是已经交付
  • 交付了多少
  • 后续能不能开票

如果强行把服务采购绑死到库存收货,就会失去业务灵活性。

所以 Odoo 允许某些行走“手工收货”模式。


qty_received_method 怎么控制模式

源码里很清楚:

  • 如果产品类型是 consuservice
  • qty_received_method 会被设成 manual
  • 否则就走自动逻辑

这意味着“收货数量”并不是统一规则,而是按产品类型分流。


qty_received_manual_inverse_qty_received

qty_received_method == 'manual' 时:

  • qty_received 的值会落到 qty_received_manual
  • 反过来改 qty_received 时,也会通过 inverse 写回手工字段

如果不是手工模式,系统会把手工值清零,避免和自动计算冲突。

这就是“看起来能改,实际有边界”的核心原因。


为什么这个设计很重要

它把两类业务分开了:

  • 有真实库存动作的商品,应该让系统自动算收货
  • 没有真实库存动作的服务,应该允许业务人员手工确认交付

这样既保留了会计/采购状态的完整性,又不会把服务单据硬塞进库存逻辑。


调试时怎么判断是否用对了模式

如果 qty_received 看起来不对,先查这几个点:

  1. 产品类型是不是 service 或 consu
  2. 当前行的 qty_received_method 是不是 manual
  3. qty_received_manual 有没有被写入
  4. inverse 是否把值反推到了正确字段
  5. 业务是不是其实在处理服务而不是库存商品

很多看似“数量不对”的问题,其实是模式选错了。


实战建议

  • 服务类采购不要强行套库存收货思路
  • 先看 qty_received_method,再看 qty_received
  • 手工模式不是例外,是有意设计的分支
  • 如果业务同时有服务和实物,记得分别理解两条路径
  • 调试时优先确认“这是自动算,还是手工填”

一句好记的话

对服务采购来说,qty_received 不是库存事实,而是业务确认;qty_received_method 决定它是自动算还是手工填。

把这条边界分清,采购和开票状态就会顺很多。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。