FactuGES_ERP/docs/customer-invoices/sql/normalize-document-series-snapshots.sql
david ee040b8335 Característica: Mejora de los modelos de facturas proforma y emitidas con atributos de serie de documentos
- Se han añadido `document_series_id`, `invoice_series_code` e `invoice_reference` a los modelos y instantáneas de facturas emitidas.
- Se han introducido `proforma_series_code` y `proforma_number`, y se han actualizado las referencias en los modelos y instantáneas de las facturas proforma.
- Se han actualizado los esquemas de la base de datos y los scripts SQL para dar cabida a los nuevos campos y garantizar la integridad de los datos.
- Se ha elaborado la documentación correspondiente a las nuevas series de documentos «contrato de instantánea» y «contrato de serie de facturas emitidas».
- Se han implementado scripts SQL de rellenado para completar los registros existentes con los nuevos campos.
2026-08-04 11:05:02 +02:00

86 lines
2.6 KiB
SQL

-- Normaliza snapshots documentales en `proformas` e `issued_invoices`.
-- Fases:
-- 1. DDL conservadora.
-- 2. Backfill de snapshots.
-- 3. Diagnostico/validacion.
-- 4. Endurecimiento opcional cuando no queden nulos.
ALTER TABLE proformas
ADD COLUMN IF NOT EXISTS proforma_series_code VARCHAR(10) NULL AFTER document_series_id;
ALTER TABLE issued_invoices
ADD COLUMN IF NOT EXISTS document_series_id CHAR(36) NULL AFTER source_proforma_id,
ADD COLUMN IF NOT EXISTS invoice_reference VARCHAR(64) NULL AFTER invoice_number;
UPDATE proformas p
JOIN document_series ds ON ds.id = p.document_series_id
SET p.proforma_series_code = ds.code
WHERE p.proforma_series_code IS NULL;
SELECT id, document_series_id, proforma_series_code, proforma_number, proforma_reference
FROM proformas
WHERE proforma_series_code IS NULL;
SELECT
ds.company_id,
ds.document_type,
ds.code,
COUNT(*) AS series_count
FROM document_series ds
WHERE ds.document_type = 'issued_invoice'
GROUP BY ds.company_id, ds.document_type, ds.code
HAVING COUNT(*) > 1;
UPDATE issued_invoices ii
JOIN document_series ds
ON ds.company_id = ii.company_id
AND ds.document_type = 'issued_invoice'
AND ds.code = ii.invoice_series_code
SET ii.document_series_id = ds.id
WHERE ii.document_series_id IS NULL;
SELECT id, invoice_series_code, invoice_number
FROM issued_invoices
ORDER BY created_at DESC
LIMIT 20;
UPDATE issued_invoices ii
JOIN document_series ds ON ds.id = ii.document_series_id
SET ii.invoice_reference = CONCAT(
COALESCE(ds.prefix, ''),
LPAD(CAST(ii.invoice_number AS UNSIGNED), ds.padding, '0'),
COALESCE(ds.suffix, '')
)
WHERE ii.invoice_reference IS NULL;
SELECT id, source_proforma_id, document_series_id, invoice_series_code, invoice_number, invoice_reference
FROM issued_invoices
WHERE document_series_id IS NULL
OR invoice_reference IS NULL;
SELECT company_id, proforma_series_code, proforma_number, COUNT(*) AS c
FROM proformas
WHERE deleted_at IS NULL
GROUP BY company_id, proforma_series_code, proforma_number
HAVING c > 1;
SELECT company_id, invoice_series_code, invoice_number, COUNT(*) AS c
FROM issued_invoices
WHERE deleted_at IS NULL
GROUP BY company_id, invoice_series_code, invoice_number
HAVING c > 1;
CREATE INDEX idx_proformas_document_series_id
ON proformas (document_series_id);
CREATE INDEX idx_issued_invoices_document_series_id
ON issued_invoices (document_series_id);
-- Ejecutar solo cuando las validaciones anteriores devuelvan 0 filas pendientes.
-- ALTER TABLE proformas
-- MODIFY proforma_series_code VARCHAR(10) NOT NULL;
--
-- ALTER TABLE issued_invoices
-- MODIFY document_series_id CHAR(36) NOT NULL,
-- MODIFY invoice_reference VARCHAR(64) NOT NULL;