3.9 KiB
3.9 KiB
RF-MGN-002-004: Jerarquías de Empresas (Holdings)
Módulo: MGN-002 - Empresas y Organizaciones Prioridad: P1 (Post-MVP) Story Points: 5 Estado: Definido Fecha: 2025-11-23
Descripción
El sistema debe permitir crear jerarquías de empresas (holdings) donde una empresa puede ser padre de otras. Facilita gestión de grupos empresariales y visualización de organigramas.
Actores
- Actor Principal: Administrador de Sistema
- Actores Secundarios: Gerente de Grupo (consulta jerarquía)
Precondiciones
- Empresas deben estar creadas (RF-MGN-002-001)
- Usuario debe tener permisos de administración
Flujo Principal
- Administrador accede a Gestión de Empresas
- Administrador crea/edita empresa
- Administrador selecciona parent_id (empresa padre)
- Sistema valida que no haya ciclos en jerarquía (A → B → A)
- Sistema actualiza core.companies.parent_id
- Sistema calcula nivel jerárquico (parent_path)
- Jerarquía queda establecida
- Usuario puede visualizar organigrama de empresas
Flujos Alternativos
FA-1: Visualización de Organigrama
- Usuario accede a módulo de Empresas
- Usuario selecciona vista "Organigrama"
- Sistema carga jerarquía de empresas
- Sistema muestra árbol visual (D3.js o similar)
- Usuario puede expandir/colapsar nodos
- Usuario puede hacer clic en empresa para ver detalle
FA-2: Ciclo Detectado
- Administrador intenta asignar parent_id que crea ciclo
- Sistema detecta ciclo: Holding A → Empresa B → Holding A
- Sistema retorna error 400: "No se permiten ciclos en jerarquías"
FA-3: Empresas Huérfanas (Sin Padre)
- Sistema permite empresas sin parent_id (raíz de jerarquía)
- Empresas huérfanas son holdings independientes
FA-4: Cambio de Padre
- Administrador cambia parent_id de empresa
- Sistema recalcula parent_path de empresa y descendientes
- Jerarquía se actualiza automáticamente
Reglas de Negocio
- RN-1: Empresa puede tener un solo parent_id (padre)
- RN-2: Empresa puede tener múltiples hijos
- RN-3: No se permiten ciclos en jerarquías (validación estricta)
- RN-4: Empresas sin parent_id son raíz de jerarquía
- RN-5: parent_path almacena ruta completa (ej: "1/5/12" = niveles)
- RN-6: Profundidad máxima recomendada: 5 niveles
Criterios de Aceptación
- Administrador puede asignar parent_id a empresas
- Sistema valida que no haya ciclos en jerarquías
- Sistema calcula parent_path automáticamente
- Usuario puede visualizar organigrama de empresas
- Organigrama muestra jerarquía completa con niveles
- Cambio de padre recalcula rutas automáticamente
- Empresas huérfanas (sin padre) son permitidas
Entidades Involucradas
- Principales:
- core.companies (parent_id, parent_path, level)
- Relacionadas:
- Ninguna (funcionalidad interna de empresas)
Referencias
Notas Técnicas
- parent_path: Materialized path pattern (ej: "1/5/12/34")
- Validación Ciclos:
WITH RECURSIVE hierarchy AS ( SELECT id, parent_id, ARRAY[id] AS path FROM core.companies WHERE id = NEW.id UNION ALL SELECT c.id, c.parent_id, h.path || c.id FROM core.companies c JOIN hierarchy h ON c.id = h.parent_id WHERE NOT (c.id = ANY(h.path)) -- Detectar ciclo ) SELECT * FROM hierarchy; - Visualización: D3.js tree layout o React Flow
- Backend: NestJS CompaniesService.validateHierarchy()
- Performance: Índice en parent_id y parent_path
Dependencias
- RF Dependientes: RF-MGN-002-001 (Gestión de Empresas)
- Bloqueante para: Ninguno (funcionalidad opcional)