[IMP] hr_payroll_hibou: finish tests, add UI for payroll updates

This commit is contained in:
Jared Kipe
2021-12-20 13:32:31 -08:00
parent bf735c9c97
commit 36bbb807d8
5 changed files with 156 additions and 8 deletions

View File

@@ -19,7 +19,9 @@ Base module for fixing specific qwerks or assumptions in the way Payroll Odoo En
""", """,
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'data/cron_data.xml',
'views/res_config_settings_views.xml', 'views/res_config_settings_views.xml',
'views/update_views.xml',
], ],
'demo': [ 'demo': [
], ],

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Cron jobs -->
<record model="ir.cron" id="payroll_publisher_update_cron">
<field name="name">Payroll Update: download latest parameter values/rates.</field>
<field name="model_id" ref="hr_payroll_hibou.model_hr_payroll_publisher_update"/>
<field name="state">code</field>
<field name="code">model.cron_payroll_update()</field>
<field name="interval_number">1</field>
<field name="interval_type">weeks</field>
<field name="numbercall">-1</field>
<field name="nextcall" eval="(datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')"/>
<field name="doall" eval="False"/>
</record>
</data>
</odoo>

View File

@@ -1,4 +1,5 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. # Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
import requests import requests
import json import json
@@ -14,11 +15,12 @@ class HRPayrollPublisherUpdate(models.Model):
def _default_request_modules(self): def _default_request_modules(self):
request_modules = self.env.context.get('default_request_modules') request_modules = self.env.context.get('default_request_modules')
if not request_modules: if not request_modules:
request_modules = '\n'.join(self.env['publisher_warranty.contract'].hibou_payroll_modules_installed()) request_modules = '\n'.join(self.env['publisher_warranty.contract'].hibou_payroll_modules_to_update())
return request_modules return request_modules
state = fields.Selection([ state = fields.Selection([
('draft', 'Draft'), ('draft', 'Draft'),
('result', 'Result'),
('done', 'Done'), ('done', 'Done'),
('error', 'Error'), ('error', 'Error'),
], default='draft') ], default='draft')
@@ -28,7 +30,15 @@ class HRPayrollPublisherUpdate(models.Model):
result = fields.Text(readonly=True) result = fields.Text(readonly=True)
parameter_codes_retrieved = fields.Text(readonly=True) parameter_codes_retrieved = fields.Text(readonly=True)
parameter_codes_missing = fields.Text(readonly=True) parameter_codes_missing = fields.Text(readonly=True)
error = fields.Text() error = fields.Text(readonly=True)
@api.model
def cron_payroll_update(self):
update = self.create({})
if update.request_modules:
update.button_send()
else:
update.unlink()
def button_send(self): def button_send(self):
self.ensure_one() self.ensure_one()
@@ -52,6 +62,13 @@ class HRPayrollPublisherUpdate(models.Model):
'error': message, 'error': message,
}) })
def set_result(self, result):
self.write({
'state': 'result',
'result': result,
'error': False,
})
def button_process_result(self): def button_process_result(self):
self.ensure_one() self.ensure_one()
if not self.result: if not self.result:
@@ -90,7 +107,7 @@ class HRPayrollPublisherUpdate(models.Model):
self.write({ self.write({
'state': 'done', 'state': 'done',
'error': '', 'error': '',
'parameter_codes_retrieved': '\n'.join(c for c, p in parameter_map.items() if p), 'parameter_codes_retrieved': '\n'.join(c for c, p in parameter_map.items()),
'parameter_codes_missing': '\n'.join(c for c, p in parameter_map.items() if not p), 'parameter_codes_missing': '\n'.join(c for c, p in parameter_map.items() if not p),
}) })
except Exception as e: except Exception as e:
@@ -119,13 +136,15 @@ class PublisherWarrantyContract(models.AbstractModel):
raise UserError('Hibou Professional Subscription Missing, please setup your subscription.') raise UserError('Hibou Professional Subscription Missing, please setup your subscription.')
if self.env.context.get('test_payroll_update_result'): if self.env.context.get('test_payroll_update_result'):
update_request.result = self.env.context.get('dummy_payroll_update_result') update_request.set_result(self.env.context.get('test_payroll_update_result'))
return return
# TODO REMOVE
raise Exception('TESTS')
try: try:
update_request.result = self._hibou_payroll_update(update_request.request_modules) res = self._hibou_payroll_update(update_request.request_modules)
if res.get('error'):
update_request.set_error_state(str(res.get('error')))
else:
update_request.set_result(json.dumps(res))
except Exception as e: except Exception as e:
update_request.set_error_state(str(e)) update_request.set_error_state(str(e))

