Odoo 14社区版:薪资单中获取工作日总天数至其他字段
解决方案:将工作日树形视图
number_of_days总计值保存到自定义字段 1. 添加自定义存储字段
首先在薪资单模型(hr.payslip)中新增浮点字段,用于存储工作日天数的总计值。创建自定义模块(若已有则直接修改),在models/hr_payslip.py中写入以下代码:
from odoo import models, fields, api class HrPayslip(models.Model): _inherit = 'hr.payslip' total_worked_days = fields.Float(string='总计工作日数', compute='_compute_total_worked_days', store=True) @api.depends('worked_days_line_ids.number_of_days') def _compute_total_worked_days(self): for payslip in self: payslip.total_worked_days = sum(line.number_of_days for line in payslip.worked_days_line_ids)
store=True确保计算结果会保存到数据库,方便其他场景直接调用@api.depends监听工作日行的天数变化,自动触发重新计算
2. 表单视图添加显示(可选)
如果需要在薪资单表单中直观展示这个总计字段,在views/hr_payslip_views.xml中添加视图继承代码:
<record id="view_hr_payslip_form_inherit" model="ir.ui.view"> <field name="name">hr.payslip.form.inherit</field> <field name="model">hr.payslip</field> <field name="inherit_id" ref="hr_payroll_community.hr_payslip_view_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='worked_days_line_ids']" position="before"> <div class="oe_right"> <label for="total_worked_days" string="总计工作日数"/> <field name="total_worked_days" readonly="1"/> </div> </xpath> </field> </record>
3. 模块配置与测试
- 在自定义模块的
__manifest__.py中添加依赖:'depends': ['hr_payroll_community'] - 安装模块后,打开任意薪资单,新增/修改工作日行,检查
total_worked_days是否自动计算并更新 - 该字段可直接用于其他业务场景:比如薪资规则中调用
payslip.total_worked_days、报表统计、其他视图引用等
批量更新历史数据(可选)
如果需要为已存在的薪资单补全总计值,可在Odoo Shell中执行以下命令:
payslips = self.env['hr.payslip'].search([]) payslips._compute_total_worked_days()
内容的提问来源于stack exchange,提问作者Rami Nasrallah
相关产品推荐
相关产品推荐

