Consulta XMLs vs Gastos/Compras
App de solo consulta para Contabilidad de Trivasa: identifica CFDIs (XMLs) timbrados
del mes que todavía no tienen un registro ligado en MPRO (gasto o compra), con un panel
de historial de proveedor al seleccionar uno. Vive en
exploracion/consulta_xmls_gastos/ del repo trivasa-bi-dev.
Se reconstruyó explícitamente como app Flask en vez de Streamlit — decisión de arquitectura tomada durante el proyecto, no la elección original.
Ingesta de CFDIs
Los XMLs se acceden vía un mount CIFS de solo lectura y persistente, en /etc/fstab:
servidor //192.168.117.211/SincronizarXml, punto de montaje
~/trivasa-bi-dev/exploracion/consulta_xmls_gastos/mnt_xml/, ruta real
mnt_xml/TRI970922TL2/XML RECIBIDOS/{año}/{año}_{mes}/{año}_{mes}_AC/. Gotcha: el UUID
en el nombre del archivo tiene casing inconsistente (mayúsculas y minúsculas mezcladas)
— normalizar siempre a mayúsculas al comparar.
Un pipeline dlt (raw.comprobante_digital en Postgres) hace la carga inicial +
incremental + un cron diario a las 5am — completo y en producción, ver
Pipelines dlt. El schema de destino se llama raw
(reservado exclusivamente para datos que vienen de MPRO); un dato relacionado que
originalmente vivía en un schema contabilidad se movió a raw_sat por esa misma
convención (ver Warehouse Postgres).
No existe una tabla única “XMLs registrados en MPRO” — el match de pendientes usa dos
fuentes de UUID distintas según el tipo de documento, unidas en la lógica de match
(pandas), no en una tabla persistida: gastos vía Pago_Cxp_Comprobante.Pcc_Timbre_UUID,
compras vía Comprobante_Digital.Cd_Timbre_UUID filtrado a cd_tabla='COMPRA'.
Falta replicar el mismo patrón de pipeline dlt para Pago_Cxp_Comprobante (lado
gastos) — hoy ese dato entra al prototipo vía CSVs exportados manualmente de .207, no
vía raw.*.
Decisiones de negocio del match
- RFC con múltiples
Pv_Cve_Proveedor: se combina el historial de todos los códigos que matcheen (no se elige uno solo ni se alerta). - Alcance del historial de proveedor: últimos 24 meses.
- Refresh de XMLs vía botón manual en la app (no cron) — no hay urgencia de frescura y así
se mantiene control explícito del usuario. El cron diario sí aplica a las tablas
rawde match (comprobante_digital, pendientePago_Cxp_Comprobante), que son infraestructura de fondo, no una acción del usuario.
Por qué no dlt/dbt para todo el prototipo
Se descartó a propósito un diseño inicial con pipeline dlt completo + proyecto dbt desde
cero — sobre-ingeniería para un prototipo. Se optó por scripts Python + Streamlit/Flask,
mismo patrón que Layout de Gastos y
Trazabilidad Consumo Interno. Solo las tablas de
match (Comprobante_Digital, Pago_Cxp_Comprobante) justifican dlt: se consultan en
cada refresh de la app y crecen día a día. El resto (Gasto_Registro,
Compra_Encabezado, historial de proveedor) sigue siendo consulta en vivo contra
.207 — impacto trivial confirmado, se dispara solo al hacer clic en un proveedor
puntual.
Estado del prototipo
El prototipo Streamlit/Flask corre hoy sobre una mezcla de CSVs exportados de .207
(uuid_gastos.csv, uuid_compras.csv, proveedor.csv, operadores.csv) y la tabla
Postgres raw_sat.cfdi_recibidos — no es la arquitectura final. Migrar el prototipo a
leer directo de raw.* en Postgres (sin CSVs intermedios) es el siguiente paso.
Conexiones nuevas creadas para este proyecto: connection_200_empresas2.py y
connection_207_empresas2.py, ambas contra la tabla Operadores (nombre de operador),
una por cada copia de la base (.200 / .207).
Pendiente
- Pipeline dlt para
Pago_Cxp_Comprobante, mismo patrón quecomprobante_digital. - Migrar el prototipo de CSVs a
raw.*en Postgres directo. - (Opcional, más adelante) replicar también
raw.proveedor,raw.gasto_registro,raw.gasto_registro_documento,raw.compra_encabezado,raw.operadores— para que el panel de historial de proveedor deje de depender de consulta en vivo a.207y de CSVs.
Véase también
- Layout de Gastos — otro reporte de Trivasa sobre la misma base MPRO, comparte convenciones de conexión (
.200vs.207). - Infraestructura de datos Trivasa — detalle de los pipelines dlt, el warehouse Postgres y las conexiones que usa este proyecto.