Roadmap — Layout de Gastos completo (60 columnas)

Fuente: Requerimiento_de_Reportes_de_Contabilidad_auditoria_V2.docx (Ismael Valdez, Contabilidad) — mismo requerimiento original que ya trabajó la exploración anterior (layout-gastos-streamlit-claude, ver docs 00-18). Esta página es el inventario de qué tanto cubre nuestra segunda vuelta (layout_gastos/, 2026-08-04) del total de columnas pedidas.

Mapeo completo del layout (60 columnas, numeradas según el Excel de referencia del programador)

Confirmado 2026-08-05 contra dos filas de muestra del Excel de producción (aaron_query/). El prefijo numérico en cada columna de impuesto (1-IVA ACREDITABLE 16%, 26-ISR RETENIDO RESICO 1.25%, etc.) es casi con certeza el Im_Cve_Impuesto del catálogo Impuesto — el mismo mecanismo de clasificación que v5.0 ya usa, solo que la muestra sumada hasta ahora (12 columnas) no cubrió el universo completo de códigos.

#ColumnaEstado
1Operacion (ID)✅ resuelto — v0.1/v1.0, 100%
2Fecha✅ resuelto — etapa 6, 100%
3Moneda✅ resuelto — etapa 6, 100%
4Clave del proveedor✅ resuelto — etapa 6, 100% (1425/1425)
5RFC del proveedor✅ resuelto — etapa 6, 100%
6Nombre del proveedor✅ resuelto — etapa 6, 100%
7Cobrado en Efectivo✅ resuelto — etapa 6, 95.7% (1364/1425). Fp_Cve_Forma_Pago='0001' nunca usado en enero 2026 (confirmado contra catálogo)
8Cobrado con Cheque o Transferencia✅ resuelto — etapa 6, 95.7% (1364/1425)
9Cheque✅ resuelto — etapa 6, 95.7% (1364/1425)
10CFDI Comprobante de pago✅ resuelto — etapa 6, 90.1% (1284/1425). Pago_Cxp_Comprobante.Pcc_Timbre_UUID, cruzado contra consulta_xmls_gastos
11FACTURA_REF❌ gap conocido — etapa 6, 3 candidatos descartados por evidencia (todos menores al 1% poblados)
12Banco✅ resuelto — etapa 6, 95.7% (1364/1425)
13Cuenta bancaria✅ resuelto — etapa 6, 95.7% (1364/1425)
14Fecha de cheque✅ resuelto — etapa 6, 89.3% (1273/1425)
15No.Cheque o No.Transf✅ resuelto — etapa 6, 89.3% (1273/1425)
16Monto Cobrado✅ resuelto — etapa 6, 95.7% (1364/1425), ya expuesta como columna final
17Tipo de comprobante✅ resuelto — etapa 6, 91.8% (1308/1425)
18Numero de factura✅ resuelto — etapa 6, 94.0% (1339/1425)
19Subtotal 0%✅ resuelto — v5.0 (SUBTOTAL_0)
20Subtotal 16%✅ resuelto — v5.0 (SUBTOTAL_16)
21Subtotal exento✅ resuelto — v5.0 (SUBTOTAL_EXENTA)
22Descuento❌ gap conocido — sin origen identificado, 0 explícito incluso en el reporte del programador externo
23Descuento global❌ gap conocido — mismo caso que Descuento
24Subtotal Neto✅ resuelto — v5.0 (SUBTOTAL_NETO_LAYOUT), validado por cuadre cruzado del bloque 19-40 (100%, ver abajo)
2526-ISR RETENIDO RESICO 1.25%✅ resuelto — v5.0 (ISR_RESICO_1_25)
2623-IVA RETENIDO S/ARRENDAMIENTO 10.67✅ resuelto — v5.0 (IVA_ARRENDAMIENTO_10_67), confirmado en v5_impuestos_layout.sql
2722-IMSS PATRON✅ resuelto — v5.0 (IMSS_PATRON). Columna independiente, no es retención de IVA ni ISR
2818-IVA RETENIDO SOBRE HONORARIOS 10.67%✅ resuelto — v5.0 (IVA_HONORARIOS_10_67)
2915-IVA RETENIDO SOBRE FLETES 4% (PROVEEDOR)✅ resuelto — v5.0 (IVA_FLETES_4_PROVEEDOR)
3014-ISR RETENIDO SOBRE INTERESES 20%✅ resuelto — v5.0 (ISR_INTERESES_20)
3113-ISR RETENIDO SOBRE DIVIDENDOS 10%✅ resuelto — v5.0 (ISR_DIVIDENDOS_10)
3212-ISR RETENIDO SOBRE ARRENDAMIENTOS 10%✅ resuelto — v5.0 (ISR_ARRENDAMIENTOS_10)
3311-ISR RETENIDO SOBRE HONORARIOS 10%✅ resuelto — v5.0 (ISR_HONORARIOS_10)
345-IVA ACREDITABLE IMPORTACIÓN✅ resuelto — v5.0 (IVA_IMPORTACION)
353-IVA ACREDITABLE 0%✅ resuelto — v5.0 (IVA_ACREDITABLE_0), pareja de Subtotal 0% (col. 19)
362-IVA ACREDITABLE 16% VARIABLE✅ resuelto — v5.0 (IVA_ACREDITABLE_16_VARIABLE)
371-IVA ACREDITABLE 16%✅ resuelto — v5.0 (IVA_ACREDITABLE_16), pareja de Subtotal 16% (col. 20)
38Retenciones de IVA✅ resuelto — v5.0 (RETENCIONES_IVA, agregado)
39Retenciones de ISR✅ resuelto — v5.0 (RETENCIONES_ISR, agregado)
40Total✅ resuelto — v5.0 (TOTAL_LAYOUT)
41UUID✅ resuelto — v2.1
42UUID_4🟢 fácil — probablemente derivado de UUID (últimos 4 caracteres)
43Fecha Factura🟢 fácil — Comprobante_Digital, v2.1
44Concepto gasto🆕 sin origen identificado
45Clave Uso bien o servicio🆕 sin origen identificado
46Descripcion Uso bien o servicio🆕 sin origen identificado
47XML RFC EMISOR🟢 fácil — Comprobante_Digital, v2.1
48XML MONTO🟢 fácil
49XML SERIE🟢 fácil
50XML FOLIO🟢 fácil
51XML METODO PAGO🟢 fácil
52XML FORMA PAGO🟢 fácil
53Fecha de poliza🟢 fácil — Poliza, v1.0
54Tipo de poliza🟢 fácil
55Numero de poliza🟢 fácil
56Concepto de poliza🟢 fácil
57Cuenta Registro✅ resuelto — v1.0/v0.3, 99.96%. Granularidad sin re-confirmar (riesgo abierto, ver exploracion-2026-08-04.md)
58Nombre Cuenta Registro✅ resuelto, mismo caveat de granularidad
59Cargo✅ resuelto, mismo caveat de granularidad
60Abono✅ resuelto, mismo caveat de granularidad

