diff --git a/README.md b/README.md new file mode 100644 index 0000000..1748ea6 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Multi-Company Employee Assignment (Odoo 19) + +This module extends the standard Odoo HR functionality to allow a single employee record to be associated with multiple branch companies. + +## Features +- **Multi-Branch Assignment**: Add a "Branches" (Many2many) field to the employee form. +- **Cross-Branch Visibility**: Employees appear in the "Employees" menu and search panel for all assigned branches. +- **POS Integration**: Cashiers and employees appear in the POS login interface for all branches they are assigned to. +- **Security Logic**: Access control rules are updated to allow visibility across all selected branches. +- **Fallback Mode**: Existing employees with no branches assigned remain visible based on their original primary company. + +## Usage +1. Open an **Employee** form. +2. In the header/top section, find the **Branches** field. +3. Select all the branch companies this employee should belong to. +4. The first branch in the list will automatically be set as the "Primary Company" for standard Odoo processes. + +## Technical Details +- Overrides `hr.employee`'s `company_id` to be a computed field based on `company_ids`. +- Overrides `_search` and `ir.rule` to support Many2many company filtering. +- Overrides `pos.config`'s `_employee_domain` for POS login visibility. +- Includes transition logic for existing data. diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..97face8 Binary files /dev/null and b/__pycache__/__init__.cpython-312.pyc differ diff --git a/models/__pycache__/hr_employee.cpython-312.pyc b/models/__pycache__/hr_employee.cpython-312.pyc index a7ab789..6b3bdc3 100644 Binary files a/models/__pycache__/hr_employee.cpython-312.pyc and b/models/__pycache__/hr_employee.cpython-312.pyc differ diff --git a/models/hr_employee.py b/models/hr_employee.py index 8feae6a..13d29b4 100644 --- a/models/hr_employee.py +++ b/models/hr_employee.py @@ -32,6 +32,37 @@ class HrEmployee(models.Model): for employee in self: if employee.company_ids: employee.company_id = employee.company_ids[0] - elif not employee.company_id: - # Fallback to current company if none specified + elif employee.company_id: + # Sync company_ids from company_id for existing records + employee.company_ids = [(6, 0, [employee.company_id.id])] + else: employee.company_id = self.env.company + employee.company_ids = [(6, 0, [self.env.company.id])] + + @api.model + def _search(self, domain, offset=0, limit=None, order=None, **kwargs): + """ Override search to include company_ids and fallback to company_id if empty """ + def replace_company_leaf(dom): + if not dom: + return dom + new_dom = [] + for leaf in dom: + if isinstance(leaf, (list, tuple)): + if leaf[0] == 'company_id': + # Match if Branch is in search OR (Branch is empty AND Company is in search) + new_dom.append('|') + new_dom.append(('company_ids', leaf[1], leaf[2])) + new_dom.append('&') + new_dom.append(('company_ids', '=', False)) + new_dom.append(('company_id', leaf[1], leaf[2])) + else: + new_dom.append(leaf) + elif isinstance(leaf, list): + new_dom.append(replace_company_leaf(leaf)) + else: + new_dom.append(leaf) + return new_dom + + if domain: + domain = replace_company_leaf(domain) + return super()._search(domain, offset=offset, limit=limit, order=order, **kwargs) diff --git a/security/hr_attendance_security.xml b/security/hr_attendance_security.xml index aba36f8..d7cd026 100644 --- a/security/hr_attendance_security.xml +++ b/security/hr_attendance_security.xml @@ -5,14 +5,14 @@ Attendance multi branch rule - ['|', ('employee_id.company_ids', '=', False), ('employee_id.company_ids', 'in', company_ids)] + ['|', ('employee_id.company_ids', 'in', company_ids), '&', ('employee_id.company_ids', '=', False), ('employee_id.company_id', 'in', company_ids)] Overtime Line multi branch rule - ['|', ('employee_id.company_ids', '=', False), ('employee_id.company_ids', 'in', company_ids)] + ['|', ('employee_id.company_ids', 'in', company_ids), '&', ('employee_id.company_ids', '=', False), ('employee_id.company_id', 'in', company_ids)] diff --git a/security/hr_security.xml b/security/hr_security.xml index c20b24b..886a635 100644 --- a/security/hr_security.xml +++ b/security/hr_security.xml @@ -5,7 +5,7 @@ Employee multi branch rule - ['|', ('company_ids', '=', False), ('company_ids', 'in', company_ids)] + ['|', ('company_ids', 'in', company_ids), '&', ('company_ids', '=', False), ('company_id', 'in', company_ids)] diff --git a/views/hr_employee_views.xml b/views/hr_employee_views.xml index e543a9e..6db0d57 100644 --- a/views/hr_employee_views.xml +++ b/views/hr_employee_views.xml @@ -1,11 +1,11 @@ + hr.employee.form.inherit.multi.company hr.employee - @@ -14,4 +14,25 @@ + + + + hr.employee.search.inherit.multi.company + hr.employee + + + + + + + + + + + [('company_id', 'in', allowed_company_ids)] + + + + [('company_id', 'in', allowed_company_ids)] +