Cesantoni Sales Feed · T0 INTERNAL ground truth

🚧 Pendiente ingest · ERP CSV mensual aún no conectado

La 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:

  1. 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.
  2. Camino semi-auto (1 semana): SFTP/S3 drop bucket → GitHub Action detecta CSV nuevo → ingest auto → rebuild Terra. Zero touch mensual.
  3. 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)

  1. Cesantoni IT genera CSV mensual desde ERP con los 7 campos requeridos (formato en cesantoni-sales-feed.example.csv).
  2. Drop el archivo en /tmp/cesantoni-sales-YYYY-MM.csv en el runner de GH Actions (o repo path).
  3. Ejecutar la ingesta del CSV.
  4. Script valida, descarta rows inválidas con razón, escribe archivo CSV mensual.
  5. Commit + push → Cloudflare Pages rebuild automático.
  6. 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.

/scenarios·/cesantoni·/tam-reconciliation