Layout de Gastos por CECO con Nómina — CONT-2
Página del app Contabilidad de streamlit-reportes (
reportes.frento.com.mx/contabilidad). Agregada 2026-09-03 junto con CONT-1 — mismo reporte, mismo grano, misma metodología base; esta entrada documenta solo la diferencia (el séptimo origen). Ver CONT-1 para fuentes/grano/reglas de negocio completas de los otros 6 orígenes.
Igual que CONT-1, agregando
GASTO_REGISTRO_NOMINA como séptimo origen de Gasto_Registro.
GASTO_REGISTRO_NOMINA — sí liga con póliza real
Quedaba excluido desde la v0.5 histórica del layout de gastos, asumiendo
"se contabiliza por otro mecanismo, ajeno a este reporte" (comentario
textual heredado en queries/v03_detalle_cuenta_centro_costo.sql).
Falso — misma situación que ya se encontró con CONSUMO_INTERNO: se
liga por el mismo mecanismo Poliza_Control (Pc_Tabla='GASTO_REGISTRO')
→ Poliza → Poliza_Detalle (Pd_Referencia=Gr_Folio) que los orígenes
normales. Investigado por primera vez 2026-09-03 (script
13_reconciliacion_nomina_ceco.py en conciliacion-master/layout-gastos/
— trabajo de otra sesión, en paralelo a la del rediseño de CONT-1).
Por qué nómina usa una técnica DISTINTA de emparejamiento
Los otros 6 orígenes usan rank-pairing (ordenar ambos lados por valor
dentro de (FOLIO, CECO) y emparejar por posición) — funciona porque,
para esos orígenes, el número de líneas suele coincidir entre el lado
operativo y el lado póliza.
Para nómina eso no aplica: cada folio desagrega el Cargo en muchas más
cuentas 6xxx por concepto (Sueldos, Bono Por Productividad/Puntualidad/
Asistencia, Fondo de ahorro, Comisiones, Vacaciones, Prima Vacacional,
Pagos Por Retiro...) de las que distingue Grc_ID/Tg_Cve_Tipo_Gasto —
ni siquiera hay correspondencia posicional confiable. Tampoco existe FK
real Tipo_Gasto → Cuenta_Contable (Tg_Cuenta_Contable vacío en los 249
tipos de gasto, mismo hueco ya documentado para el resto del proyecto).
Solución: join directo por texto — (FOLIO, CECO,
Tg_Descripcion = Cc_Descripcion normalizado). Es el único método que dio
1:1 exacto: 6,591/6,591 filas, cero conceptos huérfanos de ningún
lado (enero-marzo 2026). Más preciso que rank-pairing para este origen
específico, porque es una llave real (aunque de texto), no una posición.
Líneas de póliza sin centro de costo (reclasificaciones de pasivo
dentro de la misma póliza: ISR retenido, Cuotas IMSS, Sueldos y salarios
por pagar, Fondo de ahorro por pagar, Vales de despensa por pagar) cierran
el balance Cargo=Abono de la póliza pero no son gasto por centro — se
excluyen filtrando Pd_Centro_Costo <> '', mismo criterio que el resto
del proyecto.
TIPO_MOVIMIENTO sale de Pd_Tipo real, igual que los demás orígenes —
confirmado 2026-09-03 (leyendo el dato, no asumiéndolo como hacía la
primera exploración de 13_reconciliacion_nomina_ceco.py, que solo
miraba Pd_Tipo=1): nómina es 100% Cargo, 0% Abono con centro real.
Resultado de referencia
GASTO_REGISTRO_NOMINA: 100.00% (6,591/6,591 filas a grano
(FOLIO, CECO, CONCEPTO), 270 folios activos de 294 totales,
enero-marzo 2026, empresa 0001) — cero folios sin póliza ligada, mejor
resultado de cualquier origen de este proyecto. A nivel (FOLIO, Centro)
más grueso: 2,549/2,549 (100.00%).
Total combinado (CONT-1 + nómina, enero 2026): ver métricas en vivo del reporte — el % total sube respecto a CONT-1 porque nómina reconcilia al 100%.
El Streamlit
Código:
contabilidad/pages/2_Layout_de_Gastos_por_CECO_con_Nomina_CONT-2.py
— wrapper delgado sobre la misma
layout_gastos_ceco_ui.py
que usa CONT-1 (parámetro incluir_nomina=True), y la misma
layout_gastos_ceco_lib.py
(función reporte_completo(..., incluir_nomina=True)).
Pendiente
- Decisión de negocio pendiente: nómina es dato sensible (ver dominios.md, dominio NÓMINA marcado "Baja — definir acceso antes") — CONT-2 existe como versión aparte de CONT-1 precisamente para no forzar que todos los que ven el layout de gastos vean también el desglose de nómina.
- Mismos pendientes que CONT-1 para los otros 6 orígenes (capitalización
de activo fijo en
CONSUMO_INTERNO, filtro de doble póliza, residual del rank-pairing) — ver ese.md.