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

Odoo 10中继承hr.contract模型并创建Python类更新wage字段

在Odoo 10中继承hr.contract并通过grillesalaire更新wage字段

没问题,我来帮你搞定这个需求!下面是具体的实现步骤和代码,完全适配Odoo 10的环境:

1. 创建自定义模块并继承hr.contract模型

首先你需要一个自定义模块(比如命名为custom_contract_wage),在模块的models目录下新建hr_contract.py文件,代码如下:

from odoo import models, fields, api

class HrContract(models.Model):
    _inherit = 'hr.contract'  # 继承原生的合同模型

    # 先给合同模型添加关联grillesalaire的字段(如果还没有的话)
    grille_salaire_id = fields.Many2one('grillesalaire', string='Grille de Salaire')

    # 手动触发更新wage的方法
    @api.multi
    def update_wage_from_grille(self):
        for contract in self:
            # 替换`salaire_base`为你grillesalaire模型里实际存薪资的字段名
            if contract.grille_salaire_id:
                contract.wage = contract.grille_salaire_id.salaire_base
        return True

    # 可选:选择薪资格时自动实时更新wage
    @api.onchange('grille_salaire_id')
    def _onchange_grille_salaire(self):
        if self.grille_salaire_id:
            self.wage = self.grille_salaire_id.salaire_base

    # 可选:创建合同时自动同步wage
    @api.model
    def create(self, vals):
        contract = super(HrContract, self).create(vals)
        if contract.grille_salaire_id:
            contract.wage = contract.grille_salaire_id.salaire_base
        return contract

    # 可选:修改合同(比如切换薪资格)时自动更新wage
    @api.multi
    def write(self, vals):
        res = super(HrContract, self).write(vals)
        # 如果修改了薪资格字段,或者当前合同已有关联的薪资格,就更新wage
        if 'grille_salaire_id' in vals or self.grille_salaire_id:
            self.update_wage_from_grille()
        return res

2. 关键逻辑说明

  • 模型继承:通过_inherit = 'hr.contract'实现对原生合同模型的扩展,不需要重写整个模型,只添加需要的字段和逻辑即可。
  • 关联字段:grille_salaire_id用来关联你的grillesalaire模型,这样才能获取对应的薪资数据。
  • 自动更新:
    • _onchange_grille_salaire方法会在用户选择不同薪资格时,立刻更新wage字段,提升操作体验。
    • 重写create和write方法,确保合同创建或修改时,自动同步薪资数据到wage字段。
  • 手动更新:update_wage_from_grille方法可以用来批量更新合同的wage,后续可以添加按钮让用户手动触发。

3. 添加手动更新按钮(可选)

如果想让用户能手动触发更新,可以在合同表单视图里加个按钮。在模块的views目录下新建hr_contract_views.xml:

<odoo>
    <record id="view_contract_form_inherit" model="ir.ui.view">
        <field name="name">hr.contract.form.inherit</field>
        <field name="model">hr.contract</field>
        <field name="inherit_id" ref="hr_contract.hr_contract_form"/>
        <field name="arch" type="xml">
            <!-- 在表单的header区域添加按钮 -->
            <xpath expr="//header" position="inside">
                <button name="update_wage_from_grille" string="Mettre à jour le salaire depuis la grille" type="object" class="oe_highlight"/>
            </xpath>
        </field>
    </record>
</odoo>

4. 注意事项

  • 记得把代码里的salaire_base换成你grillesalaire模型中实际存储薪资的字段名。
  • 如果你的grillesalaire和合同的关联不是通过Many2one,而是通过职位、级别等条件匹配,那可以调整搜索逻辑,比如:
    # 示例:根据合同的职位匹配对应的薪资格
    grille = self.env['grillesalaire'].search([('job_id', '=', self.job_id.id)], limit=1)
    if grille:
        self.wage = grille.salaire_base
    
  • 确保你的模块在__manifest__.py中依赖hr_contract:
    'depends': ['hr_contract'],
    

这样就能完美实现你想要的功能啦!

内容的提问来源于stack exchange,提问作者EL Cholo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:28