[IMP] hr_payroll_hibou: retrieve payroll parameter values from upstream

This commit is contained in:
Jared Kipe
2021-12-18 15:58:24 -08:00
parent a949b2562e
commit 663c27f513
6 changed files with 185 additions and 1 deletions

View File

@@ -3,7 +3,7 @@
{ {
'name': 'Hibou Payroll', 'name': 'Hibou Payroll',
'author': 'Hibou Corp. <hello@hibou.io>', 'author': 'Hibou Corp. <hello@hibou.io>',
'version': '15.0.1.0.0', 'version': '15.0.2.0.0',
'category': 'Payroll Localization', 'category': 'Payroll Localization',
'depends': [ 'depends': [
'hr_payroll', 'hr_payroll',
@@ -18,6 +18,7 @@ Base module for fixing specific qwerks or assumptions in the way Payroll Odoo En
""", """,
'data': [ 'data': [
'security/ir.model.access.csv',
'views/res_config_settings_views.xml', 'views/res_config_settings_views.xml',
], ],
'demo': [ 'demo': [

View File

@@ -3,3 +3,4 @@ from . import hr_contract
from . import hr_payslip from . import hr_payslip
from . import hr_salary_rule from . import hr_salary_rule
from . import res_config_settings from . import res_config_settings
from . import update

View File

@@ -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', {})

View File

@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 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

View File

@@ -4,3 +4,4 @@ from . import common
from . import test_contract_wage_type from . import test_contract_wage_type
from . import test_special from . import test_special
from . import test_update

View File

@@ -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')