Descubrimiento (2026-08-05): las columnas de IVA van pareadas con su Subtotal, no son territorio nuevo

Verificado con dato real (folio 05-0147022, muestra del Excel de producción): Subtotal 16% = 5,400.00 → 1-IVA ACREDITABLE 16% = 864.00 (exacto 16% de 5,400) y 15-IVA RETENIDO SOBRE FLETES 4% = -216.00 (exacto 4% de 5,400); Total = 6,048.00 = 5,400 + 864 − 216, cuadra perfecto.

Esto significa que cada Subtotal X% tiene una casilla de IVA correspondiente, calculada sobre esa misma base:

Subtotal (base)Columna de IVA pareada
Subtotal 0% (col. 19)3-IVA ACREDITABLE 0% (col. 35)
Subtotal 16% (col. 20)1-IVA ACREDITABLE 16% (col. 37)
— (caso especial 16% variable)2-IVA ACREDITABLE 16% VARIABLE (col. 36)
— (importación)5-IVA ACREDITABLE IMPORTACIÓN (col. 34)
Subtotal exento (col. 21)no aplica IVA por definición

Consecuencia práctica: las columnas 34-37 no son territorio nuevo separado — salen de la misma tabla/mecanismo que v5.0 ya toca (Gasto_Registro_Impuesto + Impuesto, clasificado por Im_Cve_Impuesto).

