summaryrefslogtreecommitdiff
path: root/addons/hr_org_chart/models
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/hr_org_chart/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/hr_org_chart/models')
-rw-r--r--addons/hr_org_chart/models/__init__.py5
-rw-r--r--addons/hr_org_chart/models/hr_employee.py18
-rw-r--r--addons/hr_org_chart/models/hr_org_chart_mixin.py39
3 files changed, 62 insertions, 0 deletions
diff --git a/addons/hr_org_chart/models/__init__.py b/addons/hr_org_chart/models/__init__.py
new file mode 100644
index 00000000..27f11d1b
--- /dev/null
+++ b/addons/hr_org_chart/models/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import hr_org_chart_mixin
+from . import hr_employee
diff --git a/addons/hr_org_chart/models/hr_employee.py b/addons/hr_org_chart/models/hr_employee.py
new file mode 100644
index 00000000..e3d7c8bb
--- /dev/null
+++ b/addons/hr_org_chart/models/hr_employee.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class Employee(models.Model):
+ _inherit = ["hr.employee"]
+
+ subordinate_ids = fields.One2many('hr.employee', string='Subordinates', compute='_compute_subordinates', help="Direct and indirect subordinates",
+ compute_sudo=True)
+
+
+class HrEmployeePublic(models.Model):
+ _inherit = ["hr.employee.public"]
+
+ subordinate_ids = fields.One2many('hr.employee.public', string='Subordinates', compute='_compute_subordinates', help="Direct and indirect subordinates",
+ compute_sudo=True)
diff --git a/addons/hr_org_chart/models/hr_org_chart_mixin.py b/addons/hr_org_chart/models/hr_org_chart_mixin.py
new file mode 100644
index 00000000..3320b5d2
--- /dev/null
+++ b/addons/hr_org_chart/models/hr_org_chart_mixin.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class HrEmployeeBase(models.AbstractModel):
+ _inherit = "hr.employee.base"
+
+ child_all_count = fields.Integer(
+ 'Indirect Subordinates Count',
+ compute='_compute_subordinates', store=False,
+ compute_sudo=True)
+
+ def _get_subordinates(self, parents=None):
+ """
+ Helper function to compute subordinates_ids.
+ Get all subordinates (direct and indirect) of an employee.
+ An employee can be a manager of his own manager (recursive hierarchy; e.g. the CEO is manager of everyone but is also
+ member of the RD department, managed by the CTO itself managed by the CEO).
+ In that case, the manager in not counted as a subordinate if it's in the 'parents' set.
+ """
+ if not parents:
+ parents = self.env[self._name]
+
+ indirect_subordinates = self.env[self._name]
+ parents |= self
+ direct_subordinates = self.child_ids - parents
+ for child in direct_subordinates:
+ child_subordinate = child._get_subordinates(parents=parents)
+ indirect_subordinates |= child_subordinate
+ return indirect_subordinates | direct_subordinates
+
+
+ @api.depends('child_ids', 'child_ids.child_all_count')
+ def _compute_subordinates(self):
+ for employee in self:
+ employee.subordinate_ids = employee._get_subordinates()
+ employee.child_all_count = len(employee.subordinate_ids)