128 lines
4.7 KiB
SQL
128 lines
4.7 KiB
SQL
-- 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;
|