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