From 42b197c16d4f8572f0ba542085107d9049b3387b Mon Sep 17 00:00:00 2001 From: David Date: Thu, 10 Sep 2026 13:38:20 +0200 Subject: [PATCH] feat(sql): agregar script para completar nombres de snapshots fiscales en proforma_items --- .../sql/backfill-proforma-item-tax-names.sql | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 docs/customer-invoices/sql/backfill-proforma-item-tax-names.sql diff --git a/docs/customer-invoices/sql/backfill-proforma-item-tax-names.sql b/docs/customer-invoices/sql/backfill-proforma-item-tax-names.sql new file mode 100644 index 00000000..8e32a42e --- /dev/null +++ b/docs/customer-invoices/sql/backfill-proforma-item-tax-names.sql @@ -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;