Corrección 2026-08-05 (tras revisar v5_impuestos_layout.sql directamente): la query YA calcula las 21 columnas de la 19 a la 40 completas, incluidas las 4 de IVA acreditable (IVA_ACREDITABLE_0, IVA_ACREDITABLE_16_VARIABLE, IVA_ACREDITABLE_16, IVA_IMPORTACION) y las 4 columnas de retención que faltaba confirmar (26, 28, 32, 33 sí están: IVA_ARRENDAMIENTO_10_67, IVA_HONORARIOS_10_67, ISR_ARRENDAMIENTOS_10, ISR_HONORARIOS_10). El gap no estaba en el SQL — estaba en validar_impuestos_v5.py, cuya lista cols_layout solo mostraba/sumaba 12 de las 21 columnas ya calculadas por la query. No hace falta extender la query, solo corregir el script de validación para exponer todo lo que ya trae.

DESCUENTO y DESCUENTO_GLOBAL (columnas 22-23) sí son un gap real: la query los deja como CAST(0 AS money), placeholder explícito del autor original — sin fuente identificada todavía.

Nota 2026-08-05 sobre validación cruzada: al validar Subtotal Neto + IVA acreditable + Retenciones = Total, 5/1,425 folios (enero 2026) no cuadraban por una fórmula incompleta, no por dato faltante — IMSS_PATRON (Im_Cve_Impuesto = '0022', columna 27) es su propia columna independiente, no forma parte de RETENCIONES_IVA ni RETENCIONES_ISR en la query (tiene sentido de negocio: el IMSS patronal no se retiene al proveedor). La fórmula de cuadre correcta es Subtotal Neto + IVA acreditable + Retenciones IVA + Retenciones ISR + IMSS Patrón = Total.

Bloque 19-40 cerrado (2026-08-05): con la fórmula corregida, el cuadre cruzado del bloque completo da 100% (1,425/1,425 folios, enero 2026). Único gap real que queda dentro de este bloque: Descuento/Descuento global (22-23), placeholder sin fuente identificada. Todas las demás 19 columnas están resueltas, clasificadas y verificadas contra el total del documento.

Ya resuelto y validado (esta sesión, 2026-08-04)

Columna del layoutPiezaEstado
Operacion (ID)v0.1/v1.0100%
Subtotal Neto, Totalv0.1100%
UUIDv2.191.9% con 1 XML directo, 6.8% sin XML esperado, 1.2% multi-factura real
Cuenta Registro, Nombre Cuenta Registro, Cargo, Abonov1.0/v0.399.96% (9,158/9,162 folios, enero-junio)
Monto Cobrado (validación, no columna final todavía)v2.2100% (6,398/6,398 folios, caso general, enero-junio)

Etapa 6 cerrada (2026-08-06): bloque 1-18, con hallazgo crítico de bug de fan-out

Resultado final: Proveedor 100%, Cobro/pago 95.7% (1364/1425), CFDI comprobante de pago 90.1%, Tipo comprobante 91.8%, Número de factura 94.0%. Detalle completo: etapa6_bloque_1_18_proveedor_pago_cierre.md.