View File

@@ -23,7 +23,8 @@ class TestUpdate(common.TransactionCase):
self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(yesterday)) self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(yesterday))
update = self.env['hr.payroll.publisher.update']\ update = self.env['hr.payroll.publisher.update']\
.with_context(test_payroll_update_result='{"payroll_parameter_values":[]}').create({ .with_context(test_payroll_update_result='{"payroll_parameter_values":[]}')\
.create({
'request_modules': 'test', 'request_modules': 'test',
}) })
self.assertEqual(update.state, 'draft') self.assertEqual(update.state, 'draft')
@@ -33,3 +34,46 @@ class TestUpdate(common.TransactionCase):
self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(tomorrow)) self.param_model.set_param('database.hibou_professional_expiration_date', fields.Date.to_string(tomorrow))
update.button_send() update.button_send()
self.assertEqual(update.state, 'done') self.assertEqual(update.state, 'done')
self.assertEqual(update.parameter_codes_retrieved, '')
self.assertEqual(update.parameter_codes_missing, '')
# Reset to a degree.
update = update.with_context(test_payroll_update_result='{"payroll_parameter_values":[["missing_code", "2021-01-01", "5.0"]]}')
update.write({
'state': 'draft',
'result': '',
})
update.button_send()
self.assertEqual(update.state, 'done')
self.assertEqual(update.parameter_codes_retrieved, 'missing_code')
self.assertEqual(update.parameter_codes_missing, 'missing_code')
# Actually add to a rule.
test_parameter = self.env['hr.rule.parameter'].create({
'code': 'test_parameter_1',
'name': 'Test Parameter 1',
})
update = update.with_context(test_payroll_update_result='{"payroll_parameter_values":[["test_parameter_1", "2021-01-01", "5.0"]]}')
update.write({
'state': 'draft',
'result': '',
})
update.button_send()
self.assertEqual(update.state, 'done')
self.assertEqual(update.parameter_codes_retrieved, 'test_parameter_1')
self.assertEqual(update.parameter_codes_missing, '')
self.assertTrue(test_parameter.parameter_version_ids)
self.assertEqual(test_parameter.parameter_version_ids.parameter_value, '5.0')
self.assertEqual(str(test_parameter.parameter_version_ids.date_from), '2021-01-01')
test_parameter.parameter_version_ids.write({
'parameter_value': '',
})
self.assertEqual(test_parameter.parameter_version_ids.parameter_value, '')
update.write({
'state': 'draft',
'result': '',
})
update.button_send()
# doesn't make a new one, updates existing...
self.assertEqual(test_parameter.parameter_version_ids.parameter_value, '5.0')

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_payroll_publisher_update_tree" model="ir.ui.view">
<field name="name">hr.payroll.publisher.update.tree</field>
<field name="model">hr.payroll.publisher.update</field>
<field name="arch" type="xml">
<tree string="Payroll Updates">
<field name="create_date"/>
<field name="write_date"/>
<field name="request_modules"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="hr_payroll_publisher_update_form" model="ir.ui.view">
<field name="name">hr.payroll.publisher.update.form</field>
<field name="model">hr.payroll.publisher.update</field>
<field name="arch" type="xml">
<form string="Payroll Udate">
<header>
<button name="button_send" type="object" string="Send" attrs="{'invisible': [('state', 'not in', ('draft', 'error'))]}" />
<button name="button_process_result" type="object" string="Process Results" attrs="{'invisible': [('state', 'not in', ('result', 'error'))]}" />
<field name="state" widget="statusbar" statusbar_visible="draft,result,done" />
</header>
<sheet>
<group>
<group name="general" string="General">
<field name="create_date" />
<field name="write_date" />
<field name="request_modules" widget="text" />
<field name="error" attrs="{'invisible': [('error', '=', False)]}" />
</group>
<group name="parameter_codes" string="Parameter Codes">
<field name="parameter_codes_retrieved" />
<field name="parameter_codes_missing" />
<p colspan="2">Note missing codes probably means code upgrades are required.</p>
</group>
<group name="result" string="Result" groups="base.group_no_one" colspan="4">
<field name="result" nolabel="1" colspan="4" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_payroll_updates" model="ir.actions.act_window">
<field name="name">Payroll Updates</field>
<field name="res_model">hr.payroll.publisher.update</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p>
No Updates
</p>
</field>
</record>
<menuitem id="menu_hr_payroll_configuration_updates" name="Payroll Updates"
action="action_payroll_updates"
sequence="20" parent="hr_work_entry_contract_enterprise.menu_hr_payroll_configuration"/>
</odoo>