先说结论
Odoo 的 Time Off 不是“员工提一个请假申请,经理批一下”这么简单。
它真正要解决的是:
员工有没有资格请、额度从哪里来、额度是一次给还是按时间累计、审批该走到哪一层。
所以请假单只是表层,底层真正复杂的是 allocation 和 accrual。
Leave 和 Allocation 为什么必须分开理解
在 hr_holidays 里,至少有两类核心对象:
hr.leave:请假请求本身hr.leave.allocation:额度分配
这两者不是一回事。
你可以把它理解成:
- Leave = 我要用假
- Allocation = 我是否先被发过假 / 累积出假
如果没有额度层,很多企业的人力规则就没法表达。
为什么 Allocation 不只是“手工发几天”
源码里 allocation_type 明确区分:
regularaccrual
也就是说,额度来源至少有两种脑回路:
Regular Allocation
一次性给定额度。
Accrual Allocation
按规则、按时间不断累积。
这就让 Odoo 可以同时表达:
- 入职先给年假
- 每月再累计半天
- 到年底做结转或失效
Accrual Plan 真正难在哪里
从 hr.leave.accrual.plan 和 level 逻辑能看出,累计不是简单“每月 +1”。
它会牵涉:
- 从什么时候开始累计
- 以天/月/年为单位累计
- 累计是在周期开始给还是结束给
- 是否设上限
- 年末没用完是失效、结转还是限制结转
- 有效期多久
这说明 Odoo 处理的是制度规则,不是小算术。
为什么余额显示经常让人误会
因为你看到的剩余额度,往往不是单纯一列数字。
它可能同时受这些影响:
- 已批准额度
- 已请假但未完全消耗的部分
- 虚拟剩余
- 未来累计计划
- 单位是天还是小时
所以很多实施里“余额不对”并不是算错,而是说话的人看的口径不一样。
审批边界为什么也在这个模型里
holiday_status_id 相关配置会影响:
- 是否需要 allocation
- allocation validation type
- leave approval 层级
这说明 Odoo 把“额度规则”和“审批规则”放在同一整套 Time Off 语义里,而不是完全割裂。
一句话记忆法
请假单解决我要不要休,Allocation 解决我有没有资格休,Accrual 解决额度是不是会随着时间自己长出来。
DISCUSSION
评论区