先说结论
很多人打开 Odoo 项目的 Profitability 面板,只会盯一个问题:
- 这个项目赚没赚钱
但系统真正做的不是一条简单减法,而是:
把项目相关的成本、可计费工时、待开票金额、已开票收入等多种口径同时汇总,再形成一张经营视图。
所以项目盈利不是“财务最后算一下”,而是项目过程中的实时经营归集。
为什么它不是一个总字段
从 project_project.py 的源码看,官方用了整套方法:
_get_profitability_items()_get_profitability_values()action_profitability_items()analytic_account_balance
这说明 Odoo 不是在项目表上放一个“利润”数字就结束,而是在做:
- 成本项归集
- 收入项归集
- to bill / to invoice / invoiced / billed 等口径拆分
也就是说,利润面板本质上是一份动态经营分解表。
billable 为什么很关键
项目里的很多工作不是自动等于收入。
只有当项目、任务、工时和销售链条具备 billable 语义时,这些工作才可能进入:
- 待开票
- 已开票
- 收入预测
所以 billable 不是一个好看的标签,而是在回答:
这些项目工作能不能合法地转成销售收入。
如果不能 billable,它可能依然是成本,但不会自然变成收入。
to invoice 和 invoiced 为什么不能混
很多人会把这两个口径看成一回事。
但它们差别很大:
- to invoice:业务上已经可以开票,但还没真正开
- invoiced:已经形成正式销售 / 会计结果
这两个数字同时存在,正说明 Odoo 关心的是项目经营进度,而不是只看结果。
换句话说:
利润面板既看“已经落地多少”,也看“还在路上多少”。
为什么成本不只来自工时
虽然很多项目利润最直观来自 timesheet,但 Odoo 的 profitability 设计并不只盯工时。
源码和项目说明都在强调,它还可能汇入:
- 采购单
- 供应商账单
- 发票
- 工时
- ticket / 服务相关链路
所以项目盈利不是“工时乘单价”这么窄,而是一个更完整的项目经营口径。
为什么 analytic account 还是底座
前面项目与分析账户的文章已经讲过归集逻辑,这里更进一步:
- 如果没有分析账户归集
- 成本和收入就很难稳定地汇到同一个项目口径下
所以 profitability 面板看起来像项目功能,底层其实仍然站在 analytic account 这块地基上。
一句话记忆法
项目盈利不是“收入减成本”四个字那么简单,而是“哪些工作能计费、哪些还待开票、哪些已入账、哪些成本已归集”的一张经营总览。
DISCUSSION
评论区