企业 人力资源

Odoo 企业版请假为什么不会直接“少发几天工资”:休假、work entry 与薪资输入链路讲透

基于 hr_payroll_holidays、hr_work_entry_holidays_enterprise 与 hr_payroll 源码,讲清休假如何切分 work entry,并最终影响 payslip 的 worked days 与输入。

人力资源 企业
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 5 阅读

在 Odoo 企业版里,请假不会粗暴地变成“少算几天工资”。hr_payroll_holidays 真正在做的是把 Time Off、Work Entry 与 Payslip 串成一条可回溯的改写链,所以系统可以区分“这次休假已经算进工资”“需要延后到下月处理”还是“必须手工拆分工时”。

## 1. 请假对象先拿到 payslip_state,而不是直接修改工资单金额

enterprise/hr_payroll_holidays/models/hr_leave.pyhr.leave 增加了 payslip_state,并在审批、回退、归档等节点调用 _recompute_payslips()。这意味着请假记录本身就携带“待下次工资计算”“已在当前工资单计算”“延后处理”的状态,而不是等 Payroll 事后猜测它是否生效。

2. 真正改变工资输入的,是 leave 对 work entry 的切分与延后

同一文件里的 action_report_on_next_month() 会去查本月和次月的 hr.work.entry,如果发现可用的 WORK100 正常出勤条目,就通过 action_split() 或直接改 work_entry_type_id 把工时改写成假别对应的 leave type。这里跨过去的不是一个“请假天数”,而是具体到每条工时记录的时间片、时长与工时类型。

3. 工资单不会盲算,而是根据 leave 与 work entry 关系刷新 worked days

enterprise/hr_payroll_holidays/models/hr_payslip.py,草稿工资单会重算 worked days,等待中的工资单会 action_refresh_from_work_entries()。这说明 Payroll 并不直接读取 leave 天数字段,而是要求 work entry 先被修正,再由工资单从 work entry 刷新。这样薪资规则看到的是统一工时语义,而不是各模块自己定义的请假表示法。

4. 企业里最常见的误解,是以为 Time Off 改一条记录就能自动追溯所有工资

源码明确防止这种想当然:跨月超过限制会报错;已进已验证工资单的休假会进入 blocked;没有足够可改写的次月出勤条目也会阻断自动处理。Odoo 企业版宁可让你显式 defer,也不愿意偷偷篡改已经结算的工资边界。

## 结论

因此,请假影响工资的关键,不是“休假减少金额”,而是 leave 先改写或推迟 work entry,再由 payslip 从同一套工时事实里刷新结果。跨模块一致性,才是企业版 Payroll 不乱账的根。

主要源码锚点:

- `enterprise/hr_payroll_holidays/models/hr_leave.py`
  • enterprise/hr_payroll_holidays/models/hr_payslip.py
  • enterprise/hr_work_entry_holidays_enterprise
  • enterprise/hr_payroll

DISCUSSION

评论区

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