From 663c27f513e22d46df9eb24c58bdf23864cd33b5 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Sat, 18 Dec 2021 15:58:24 -0800 Subject: [PATCH] [IMP] hr_payroll_hibou: retrieve payroll parameter values from upstream --- hr_payroll_hibou/__manifest__.py | 3 +- hr_payroll_hibou/models/__init__.py | 1 + hr_payroll_hibou/models/update.py | 144 ++++++++++++++++++ hr_payroll_hibou/security/ir.model.access.csv | 2 + hr_payroll_hibou/tests/__init__.py | 1 + hr_payroll_hibou/tests/test_update.py | 35 +++++ 6 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 hr_payroll_hibou/models/update.py create mode 100644 hr_payroll_hibou/security/ir.model.access.csv create mode 100644 hr_payroll_hibou/tests/test_update.py diff --git a/hr_payroll_hibou/__manifest__.py b/hr_payroll_hibou/__manifest__.py index 88a5463b..0ada7294 100644 --- a/hr_payroll_hibou/__manifest__.py +++ b/hr_payroll_hibou/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Hibou Payroll', 'author': 'Hibou Corp. ', - 'version': '15.0.1.0.0', + 'version': '15.0.2.0.0', 'category': 'Payroll Localization', 'depends': [ 'hr_payroll', @@ -18,6 +18,7 @@ Base module for fixing specific qwerks or assumptions in the way Payroll Odoo En """, 'data': [ + 'security/ir.model.access.csv', 'views/res_config_settings_views.xml', ], 'demo': [ diff --git a/hr_payroll_hibou/models/__init__.py b/hr_payroll_hibou/models/__init__.py index ecd8aaf0..07ff4206 100644 --- a/hr_payroll_hibou/models/__init__.py +++ b/hr_payroll_hibou/models/__init__.py @@ -3,3 +3,4 @@ from . import hr_contract from . import hr_payslip from . import hr_salary_rule from . import res_config_settings +from . import update diff --git a/hr_payroll_hibou/models/update.py b/hr_payroll_hibou/models/update.py new file mode 100644 index 00000000..62c938d9 --- /dev/null +++ b/hr_payroll_hibou/models/update.py @@ -0,0 +1,144 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. +import requests +import json + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class HRPayrollPublisherUpdate(models.Model): + _name = 'hr.payroll.publisher.update' + _description = 'Payroll Update' + _order = 'id DESC' + + def _default_request_modules(self): + request_modules = self.env.context.get('default_request_modules') + if not request_modules: + request_modules = '\n'.join(self.env['publisher_warranty.contract'].hibou_payroll_modules_installed()) + return request_modules + + state = fields.Selection([ + ('draft', 'Draft'), + ('done', 'Done'), + ('error', 'Error'), + ], default='draft') + request_modules = fields.Char(default=_default_request_modules, + states={'done': [('readonly', True)], + 'error': [('readonly', True)]}) + result = fields.Text(readonly=True) + parameter_codes_retrieved = fields.Text(readonly=True) + parameter_codes_missing = fields.Text(readonly=True) + error = fields.Text() + + def button_send(self): + self.ensure_one() + if not self.request_modules: + raise UserError('One or more modules needed.') + if self.result: + raise UserError('Already retrieved') + self._send() + if self.result and not self.state == 'error': + self._process_result() + + def _send(self): + try: + self.env['publisher_warranty.contract'].hibou_payroll_update(self) + except UserError as e: + self.set_error_state(e.name) + + def set_error_state(self, message=''): + self.write({ + 'state': 'error', + 'error': message, + }) + + def button_process_result(self): + self.ensure_one() + if not self.result: + raise UserError('No Result to process.') + self._process_result() + + def _process_result(self): + try: + result_dict = json.loads(self.result) + parameter_values = result_dict.get('payroll_parameter_values') + if not parameter_values or not isinstance(parameter_values, list): + self.set_error_state('Result is missing expected parameter values.') + parameter_map = {} + parameter_model = self.env['hr.rule.parameter'].sudo() + for code, date_from, pv in parameter_values: + date_from = fields.Date.from_string(date_from) + if code not in parameter_map: + parameter_map[code] = parameter_model.search([('code', '=', code)], limit=1) + parameter = parameter_map[code] + if not parameter: + continue + # watch out for versions of Odoo where this is not datetime.date + parameter_version = parameter.parameter_version_ids.filtered(lambda p: p.date_from == date_from) + if not parameter_version: + parameter.write({ + 'parameter_version_ids': [(0, 0, { + 'date_from': date_from, + 'parameter_value': pv, + })] + }) + elif parameter_version.parameter_value != pv: + parameter_version.write({ + 'parameter_value': pv, + }) + # We have applied all of the updates. Set statistics. + self.write({ + 'state': 'done', + 'error': '', + 'parameter_codes_retrieved': '\n'.join(c for c, p in parameter_map.items() if p), + 'parameter_codes_missing': '\n'.join(c for c, p in parameter_map.items() if not p), + }) + except Exception as e: + self.set_error_state(str(e)) + + +class PublisherWarrantyContract(models.AbstractModel): + _inherit = 'publisher_warranty.contract' + + CONFIG_HIBOU_URL_PAYROLL = 'https://api.hibou.io/hibouapi/v1/professional/payroll' + + @api.model + def hibou_payroll_modules_to_update(self): + # Filled downstream + return [] + + @api.model + def hibou_payroll_update(self, update_request): + # Check status locally + status = self.hibou_professional_status() + if status['expired']: + raise UserError('Hibou Professional Subscription Expired, you cannot retrieve updates.') + if status['expiration_reason'] == 'trial': + raise UserError('Hibou Professional Subscription Trial, not eligible for updates.') + if not status['professional_code']: + raise UserError('Hibou Professional Subscription Missing, please setup your subscription.') + + if self.env.context.get('test_payroll_update_result'): + update_request.result = self.env.context.get('dummy_payroll_update_result') + return + + # TODO REMOVE + raise Exception('TESTS') + try: + update_request.result = self._hibou_payroll_update(update_request.request_modules) + except Exception as e: + update_request.set_error_state(str(e)) + + + def _hibou_payroll_update(self, payroll_modules): + data = self._get_hibou_message() + data['payroll_modules'] = payroll_modules + data = { + 'jsonrpc': '2.0', + 'method': 'call', + 'params': data, + } + r = requests.post(self.CONFIG_HIBOU_URL_PAYROLL, json=data, timeout=30) + r.raise_for_status() + wrapper = r.json() + return wrapper.get('result', {}) diff --git a/hr_payroll_hibou/security/ir.model.access.csv b/hr_payroll_hibou/security/ir.model.access.csv new file mode 100644 index 00000000..ce057ee7 --- /dev/null +++ b/hr_payroll_hibou/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +hr_payroll_hibou.access_hr_payroll_publisher_update,access_hr_payroll_publisher_update,hr_payroll_hibou.model_hr_payroll_publisher_update,base.group_user,1,1,1,1 diff --git a/hr_payroll_hibou/tests/__init__.py b/hr_payroll_hibou/tests/__init__.py index 45ce36c6..a411b012 100644 --- a/hr_payroll_hibou/tests/__init__.py +++ b/hr_payroll_hibou/tests/__init__.py @@ -4,3 +4,4 @@ from . import common from . import test_contract_wage_type from . import test_special +from . import test_update diff --git a/hr_payroll_hibou/tests/test_update.py b/hr_payroll_hibou/tests/test_update.py new file mode 100644 index 00000000..0a2d22e4 --- /dev/null +++ b/hr_payroll_hibou/tests/test_update.py @@ -0,0 +1,35 @@ +import datetime + +from odoo import fields +from odoo.exceptions import ValidationError +from odoo.tests import common + + +class TestUpdate(common.TransactionCase): + + def setUp(self): + super().setUp() + # setup the database to run in general + today = datetime.date.today() + tomorrow = today + datetime.timedelta(days=1) + self.param_model = self.env['ir.config_parameter'].sudo() + self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(tomorrow)) + self.param_model.set_param('database.hibou_professional_code', 'TESTCODE') + + def test_01_database_state(self): + today = datetime.date.today() + tomorrow = today + datetime.timedelta(days=1) + yesterday = today - datetime.timedelta(days=1) + self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(yesterday)) + + update = self.env['hr.payroll.publisher.update']\ + .with_context(test_payroll_update_result='{"payroll_parameter_values":[]}').create({ + 'request_modules': 'test', + }) + self.assertEqual(update.state, 'draft') + update.button_send() + self.assertEqual(update.state, 'error') + + self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(tomorrow)) + update.button_send() + self.assertEqual(update.state, 'done')