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)]
+