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