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
相关产品推荐
相关产品推荐

