# **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)
);
```

---
