# **Requisitos Técnicos del ERP** ## **1. Administración de Usuarios** - **Roles y Perfiles**: - Los usuarios pueden tener uno o más perfiles predefinidos (por ejemplo, "Ventas", "Compras"). - Los perfiles controlan permisos generales a nivel de empresa y refinados a nivel de sucursal. - Un usuario puede tener diferentes perfiles en distintas sucursales de la misma empresa. - **Permisos**: - Configurables por módulo (Presupuestos, Facturas, etc.). - Granularidad: permitir acciones específicas como "leer", "escribir", "eliminar". - Un usuario puede tener permisos para acceder a una o más sucursales de la empresa, pero debe trabajar en una empresa activa por sesión. - Si el usuario solo tiene permisos para una sucursal, se selecciona automáticamente. Si tiene acceso a varias, se selecciona solo cuando sea necesario. - **Superadministrador**: - Puede crear, modificar y eliminar usuarios. - Gestiona perfiles, permisos y asociaciones con empresas y sucursales. --- ## **2. Gestión Multiempresa y Multisucursal** - **Usuarios y Empresas**: - Un usuario puede estar asociado a múltiples empresas. - En cada sesión o pestaña, el usuario puede trabajar con una empresa específica. - La empresa activa se elige al inicio de sesión. - **Sucursales**: - Cada empresa debe tener al menos una sucursal, pero puede tener varias. - Los usuarios de una sucursal pueden gestionar datos de otras sucursales si tienen los permisos adecuados. - Se permite definir permisos para operar en múltiples sucursales dentro de la misma empresa. - **Flujo de Selección**: - Al iniciar sesión, el usuario elige la empresa activa. - Si tiene acceso a una única sucursal, esta se selecciona automáticamente. - Si tiene acceso a múltiples sucursales, la selección de sucursal ocurre solo cuando sea necesario para una operación específica. --- ## **3. Soporte Multiidioma y Regionalización** - **Idiomas**: - La interfaz del ERP debe estar disponible en varios idiomas. - Los documentos (presupuestos, facturas) pueden generarse en el idioma del cliente. - El idioma de usuario es configurable en su perfil. - **Monedas e Impuestos**: - Configuración de moneda por empresa, con posibilidad de conversión. - Definición de impuestos según país (IVA, retenciones, tasas locales). - Flexibilidad para configurar tarifas por categoría de productos o servicios. --- ## **4. Contexto de Sesión y Pestaña** - **Contexto por Pestaña**: - Cada pestaña tiene un contexto independiente (`tab_id`), que incluye la empresa activa. - Si se requiere una sucursal para la operación, se solicitará en ese momento. - Se almacena el `tab_id` junto con la empresa activa en el backend para cada sesión de usuario. - **Gestión de Sesiones**: - Tokens JWT deben incluir información sobre: - `user_id` - `tab_id` - `active_company_id` - Lista de permisos específicos - Se debe registrar el contexto de pestaña en la base de datos para auditoría y trazabilidad. --- ## **5. Auditoría y Registro de Actividades** - **Registro de Cambios en Documentos**: - Presupuestos, facturas y otros documentos deben mantener un historial detallado de modificaciones. - Se registra la siguiente información: - Usuario que realizó el cambio. - Fecha y hora. - Cambios específicos (antes y después). - **Trazabilidad Global**: - Auditar las actividades del usuario a nivel de empresa, sucursal y pestaña. - Se debe asociar cada acción al `tab_id` para identificar actividades por pestaña específica. --- ## **6. Documentos Operativos** - **Historial de Cambios**: - Cada documento (presupuestos, facturas, etc.) debe registrar todas las modificaciones con la posibilidad de revertirlas si es necesario. - **Exportación Multiidioma**: - Generación de documentos en diferentes idiomas según la configuración del cliente. --- ## **7. Seguridad** - **Autenticación**: - Autenticación basada en tokens JWT. - Contraseñas encriptadas con bcrypt o Argon2. - Soporte para autenticación en dos pasos (2FA) en futuras iteraciones. - **Control de Acceso**: - Validación de permisos en cada solicitud al backend. - Aplicación del principio de mínimos privilegios para usuarios. --- ## **8. Extensibilidad y Modularidad** - **Estructura Modular**: - El sistema debe permitir la integración de nuevos módulos sin afectar los permisos o el funcionamiento existente. - Módulos actuales planificados: - Presupuestos - Facturas - Clientes - Pedidos - Inventario (futuro) - Recursos Humanos (futuro) --- ## **9. Base de Datos - Diseño Técnico** ### **Tablas Principales** ```sql -- Usuarios CREATE TABLE Users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` ```sql -- Empresas CREATE TABLE Companies ( id SERIAL PRIMARY KEY, name VARCHAR(100) UNIQUE NOT NULL, country_code CHAR(2), currency_code CHAR(3), tax_config JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` ```sql -- Sucursales CREATE TABLE Branches ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, company_id INT NOT NULL REFERENCES Companies(id) ON DELETE CASCADE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` ```sql -- Relación Usuario - Empresa CREATE TABLE User_Company ( id SERIAL PRIMARY KEY, user_id INT NOT NULL REFERENCES Users(id), company_id INT NOT NULL REFERENCES Companies(id), is_active BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` ```sql -- Relación Usuario - Sucursal CREATE TABLE User_Branch ( id SERIAL PRIMARY KEY, user_id INT NOT NULL REFERENCES Users(id), branch_id INT NOT NULL REFERENCES Branches(id), permissions JSONB NOT NULL ); ``` ```sql -- Contexto por pestaña CREATE TABLE Tab_Context ( id SERIAL PRIMARY KEY, user_id INT NOT NULL REFERENCES Users(id), tab_id UUID NOT NULL, company_id INT NOT NULL REFERENCES Companies(id), branch_id INT REFERENCES Branches(id) ); ``` ---