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

Odoo薪资计算:如何调用同年往期工资单进行年度税额核算?

Odoo Payroll 15/16 薪资规则中汇总往期工资单特定项方案

核心思路

要计算员工当年已缴纳的特定税额,需在薪资规则的Python代码中主动查询该员工**已确认(状态为done)**的往期工资单,过滤出当年内、当前工资单之前的记录,再汇总目标工资项的金额。

Odoo 15 实现代码

在薪资规则的「Python代码」字段中填入以下逻辑:

# 获取当前员工与工资单所属年度
employee = payslip.employee_id
current_year = payslip.date_from.year
target_code = 'THE_TAX'  # 替换为你的目标工资项代码

# 查询符合条件的往期已确认工资单
previous_payslips = env['hr.payslip'].search([
    ('employee_id', '=', employee.id),
    ('state', '=', 'done'),  # 仅统计已确认的工资单
    ('date_from', '>=', f'{current_year}-01-01'),  # 当年起始
    ('date_to', '<=', payslip.date_from),  # 早于当前工资单的期间
    ('id', '!=', payslip.id)  # 排除当前工资单本身
])

# 汇总目标工资项金额
total_previous = 0.0
for slip in previous_payslips:
    tax_line = slip.line_ids.filtered(lambda l: l.code == target_code)
    total_previous += tax_line.total or 0.0

# 将汇总值赋值给result,供薪资规则使用
result = total_previous

Odoo 16 优化实现

Odoo 16可直接查询工资单行表(hr.payslip.line),减少遍历开销,代码更高效:

employee = payslip.employee_id
current_year = payslip.date_from.year
target_code = 'THE_TAX'

# 直接查询目标工资单行,汇总金额
total_previous = sum(env['hr.payslip.line'].search([
    ('slip_id.employee_id', '=', employee.id),
    ('slip_id.state', '=', 'done'),
    ('slip_id.date_from', '>=', f'{current_year}-01-01'),
    ('slip_id.date_to', '<', payslip.date_from),
    ('code', '=', target_code)
]).mapped('total'))

result = total_previous

关键注意事项

  • 必须过滤工资单状态为done:草稿、待确认的工资单不应计入年度汇总
  • 时间范围要精准:确保只统计当年内的记录,避免跨年数据干扰
  • 多公司场景需补充公司过滤:在搜索条件中加入('company_id', '=', payslip.company_id.id)
  • 测试验证:用已确认的往期工资单测试,确认汇总金额与手动计算一致

内容的提问来源于stack exchange,提问作者Vincent Cloutier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:25:19