Odoo16中基于考勤、带薪/无薪假的薪资计算问题求助
Odoo 16 薪资计算:正确统计出勤、带薪假并排除无薪假
问题分析
- 代码段1遍历所有
worked_days_line_ids,会把无薪假天数也计入统计,导致薪资计算结果偏高 - 代码段2仅取
WORK100(正常出勤)类型的天数,漏掉了带薪病假、年假等带薪假期,导致薪资计算结果偏低
解决方案
核心逻辑是只累加带薪类型的工作日天数,自动排除无薪假。你需要先确认系统中配置的各类工作日类型代码(比如正常出勤、病假、带薪年假对应的code),再针对性筛选累加。
基础版(所有带薪假按全额计算)
# 替换为你系统中实际的带薪工作日类型代码 paid_work_codes = ['WORK100', 'SICK', 'ANNUAL_LEAVE', 'MARRIAGE_LEAVE'] total_paid_days = 0 for line in payslip.worked_days_line_ids: if line.code in paid_work_codes: total_paid_days += line.number_of_days # 计算最终薪资 result = total_paid_days * (contract.wage / 30)
进阶版(部分带薪假按比例计算)
如果存在病假只发部分薪资的场景,可以单独处理对应类型:
total_paid_days = 0 for line in payslip.worked_days_line_ids: if line.code == 'WORK100': total_paid_days += line.number_of_days elif line.code == 'SICK': total_paid_days += line.number_of_days * 0.8 # 病假按80%折算有效天数 elif line.code in ['ANNUAL_LEAVE', 'MARRIAGE_LEAVE']: total_paid_days += line.number_of_days # 无薪假类型直接跳过,不参与累加 result = total_paid_days * (contract.wage / 30)
注意事项
- 必须根据你Odoo系统中实际配置的工作日类型code调整代码中的列表,确保所有带薪类型都被包含
- 若需要按当月实际天数计算日薪,可将
contract.wage/30替换为contract.wage / payslip.number_of_days_in_month
内容的提问来源于stack exchange,提问作者Krakalien
相关产品推荐
相关产品推荐

