mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[IMP] hr_payroll_hibou: retrieve payroll parameter values from upstream
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
{
|
||||
'name': 'Hibou Payroll',
|
||||
'author': 'Hibou Corp. <hello@hibou.io>',
|
||||
'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': [
|
||||
|
||||
@@ -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
|
||||
|
||||
144
hr_payroll_hibou/models/update.py
Normal file
144
hr_payroll_hibou/models/update.py
Normal 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', {})
|
||||
2
hr_payroll_hibou/security/ir.model.access.csv
Normal file
2
hr_payroll_hibou/security/ir.model.access.csv
Normal 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
|
||||
|
@@ -4,3 +4,4 @@ from . import common
|
||||
|
||||
from . import test_contract_wage_type
|
||||
from . import test_special
|
||||
from . import test_update
|
||||
|
||||
35
hr_payroll_hibou/tests/test_update.py
Normal file
35
hr_payroll_hibou/tests/test_update.py
Normal 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')
|
||||
Reference in New Issue
Block a user