MAJA · Manual de Datos
Generado el 13/08/2026 13:41 · analisis_maja
Data Seekers + pg_cron
dd_inventario_diario
0 bytes
Inventario diario al cierre por fecha, almacén y artículo.
Tabla de ~39 GB. Siempre filtrar por fecha antes de cualquier join.
Tamaño en disco
0 bytes
ColumnaTipoDescripción
fecha 🔑 date
almacen_id 🔑 bigint
articulo_id 🔑 bigint
entradas_diarias numeric(18,2)NOT NULL
salidas_diarias numeric(18,2)NOT NULL
existencia_inicial numeric(18,2)NOT NULL
existencia_final numeric(18,2)NOT NULL
costo_total_entradas_diarias numeric(18,2)NOT NULL
costo_total_salidas_diarias numeric(18,2)NOT NULL
costo_total_inicial numeric(18,2)NOT NULL
costo_total_final numeric(18,2)NOT NULL
doctos_in
299 MB
Movimientos de inventario: entradas y salidas por concepto.
Tamaño en disco
299 MB
Filas estimadas
~2,092,713
ColumnaTipoDescripción
docto_in_id bigint
almacen_id bigint
concepto_in_id bigint
fecha timestamp
almacen_destino_id float8
centro_costo_id float8
sucursal_id bigint
descripcion text
sistema_origen text
folio text
naturaleza_concepto text
cancelado text
usuario_creador text
fecha_hora_creacion timestamp
usuario_aut_creacion text
usuario_ult_modif text
fecha_hora_ult_modif timestamp
usuario_cancelacion text
traspasos_in
22 MB
Traspasos de mercancía entre almacenes.
Tamaño en disco
22 MB
Filas estimadas
~126,631
ColumnaTipoDescripción
traspaso_in_id bigint
folio text
fecha timestamp
fecha_entrega timestamp
sucursal_origen_id bigint
almacen_origen_id bigint
sucursal_destino_id bigint
almacen_destino_id bigint
via_embarque_id float8
docto_in_id float8
descripcion text
estatus text
usuario_creador text
fecha_hora_creacion timestamp
usuario_ult_modif text
fecha_hora_ult_modif timestamp
fecha_hora_cancelacion timestamp
dd_ventas_diarias_articulos_omnicanal
0 bytes
Ventas consolidadas por canal, sin cancelaciones ni devoluciones.
Solo registros vigentes. Para ver devoluciones usar doctos_ve.
Tamaño en disco
0 bytes
ColumnaTipoDescripción
ventaid textNOT NULL
canal varchar(20)NOT NULL
fecha dateNOT NULL
almacen_id bigintNOT NULL
folio varchar(50)NOT NULL
cliente_id bigint
articulo_id bigintNOT NULL
clave_articulo varchar(50)
unidades numeric(14,4)NOT NULL
venta_sin_iva numeric(14,4)NOT NULL
tipo_docto char(1)NOT NULL
doctos_ve
129 MB
Documentos de venta con todos los estatus, incluyendo cancelaciones.
Tamaño en disco
129 MB
Filas estimadas
~386,216
ColumnaTipoDescripción
docto_ve_id bigint
tipo_docto text
subtipo_docto text
sucursal_id bigint
folio text
fecha timestamp
hora timestamp
clave_cliente text
cliente_id bigint
dir_cli_id bigint
dir_consig_id bigint
almacen_id float8
lugar_expedicion_id float8
moneda_id bigint
tipo_cambio float8
tipo_dscto text
dscto_pctje float8
dscto_importe float8
estatus text
aplicado text
descripcion text
importe_neto float8
fletes float8
otros_cargos float8
total_impuestos float8
total_retenciones float8
total_anticipos float8
peso_embarque float8
forma_emitida text
contabilizado text
acreditar_cxc text
sistema_origen text
cond_pago_id bigint
vendedor_id float8
pctje_comis float8
via_embarque_id float8
importe_cobro float8
usuario_creador text
es_cfd text
modalidad_facturacion text
uso_cfdi text
metodo_pago_sat text
fecha_hora_creacion timestamp
orden_compra text
doctos_cm
6312 kB
Documentos de compra: órdenes, recepciones y devoluciones.
Tamaño en disco
6312 kB
Filas estimadas
~27,756
ColumnaTipoDescripción
dscto_importe float8
importe_neto float8
fletes float8
otros_cargos float8
total_impuestos float8
total_retenciones float8
gastos_aduanales float8
otros_gastos float8
docto_cm_id bigint
fecha timestamp
proveedor_id bigint
consig_cm_id float8
almacen_id bigint
pedimento_id float8
dscto_pctje text
fecha_entrega timestamp
sucursal_id bigint
descripcion text
tipo_docto text
folio text
folio_prov text
tipo_dscto text
estatus text
subtipo_docto text
factura_dev text
via_embarque_id float8
moneda_id bigint
cond_pago_id bigint
folio_prov_aux text
almacenes
112 kB
Catálogo de almacenes y sucursales.
Usar siempre como CTE al inicio de queries que necesiten nombre de almacén.
Tamaño en disco
112 kB
Filas estimadas
~301
ColumnaTipoDescripción
nombre_abrev text
almacen_id bigint
nombre text
ciudad_id float8
fecha_hora_creacion timestamp
oculto text
calle text
codigo_postal text
nombre_calle text
num_exterior text
num_interior text
colonia text
poblacion text
referencia text
cuenta_almacen text
cuenta_costo_venta text
cuenta_ventas text
cuenta_dscto_ventas text
cuenta_compras text
cuenta_devol_ventas text
articulos
1008 kB
Catálogo maestro de artículos.
Tamaño en disco
1008 kB
Filas estimadas
~10,800
ColumnaTipoDescripción
articulo_id bigint
linea_articulo_id float8
nombre text
estatus text
peso_unitario text
articulos_clasificadores
3400 kB
Clasificadores de cadena de suministro por artículo.
Se actualiza constantemente. Usar LEFT JOIN para no perder artículos sin clasificar.
Tamaño en disco
3400 kB
Filas estimadas
~10,800
ColumnaTipoDescripción
elemento_id bigint
00_coleccion_checo text
00_maja_descuentos_activos text
01_categoria text
02_subcategoria text
03_clase text
04_sku_padre text
05_sku_padre_descripcion text
06_sku_variante text
07_sku_variante_descripcion text
08_sku text
09_sku_composicion text
10_coleccion_de_lanzamiento text
11_color text
12_color_primario text
13_tono text
14_talla text
15_tipo_de_compra text
16_segmentacion text
17_styletag text
18_estacionalidad text
19_patronaje text
20_segmentos_tienda text
21_tipos_de_tienda text
22_marca text
23_temporada text
24_tipo text
25_estatus_de_producto text
26_fit text
familia text
genero text
subcategoria text
Extensiones
analisis_maja
Herramientas instaladas en PostgreSQL que amplían las capacidades de la base de datos.
pg_cron corre como proceso interno de PostgreSQL. Los jobs se definen en SQL y se administran directamente desde analisis_maja, sin tocar el servidor ni el crontab del OS.
shared_preload_libraries
'pg_cron'
cron.database_name
'analisis_maja'
Schema del catálogo
cron — se crea al instalar la extensión
Resolución mínima
1 minuto
Ejecución en paralelo
Sí — jobs independientes
Historial
cron.job_run_details
Activo en
Solo el servidor primario
┌─────── minuto (0–59) │ ┌───── hora (0–23) │ │ ┌─── día del mes (1–31) │ │ │ ┌─ mes (1–12) │ │ │ │ ┌ día semana (0–7, 0=domingo) │ │ │ │ │ * * * * *
0 5 * * *
Todos los días a las 5:00 am
30 4 * * *
Todos los días a las 4:30 am
0 3 * * 0
Domingos a las 3:00 am
*/30 * * * *
Cada 30 minutos
0 7 * * 1-5
Lunes a viernes a las 7:00 am
SELECT cron.schedule( 'etl_ventas_omnicanal_sp', '30 4 * * *', $$CALL sp_dd_ventas_diarias_articulos_omnicanal()$$ );
SELECT cron.unschedule('etl_ventas_omnicanal_sp');
-- Ver todos los jobs SELECT jobid, jobname, schedule, active FROM cron.job ORDER BY jobname; -- Últimas 20 ejecuciones SELECT j.jobname, r.status, r.start_time::time(0) AS inicio, ROUND(EXTRACT(EPOCH FROM(r.end_time-r.start_time))) AS seg FROM cron.job_run_details r JOIN cron.job j ON j.jobid = r.jobid ORDER BY r.start_time DESC LIMIT 20;
SELECT cron.schedule('etl_ventas_omnicanal_sp', '30 4 * * *', $$CALL sp_dd_ventas_diarias_articulos_omnicanal()$$); SELECT cron.schedule('etl_inventario_snapshot_sp', '0 5 * * *', $$CALL sp_dd_inventario_diario()$$); SELECT cron.schedule('maint_inventario_vacuum', '0 3 * * 0', $$VACUUM ANALYZE dd_inventario_diario$$);
Próxima extensión por documentar.
Queries eficientes con CTEs
SQL
Patrones recomendados para consultar las tablas grandes de MAJA sin degradar el rendimiento.
-- ✅ Correcto: filtrar en CTE, luego JOIN WITH inv AS ( SELECT fecha, almacen_id, articulo_id, existencia_final FROM dd_inventario_diario WHERE fecha = '2024-12-31' AND almacen_id IN (1,5,10) ) SELECT i.fecha, art.nombre, i.existencia_final FROM inv i LEFT JOIN articulos art ON i.articulo_id = art.articulo_id;
SELECT DISTINCT ON (almacen_id, articulo_id) fecha, almacen_id, articulo_id, existencia_final FROM dd_inventario_diario WHERE fecha >= current_date - 7 ORDER BY almacen_id, articulo_id, fecha DESC;
Conexión desde Python
SQLAlchemypython-dotenv
Cómo conectarte a analisis_maja desde Python usando variables de entorno.
Las credenciales te serán enviadas por Slack o correo corporativo. Nunca las subas a un repositorio.
# .env DB_URI=postgresql+psycopg2://usuario:password@host:5432/analisis_maja
import os, polars as pl from dotenv import load_dotenv from sqlalchemy import create_engine load_dotenv() engine = create_engine(os.getenv("DB_URI")) df = pl.read_database( query="SELECT * FROM dd_inventario_diario WHERE fecha = current_date - 1", connection=engine ) print(df.head())
pg_cron — Recomendaciones
Best practices
Guía práctica para operar pg_cron de manera segura en analisis_maja.
-- {categoria}_{tabla/proceso}_{accion} 'etl_ventas_omnicanal_sp' 'maint_inventario_vacuum' 'refresh_mv_inventario'
ETL
3:00 am – 6:00 am
Mantenimiento
Sáb/Dom 1:00 am – 4:00 am
⚠️ Evitar
8:00 am – 10:00 am (pico de reportes)
Nunca programes VACUUM FULL vía pg_cron. Usa siempre VACUUM ANALYZE.