from odoo.tests.common import TransactionCase, Form from odoo.exceptions import UserError from odoo.tests import tagged from datetime import date @tagged('post_install', '-at_install') class TestEmployeePromotions(TransactionCase): def setUp(cls): super(TestEmployeePromotions, cls).setUp() cls.structure_scale = cls.env['hr.payroll.structure'].create({ 'name': 'General Scale', 'type': 'scale', 'code': 'SCL_TEST_01' }) cls.level_1 = cls.env['hr.payroll.structure'].create({ 'name': 'Level 1', 'type': 'level', 'salary_scale_id': cls.structure_scale.id, 'code': 'LVL_TEST_01' }) cls.group_A = cls.env['hr.payroll.structure'].create({ 'name': 'Group A', 'type': 'group', 'salary_scale_id': cls.structure_scale.id, 'salary_scale_level_id': cls.level_1.id, 'code': 'GRP_TEST_A' }) cls.degree_1 = cls.env['hr.payroll.structure'].create({ 'name': 'Degree 1', 'type': 'degree', 'salary_scale_id': cls.structure_scale.id, 'salary_scale_group_id': cls.group_A.id, 'base_salary': 5000.0, 'code': 'DEG_TEST_1' }) cls.level_2 = cls.env['hr.payroll.structure'].create({ 'name': 'Level 2', 'type': 'level', 'salary_scale_id': cls.structure_scale.id, 'code': 'LVL_TEST_02' }) cls.group_B = cls.env['hr.payroll.structure'].create({ 'name': 'Group B', 'type': 'group', 'salary_scale_id': cls.structure_scale.id, 'salary_scale_level_id': cls.level_2.id, 'code': 'GRP_TEST_B' }) cls.degree_2 = cls.env['hr.payroll.structure'].create({ 'name': 'Degree 2', 'type': 'degree', 'salary_scale_id': cls.structure_scale.id, 'salary_scale_group_id': cls.group_B.id, 'base_salary': 7000.0, 'code': 'DEG_TEST_2' }) cls.employee = cls.env['hr.employee'].create({ 'name': 'Test Employee', 'salary_scale': cls.structure_scale.id, 'salary_level': cls.level_1.id, 'salary_group': cls.group_A.id, 'salary_degree': cls.degree_1.id, }) cls.contract = cls.env['hr.contract'].create({ 'name': 'Test Contract', 'employee_id': cls.employee.id, 'wage': 5000.0, 'state': 'open', 'salary_level': cls.level_1.id, 'salary_group': cls.group_A.id, 'salary_degree': cls.degree_1.id, }) cls.employee.contract_id = cls.contract def test_01_promotion_workflow_full_cycle(self): promotion_form = Form(self.env['employee.promotions']) promotion_form.date = date.today() promotion_form.employee_id = self.employee self.assertEqual(promotion_form.old_degree, self.degree_1, "Should auto-fill old degree from employee") promotion_form.new_level = self.level_2 promotion_form.new_group = self.group_B promotion_form.new_degree = self.degree_2 promotion = promotion_form.save() promotion.confirm() self.assertEqual(promotion.state, 'confirm') promotion.hr_manager() self.assertEqual(promotion.state, 'hr_manager') promotion.approved() self.assertEqual(promotion.state, 'approved') self.assertEqual(self.employee.contract_id.salary_degree, self.degree_2, "Contract degree should be updated to new degree") self.assertEqual(self.employee.contract_id.salary, 7000.0, "Contract salary should be updated to new base salary") def test_02_redraft_reverts_values(self): promotion = self.env['employee.promotions'].create({ 'date': date.today(), 'employee_id': self.employee.id, 'old_degree': self.degree_1.id, 'old_level_2': self.level_1.id, 'old_group_2': self.group_A.id, 'old_degree_2': self.degree_1.id, 'new_degree': self.degree_2.id, 'new_level': self.level_2.id, 'new_group': self.group_B.id, }) promotion.approved() self.assertEqual(self.employee.contract_id.salary_degree, self.degree_2) promotion.re_draft() self.assertEqual(promotion.state, 'draft') self.assertEqual(self.employee.contract_id.salary_degree, self.degree_1, "Should revert to old degree on re-draft") def test_03_unlink_restriction(self): promotion = self.env['employee.promotions'].create({ 'date': date.today(), 'employee_id': self.employee.id, 'state': 'confirm' }) with self.assertRaises(UserError): promotion.unlink() promotion.state = 'draft' promotion.unlink() self.assertFalse(promotion.exists())