from odoo import models, api class ResUsers(models.Model): _inherit = 'res.users' @api.model_create_multi def create(self, vals_list): # Pre-process vals to ensure primary company_id is always in allowed company_ids # This prevents Odoo's _check_user_company ValidationError when template users have different company_ids for vals in vals_list: company_id = vals.get('company_id') if company_id: if 'company_ids' in vals: company_ids_commands = vals['company_ids'] existing_ids = set() has_six = False six_index = -1 for idx, cmd in enumerate(company_ids_commands): if isinstance(cmd, (list, tuple)) and len(cmd) >= 3: if cmd[0] == 6: existing_ids.update(cmd[2]) has_six = True six_index = idx elif cmd[0] == 4: existing_ids.add(cmd[1]) if company_id not in existing_ids: if has_six and six_index != -1: cmd = list(company_ids_commands[six_index]) cmd[2] = list(cmd[2]) + [company_id] company_ids_commands[six_index] = tuple(cmd) else: company_ids_commands.append((4, company_id)) else: vals['company_ids'] = [(6, 0, [company_id])] users = super().create(vals_list) users.sudo()._sync_employee_company_ids() return users def write(self, vals): # Pre-process vals to ensure primary company_id is always in allowed company_ids company_id = vals.get('company_id') if company_id: has_company_ids = 'company_ids' in vals existing_ids = set() if has_company_ids: for cmd in vals['company_ids']: if isinstance(cmd, (list, tuple)) and len(cmd) >= 3: if cmd[0] == 6: existing_ids.update(cmd[2]) elif cmd[0] == 4: existing_ids.add(cmd[1]) for user in self: user_allowed = set(user.company_ids.ids) if has_company_ids: if company_id not in existing_ids: vals['company_ids'] = list(vals['company_ids']) + [(4, company_id)] else: if company_id not in user_allowed: vals['company_ids'] = [(4, company_id)] res = super().write(vals) if any(f in vals for f in ['company_id', 'company_ids']): self.sudo()._sync_employee_company_ids() return res def _sync_employee_company_ids(self): for user in self: employee_companies = user.employee_ids.mapped('company_ids') employee_primary_companies = user.employee_ids.mapped('company_id') companies_to_add = (employee_companies | employee_primary_companies | user.company_id) - user.company_ids if companies_to_add: user.write({ 'company_ids': [(4, cid.id) for cid in companies_to_add] })