Cesantoni Sales Feed · T0 INTERNAL ground truth
🚧 Pendiente ingest · ERP CSV mensual aún no conectadoLa pieza que cierra todo el loop: sales reales por SKU × plaza × mes desde Cesantoni ERP. Sin esto, toda la SOM es estimación. Status: PENDIENTE INGEST.
Rows ingested
0
pendiente ERP
Plazas covered
0/109
pendiente ERP
SKUs covered
0/1090
pendiente ERP
Months covered
0
pendiente ERP
Revenue total
$0M
pendiente ERP
⏳ Esperando primer ingest
La infraestructura está lista. Faltan los datos reales del ERP Cesantoni. 3 caminos para arrancar:
- Camino rápido (1 día): Cesantoni exporta CSV mensual del ERP → drop en repo → un script de ingesta valida y commitea automáticamente. Listo.
- Camino semi-auto (1 semana): SFTP/S3 drop bucket → GitHub Action detecta CSV nuevo → ingest auto → rebuild Terra. Zero touch mensual.
- Camino pro (1 mes): Webhook desde ERP (SAP/Oracle/lo-que-sea) → Cloudflare Worker → KV → trigger build. Real-time.
Schema definido abajo. Sample CSV en data/cesantoni-sales-feed.example.csv.
Schema esperado
Una fila por (sku × plaza × mes). Idealmente 1090 SKUs × 109 plazas × 12 meses ≈ 1.4M rows/año
Campos requeridos
- ● year_month
- ● sku_id
- ● plaza_slug
- ● channel
- ● units_sold
- ● revenue_mxn
- ● list_price_mxn
Campos opcionales (recomendados)
- ○ discount_mxn
- ○ margin_mxn
- ○ inventory_remaining
- ○ lead_time_days
- ○ specifier_id
- ○ deal_id
- ○ sales_rep_id
Channels válidos (11)
tienda_propiadesign_centeroutlethome_depotconstruramamaceremultimarca_independienteb2b_directob2b_distribuidorecommerce_propioecommerce_marketplace
Reglas de validación
- year_month formato YYYY-MM
- sku_id existe en cesantoni-msrp-oficial.json
- plaza_slug existe en chat-context.json
- units_sold >= 0
- revenue_mxn = units_sold × list_price_mxn × (1 - discount_pct)
- margin_mxn (si presente) <= revenue_mxn
📋 Cómo arrancar (operación)
- Cesantoni IT genera CSV mensual desde ERP con los 7 campos requeridos (formato en
cesantoni-sales-feed.example.csv). - Drop el archivo en
/tmp/cesantoni-sales-YYYY-MM.csven el runner de GH Actions (o repo path). - Ejecutar la ingesta del CSV.
- Script valida, descarta rows inválidas con razón, escribe
archivo CSV mensual. - Commit + push → Cloudflare Pages rebuild automático.
- Esta página + /scenarios + /dof-watch usan los datos reales en lugar de estimados.
Cobertura mínima útil: 3 meses de historia × top 20 plazas × top 100 SKUs ≈ 6,000 rows. Cobertura ideal: 12 meses × 109 plazas × 1090 SKUs ≈ 1.4M rows.
Privacidad: el feed JSON va al repo público pero el commit puede ir a branch privado si Cesantoni prefiere — config en GH Actions.