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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:54:18