Skip to content

Transferencias sin recepción

Página 2 de streamlit-reportes.

Identificar transferencias entre sucursales que ya fueron enviadas pero que no han sido recibidas en la sucursal destino — para dar seguimiento y evitar que la mercancía quede "perdida" entre ambos puntos.

Modelo de datos: el ciclo Solicitud → Envío → Recepción

Transferencia guarda las tres etapas del ciclo en la misma tabla, encadenadas por Tr_Documento (apunta al Tr_Folio del registro padre) + Tr_Tabla = 'Transferencia':

SL (solicitud) ──Tr_Documento──► EN (envío) ──Tr_Documento──► RC (recepción)
  • 145,106 de 151,962 folios EN (95%) traen Tr_Documento apuntando a una SL — el resto se creó sin solicitud previa.
  • Confirmado cruzando folios reales: RC.Tr_Documento = EN.Tr_Folio.

Estados por tipo (Tr_Tipo / Es_Cve_Estado), conteo de folios distintos al 2026-08-28

Tr_Tipo Es_Cve_Estado Folios Significado
EN RCT 135,011 Recepcionado totalmente (confirmado con el usuario)
EN CA 11,504 Cancelado
EN CE 5,276 Cerrado — 100% de estos ya tiene un RC ligado
EN AC 171 Activo = enviado, sin ningún RC ligado — esta es la "transferencia sin recepción" real

El reporte filtra exactamente Tr_Tipo = 'EN' y Es_Cve_Estado = 'AC'.

Grano y fuente

Grano: línea de transferencia (Tr_Folio, Pr_Cve_Producto). Fuente: TRIVASADB (.207), tabla Transferencia directa.

Query base

queries/transferencias_sin_recepcion.sql en streamlit-reportes. Diseñada originalmente contra el warehouse Postgres (raw.transferencia / raw.sucursal / raw.almacen / raw.producto, poblados por dlt desde este mismo ERP) y adaptada 1:1 a T-SQL para correr contra .207 en vivo (mismos alias de columna de salida; solo cambia || → + y se usan los nombres de tabla/columna reales de SQL Server, confirmados vía INFORMATION_SCHEMA).

SELECT
    t.Tr_Folio                                            AS folio,
    t.Tr_Fecha                                            AS fecha,
    t.Sc_Cve_Sucursal + N' - ' + so.Sc_Descripcion        AS sucursal_origen,
    t.Al_Cve_Almacen  + N' - ' + a.Al_Descripcion         AS almacen,
    t.Sc_Cve_Sucursal_Recibe + N' - ' + sd.Sc_Descripcion AS sucursal_destino,
    t.Pr_Cve_Producto                                     AS producto_clave,
    p.Pr_Descripcion                                      AS producto_descripcion,
    t.Tr_Cantidad_1                                       AS cantidad,
    t.Tr_Unidad_1                                         AS unidad,
    t.Tr_Importe_Costo                                    AS importe,
    t.Oper_Alta                                           AS operador,
    t.Tr_Comentario                                       AS comentario
FROM Transferencia t
JOIN Sucursal so ON so.Sc_Cve_Sucursal = t.Sc_Cve_Sucursal
JOIN Sucursal sd ON sd.Sc_Cve_Sucursal = t.Sc_Cve_Sucursal_Recibe
JOIN Almacen  a  ON a.Sc_Cve_Sucursal = t.Sc_Cve_Sucursal AND a.Al_Cve_Almacen = t.Al_Cve_Almacen
JOIN Producto p  ON p.Pr_Cve_Producto = t.Pr_Cve_Producto
WHERE t.Tr_Tipo = N'EN'
  AND t.Es_Cve_Estado = N'AC'
ORDER BY t.Tr_Fecha DESC

Pendiente de confirmar con el usuario: operador usa Oper_Alta (quien creó el registro) — podría ser en realidad Oper_Ult_Modif (última modificación).

El Streamlit

Código: pages/2_Transferencias_sin_recepcion.py.

  • Filtros: rango de fechas sobre Tr_Fecha (default 1-enero del año en curso hasta la fecha más reciente en los datos), Sucursal origen, Almacén origen, Operador — cada uno como checkboxes dentro de un expander (con botones "Todos"/"Ninguno"), no un multiselect de selector único.
  • Métricas: folios distintos, líneas, importe total.
  • Tabla: streamlit-aggrid con filtro inline tipado por columna (texto/número/fecha), paginación de 50 filas, enable_enterprise_modules=False.
  • Descarga CSV del resultado ya filtrado. Query cacheada 10 min.

Fuente de exploración

Lógica validada en trivasa-bi/proyectos-bi/transferencia-sin-recepcion.

Pendiente

  • Confirmar si operador debe ser Oper_Alta o Oper_Ult_Modif.