在项目服务计费里,“只给客户看已批准工时”听起来像一个很普通的设置。但 sale_timesheet_enterprise 的实现告诉你,这根本不是前台筛选,而是一条横跨工时、销售行、客户门户和发票取数的主链路。
主要参考:
enterprise/sale_timesheet_enterprise/models/account_analytic_line.pyenterprise/sale_timesheet_enterprise/models/sale_order_line.pyenterprise/sale_timesheet_enterprise/models/project_task.py
一、approved only 会改 delivered quantity 的计算域
sale_order_line.py 里 _timesheet_compute_delivered_quantity_domain() 会在配置为 approved 时,把 validated = True 作为 delivered hours 的取数条件。也就是说,销售行上看到的已交付工时,已经不是“录了多少”而是“批准了多少”。
二、门户可见性也受同一口径控制
account_analytic_line.py 与 project_task.py 都会检查配置参数。如果公司设置为只向客户展示已验证工时,那么 portal 读取任务工时、展示列表甚至进度口径都会一起收紧。企业版没有把“内部批准口径”和“外部展示口径”分裂开,这是非常重要的设计。
三、发票取数同样沿用这个边界
account_move_line.py 一侧也会收缩发票所关联的 timesheet domain。这样做的目的非常直接:既然公司规定只有已批准工时可计费,那么 delivered、portal、invoice 三处必须是同一答案,否则用户一定会在客户投诉时崩溃。
四、最容易误解的点
- approved only 不是报表过滤器。 它会改核心业务域。
- 客户看不到不代表不计费。 在企业版里,两者通常被同一配置联动。
- 工时验证是项目经理内部动作。 一旦连接销售与门户,它就不再只是内部动作。
五、实战建议
- 上线前先决定组织到底按“全部工时计费”还是“批准后计费”,不要模棱两可。
- 用真实项目测试同一工时在内部、SO、portal、invoice 四处是否一致。
- 若客户抱怨门户工时与内部不一致,先查配置参数
sale.invoiced_timesheet与工时验证状态。
六、结论
企业版已验证工时计费的重点,不是多了一个开关,而是系统用这个开关统一了交付、计费和客户可见性三套口径。
DISCUSSION
评论区