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.
| # | Columna | Estado |
|---|---|---|
| 1 | Operacion (ID) | ✅ resuelto — v0.1/v1.0, 100% |
| 2 | Fecha | ✅ resuelto — etapa 6, 100% |
| 3 | Moneda | ✅ resuelto — etapa 6, 100% |
| 4 | Clave del proveedor | ✅ resuelto — etapa 6, 100% (1425/1425) |
| 5 | RFC del proveedor | ✅ resuelto — etapa 6, 100% |
| 6 | Nombre del proveedor | ✅ resuelto — etapa 6, 100% |
| 7 | Cobrado en Efectivo | ✅ resuelto — etapa 6, 95.7% (1364/1425). Fp_Cve_Forma_Pago='0001' nunca usado en enero 2026 (confirmado contra catálogo) |
| 8 | Cobrado con Cheque o Transferencia | ✅ resuelto — etapa 6, 95.7% (1364/1425) |
| 9 | Cheque | ✅ resuelto — etapa 6, 95.7% (1364/1425) |
| 10 | CFDI Comprobante de pago | ✅ resuelto — etapa 6, 90.1% (1284/1425). Pago_Cxp_Comprobante.Pcc_Timbre_UUID, cruzado contra consulta_xmls_gastos |
| 11 | FACTURA_REF | ❌ gap conocido — etapa 6, 3 candidatos descartados por evidencia (todos menores al 1% poblados) |
| 12 | Banco | ✅ resuelto — etapa 6, 95.7% (1364/1425) |
| 13 | Cuenta bancaria | ✅ resuelto — etapa 6, 95.7% (1364/1425) |
| 14 | Fecha de cheque | ✅ resuelto — etapa 6, 89.3% (1273/1425) |
| 15 | No.Cheque o No.Transf | ✅ resuelto — etapa 6, 89.3% (1273/1425) |
| 16 | Monto Cobrado | ✅ resuelto — etapa 6, 95.7% (1364/1425), ya expuesta como columna final |
| 17 | Tipo de comprobante | ✅ resuelto — etapa 6, 91.8% (1308/1425) |
| 18 | Numero de factura | ✅ resuelto — etapa 6, 94.0% (1339/1425) |
| 19 | Subtotal 0% | ✅ resuelto — v5.0 (SUBTOTAL_0) |
| 20 | Subtotal 16% | ✅ resuelto — v5.0 (SUBTOTAL_16) |
| 21 | Subtotal exento | ✅ resuelto — v5.0 (SUBTOTAL_EXENTA) |
| 22 | Descuento | ❌ gap conocido — sin origen identificado, 0 explícito incluso en el reporte del programador externo |
| 23 | Descuento global | ❌ gap conocido — mismo caso que Descuento |
| 24 | Subtotal Neto | ✅ resuelto — v5.0 (SUBTOTAL_NETO_LAYOUT), validado por cuadre cruzado del bloque 19-40 (100%, ver abajo) |
| 25 | 26-ISR RETENIDO RESICO 1.25% | ✅ resuelto — v5.0 (ISR_RESICO_1_25) |
| 26 | 23-IVA RETENIDO S/ARRENDAMIENTO 10.67 | ✅ resuelto — v5.0 (IVA_ARRENDAMIENTO_10_67), confirmado en v5_impuestos_layout.sql |
| 27 | 22-IMSS PATRON | ✅ resuelto — v5.0 (IMSS_PATRON). Columna independiente, no es retención de IVA ni ISR |
| 28 | 18-IVA RETENIDO SOBRE HONORARIOS 10.67% | ✅ resuelto — v5.0 (IVA_HONORARIOS_10_67) |
| 29 | 15-IVA RETENIDO SOBRE FLETES 4% (PROVEEDOR) | ✅ resuelto — v5.0 (IVA_FLETES_4_PROVEEDOR) |
| 30 | 14-ISR RETENIDO SOBRE INTERESES 20% | ✅ resuelto — v5.0 (ISR_INTERESES_20) |
| 31 | 13-ISR RETENIDO SOBRE DIVIDENDOS 10% | ✅ resuelto — v5.0 (ISR_DIVIDENDOS_10) |
| 32 | 12-ISR RETENIDO SOBRE ARRENDAMIENTOS 10% | ✅ resuelto — v5.0 (ISR_ARRENDAMIENTOS_10) |
| 33 | 11-ISR RETENIDO SOBRE HONORARIOS 10% | ✅ resuelto — v5.0 (ISR_HONORARIOS_10) |
| 34 | 5-IVA ACREDITABLE IMPORTACIÓN | ✅ resuelto — v5.0 (IVA_IMPORTACION) |
| 35 | 3-IVA ACREDITABLE 0% | ✅ resuelto — v5.0 (IVA_ACREDITABLE_0), pareja de Subtotal 0% (col. 19) |
| 36 | 2-IVA ACREDITABLE 16% VARIABLE | ✅ resuelto — v5.0 (IVA_ACREDITABLE_16_VARIABLE) |
| 37 | 1-IVA ACREDITABLE 16% | ✅ resuelto — v5.0 (IVA_ACREDITABLE_16), pareja de Subtotal 16% (col. 20) |
| 38 | Retenciones de IVA | ✅ resuelto — v5.0 (RETENCIONES_IVA, agregado) |
| 39 | Retenciones de ISR | ✅ resuelto — v5.0 (RETENCIONES_ISR, agregado) |
| 40 | Total | ✅ resuelto — v5.0 (TOTAL_LAYOUT) |
| 41 | UUID | ✅ resuelto — v2.1 |
| 42 | UUID_4 | 🟢 fácil — probablemente derivado de UUID (últimos 4 caracteres) |
| 43 | Fecha Factura | 🟢 fácil — Comprobante_Digital, v2.1 |
| 44 | Concepto gasto | 🆕 sin origen identificado |
| 45 | Clave Uso bien o servicio | 🆕 sin origen identificado |
| 46 | Descripcion Uso bien o servicio | 🆕 sin origen identificado |
| 47 | XML RFC EMISOR | 🟢 fácil — Comprobante_Digital, v2.1 |
| 48 | XML MONTO | 🟢 fácil |
| 49 | XML SERIE | 🟢 fácil |
| 50 | XML FOLIO | 🟢 fácil |
| 51 | XML METODO PAGO | 🟢 fácil |
| 52 | XML FORMA PAGO | 🟢 fácil |
| 53 | Fecha de poliza | 🟢 fácil — Poliza, v1.0 |
| 54 | Tipo de poliza | 🟢 fácil |
| 55 | Numero de poliza | 🟢 fácil |
| 56 | Concepto de poliza | 🟢 fácil |
| 57 | Cuenta Registro | ✅ resuelto — v1.0/v0.3, 99.96%. Granularidad sin re-confirmar (riesgo abierto, ver exploracion-2026-08-04.md) |
| 58 | Nombre Cuenta Registro | ✅ resuelto, mismo caveat de granularidad |
| 59 | Cargo | ✅ resuelto, mismo caveat de granularidad |
| 60 | Abono | ✅ 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 layout | Pieza | Estado |
|---|---|---|
Operacion (ID) | v0.1/v1.0 | 100% |
Subtotal Neto, Total | v0.1 | 100% |
UUID | v2.1 | 91.9% con 1 XML directo, 6.8% sin XML esperado, 1.2% multi-factura real |
Cuenta Registro, Nombre Cuenta Registro, Cargo, Abono | v1.0/v0.3 | 99.96% (9,158/9,162 folios, enero-junio) |
Monto Cobrado (validación, no columna final todavía) | v2.2 | 100% (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 enGasto_Registro/Gasto_Registro_Documento.Clave del proveedor,RFC del proveedor,Nombre del proveedor—JOIN Proveedoradicional.Fecha de poliza,Tipo de poliza,Numero de poliza,Concepto de poliza— ya estamos enPoliza(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 enComprobante_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íaPago_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 deGasto_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 unSUM(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 (verdocs/control_combustible_hallazgo.md, sección “Corrección 2026-08-04”: el join debe agregar conSUMdel lado deCuenta_X_Pagar, no dejarlo crudo, o produce fan-out). GASTO_RECLASIFICACIONy folios conGr_Genera_Cxp='NO': no generan CXP por diseño de negocio — confirmado, no es hueco de datos.
Pendiente inmediato
- Escribir
.mdde cierre de v2.2 (CXP caso general) — validado 100% pero sin documentar todavía. - Explorar
Pago_CXP/Chequepara las columnas de pago (banco, cheque, fecha) — la pieza “fácil” más próxima. - Explorar
Gasto_Registro_Impuesto+Impuestopara 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).