fix/de los tickets T2026-05-027, T2025-09-004 y T2025-09-056
This commit is contained in:
90
scripts/t2026_05_027/01_deteccion_registros_afectados.sql
Normal file
90
scripts/t2026_05_027/01_deteccion_registros_afectados.sql
Normal file
@@ -0,0 +1,90 @@
|
||||
-- T2026-05-027 / Paso 1: detección de registros afectados (solo lectura)
|
||||
-- Ejecutar ANTES de la migración como línea base y DESPUÉS de la corrección
|
||||
-- (las queries deben regresar 0 filas al final).
|
||||
--
|
||||
-- Catálogo confirmado de document_type:
|
||||
-- 4 = acuse EDoc, 7 = acuse COVE, 19/23 = request COVE, 21/25 = request EDoc,
|
||||
-- 20 = error COVE, 22 = error EDoc, 24 = error acuse COVE, 26 = error acuse EDoc
|
||||
-- Confirmar con: SELECT id, nombre, descripcion FROM document_type ORDER BY id;
|
||||
|
||||
-- (a) Acuses de EDocument marcados descargados SIN documento tipo 4 en BD
|
||||
SELECT e.id, e.numero_edocument, p.pedimento, p.id AS pedimento_id, e.organizacion_id
|
||||
FROM edocs e
|
||||
JOIN pedimento p ON p.id = e.pedimento_id
|
||||
WHERE e.acuse_descargado = TRUE
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id
|
||||
AND d.document_type_id = 4
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%'
|
||||
);
|
||||
|
||||
-- (b) EDocuments marcados descargados SIN documento general
|
||||
SELECT e.id, e.numero_edocument, p.pedimento
|
||||
FROM edocs e
|
||||
JOIN pedimento p ON p.id = e.pedimento_id
|
||||
WHERE e.edocument_descargado = TRUE
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%'
|
||||
AND d.document_type_id NOT IN (4, 21, 22, 25, 26)
|
||||
);
|
||||
|
||||
-- (c) Acuses de COVE marcados descargados SIN documento tipo 7
|
||||
SELECT c.id, c.numero_cove, p.pedimento
|
||||
FROM coves c
|
||||
JOIN pedimento p ON p.id = c.pedimento_id
|
||||
WHERE c.acuse_cove_descargado = TRUE
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id
|
||||
AND d.document_type_id = 7
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%'
|
||||
);
|
||||
|
||||
-- (d) COVEs marcados descargados SIN documento general
|
||||
SELECT c.id, c.numero_cove, p.pedimento
|
||||
FROM coves c
|
||||
JOIN pedimento p ON p.id = c.pedimento_id
|
||||
WHERE c.cove_descargado = TRUE
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%'
|
||||
AND d.document_type_id NOT IN (7, 19, 20, 23, 24)
|
||||
);
|
||||
|
||||
-- (e) Pendientes con evidencia de error (documentos tipo 20/22/24/26)
|
||||
SELECT 'cove_acuse_pendiente_con_error' AS categoria, c.id::text, c.numero_cove AS numero
|
||||
FROM coves c
|
||||
WHERE c.acuse_cove_descargado = FALSE
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id AND d.document_type_id = 24
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%')
|
||||
UNION ALL
|
||||
SELECT 'cove_pendiente_con_error', c.id::text, c.numero_cove
|
||||
FROM coves c
|
||||
WHERE c.cove_descargado = FALSE
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id AND d.document_type_id = 20
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%')
|
||||
UNION ALL
|
||||
SELECT 'edoc_pendiente_con_error', e.id::text, e.numero_edocument
|
||||
FROM edocs e
|
||||
WHERE e.edocument_descargado = FALSE
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id AND d.document_type_id = 22
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%')
|
||||
UNION ALL
|
||||
SELECT 'edoc_acuse_pendiente_con_error', e.id::text, e.numero_edocument
|
||||
FROM edocs e
|
||||
WHERE e.acuse_descargado = FALSE
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id AND d.document_type_id = 26
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%');
|
||||
|
||||
-- (f) Verificación puntual del caso reportado por QA (pedimento del documento de pruebas)
|
||||
SELECT e.id, e.numero_edocument, e.edocument_descargado, e.acuse_descargado
|
||||
FROM edocs e
|
||||
WHERE e.pedimento_id = 'b4a6c3dd-5966-45a8-aa50-79b626ffd9c1';
|
||||
21
scripts/t2026_05_027/02_backfill_estados.sql
Normal file
21
scripts/t2026_05_027/02_backfill_estados.sql
Normal file
@@ -0,0 +1,21 @@
|
||||
-- T2026-05-027 / Paso 2: backfill de estados (ejecutar DESPUÉS de aplicar la
|
||||
-- migración de customs que agrega *_estado, *_intentos, ultimo_intento_at, ultimo_error).
|
||||
-- Deriva el estado de 3 valores de los booleanos legados.
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- Conteos de control: anotar y comparar contra las filas afectadas por cada UPDATE
|
||||
SELECT COUNT(*) AS total_edocs FROM edocs;
|
||||
SELECT COUNT(*) AS total_coves FROM coves;
|
||||
|
||||
UPDATE edocs SET
|
||||
edocument_estado = CASE WHEN edocument_descargado THEN 'descargado' ELSE 'pendiente' END,
|
||||
acuse_estado = CASE WHEN acuse_descargado THEN 'descargado' ELSE 'pendiente' END;
|
||||
|
||||
UPDATE coves SET
|
||||
cove_estado = CASE WHEN cove_descargado THEN 'descargado' ELSE 'pendiente' END,
|
||||
acuse_cove_estado = CASE WHEN acuse_cove_descargado THEN 'descargado' ELSE 'pendiente' END;
|
||||
|
||||
-- Validar que cada UPDATE afectó exactamente el total de su tabla antes de confirmar:
|
||||
COMMIT;
|
||||
-- ROLLBACK; -- usar en su lugar si los conteos no cuadran
|
||||
85
scripts/t2026_05_027/03_correccion_pendientes_con_error.sql
Normal file
85
scripts/t2026_05_027/03_correccion_pendientes_con_error.sql
Normal file
@@ -0,0 +1,85 @@
|
||||
-- T2026-05-027 / Paso 3: corrección masiva de pendientes con evidencia de error.
|
||||
-- Ejecutar DESPUÉS del backfill (02). Los registros 'pendiente' con documento de
|
||||
-- error asociado (tipos 20/22/24/26) transicionan a 'error' — quedan visibles y
|
||||
-- solo reprocesables de forma manual.
|
||||
--
|
||||
-- Los falsos "descargado" se corrigen con el comando (verifica también MinIO):
|
||||
-- python manage.py reconciliar_descargas -- dry-run
|
||||
-- python manage.py reconciliar_descargas --apply -- corrige
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- Conteo de control (comparar contra filas afectadas por el UPDATE correspondiente)
|
||||
SELECT COUNT(*) AS coves_acuse_error FROM coves c
|
||||
WHERE c.acuse_cove_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id AND d.document_type_id = 24
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%');
|
||||
|
||||
UPDATE coves c SET
|
||||
acuse_cove_estado = 'error',
|
||||
acuse_cove_descargado = FALSE,
|
||||
ultimo_error = 'Corrección T2026-05-027: acuse con documento de error (tipo 24) sin reintento',
|
||||
updated_at = NOW()
|
||||
WHERE c.acuse_cove_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id AND d.document_type_id = 24
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%');
|
||||
|
||||
SELECT COUNT(*) AS coves_error FROM coves c
|
||||
WHERE c.cove_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id AND d.document_type_id = 20
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%');
|
||||
|
||||
UPDATE coves c SET
|
||||
cove_estado = 'error',
|
||||
cove_descargado = FALSE,
|
||||
ultimo_error = 'Corrección T2026-05-027: COVE con documento de error (tipo 20) sin reintento',
|
||||
updated_at = NOW()
|
||||
WHERE c.cove_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = c.pedimento_id AND d.document_type_id = 20
|
||||
AND d.archivo ILIKE '%' || c.numero_cove || '%');
|
||||
|
||||
SELECT COUNT(*) AS edocs_error FROM edocs e
|
||||
WHERE e.edocument_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id AND d.document_type_id = 22
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%');
|
||||
|
||||
UPDATE edocs e SET
|
||||
edocument_estado = 'error',
|
||||
edocument_descargado = FALSE,
|
||||
ultimo_error = 'Corrección T2026-05-027: EDocument con documento de error (tipo 22) sin reintento',
|
||||
updated_at = NOW()
|
||||
WHERE e.edocument_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id AND d.document_type_id = 22
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%');
|
||||
|
||||
SELECT COUNT(*) AS edocs_acuse_error FROM edocs e
|
||||
WHERE e.acuse_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id AND d.document_type_id = 26
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%');
|
||||
|
||||
UPDATE edocs e SET
|
||||
acuse_estado = 'error',
|
||||
acuse_descargado = FALSE,
|
||||
ultimo_error = 'Corrección T2026-05-027: acuse con documento de error (tipo 26) sin reintento',
|
||||
updated_at = NOW()
|
||||
WHERE e.acuse_estado = 'pendiente'
|
||||
AND EXISTS (SELECT 1 FROM document d
|
||||
WHERE d.pedimento_id = e.pedimento_id AND d.document_type_id = 26
|
||||
AND d.archivo ILIKE '%' || e.numero_edocument || '%');
|
||||
|
||||
COMMIT;
|
||||
-- ROLLBACK; -- usar en su lugar si los conteos no cuadran
|
||||
|
||||
-- Censo final: distribución de estados (no debe existir valor fuera del catálogo)
|
||||
SELECT 'edocs' AS tabla, edocument_estado AS estado, COUNT(*) FROM edocs GROUP BY 2
|
||||
UNION ALL SELECT 'edocs_acuse', acuse_estado, COUNT(*) FROM edocs GROUP BY 2
|
||||
UNION ALL SELECT 'coves', cove_estado, COUNT(*) FROM coves GROUP BY 2
|
||||
UNION ALL SELECT 'coves_acuse', acuse_cove_estado, COUNT(*) FROM coves GROUP BY 2
|
||||
ORDER BY tabla, estado;
|
||||
Reference in New Issue
Block a user