75 lines
3.3 KiB
Python
75 lines
3.3 KiB
Python
from odoo.tests.common import TransactionCase
|
|
|
|
|
|
class TestEmployeeReport(TransactionCase):
|
|
def test_leadership_level(self):
|
|
"""
|
|
Leadership Level represents the maximum number of levels of subordinates under a given employee.
|
|
For instance, given the following diagram of an employee hierarchy:
|
|
|
|
┌──────────┐
|
|
│Employee 1│
|
|
┌───────┴────┬─────┴───────┐
|
|
│ │ │
|
|
┌────▼─────┐ ┌────▼─────┐ ┌─────▼────┐
|
|
│Employee 2│ │Employee 3│ │Employee 4│
|
|
└────┬─────┘ └──────────┘ └──────────┘
|
|
│
|
|
┌────▼─────┐
|
|
│Employee 5│
|
|
└──────────┘
|
|
|
|
We have the following values for leadership level:
|
|
- Employee 1: 2
|
|
- Employee 2: 1
|
|
- Employees 3, 4 and 5: 0
|
|
|
|
In case of cycles, the maximum depth will be the one that can be reached
|
|
without encountering the same employee again.
|
|
"""
|
|
employee_1 = self.env["hr.employee"].create({
|
|
"name": "Employee 1",
|
|
})
|
|
employee_2, employee_3, employee_4 = self.env["hr.employee"].create([{
|
|
"name": f"Employee {n}",
|
|
"parent_id": employee_1.id,
|
|
} for n in range(2, 5)])
|
|
employee_5 = self.env["hr.employee"].create({
|
|
"name": "Employee 5",
|
|
"parent_id": employee_2.id,
|
|
})
|
|
|
|
for employee, expected_leadership_level in [
|
|
(employee_1, 2),
|
|
(employee_2, 1),
|
|
(employee_3, 0),
|
|
(employee_5, 0),
|
|
]:
|
|
report_record = self.env["esg.employee.report"].browse(employee.id)
|
|
self.assertEqual(report_record.leadership_level, expected_leadership_level)
|
|
|
|
# Add a cycle
|
|
employee_1.parent_id = employee_4.id
|
|
self.env.cr.flush()
|
|
self.env["esg.employee.report"]._invalidate_cache()
|
|
self.env["hr.employee"]._invalidate_cache()
|
|
for employee, expected_leadership_level in [
|
|
(employee_1, 2), # Longest path is unchaged since the cycle is only 1 -> 4 -> 1 (depth of one)
|
|
(employee_4, 3), # Since the longest path is now 4 -> 1 -> 2 -> 5
|
|
]:
|
|
report_record = self.env["esg.employee.report"].browse(employee.id)
|
|
self.assertEqual(report_record.leadership_level, expected_leadership_level)
|
|
|
|
# Make employees their own manager
|
|
employee_1.parent_id = employee_1.id
|
|
employee_4.parent_id = employee_4.id
|
|
self.env.cr.flush()
|
|
self.env["esg.employee.report"]._invalidate_cache()
|
|
self.env["hr.employee"]._invalidate_cache()
|
|
for employee, expected_leadership_level in [
|
|
(employee_1, 2), # Longest path still unchanged
|
|
(employee_4, 0), # Employee 4 is now isolated from the rest of the hierarchy
|
|
]:
|
|
report_record = self.env["esg.employee.report"].browse(employee.id)
|
|
self.assertEqual(report_record.leadership_level, expected_leadership_level)
|