# Walkthrough — Historial de Correcciones de Base de Datos y Formulario

Este documento contiene un resumen de los cambios aplicados en las pantallas del proyecto de gestión.

## Cambios en el Código Fuente

### 1. Componentes de Interfaz de Usuario (UI)

- **Nuevas Pantallas de Alérgenos y Tipos de IVA (Módulo de Empresa)**:
  - Se crearon los formularios de listado [frm_Alergenos.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_Alergenos.pas) y [frm_TiposIva.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_TiposIva.pas) heredando de `TfrmBaseList` para cargar y mostrar los registros de las tablas `ge_alergenos` y `ge_tipos_iva` respectivamente.
  - Se crearon los formularios de edición [frm_AlergenosEditor.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_AlergenosEditor.pas) y [frm_TiposIvaEditor.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_TiposIvaEditor.pas) heredando de `TfrmBase` para realizar las operaciones de inserción, modificación, navegación y borrado de registros.
  - Se implementó la generación automática de claves UUID en inserción y asignación del usuario de auditoría para ambas tablas.
  - Se registraron los nuevos archivos en [Gestion.dpr](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/Gestion.dpr) y [Gestion.dproj](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/Gestion.dproj).
  - Se agregaron los botones **Alérgenos** (`btnAlergenos`) y **Tipos IVA** (`btnTiposIva`) en la pestaña "Empresa" del menú superior en [frm_Main.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_Main.pas) and [frm_Main.dfm](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_Main.dfm), vinculando sus eventos para abrir las nuevas pestañas en el panel de pestañas de trabajo.

- **`frm_AlbaranesEditor.pas` y `frm_FacturasEditor.pas` (Cálculo de Totales, Impuestos y Descuentos)**:
  - Se añadieron las columnas **% Dto.** (`descuento_porc`), **Dto. Importe** (`descuento_cant`) y **% IVA** (`tipo_iva`) a la rejilla de detalle de artículos (`dbgItems`).
  - Se actualizó `qryLinesBeforePost` para realizar el cálculo del descuento de manera automática:
    $$\text{Importe Descuento} = \text{precio} \times \text{cantidad} \times \left(\frac{\text{descuento\_porc}}{100}\right) \quad (\text{si } \% \text{ Dto. } \neq 0)$$
    $$\text{Base de la Línea} = (\text{precio} \times \text{cantidad}) - \text{Importe Descuento}$$
    $$\text{IVA de la Línea} = \text{Base de la Línea} \times \left(\frac{\text{tipo\_iva}}{100}\right)$$
    $$\text{Total de la Línea} = \text{Base de la Línea} + \text{IVA de la Línea}$$
  - Se actualizó el procedimiento `RecalculateTotal` para sumar todas las bases netas (restando los descuentos de cada línea) y las cuotas de IVA de las líneas del documento.
  - Se agrupó y desglosó el IVA de las líneas por tipo (p. ej. `10% (Base: 50.00 IVA: 5.00) | 21% (Base: 100.00 IVA: 21.00)`), mostrando el texto resultante en el nuevo campo `edtIvaDesglose`.
  - Se vinculó en `LoadData` la recarga automática de los totales para asegurar que se muestren correctamente nada más cargar el documento.
  - Se ajustó el guardado en base de datos en `btnSaveClick` para persistir los valores de `base_imponible` e `iva` (además del `total`) en las tablas `ge_albaranes` y `ge_facturas`.

- **`frm_AlbaranesEditor.pas` y `frm_FacturasEditor.pas` (Asignación de ID en Líneas)**:
  - Se corrigió el error `Field 'id' must have a value` al añadir líneas asignando un nuevo UUID limpio mediante `TdmgMain.CleanUUID(TGUID.NewGuid.ToString)` en el evento `qryLinesBeforePost` cuando el campo `id` esté vacío o nulo.

- **`frm_AlbaranesEditor.dfm` y `frm_FacturasEditor.dfm` (Diseño del Pie de Página)**:
  - Se rediseñó el panel inferior `pnlFooter` en ambos formularios para incluir los nuevos campos y etiquetas:
    - **Base Imponible** (`lblBase` y `edtBase`)
    - **Desglose IVA** (`lblIvaDesglose` y `edtIvaDesglose`)
    - **Total** (`lblTotal` y `edtTotal`)
  - Los campos se ordenaron de manera horizontal y se configuraron como de sólo lectura (`ReadOnly = True`) para reflejar los cálculos automáticos de las líneas de detalle.
  - Para `frm_FacturasEditor.dfm`, el diseño se adaptó para no exceder el ancho de 850 píxeles.

- **`frm_AlbaranesEditor.pas` y `frm_FacturasEditor.pas` (Detalle de Líneas - Trazabilidad)**:
  - Se añadieron las columnas **Lote** (`lotes`) y **F. Caducidad** (`fecha_caducidad`) a la rejilla de detalle de artículos (`dbgItems`). Ahora se pueden visualizar e introducir de forma directa la trazabilidad en cada línea.

