FactuGES_ERP/docs/customer-invoices/sql/normalize-document-series-snapshots.sql

86 lines
2.6 KiB
MySQL
Raw Normal View History

-- 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;