feat(sql): agregar script para completar nombres de snapshots fiscales en proforma_items

This commit is contained in:
David Arranz 2026-09-10 13:38:20 +02:00
parent d57b71c200
commit 42b197c16d

View File

@ -0,0 +1,127 @@
-- Completa los nombres de los snapshots fiscales de proforma_items.
--
-- Fuente: tax_definitions vigente (misma company_id y code).
-- Seguridad:
-- * Solo completa iva_name, rec_name y retention_name vacíos o NULL.
-- * No modifica códigos, porcentajes, escalas ni importes.
-- * No inventa nombres: los códigos sin TaxDefinition no se actualizan.
--
-- Ejecutar primero los SELECT de diagnóstico. Ejecutar el UPDATE dentro de una
-- transacción únicamente después de revisar los resultados.
-- Diagnóstico: filas que el backfill completará.
SELECT
pi.item_id,
pi.proforma_id,
p.company_id,
pi.iva_code,
iva.name AS iva_name_source,
pi.rec_code,
rec.name AS rec_name_source,
pi.retention_code,
retention.name AS retention_name_source
FROM proforma_items pi
INNER JOIN proformas p ON p.id = pi.proforma_id
LEFT JOIN tax_definitions iva
ON iva.company_id = p.company_id
AND iva.code = pi.iva_code
AND iva.deleted_at IS NULL
LEFT JOIN tax_definitions rec
ON rec.company_id = p.company_id
AND rec.code = pi.rec_code
AND rec.deleted_at IS NULL
LEFT JOIN tax_definitions retention
ON retention.company_id = p.company_id
AND retention.code = pi.retention_code
AND retention.deleted_at IS NULL
WHERE (NULLIF(TRIM(pi.iva_name), '') IS NULL AND NULLIF(TRIM(pi.iva_code), '') IS NOT NULL AND iva.id IS NOT NULL)
OR (NULLIF(TRIM(pi.rec_name), '') IS NULL AND NULLIF(TRIM(pi.rec_code), '') IS NOT NULL AND rec.id IS NOT NULL)
OR (
NULLIF(TRIM(pi.retention_name), '') IS NULL
AND NULLIF(TRIM(pi.retention_code), '') IS NOT NULL
AND retention.id IS NOT NULL
);
-- Diagnóstico: códigos con nombre vacío que no tienen una TaxDefinition disponible.
-- Estas filas se preservan sin cambios y requieren una decisión de recuperación manual.
SELECT
pi.item_id,
pi.proforma_id,
p.company_id,
CASE
WHEN NULLIF(TRIM(pi.iva_name), '') IS NULL AND NULLIF(TRIM(pi.iva_code), '') IS NOT NULL AND iva.id IS NULL
THEN pi.iva_code
END AS missing_iva_definition_code,
CASE
WHEN NULLIF(TRIM(pi.rec_name), '') IS NULL AND NULLIF(TRIM(pi.rec_code), '') IS NOT NULL AND rec.id IS NULL
THEN pi.rec_code
END AS missing_rec_definition_code,
CASE
WHEN NULLIF(TRIM(pi.retention_name), '') IS NULL AND NULLIF(TRIM(pi.retention_code), '') IS NOT NULL AND retention.id IS NULL
THEN pi.retention_code
END AS missing_retention_definition_code
FROM proforma_items pi
INNER JOIN proformas p ON p.id = pi.proforma_id
LEFT JOIN tax_definitions iva
ON iva.company_id = p.company_id
AND iva.code = pi.iva_code
AND iva.deleted_at IS NULL
LEFT JOIN tax_definitions rec
ON rec.company_id = p.company_id
AND rec.code = pi.rec_code
AND rec.deleted_at IS NULL
LEFT JOIN tax_definitions retention
ON retention.company_id = p.company_id
AND retention.code = pi.retention_code
AND retention.deleted_at IS NULL
WHERE (NULLIF(TRIM(pi.iva_name), '') IS NULL AND NULLIF(TRIM(pi.iva_code), '') IS NOT NULL AND iva.id IS NULL)
OR (NULLIF(TRIM(pi.rec_name), '') IS NULL AND NULLIF(TRIM(pi.rec_code), '') IS NOT NULL AND rec.id IS NULL)
OR (
NULLIF(TRIM(pi.retention_name), '') IS NULL
AND NULLIF(TRIM(pi.retention_code), '') IS NOT NULL
AND retention.id IS NULL
);
START TRANSACTION;
UPDATE proforma_items pi
INNER JOIN proformas p ON p.id = pi.proforma_id
LEFT JOIN tax_definitions iva
ON iva.company_id = p.company_id
AND iva.code = pi.iva_code
AND iva.deleted_at IS NULL
LEFT JOIN tax_definitions rec
ON rec.company_id = p.company_id
AND rec.code = pi.rec_code
AND rec.deleted_at IS NULL
LEFT JOIN tax_definitions retention
ON retention.company_id = p.company_id
AND retention.code = pi.retention_code
AND retention.deleted_at IS NULL
SET
pi.iva_name = CASE
WHEN NULLIF(TRIM(pi.iva_name), '') IS NULL AND NULLIF(TRIM(pi.iva_code), '') IS NOT NULL AND iva.id IS NOT NULL
THEN iva.name
ELSE pi.iva_name
END,
pi.rec_name = CASE
WHEN NULLIF(TRIM(pi.rec_name), '') IS NULL AND NULLIF(TRIM(pi.rec_code), '') IS NOT NULL AND rec.id IS NOT NULL
THEN rec.name
ELSE pi.rec_name
END,
pi.retention_name = CASE
WHEN NULLIF(TRIM(pi.retention_name), '') IS NULL AND NULLIF(TRIM(pi.retention_code), '') IS NOT NULL AND retention.id IS NOT NULL
THEN retention.name
ELSE pi.retention_name
END
WHERE (NULLIF(TRIM(pi.iva_name), '') IS NULL AND NULLIF(TRIM(pi.iva_code), '') IS NOT NULL AND iva.id IS NOT NULL)
OR (NULLIF(TRIM(pi.rec_name), '') IS NULL AND NULLIF(TRIM(pi.rec_code), '') IS NOT NULL AND rec.id IS NOT NULL)
OR (
NULLIF(TRIM(pi.retention_name), '') IS NULL
AND NULLIF(TRIM(pi.retention_code), '') IS NOT NULL
AND retention.id IS NOT NULL
);
-- Revisar ROW_COUNT() y los dos diagnósticos anteriores antes de confirmar.
-- COMMIT;
-- ROLLBACK;