133 lines
5.4 KiB
Python
133 lines
5.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
import json
|
|
from unittest.mock import patch
|
|
|
|
from odoo.tests.common import HttpCase, TransactionCase, tagged
|
|
from odoo.tools import mute_logger
|
|
from odoo.addons.hr_contract_salary.models.hr_version import HrVersion
|
|
|
|
|
|
@tagged('benefits')
|
|
class TestBenefits(TransactionCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.structure_type = cls.env['hr.payroll.structure.type'].create({'name': 'struct'})
|
|
cls.employee = cls.env['hr.employee'].create({
|
|
'name': "John",
|
|
'wage': 6500,
|
|
'structure_type_id': cls.structure_type.id,
|
|
})
|
|
cls.version = cls.employee.version_id
|
|
|
|
def test_yearly_cost_new_benefit(self):
|
|
fieldname = 'x_test_field'
|
|
model = self.env.ref('hr.model_hr_version')
|
|
field = self.env['ir.model.fields'].create({
|
|
'name': fieldname,
|
|
'model': model.model,
|
|
'ttype': 'float',
|
|
'model_id': model.id,
|
|
})
|
|
self.version.write({fieldname: 50})
|
|
self.assertEqual(self.version.final_yearly_costs, 12 * self.version.wage)
|
|
benefit_costs = HrVersion._get_benefits_costs
|
|
with patch.object(HrVersion, '_get_benefits_costs', lambda self: benefit_costs(self) + self[fieldname]):
|
|
atype = self.env['hr.contract.salary.benefit.type'].create({})
|
|
self.env['hr.contract.salary.benefit'].create({
|
|
'benefit_type_id': atype.id,
|
|
'res_field_id': field.id,
|
|
'cost_res_field_id': field.id,
|
|
'structure_type_id': self.structure_type.id,
|
|
})
|
|
self.assertEqual(self.version.final_yearly_costs, 12 * (self.version.wage + 50), "The new benefit should have updated the yearly cost")
|
|
|
|
def test_holidays_yearly_cost(self):
|
|
# yearly cost should not change even if the number of extra time off changes
|
|
with patch.object(HrVersion, '_get_benefits_costs', lambda self: 250):
|
|
self.version._compute_final_yearly_costs()
|
|
base_yearly_cost = self.version.final_yearly_costs
|
|
self.version.holidays = 15
|
|
# this is triggered when configuring/signing a version
|
|
# and recomputes the final_yearly_costs field
|
|
self.version.wage_with_holidays = 6076.57
|
|
self.assertAlmostEqual(base_yearly_cost, self.version.final_yearly_costs, 2,
|
|
'Yearly costs should stay the same')
|
|
|
|
def test_final_yearly_costs(self):
|
|
# Yearly costs should not change when set manually on the interface
|
|
# 100000 € / 12 = 8333.33333333
|
|
# Wage is rounded, then 8333.33 * 12 = 99999.96
|
|
self.version.final_yearly_costs = 100000
|
|
self.version._onchange_final_yearly_costs()
|
|
self.assertAlmostEqual(self.version.final_yearly_costs, 100000, 2) # And not 99999.96
|
|
|
|
self.version.holidays = 10
|
|
self.version.final_yearly_costs = 100000
|
|
self.version._onchange_final_yearly_costs()
|
|
self.version._onchange_wage_with_holidays()
|
|
self.assertAlmostEqual(self.version.final_yearly_costs, 100000, 2) # And not 99999.96
|
|
|
|
|
|
@tagged('-at_install', 'post_install')
|
|
class TestInformationUpdate(HttpCase):
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_prevent_update_employee_information(self):
|
|
# Create an offer for an employee
|
|
job = self.env['hr.job'].create({'name': 'Test job'})
|
|
employee = self.env['hr.employee'].create({
|
|
'email': 'test_employee@test.example.com',
|
|
'name': 'Test Employee',
|
|
'work_email': 'test_employee@test.example.com',
|
|
'job_id': job.id,
|
|
'wage': 1000,
|
|
})
|
|
internal_user = self.env['res.users'].create({'name': 'Cool User', 'login': 'cool_user'})
|
|
employee.user_id = internal_user
|
|
|
|
contract_employee = employee.version_id
|
|
contract_template = self.env['hr.version'].create({
|
|
'job_id': job.id,
|
|
'name': "Test Template job",
|
|
'wage': 1000,
|
|
})
|
|
salary_offer = self.env['hr.contract.salary.offer'].create([
|
|
{
|
|
'contract_template_id': contract_template.id,
|
|
'employee_version_id': contract_employee.id,
|
|
'employee_id': contract_employee.employee_id.id,
|
|
}
|
|
])
|
|
|
|
data = {
|
|
"params": {
|
|
"version_id": None,
|
|
"offer_id": salary_offer.id,
|
|
"benefits": {
|
|
'version': {
|
|
'wage': 1000,
|
|
'final_yearly_costs': 1000,
|
|
},
|
|
'version_personal': {},
|
|
'employee': {
|
|
'name': 'Edited Test Employee',
|
|
'private_email': 'edited_test_employee@test.example.com',
|
|
'employee_job_id': None,
|
|
'department_id': None,
|
|
'job_title': None,
|
|
},
|
|
'address': {},
|
|
'bank_account': {},
|
|
},
|
|
},
|
|
}
|
|
|
|
# Public user cannot update information via an offer linked to an existing employee with user
|
|
res = self.url_open("/salary_package/submit", json=data)
|
|
content = json.loads(res.content)
|
|
self.assertIn('error', content)
|
|
self.assertIn('AccessError', content['error']['data']['name'])
|