- **`frm_Facturas.pas` y `frm_Albaranes.pas` (Filtrado)**:
  - Se implementó el filtrado dinámico por SQL en el listado de facturas y de albaranes utilizando el valor de búsqueda `edtSearch.Text`. Ahora los listados se filtran por el nombre del cliente o el código/número de documento.
  
- **`frm_AlbaranesEditor.pas` y `frm_FacturasEditor.pas` (Eventos VCL)**:
  - Se movieron los manejadores de eventos `qryLinesAfterPost` y `qryLinesAfterDelete` de la sección `private` a la sección `published` (por defecto de la clase). Esto solucionó el error en tiempo de ejecución: `Error reading qryLines.AfterPost: Invalid property value`.

- **`frm_FacturasEditor.dfm`**:
  - Se eliminaron las propiedades de diseño de posicionamiento `ExplicitWidth` y `ExplicitHeight` de la rejilla heredada `dbgItems: TDBGrid`, solucionando el error en tiempo de ejecución: `Property ExplicitWidth does not exist`.

- **`frm_EmpresasEditor.pas` y `frm_EmpresasEditor.dfm` (Ampliación de Campos del Formulario)**:
  - Se añadieron y posicionaron de forma limpia todos los campos de la tabla `ge_empresas`: **ID (UUID)** (`edtId`), **Modelo de IA** (`edtIAmodelo`), **API Key** (`edtApiKey`), **Fecha de Creación** (`edtCreatedAt`), **Usuario Creador** (`edtUserCreator`), **Última Modificación** (`edtUpdatedAt`) y **Usuario Modificador** (`edtUserUpdate`).
  - Los campos de identificación y auditoría se configuraron como de sólo lectura (`ReadOnly = True`) con colores de fondo de sistema para mantener la integridad de los datos.
  - Se actualizaron los procedimientos `LoadData` y `DoAnadir` para poblar y limpiar estos campos respectivamente.
  - Se redimensionó la ventana principal del editor de empresas a `ClientHeight = 620` para contener de forma organizada toda la información.

- **Módulo de Proveedores, Albaranes y Facturas de Proveedores (Refactorización e Implementación)**:
  - **Gestión de Proveedores (Listado y Edición)**: Se crearon los formularios [frm_Proveedores.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_Proveedores.pas) (listado heredado de `TfrmBaseList`) y [frm_ProveedoresEditor.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_ProveedoresEditor.pas) (editor heredado de `TfrmBase`) para gestionar de forma integral los registros de `ge_proveedores`.
  - **Refactorización de Albaranes de Proveedores (`uProvAlbaranes`)**: Se actualizaron las sentencias SQL en [uProvAlbaranes.dfm](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/uProvAlbaranes.dfm) para apuntar a las nuevas tablas `ge_prov_albaranes`, `ge_prov_albaranes_detalle` y `ge_proveedores`. Se corrigió el enlace de claves en [uProvAlbaranes.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/uProvAlbaranes.pas) sustituyendo el método `.AsInteger` por `.AsString` e implementando la generación de UUIDs limpios durante las inserciones. Se eliminó la asignación del parámetro `Idempresa` en `qProvList` ya que la consulta de proveedores activos es global.
  - **Refactorización de Facturas de Proveedores (`uProvFacturas`)**: Se actualizaron las consultas en [uProvFacturas.dfm](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/uProvFacturas.dfm) para utilizar `ge_prov_facturas`, `ge_prov_facturas_detalle` y `ge_proveedores`, y se adaptaron los enlaces del código a tipo string/UUID en [uProvFacturas.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/uProvFacturas.pas). Se removió la asignación del parámetro `Idempresa` en `qProvList` para evitar excepciones en la inicialización.
  - **Integración con Menú Principal (`frm_Main`)**: Se registraron las nuevas unidades en [Gestion.dpr](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/Gestion.dpr), se implementaron los métodos de apertura de pestañas en [frm_Main.pas](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_Main.pas) y se vincularon los botones del Ribbon `btnProveedor` (Proveedores), `SpeedButton6` (Albaranes de Compra) y `SpeedButton7` (Facturas de Compra) a sus respectivos eventos OnClick en [frm_Main.dfm](file:///c:/fuentes/proyectos%20delphi/RAUL_ASENCIO/GESTION/src/UI/frm_Main.dfm).

### 2. Módulo de Datos (DataModule)

- **`dmg_Main.pas`**:
  - Se modificó la función `GetNextIDS` para eliminar el casting de UUID propio de PostgreSQL (`CAST(:emp AS uuid)`) que fallaba en MariaDB/MySQL. Ahora se utiliza una consulta estándar con parámetro: `WHERE empresa_id = :emp`.

---

## Instrucciones de Compilación para el Usuario

Para ver reflejados todos los cambios en tu ejecutable:

1. **Cerrar la aplicación** si está abierta.
2. Abre el proyecto en **Delphi 11**.
3. Realiza un **Build completo** (**Shift + F9**) para compilar y generar el nuevo ejecutable.
4. Ejecuta de nuevo y prueba a editar un Albarán o una Factura para validar el desglose de IVA y los totales.
