4.7 KiB
4.7 KiB
RF-MGN-002-003: Asignación de Usuarios a Empresas (Multi-Empresa)
Módulo: MGN-002 - Empresas y Organizaciones Prioridad: P0 (MVP) Story Points: 8 Estado: Definido Fecha: 2025-11-23
Descripción
El sistema debe permitir asignar usuarios a múltiples empresas y gestionar roles diferenciados por empresa. Un usuario puede tener rol de "Contador" en Empresa A y "Vendedor" en Empresa B.
Actores
- Actor Principal: Administrador de Sistema
- Actores Secundarios: Usuario Multi-Empresa
Precondiciones
- Usuario debe existir (RF-MGN-001-003)
- Empresa debe existir (RF-MGN-002-001)
- Roles deben estar definidos (RF-MGN-001-002)
Flujo Principal
- Administrador accede a Gestión de Usuarios
- Administrador selecciona usuario
- Administrador asigna empresa al usuario
- Administrador selecciona roles específicos para esa empresa
- Sistema crea registro en auth.user_companies
- Sistema crea registros en auth.user_company_roles
- Usuario queda habilitado para acceder a la empresa
- Usuario ve empresa en lista de empresas disponibles
Flujos Alternativos
FA-1: Cambio de Empresa Activa (Context Switching)
- Usuario autenticado tiene acceso a múltiples empresas
- Usuario selecciona otra empresa del selector
- Sistema valida acceso del usuario a la empresa
- Sistema actualiza contexto: current_company_id = selected_company_id
- Sistema ejecuta
SET search_pathsi aplica - Sistema recarga dashboard con datos de nueva empresa
- Todas las operaciones subsecuentes usan nueva empresa
FA-2: Roles Diferentes por Empresa
- Usuario tiene rol "Contador" en Empresa A
- Usuario tiene rol "Vendedor" en Empresa B
- Al cambiar a Empresa A: permisos de contador
- Al cambiar a Empresa B: permisos de vendedor
- Sistema valida permisos según empresa activa
FA-3: Eliminación de Acceso a Empresa
- Administrador elimina usuario de empresa
- Sistema valida que usuario no tenga documentos pendientes
- Sistema elimina registro de auth.user_companies
- Usuario pierde acceso a esa empresa
- Si era última empresa, usuario queda sin acceso al sistema
FA-4: Usuario Sin Empresas Asignadas
- Usuario intenta iniciar sesión
- Sistema detecta que no tiene empresas asignadas
- Sistema retorna error 403: "Usuario sin empresas asignadas. Contacte al administrador"
Reglas de Negocio
- RN-1: Usuario puede tener acceso a múltiples empresas
- RN-2: Usuario puede tener roles diferentes en cada empresa
- RN-3: Usuario debe tener al menos una empresa asignada para operar
- RN-4: Empresa activa determina datos visibles y permisos
- RN-5: Cambio de empresa no requiere logout
- RN-6: RLS filtra datos automáticamente por empresa activa
- RN-7: Documentos creados tienen company_id de empresa activa
Criterios de Aceptación
- Administrador puede asignar usuarios a múltiples empresas
- Administrador puede definir roles diferentes por empresa
- Usuario ve lista de empresas a las que tiene acceso
- Usuario puede cambiar empresa activa sin logout
- Permisos se aplican según roles de empresa activa
- Datos mostrados corresponden a empresa activa (RLS)
- Documentos creados tienen company_id de empresa activa
- Usuario sin empresas no puede operar en el sistema
- Sistema valida acceso a empresa en cada request
Entidades Involucradas
- Principales:
- auth.user_companies (user_id, company_id, is_default)
- auth.user_company_roles (user_id, company_id, role_id)
- Relacionadas:
- auth.users (usuario)
- core.companies (empresas)
- auth.roles (roles)
Referencias
Notas Técnicas
- Patrón Odoo: res.company + res.users.company_ids (many2many)
- Context Switching: Actualizar req.company_id en middleware
- RLS: Filtro automático WHERE company_id = get_current_company_id()
- Función SQL:
CREATE OR REPLACE FUNCTION get_current_company_id() RETURNS INTEGER AS $$ BEGIN RETURN current_setting('app.current_company_id')::INTEGER; END; $$ LANGUAGE plpgsql; - Frontend: Selector de empresas en navbar
- Backend: Middleware que valida acceso a empresa
Dependencias
- RF Dependientes:
- RF-MGN-001-003 (Gestión de Usuarios)
- RF-MGN-002-001 (Gestión de Empresas)
- RF-MGN-001-002 (Roles)
- Bloqueante para: Todos los módulos transaccionales (requieren company_id)