Limpia documentos duplicados (misma sub-entidad + mismo document_type) creados ANTES del fix de reemplazo del microservicio (jun-2026). Conserva el mas reciente con archivo valido en storage, borra el resto (archivo MinIO si no lo referencia otra fila + fila + ajuste de cuota). --dry-run, conteo previo, idempotente; solo docs ligados a entidad (partida/cove/edocument). La creacion ya reemplaza desde jun-2026: verificado 0 duplicados posteriores al fix. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.1 KiB
3.1 KiB
Changelog — EFC Backend
Historial de cambios por ticket (más reciente arriba). Cada entrada: fecha, ticket,
tipo, repos afectados, qué se hizo y por qué. Reglas del flujo en ../CLAUDE.md.
T2025-09-004 — Pertenencia documento→entidad (matching de partidas + FK polimórfica)
- Fecha: 2026-06-24
- Tipo: feature
- Repos: backend (microservice/frontend: sin cambios — el microservicio ya embebe el número en el nombre del archivo y el backend resuelve la FK al crear el documento)
- Branch:
feature/T2025-09-004· PR: (pendiente de aceptación manual) - Qué se hizo:
- Matching documento→partida con frontera
(_|.|$)encore/partida_docs.py(cubre los 3 formatos de nombre sin confundir la partida 1 con 11/100). - FK reales
document.partida/cove/edocument(nullable,CASCADE); los acuses cuelgan de su cove/edoc padre; los documentos nativos (PC, remesa, subidas generales) quedan sin FK. - Resolución central en
Document.save()víacore/document_links.py: liga la FK pordocument_type+ nombre de archivo en toda ruta de creación (incluida la ingesta del microservicio); set explícito de la FK encreate_vu_record. - Comando
backfill_document_linkspara poblar la FK en filas existentes (idempotente). - Comando
dedup_documentspara limpiar documentos duplicados legados (misma entidad + mismo tipo): conserva el más reciente con archivo válido en storage, borra el resto (archivo MinIO si no lo referencia otra fila + fila + ajuste de cuota),--dry-run, conteo previo, idempotente. Los duplicados eran pre-fix: la descarga ya reemplaza en vez de re-crear desde jun-2026 (microservicio,post_or_update_document), verificado con 0 duplicados creados después del fix. Solo aplica a docs ligados a entidad. - Lectura, descarga y borrado SIEMPRE por la FK (id), nunca por nombre. El nombre solo
ESTABLECE la FK (en
Document.save()para altas y en el backfill para filas viejas).
- Matching documento→partida con frontera
- Por qué: retirar el matching frágil por nombre de archivo (
icontains/prefijo, que confundía entidades y se rompía con formatos nuevos) y tener la pertenencia documento→entidad como dato real, consultable e íntegro. - Migraciones:
0004_document_subentidad_fk(campos, metadata-only),0005_document_subentidad_idx(índices conCREATE INDEX CONCURRENTLY IF NOT EXISTS,atomic=False, idempotente víaSeparateDatabaseAndState),0006_analyze_document(ANALYZE document: refresca estadísticas del planner — sin esto, el prefetch hacía seq scan sobre ~5M filas y los endpoints tardaban ~9s). La tabladocumenttiene ~5M filas: cada índice tarda minutos y NO debe interrumpirse. Recuperación si se corta: índices válidos →migrate --fake record 0005; alguno INVALID →DROP INDEX IF EXISTS "<nombre>";y reintentarmigrate record. - Despliegue (orden obligatorio): aplicar migraciones (0004-0006) → correr el backfill completo → recién entonces la lectura/descarga/borrado por FK es correcta. Como NO hay fallback por nombre, un documento sin backfillear queda invisible hasta ligar su FK.