You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:00:05