oca-technical/odoo-bringout-oca-hack-payroll/payroll/models/hr_rule_parameter.py
2025-08-29 15:43:03 +02:00

74 lines
2.3 KiB
Python

import ast
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class HrSalaryRuleParameterValue(models.Model):
_name = "hr.rule.parameter.value"
_description = "Salary Rule Parameter Value"
_order = "date_from desc"
rule_parameter_id = fields.Many2one(
"hr.rule.parameter", required=True, ondelete="cascade"
)
code = fields.Char(related="rule_parameter_id.code", store=True, readonly=True)
date_from = fields.Date(string="Date From", required=True)
parameter_value = fields.Text(help="Python Code")
country_id = fields.Many2one(related="rule_parameter_id.country_id")
company_id = fields.Many2one(related="rule_parameter_id.company_id")
_sql_constraints = [
(
"_unique",
"unique (rule_parameter_id, date_from)",
"Two rules parameters with the same code cannot start the same day",
),
]
class HrSalaryRuleParameter(models.Model):
_name = "hr.rule.parameter"
_description = "Salary Rule Parameter"
name = fields.Char(required=True)
code = fields.Char(required=True)
description = fields.Text("Description")
country_id = fields.Many2one(
"res.country",
string="Country",
default=lambda self: self.env.company.country_id,
)
parameter_version_ids = fields.One2many(
"hr.rule.parameter.value", "rule_parameter_id", string="Versions"
)
company_id = fields.Many2one(
"res.company", "Company", required=True, default=lambda self: self.env.company
)
@api.model
def _get_parameter_from_code(self, code, date=None):
if not date:
date = fields.Date.today()
rule_parameter = self.env["hr.rule.parameter.value"].search(
[
("code", "=", code),
("date_from", "<=", date),
("company_id", "=", self.env.company.id),
],
limit=1,
)
if rule_parameter:
return ast.literal_eval(rule_parameter.parameter_value)
else:
raise UserError(
_("No rule parameter with code '%s' was found for %s ") % (code, date)
)
_sql_constraints = [
(
"_unique",
"unique (code, company_id)",
"Two rule parameters cannot have the same code.",
),
]