# **Especificaciones del Módulo de Clientes - ERP** El **módulo de clientes** del ERP permite gestionar la información de clientes, asegurando compatibilidad con la gestión multiempresa, multiidioma y multi-moneda. A continuación, se detallan las especificaciones, incluyendo los campos clave y su función. --- ## **1. Funcionalidades del Módulo de Clientes** El módulo de clientes debe permitir: - **Crear, leer, actualizar y eliminar clientes** (CRUD). - **Asociar clientes a una empresa** y, opcionalmente, a una o más sucursales. - **Registrar clientes como personas físicas o empresas**. - **Gestionar datos fiscales, comerciales y de contacto**. - **Definir configuraciones de facturación y pago personalizadas**. - **Aplicar descuentos en distintos niveles**. - **Manejar aspectos financieros como retenciones y recargos**. - **Identificar clientes con riesgo financiero**. - **Asignar comerciales o delegados**. - **Controlar el estado del cliente** (activo/inactivo). - **Registrar auditoría de cambios**. --- ## **2. Estructura del Cliente y sus Campos** Cada cliente tiene los siguientes atributos: ### **Datos Generales** | Campo | Tipo de Dato | Descripción | |-----------------------|-----------------|-------------| | `id` | `INT` (PK) | Identificador único del cliente. | | `company_id` | `INT` (FK) | Empresa a la que pertenece el cliente. | | `is_company` | `BOOLEAN` | Indica si el cliente es una empresa (`true`) o una persona física (`false`). | | `fiscal_name` | `VARCHAR(255)` | Nombre fiscal del cliente (solo si es empresa). | | `commercial_name` | `VARCHAR(255)` | Nombre comercial del cliente (si aplica). | | `name` | `VARCHAR(255)` | Nombre de la persona o empresa. | | `email` | `VARCHAR(100)` | Correo electrónico único del cliente. | | `phone` | `VARCHAR(20)` | Número de teléfono de contacto. | | `address` | `TEXT` | Dirección del cliente. | | `country_code` | `CHAR(2)` | Código del país del cliente (ISO 3166-1 alpha-2). | | `origin` | `VARCHAR(100)` | Origen del cliente (ej. publicidad, redes sociales, feria, escaparate). | ### **Configuración de Moneda e Idioma** | Campo | Tipo de Dato | Descripción | |---------------------|-----------------|-------------| | `currency_code` | `CHAR(3)` | Código de la divisa con la que trabaja el cliente (ISO 4217). | | `language_code` | `CHAR(5)` | Idioma preferido del cliente para documentos y comunicación (ej. `es-ES`, `en-US`). | ### **Información Fiscal y Financiera** | Campo | Tipo de Dato | Descripción | |------------------------|----------------|-------------| | `vat_percentage` | `DECIMAL(5,2)` | Porcentaje de IVA aplicable al cliente. | | `equivalence_charge` | `BOOLEAN` | Indica si el cliente aplica recargo de equivalencia. | | `withholding_percentage` | `DECIMAL(5,2)` | Porcentaje de retención en facturas del cliente. | | `payment_method` | `VARCHAR(100)` | Forma de pago habitual del cliente (ej. transferencia, tarjeta, efectivo). | | `payment_day` | `INT` | Día del mes en que el cliente realiza pagos (1-31). | | `risk` | `BOOLEAN` | Indica si el cliente tiene riesgo financiero o historial de morosidad. | ### **Descuentos y Tarifas Especiales** | Campo | Tipo de Dato | Descripción | |---------------------|----------------|-------------| | `discount_line` | `DECIMAL(5,2)` | Descuento aplicado a nivel de línea en presupuestos. | | `discount_chapter` | `DECIMAL(5,2)` | Descuento aplicado a nivel de capítulo en presupuestos. | | `discount_global` | `DECIMAL(5,2)` | Descuento global aplicado al presupuesto. | | `price_point` | `DECIMAL(10,2)` | Valor de "precio punto" del cliente, usado para calcular costos personalizados en catálogo. | ### **Clasificación y Estado** | Campo | Tipo de Dato | Descripción | |---------------|----------------|-------------| | `client_type` | `VARCHAR(100)` | Tipo de cliente (ej. profesionales, constructoras, distribuidores, particulares). | | `is_active` | `BOOLEAN` | Indica si el cliente está activo (`true`) o dado de baja (`false`). | ### **Delegados y Comerciales** | Campo | Tipo de Dato | Descripción | |-----------------|----------------|-------------| | `Client_Sales_Rep` | `Tabla Relacional` | Relación con los comerciales asignados a este cliente. | --- ## **3. Auditoría y Seguridad** Cada cambio en los datos de un cliente debe registrarse en una tabla de auditoría: ```sql CREATE TABLE Client_Audit ( id SERIAL PRIMARY KEY, client_id INT NOT NULL REFERENCES Clients(id) ON DELETE CASCADE, user_id INT NOT NULL REFERENCES Users(id), change_description TEXT, change_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` Esto permitirá rastrear modificaciones y garantizar transparencia en la gestión de clientes. --- ## **4. Endpoints Principales de la API** ### **4.1. Listar Clientes** ```http GET /api/companies/{company_id}/clients Authorization: Bearer ``` ### **4.2. Crear Cliente** ```http POST /api/companies/{company_id}/clients Authorization: Bearer ``` **Solicitud:** ```json { "is_company": true, "fiscal_name": "Empresa XYZ SL", "commercial_name": "XYZ Comercial", "name": "Empresa XYZ", "email": "contacto@xyz.com", "phone": "+34912345678", "country_code": "ES", "origin": "Publicidad", "currency_code": "EUR", "language_code": "es-ES", "vat_percentage": 21.00, "payment_method": "Transferencia bancaria", "discount_line": 5.00, "discount_chapter": 2.50, "discount_global": 10.00, "price_point": 1.20, "payment_day": 15, "risk": false, "equivalence_charge": false, "withholding_percentage": 10.00, "client_type": "Distribuidor", "is_active": true } ``` ### **4.3. Obtener Cliente por ID** ```http GET /api/clients/{client_id} Authorization: Bearer ``` ### **4.4. Actualizar Cliente** ```http PUT /api/clients/{client_id} Authorization: Bearer ``` ### **4.5. Baja Lógica de Cliente** ```http PATCH /api/clients/{client_id}/deactivate Authorization: Bearer ``` ### **4.6. Asignar Comercial a Cliente** ```http POST /api/clients/{client_id}/sales-reps Authorization: Bearer ``` --- ## **5. Seguridad y Control de Acceso** - **Middleware de autenticación** para validar que solo usuarios autorizados gestionen clientes. - **Permisos basados en roles**, como `Clientes: leer`, `Clientes: escribir`, `Clientes: eliminar`. - **Reglas de validación** para evitar datos erróneos o incompletos. - **Registro de auditoría** para cada modificación. ---