v2.1 — UUID de CFDI por folio

Primera pieza del layout completo (ver docs/v1_0_cierre.md para el roadmap de columnas pendientes: pago, proveedor, CFDI, XML). Esta cierra la columna UUID.

Query

docs/queries/gastos/v_uuid_detalle_por_folio.sql — 1 fila por (folio, UUID), sin agregar (SQL Server de esta instancia no soporta STRING_AGG, versión anterior a 2017). La agregación a lista/conteo por folio se hace en Python.

Regla final

  1. Nivel folio (Gasto_Registro), nunca Grd_ID/documento — replica la lógica exacta de RPAG008_99.asp (MPRO tampoco resuelve la ambigüedad a nivel documento, delega al usuario mostrando “Varios”).
  2. Join con LIKE gr.Gr_Folio + '%', no LEFT(Cd_Documento, LEN(Gr_Folio)) = Gr_Folio — la versión con LEFT() no es sargable, escanea las 671k filas de Comprobante_Digital completas por cada folio (~9,000 folios × 671k filas). Con LIKE y comodín al final, SQL Server sí usa el índice (~7s contra el semestre completo, vs. varios minutos con LEFT()).
  3. Deduplicar siempre por Cd_Timbre_UUID distinto, nunca por conteo de filas de Comprobante_Digital. Comprobante_Digital puede traer 2+ filas físicas para el mismo comprobante (registro de encabezado vs. detalle, Cd_Documento de 10 vs. 14 caracteres — visto en RPAG008_99.asp). Contar filas crudas genera falsos “Varios”: en la primera pasada, 501 de 614 folios marcados como “2+” eran el mismo UUID duplicado, no facturas distintas.
  4. Cuando de verdad hay 2+ UUIDs distintos, se listan todos (no se muestra “Varios” como texto, a diferencia de MPRO) — con la deduplicación, esos casos son folios de lote con múltiples facturas reales, vale la pena verlas todas.

Resultado (enero-junio 2026, 9,162 folios)

CategoríaFolios%
1 comprobante8,42491.9%
0 (sin XML)6256.8%
2+ (Varios real)1131.2%

El “sin XML” no es un hueco de datos — es esperado por diseño de negocio: GASTO_RECLASIFICACION (0/86, 100%) y folios de reversión (Importe<=-$1, 32/35, 91%) son movimientos contables internos sin CFDI asociado.

Pendiente / no explorado en esta pieza

  • Los 113 folios “Varios real” no se inspeccionaron uno por uno — se asume que son lotes legítimos (similar al patrón de “costeo estándar” ya visto en v1.0), pero no se confirmó con drill-down individual.
  • Mecanismo alterno visto en RPAG008_99.asp para Cd_Documento de ≤10 caracteres: busca en tabla Adjunto (no Comprobante_Digital) — no explorado, puede ser una fuente adicional de UUID/adjuntos no capturada todavía.

Véase también

  • docs/v1_0_cierre.md — roadmap completo del layout extendido.
  • Exploración anterior (consulta_xmls_gastos): confirma los mismos dos caminos de UUID (Pago_Cxp_Comprobante.Pcc_Timbre_UUID para gastos vía pago, Comprobante_Digital.Cd_Timbre_UUID para compras) — este cierre usa únicamente el segundo camino, anclado en Gasto_Registro directo.