Skip to content

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.