企业 采购 / 预算边界

Odoo 企业版采购预算为什么有时“不报超预算”:budget.analytic 读取权限、共享公司预算与剩余未收数量闸门

从 _compute_budget_line_ids 与 _compute_above_budget 出发,解释为什么没有预算读取权限、预算行公司为空、或采购数量已收完时,超预算提示会表现得像“忽隐忽现”。

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

“为什么同一张采购单,有的人看到超预算提示,有的人看不到?”这类问题通常不是前端缓存,而是采购、预算和权限三条链一起在起作用。企业版采购预算本来就不是无条件提醒。

第一道边界在预算读取权限。采购行要先通过 _compute_budget_line_ids() 找到可用的预算行,但这件事建立在当前用户能读到相关 budget.analytic / budget line 的前提上。你如果把采购权限和预算可见性拆得很开,采购页面上的行为就会出现“同单不同视角”。

第二道边界在多公司预算共享。预算行不一定绑定具体公司;有些预算会以 company_id 为空的方式做共享。这样一来,采购行匹配时并不是单纯看 po.company_id = budget.company_id,而是在公司专属预算和共享预算之间同时判断。多公司环境里,这正是很多“预算明明存在却没命中”的根源。

第三道边界在剩余未收数量。_compute_budget_line_ids() 和超预算计算都不想为已经彻底履约的采购数量继续占预算。所以当 product_qty - qty_received <= 0 时,采购行就可能不再继续维持原来的预算占用判断。这让业务侧感觉提示在“消失”,但从预算语义看它只是跟着履约状态收口。

因此,采购预算提醒本质上是采购执行事实、预算可见范围和公司边界共同决定的结果。它不是采购模块单方面发出的 UI 警告,而是预算模块授权后的业务判断。

排查顺序建议也要按链路来:先确认用户是否看得到预算对象;再确认预算是公司专属还是共享;最后看采购行还有没有未收数量。把这三件事拆开核对,往往比盯着“为什么这次没弹红字”更有效。

DISCUSSION

评论区

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