From b45364a5287a66270950bab5d14f332677db1b8c Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Fri, 15 May 2026 13:46:07 +0700 Subject: [PATCH] feat: implement multi-branch employee visibility through updated security rules, search overrides, and company sync logic --- README.md | 22 +++++++++++ __pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../__pycache__/hr_employee.cpython-312.pyc | Bin 1671 -> 3298 bytes models/hr_employee.py | 35 +++++++++++++++++- security/hr_attendance_security.xml | 4 +- security/hr_security.xml | 2 +- views/hr_employee_views.xml | 23 +++++++++++- 7 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 README.md create mode 100644 __pycache__/__init__.cpython-312.pyc 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 0000000000000000000000000000000000000000..97face845bde91241b99d74abb47e26c90672916 GIT binary patch literal 213 zcmXwzu?oU45QcND6cGvz_940$90hTA5pi@0r3ti>xH!29-8y*% z{g?axpF940r0If@vcv3}(R@wjujmKElHkT9lc1S_3jhmI9>0O&9QwqdRN5c&sAn#w z?9PViay;`2jpDwml#_vQn?hb-VWX`9BDiDMwGjhot1%evNRviB}Kc=nMy zv!96iao5KkTp4KUeKXrG9iVASNSAMe3LTaG;Xwubw-zyHIso zXQVy%+;h)4_uO;OS_>tU#v<_whP;#``K^JyV2 zq{X<%As!7Q%+De$5N^WNR#xDRD}p!1r71D$d&(wJ(UH>&n(RIYgTFTs(LgMVp+O5qdtIGqO{JOdm?o7^zGsF=L5rI;Ul(9QkdkWfCc3PPbp} ziR3g&GM1|2NUst(b{gQ2W|$;;ZTghQr+9KYF%>JNn@U-!0=QtD(a(+FgP{)E_ZkxI|9kv@a`X?Ey_EhNsOc;m&4d(3KZqVPy15Y zH0d+*DMIm7-w&s(R5p`<+S8ZC+3dh~`x1EwowSA_Y|OqCRnvLH(koG1R@dj1E5=YJ z#d1@W)s*R@`{^00k_JbC$6N$3gSNx%Um-a#%*~D1!6RG2uE)VHyF0ek{pMQto2vtB z-KQ7j&BI-GL+e(!`p>QPpWEsmTI(Mw_6-+%Mv9Sl8Rv=Z?vuYw zeV*Fteq*isjYW9_WL**Q_wqv!JG<6@))OxFy;JNtUyKa7V$T|w5xZa$N|dWSo3Qf7 z;(PZ3fZNz$Li?Ul0l+=06n* zzPsG7I4EMm^abV84MM4o31qlN6DgMDdM07yfwF(MP<%32NkS!fUrStPJo{^ko@7Ki1w`4U7k=;K7^)|<{&g2W|G8$)j$1-poGLYZ5wZL1IY_TdilH|)}o&KT#ImI#% z^VfS2qAAF)QfmNW<-DdTnkdN` zT4KLtF{;VpK~a<$+71Zq1u)%zFu}dxjlE@LpTUpBVbM_yU1 zv0K7(!*;msD^y<>T@;@*cHF^tuiSrq`Qk?7Df>vz{BxX>(SsJCX12b z&G1NBwY3@UebU^yEZ)T%&9B-`ZA+uKM%TK&y(+GEo!)FZv+YrqzqQ%av(o|g?i@u; zZF8fv1J1-A1KDH}+O*>{^t28`mSRGo2K&r>j!?(1dQOVUls$IbmPwgUXpDhA0FHEh zQlsOh>tH9KstE%g9ja=wrUUMW?`-J`27odh`tK_^33T&y0RNgnds1Vd?b%6G8~U<2 zdarxEd0=knNw8^ta{lLcZWM!K_mZpU|I)k`94r3lCk)DCrK7lgW^^=q*pXE=qos+e zIyI^a)jn@9yjE2|$ZJMvMOO6;^by^nEJ~cfMQA;z(g3_@l-+qYL%hIk)+`I6kA|p!M$ad)XV)s_)_*&?=EjQc2Ry+8bT{pNF@HI*^KiCPO(6PmqrOsQO?rPXR z{0+N4WH+?f4b664axW-{q?zyUG@*{(J42sc`s9)=H`>7qdp@B%5d%@4C@- z2xYC_@m*wp3S7qDAy0^9;S2dK??TSdL6|aMn4JK21dikWjw0(QvL_C5@XrK}*M6)0 KpU9oK3jPgc)e?~a delta 331 zcmaDP+0M&%nwOW00SMGQS+f4JOyrx%e2jr%;+mr@l|q`ro0l@KVH9NsN`vs{B|u_2 zLk)uqL#+4YH0D?d#va2OhAbAKFe;er$Raw~fQ3iC$Crhnl0lQnuZRh#LX)LP7)agX zO3u$MNX)B@pS*)*BcBIQsDa^ugv=)fR!;ND6|C~=qO#XTH7<*4JW$hGp0P0Fx|-QV zHM0pER|S+mas$gGTvuU Zzs#Wig++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)] +