Hallazgo importante — bug de fan-out por referencia vacía: al extender el match de CXP por referencia consolidada (usado originalmente solo para combustible) a todos los folios, se detectó que folios con Grd_Referencia vacío y Pv_Cve_Proveedor='0000000000' (PROVEEDORES VARIOS, placeholder genérico) generaban falsos positivos masivos — la condición de match se volvía “cualquier CXP con referencia vacía y proveedor genérico”, encontrando cientos de Cxp_Folio no relacionados de años de historial. Se detectó porque GASTO_RECLASIFICACION (que sabíamos con certeza que no genera CXP) pasó de 0/13 a 8/13 tras el cambio — señal inequívoca de falso positivo. Fix: exigir Grd_Referencia IS NOT NULL AND LTRIM(RTRIM(Grd_Referencia)) <> '' en el match por referencia. Se investigaron alternativas más robustas (Control_Combustible, Comprobacion_Gasto) y ambas se descartaron con evidencia — no hay una FK más limpia disponible, el texto de la referencia es el único ancla real que existe en el sistema para este mecanismo.

  • Fecha, Moneda — ya en Gasto_Registro/Gasto_Registro_Documento.
  • Clave del proveedor, RFC del proveedor, Nombre del proveedor — JOIN Proveedor adicional.
  • Fecha de poliza, Tipo de poliza, Numero de poliza, Concepto de poliza — ya estamos en Poliza (v1.0), solo traer más columnas.
  • XML RFC EMISOR, XML MONTO, XML SERIE, XML FOLIO, XML METODO PAGO, XML FORMA PAGO, Fecha Factura, Tipo de comprobante — ya estamos en Comprobante_Digital (v2.1), solo traer más columnas de la misma fila.
  • Cobrado en Efectivo, Cobrado con Cheque o Transferencia, Banco, Cuenta bancaria, Fecha de cheque, No.Cheque o No.Transf — vía Pago_CXP/Cheque, ya identificado en el reporte de producción compartido (ContabilidadRepository.txt), no explorado con datos propios todavía.

Territorio nuevo — sin explorar

  • Impuestos por tasa: Subtotal 0%, Subtotal 16%, Subtotal exento, Descuento, Descuento global, y ~13 columnas de retenciones específicas (ISR RESICO, IVA s/arrendamiento, IMSS patrón, etc.) — salen de Gasto_Registro_Impuesto + Impuesto, tabla no tocada en ninguna de las dos exploraciones. Es el bloque más grande pendiente, probablemente el que más validación necesite (cada retención es un SUM(CASE...) filtrado por cuenta/tasa específica en el reporte de producción).
  • FACTURA_REF, Concepto gasto, Clave Uso bien o servicio, Descripcion Uso bien o servicio — no identificado su origen todavía.

Piezas resueltas con dos casos especiales (no estándar)

  • CXP para CONTROL_COMBUSTIBLE: no usa el link estándar por folio — es un link por texto (Cxp_Referencia = Grd_Referencia, mismo proveedor), consolidado semanalmente. 30/30 referencias enero, 32/32 mayo, $0.00 diferencia — resuelto y corregido (ver docs/control_combustible_hallazgo.md, sección “Corrección 2026-08-04”: el join debe agregar con SUM del lado de Cuenta_X_Pagar, no dejarlo crudo, o produce fan-out).
  • GASTO_RECLASIFICACION y folios con Gr_Genera_Cxp='NO': no generan CXP por diseño de negocio — confirmado, no es hueco de datos.

Pendiente inmediato

  1. Escribir .md de cierre de v2.2 (CXP caso general) — validado 100% pero sin documentar todavía.
  2. Explorar Pago_CXP/Cheque para las columnas de pago (banco, cheque, fecha) — la pieza “fácil” más próxima.
  3. Explorar Gasto_Registro_Impuesto + Impuesto para el bloque de tasas/retenciones — la pieza grande sin empezar.

Relación con la exploración anterior

La exploración anterior (layout-gastos-streamlit-claude/docs/00-18, completada ~junio-julio 2026) llegó a un v1.1 funcional que sí cubre prácticamente todas estas columnas de una vez (ver docs/03_hito_v1.md y 05_hito_v1_1.md), con +0.89% de brecha de reconciliación. Esta segunda vuelta (layout_gastos/, agosto 2026) no repite ese trabajo — lo usa como referencia y lo re-valida pieza por pieza con datos propios, encontrando en el camino cosas que la primera exploración no tenía documentadas (el join simple sin CONVERT, el filtro Gr_Genera_Cxp, la moneda original sin convertir para CXP, el mecanismo de combustible).