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 @@
-
-
payslip:
contains current payslip data
+ >payslip: contains current payslip object data (hr.payslip)
employee:
contains current employee data
+ >payslips: contains payslips data (Payslips - Browsable Object)
contract:
contains current contract data
+ >employee: contains current employee object data (hr.employee)
rules:
contains the rule code (previusly computed)
+ >contract: contains current contract object data (hr.contract)
+ rules:
contains the rules code (previusly computed)
+* Nicolas Rodriguez
diff --git a/payroll_rule_time_parameter/readme/DESCRIPTION.rst b/payroll_rule_time_parameter/readme/DESCRIPTION.rst
new file mode 100644
index 00000000..81e62d8e
--- /dev/null
+++ b/payroll_rule_time_parameter/readme/DESCRIPTION.rst
@@ -0,0 +1,7 @@
+This module adds Rule Parameters to payroll configuration menu.
+
+Use in salary rule python code like this:
+
+.. code-block:: python
+
+ myvalue = payslip.time_parameter("mycode")
diff --git a/payroll_rule_time_parameter/security/ir.model.access.csv b/payroll_rule_time_parameter/security/ir.model.access.csv
new file mode 100644
index 00000000..9655d8be
--- /dev/null
+++ b/payroll_rule_time_parameter/security/ir.model.access.csv
@@ -0,0 +1,5 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_base_time_parameter_manager,access_base_time_parameter_manager,base_time_parameter.model_base_time_parameter,payroll.group_payroll_manager,1,1,1,1
+access_base_time_parameter_user,access_base_time_parameter_user,base_time_parameter.model_base_time_parameter,hr.group_hr_user,1,0,0,0
+access_base_time_parameter_version_manager,access_base_time_parameter_version_manager,base_time_parameter.model_base_time_parameter_version,payroll.group_payroll_manager,1,1,1,1
+access_base_time_parameter_version_user,access_base_time_parameter_version_user,base_time_parameter.model_base_time_parameter_version,hr.group_hr_user,1,0,0,0
diff --git a/payroll_rule_time_parameter/static/description/icon.png b/payroll_rule_time_parameter/static/description/icon.png
new file mode 100644
index 00000000..3a0328b5
Binary files /dev/null and b/payroll_rule_time_parameter/static/description/icon.png differ
diff --git a/payroll_rule_time_parameter/tests/__init__.py b/payroll_rule_time_parameter/tests/__init__.py
new file mode 100644
index 00000000..22bb6314
--- /dev/null
+++ b/payroll_rule_time_parameter/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_time_parameter
diff --git a/payroll_rule_time_parameter/tests/test_time_parameter.py b/payroll_rule_time_parameter/tests/test_time_parameter.py
new file mode 100644
index 00000000..01e8ada8
--- /dev/null
+++ b/payroll_rule_time_parameter/tests/test_time_parameter.py
@@ -0,0 +1,37 @@
+from datetime import date
+
+from odoo.tests.common import TransactionCase
+
+
+class TestTimeParameter(TransactionCase):
+ def setUp(self):
+ super().setUp()
+
+ def test_time_parameter(self):
+ self.env["base.time.parameter"].create(
+ {
+ "code": "TEST_CODE",
+ "type": "text",
+ "version_ids": [
+ (0, 0, {"date_from": date(2022, 1, 1), "value_text": "TEST_VALUE"})
+ ],
+ }
+ )
+ employee = self.env["hr.employee"].create(
+ {
+ "name": "Richard",
+ "gender": "male",
+ "birthday": "1984-05-01",
+ "country_id": self.ref("base.be"),
+ }
+ )
+ payslip = self.env["hr.payslip"].create(
+ {
+ "employee_id": employee.id,
+ }
+ )
+
+ time_value = payslip.get_time_parameter("TEST_CODE")
+ rule_value = payslip.get_time_parameter("TEST_CODE")
+ self.assertEqual(time_value, "TEST_VALUE", "value = TEST_VALUE")
+ self.assertEqual(rule_value, "TEST_VALUE", "value = TEST_VALUE")
diff --git a/payroll_rule_time_parameter/views/base_time_parameter_views.xml b/payroll_rule_time_parameter/views/base_time_parameter_views.xml
new file mode 100644
index 00000000..37fbad87
--- /dev/null
+++ b/payroll_rule_time_parameter/views/base_time_parameter_views.xml
@@ -0,0 +1,23 @@
+
+
+
+ Rule Parameters
+ base.time.parameter
+ tree,form
+
+
+
+
+
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 00000000..180fc497
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+# generated from manifests external_dependencies
+openupgradelib
diff --git a/setup/payroll_rule_time_parameter/odoo/addons/payroll_rule_time_parameter b/setup/payroll_rule_time_parameter/odoo/addons/payroll_rule_time_parameter
new file mode 120000
index 00000000..c24fe6ca
--- /dev/null
+++ b/setup/payroll_rule_time_parameter/odoo/addons/payroll_rule_time_parameter
@@ -0,0 +1 @@
+../../../../payroll_rule_time_parameter
\ No newline at end of file
diff --git a/setup/payroll_rule_time_parameter/setup.py b/setup/payroll_rule_time_parameter/setup.py
new file mode 100644
index 00000000..28c57bb6
--- /dev/null
+++ b/setup/payroll_rule_time_parameter/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)