diff --git a/payroll/__manifest__.py b/payroll/__manifest__.py index ef1accf5..7b4a7e52 100644 --- a/payroll/__manifest__.py +++ b/payroll/__manifest__.py @@ -3,13 +3,17 @@ { "name": "Payroll", "version": "14.0.5.5.4", - "category": "Human Resources", + "category": "Payroll", "website": "https://github.com/OCA/payroll", "sequence": 38, "summary": "Manage your employee payroll records", "license": "LGPL-3", "author": "Odoo SA, Odoo Community Association (OCA)", - "depends": ["hr_contract", "hr_holidays", "mail"], + "depends": [ + "hr_contract", + "hr_holidays", + "mail", + ], "data": [ "security/hr_payroll_security.xml", "security/ir.model.access.csv", @@ -27,7 +31,6 @@ "views/hr_payslip_views.xml", "views/hr_payslip_run_views.xml", "views/hr_employee_views.xml", - "views/hr_rule_parameter_views.xml", "views/report_contributionregister.xml", "views/report_payslip.xml", "views/report_payslipdetails.xml", diff --git a/payroll/migrations/14.0.6.0.0/pre-migration.py b/payroll/migrations/14.0.6.0.0/pre-migration.py new file mode 100644 index 00000000..f4d71cf8 --- /dev/null +++ b/payroll/migrations/14.0.6.0.0/pre-migration.py @@ -0,0 +1,23 @@ +from openupgradelib import openupgrade + +from odoo.addons.payroll.migrations.move_records import move_records + + +def rename_tables(cr): + openupgrade.rename_tables( + cr, + [ + ("hr_rule_parameter", None), + ("hr_rule_parameter_value", None), + ], + ) + + +@openupgrade.migrate() +def migrate(env, version): + cr = env.cr + module = env["ir.module.module"].search([("name", "=", "base_time_parameter")]) + if module.exists() and module.state == "installed": + move_records(cr, legacy=False) + else: + rename_tables(cr) diff --git a/payroll/migrations/move_records.py b/payroll/migrations/move_records.py new file mode 100644 index 00000000..d3c079f1 --- /dev/null +++ b/payroll/migrations/move_records.py @@ -0,0 +1,66 @@ +from openupgradelib import openupgrade + +from odoo import SUPERUSER_ID, api + + +@openupgrade.logging() +def move_records(cr, legacy): + """ + hr.rule.parameter -> base.time.parameter + hr.rule.parameter.value -> base.time.parameter.version + (with new id for many2one base.time.parameter) + """ + env = api.Environment(cr, SUPERUSER_ID, {}) + payslip_model_id = env["ir.model"].search([("model", "=", "hr.payslip")]).id + + name = "openupgrade_legacy_14_0_" if legacy else "" + hr_rule_parameter = name + "hr_rule_parameter" + hr_rule_parameter_value = name + "hr_rule_parameter_value" + + sql_select_parameters = """ + SELECT id, name, code, description, company_id, country_id, 'text' + FROM {hr_rule_parameter} + """.format( + hr_rule_parameter=hr_rule_parameter + ) + openupgrade.logged_query(cr, sql_select_parameters) + parameters = [(p[0], p[1:] + (payslip_model_id,)) for p in cr.fetchall()] + + sql_insert_parameters = """ + INSERT INTO base_time_parameter ( + name, code, description, company_id, country_id, type, model_id + ) + VALUES {parameters} + RETURNING id; + """.format( + parameters=", ".join([str(p[1]).replace("None", "null") for p in parameters]), + ) + openupgrade.logged_query(cr, sql_insert_parameters) + new_parameters = cr.fetchall() + id_old_new = {} + for i in range(len(parameters)): + id_old_new[parameters[i][0]] = new_parameters[i][0] + + sql_select_versions = """ + SELECT pv.rule_parameter_id, p.company_id, pv.code, pv.date_from, pv.parameter_value + FROM {hr_rule_parameter_value} pv JOIN {hr_rule_parameter} p + ON pv.rule_parameter_id = p.id; + """.format( + hr_rule_parameter_value=hr_rule_parameter_value, + hr_rule_parameter=hr_rule_parameter, + ) + openupgrade.logged_query(cr, sql_select_versions) + versions = [ + (id_old_new[v[0]], v[1], v[2], v[3].strftime("%Y-%m-%d"), v[4]) + for v in cr.fetchall() + ] + + sql_insert_versions = """ + INSERT INTO base_time_parameter_version ( + parameter_id, company_id, code, date_from, value_text + ) + VALUES {versions} + """.format( + versions=", ".join([str(v) for v in versions]) + ) + openupgrade.logged_query(cr, sql_insert_versions) diff --git a/payroll/models/__init__.py b/payroll/models/__init__.py index 95e96428..3946bd78 100644 --- a/payroll/models/__init__.py +++ b/payroll/models/__init__.py @@ -14,4 +14,3 @@ from . import hr_payslip_worked_days from . import hr_payslip_run from . import res_config_settings -from . import hr_rule_parameter diff --git a/payroll/models/base_browsable.py b/payroll/models/base_browsable.py index a516e86d..58333ce8 100644 --- a/payroll/models/base_browsable.py +++ b/payroll/models/base_browsable.py @@ -1,7 +1,11 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging + from odoo import fields +_logger = logging.getLogger(__name__) + class BaseBrowsableObject(object): def __init__(self, vals_dict): @@ -95,8 +99,3 @@ def sum(self, code, from_date, to_date=None): ) res = self.env.cr.fetchone() return res and res[0] or 0.0 - - def rule_parameter(self, code): - return self.env["hr.rule.parameter"]._get_parameter_from_code( - code, self.dict.date_to - ) diff --git a/payroll/models/hr_payslip.py b/payroll/models/hr_payslip.py index 9e0a6380..910607f7 100644 --- a/payroll/models/hr_payslip.py +++ b/payroll/models/hr_payslip.py @@ -511,7 +511,7 @@ def _get_baselocaldict(self, contracts): line.code: line for line in self.input_line_ids if line.code } localdict = { - "payslip": Payslips(self.employee_id.id, self, self.env), + "payslips": Payslips(self.employee_id.id, self, self.env), "worked_days": WorkedDays(self.employee_id.id, worked_days_dict, self.env), "inputs": InputLine(self.employee_id.id, input_lines_dict, self.env), "payroll": BrowsableObject( @@ -618,7 +618,10 @@ def get_lines_dict(self): ) # set up localdict with current contract and employee values localdict = dict( - baselocaldict, employee=contract.employee_id, contract=contract + baselocaldict, + employee=contract.employee_id, + contract=contract, + payslip=payslip, ) for rule in payslip._get_salary_rules(): localdict = rule._reset_localdict_values(localdict) diff --git a/payroll/models/hr_rule_parameter.py b/payroll/models/hr_rule_parameter.py deleted file mode 100644 index 28768b20..00000000 --- a/payroll/models/hr_rule_parameter.py +++ /dev/null @@ -1,74 +0,0 @@ -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.", - ), - ] diff --git a/payroll/models/hr_salary_rule.py b/payroll/models/hr_salary_rule.py index e3cbe78c..34e5e4fb 100644 --- a/payroll/models/hr_salary_rule.py +++ b/payroll/models/hr_salary_rule.py @@ -67,7 +67,8 @@ class HrSalaryRule(models.Model): default=""" # Available variables: #------------------------------- - # payslip: object containing the payslips + # payslip: hr.payslip object + # payslips: object containing payslips (browsable) # employee: hr.employee object # contract: hr.contract object # rules: object containing the rules code (previously computed) @@ -121,7 +122,8 @@ class HrSalaryRule(models.Model): default=""" # Available variables: #------------------------------- - # payslip: object containing the payslips + # payslip: hr.payslip object + # payslips: object containing payslips (browsable) # employee: hr.employee object # contract: hr.contract object # rules: object containing the rules code (previously computed) diff --git a/payroll/readme/HISTORY.rst b/payroll/readme/HISTORY.rst new file mode 100644 index 00000000..80372f5a --- /dev/null +++ b/payroll/readme/HISTORY.rst @@ -0,0 +1,34 @@ +14.0.6.0.0 (2022-11-04) +~~~~~~~~~~~~~~~~~~~~~~~ + +* #87 payroll_rule_time_parameter: remove from payroll +* Removed hr.rule.parameter & hr.rule.parameter.value (see payroll_rule_time_parameter) + +14.0.5.3.0 (2022-09-13) +~~~~~~~~~~~~~~~~~~~~~~~ + +* #67 Merge payslip_cancel and payslip_change_state in base module +* Merged hr_payroll_cancel, adding a setting to enable this feature (by default disabled). +* Merged hr_payroll_change_state (there is no setting to disable this feature). + +14.0.5.0.0 (2022-08-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +* #60 Improve views, add child functionalities, allow compute of name + +14.0.4.0.0 (2022-08-17) +~~~~~~~~~~~~~~~~~~~~~~~ + +* #45 Remove contract_advantage_template model and new module +* Removed hr.contract.advantage.template (moved to payroll_contract_advantages) + +14.0.3.0.0 (2022-08-15) +~~~~~~~~~~~~~~~~~~~~~~~ + +* #47 payslip refactoring + +14.0.2.0.0 (2022-07-07) +~~~~~~~~~~~~~~~~~~~~~~~ + +* #31 major-rule-parameters-function +* Added hr.rule.parameter & hr.rule.parameter.value diff --git a/payroll/security/ir.model.access.csv b/payroll/security/ir.model.access.csv index 62916208..cf2b5127 100644 --- a/payroll/security/ir.model.access.csv +++ b/payroll/security/ir.model.access.csv @@ -13,8 +13,4 @@ access_hr_salary_rule_user,hr.salary.rule user,model_hr_salary_rule,payroll.grou access_hr_salary_rule_manager,hr.salary.rule manager,model_hr_salary_rule,payroll.group_payroll_manager,1,1,1,1 access_hr_payslip_batch_employees_transient,hr.payslip.employees.batch,model_hr_payslip_employees,hr.group_hr_user,1,1,1,0 access_hr_payslip_lines_contribution_register_transient,payslip.lines.contribution.register,model_payslip_lines_contribution_register,hr.group_hr_user,1,1,1,0 -access_hr_rule_parameter_manager,access_hr_rule_parameter_manager,model_hr_rule_parameter,payroll.group_payroll_manager,1,1,1,1 -access_hr_rule_parameter_user,access_hr_rule_parameter_user,model_hr_rule_parameter,hr.group_hr_user,1,0,0,0 -access_hr_rule_parameter_value_manager,access_hr_rule_parameter_value_manager,model_hr_rule_parameter_value,payroll.group_payroll_manager,1,1,1,1 -access_hr_rule_parameter_value_user,access_hr_rule_parameter_value_user,model_hr_rule_parameter_value,hr.group_hr_user,1,0,0,0 access_hr_payslip_change_state,access_hr_payslip_change_state,model_hr_payslip_change_state,base.group_user,1,1,1,0 diff --git a/payroll/tests/test_browsable_object.py b/payroll/tests/test_browsable_object.py index dfb3c92e..b5c5f174 100644 --- a/payroll/tests/test_browsable_object.py +++ b/payroll/tests/test_browsable_object.py @@ -1,5 +1,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. + from odoo.addons.payroll.models.hr_payslip import BaseBrowsableObject, BrowsableObject from .common import TestPayslipBase diff --git a/payroll/views/hr_rule_parameter_views.xml b/payroll/views/hr_rule_parameter_views.xml deleted file mode 100644 index f30f29b0..00000000 --- a/payroll/views/hr_rule_parameter_views.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - hr.rule.parameter.form - hr.rule.parameter - -
- - - - - - - - - - - - - - - -
-
-
- - hr.rule.parameter.tree - hr.rule.parameter - - - - - - - - - - - hr.rule.parameter.search - hr.rule.parameter - - - - - - - - Salary Rule Parameters - hr.rule.parameter - tree,form - - -
diff --git a/payroll/views/hr_salary_rule_views.xml b/payroll/views/hr_salary_rule_views.xml index d644a948..6ad04d88 100644 --- a/payroll/views/hr_salary_rule_views.xml +++ b/payroll/views/hr_salary_rule_views.xml @@ -229,19 +229,23 @@