WAREHOUSE MANAGEMENT SYSTEM · ENTERPRISE 4PL
Guida Completa al Simulatore
v3.0 — Marzo 2026
🎮 8 Scenari 🧵 Web Worker 🎬 SimRecorder 📊 SimIDB 🏆 Gaming System 📡 69 Feature tracciate 🤖 AI Vision 🧪 Test integrati

📋 Indice

  1. Architettura del simulatore
    SimEngine, Web Worker, event bus, moduli ausiliari
  2. Setup multi-step
    3 step: selezione scenario, modalità, opzioni avanzate
  3. Cockpit — layout annotato
    Header, pipeline flow, mappa SVG, 7 pannelli OPS, layer chips
  4. I 5 Tab del pannello inferiore
    LOG, MISSIONI, BUG, BUDGET, AUDIT WMS
  5. I 7+1 Scenari
    S1 Food, S2 4PL, S3 Filiera™, S4 Pharma GDP, S5 E-commerce, S6 Returns, S7 Enterprise + CUSTOM
  6. KPI per scenario — tabella completa
    20 KPI totali distribuiti su S1/S2/S3
  7. Gaming System — Achievements & Combos
    9 achievement, combo ×2-5, streaks, score system
  8. SimRecorder — Replay event-driven
    Registrazione, playback slider, sparklines, AI summary
  9. SimIDB — API Call Logger
    IndexedDB, 5000 entry FIFO, latency stats, top endpoint
  10. SimCoverage — 69 Feature Tracker
    Monitoraggio live copertura funzionale durante demo
  11. Web Worker — Motore off-thread
    Anti-throttling Chrome, protocollo postMessage, localStorage sync
  12. Snapshot AI Vision
    html2canvas, auto-trigger critico, upload API, analisi Claude
  13. Integrazione con il sistema di test
    Tab AUDIT come L4 integrato, health check, export report
  14. Setup Wizard — Avvio guidato 7 step
    Upload CSV/JSON, health check servizi, dataset server-side, auto-launch

01 Architettura del simulatore

Il simulatore WMS Agile è un ambiente di simulazione discreta event-driven che replica l'intera operatività di un magazzino enterprise — incluse le interazioni 4PL multi-tenant — all'interno del browser, senza alcun backend dedicato alla simulazione.

Schema architetturale

┌─────────────────────────────────────────────────────────────┐ │ MAIN THREAD (UI) │ │ │ │ simulator-ui.js simulator-recorder.js │ │ ├─ renderCockpit() ├─ onEvent(type, data) │ │ ├─ bindEngineEvents() ├─ getFrames() │ │ └─ gaming / toasts └─ showReplay() │ │ │ │ simulator-idb.js simulator-coverage.js │ │ ├─ logCall() ├─ trackEvent() │ │ └─ getStats() └─ getCoverage() │ │ │ │ sim-worker-init.js ←──── postMessage bridge ──────────┐ │ │ ├─ sendToWorker() │ │ │ └─ onWorkerMessage() → emit() verso UI │ │ └──────────────────────────────────────────────────────┬──┘ │ │ │ ┌──────────────────────────────────────────────────────▼────┐ │ │ WEB WORKER THREAD │ │ │ │ │ │ sim-worker.js │ │ │ ├─ importScripts(simulator-data.js, simulator.js) │ │ │ │ │ │ │ │ simulator.js (SimEngine) │ │ │ │ ├─ _tick() → evento ogni N ms simulati │ │ │ │ ├─ _genEvent() → Poisson sampling │ │ │ │ ├─ _processEvent() → aggiorna stato │ │ │ │ └─ emit(type, data) → postMessage al main thread │ │ │ │ │ │ │ │ simulator-data.js (dati statici) │ │ │ │ ├─ PRODUCTS, CUSTOMERS, SUPPLIERS │ │ │ │ └─ SEASONAL_FACTORS, SLA_PROFILES │ │ │ └──────────────────────────────────────────────────── │ │ └────────────────────────────────────────────────────────────┘ │ │ WMS API Backend (wms.agile.software) ←── api() fetch helper ────┘ ├─ /api/auth/login /api/inbound/orders /api/outbound/waves ├─ /api/missions /api/stock /api/alerts └─ 30+ endpoint tracciati da SimIDB

Moduli e responsabilità

ModuloFileResponsabilitàThread
SimEnginesimulator.jsMotore eventi, stato simulazione, emitWorker
SimDatasimulator-data.js + S2-S7Dati statici: SKU, clienti, fornitori, SLA profilesWorker
SimUIsimulator-ui.jsRendering cockpit, gaming, toast, mappaMain
SimRecordersimulator-recorder.jsFrame capture event-driven, replay slider, AIMain
SimIDBsimulator-idb.jsIndexedDB API call logger, latency statsMain
SimCoveragesimulator-coverage.jsFeature tracker 69 funzionalitàMain
SimWorkerInitsim-worker-init.jsBridge main↔worker, postMessage protocolMain
SimWorkersim-worker.jsWorker entry point, stub browser APIWorker
SimSetupsimulator-setup.jsLogin, init ambiente, overlay step 1-3Main
SimScenariossimulator-scenarios.jsCatalogo scenari, factory per S1-S7Main
WarehouseMapwarehouse-map.jsSVG planimetria interattiva, layer, zoneMain

Ordine di caricamento script (critico)

api.js html2canvas (CDN) warehouse-map.js simulator-data.js ← dati S1 base (caricato nel Worker via importScripts) simulator-coverage.js simulator-recorder.js simulator-idb.js simulator-setup.js simulator-scenarios.js simulator.js ← SimEngine (caricato nel Worker via importScripts) sim-worker-init.js simulator-cameras.js simulator-ui.js ← ULTIMO: dipende da tutti gli altri
⚠️
Ordine critico simulator-ui.js deve essere caricato per ultimo perché al momento del suo caricamento chiama SimUI.start() che si aspetta tutti gli altri moduli già disponibili. Alterare l'ordine causa errori ReferenceError: SimEngine is not defined o simili.

02 Setup multi-step

All'avvio, il simulatore mostra un overlay di configurazione a 3 step prima di entrare nel cockpit. Questo overlay consente di scegliere scenario, modalità e funzionalità avanzate.

Step 1 — Selezione scenario

Griglia di card (una per scenario S1-S7). Ogni card mostra nome, settore industriale e numero di facility/tenant. Cliccando una card si avanza allo step 2.

Step 2 — Modalità di avvio

▶ RIPRENDI

Continua la sessione precedente. Recupera token JWT da sessionStorage, stato simulazione da localStorage.

Consigliato per demo continuative o simulazioni lunghe (>1 ora).

🔄 RESET DB

Cancella tutti i dati del tenant demo e ri-inizializza da zero: ordini, stock, missioni, alert.

Usare prima di una demo con pubblico per avere dati puliti.

Step 3 — Opzioni avanzate

OpzioneDefaultDescrizione
Audit TrailOFFAbilita SimRecorder: pulsante REC nell'header, cattura frame per ogni evento, replay + AI summary
Snapshot AIOFFAuto-screenshot cockpit su eventi critici (bug, stock_low, sla_breach…) con upload a Claude Vision
Mission PlannerONDispatcher automatico missioni AGV: crea missioni FEFO e stock-pick senza intervento manuale
UOM PackagingONUnità di misura avanzate (pallet, cartone, pz) nelle transazioni inbound/outbound
CalendarOFFIntegrazione calendar-ms per festività 12 paesi — blocca appuntamenti su giorni non lavorativi
Durata (giorni)90Numero di giorni simulati al termine dei quali la simulazione si ferma automaticamente
💡
Consiglio per demo Per una demo di 15 minuti impostare velocità 50× e durata 30 giorni: si ottiene un ciclo completo di circa 30 giorni di operatività in ~17 minuti reali, con almeno 2-3 billing cycle, 1-2 guasti equipment e picchi SLA visibili.

03 Cockpit — Layout annotato

Header

Zona headerComponentiFunzione
Sinistra Logo + Titolo + Nome scenario Identità visiva, scenario attivo
Facility tabs A · B · C · D · E Switcha la vista sulla facility selezionata. Ogni tab mostra i KPI della facility (es. A=NORD, B=SUD, C=PHARMA GDP, D=ECOMM, E=RETURNS)
Speed controls 1× 2× 5× 10× 25× 50× 100× Moltiplicatore velocità simulazione. 50× = 1 giorno simulato ogni ~28 min reali
▶ / ⏸ PLAY / PAUSA Avvia o congela il motore. Lo stato viene preservato
Destra — pulsanti 🕐 Orologio · ⭐ Score · COV · REC · REPLAY · SNAP · CLR · RESET · INJECT Vedi sotto

Pulsanti header destra — dettaglio

Pipeline Flow

Sotto l'header, una barra orizzontale mostra il flusso operativo in tempo reale con 5 stage e frecce animate:

🚛
ARRIVI
camion in dock
📋
ORDINI
clienti confermati
🌊
WAVE PICK
pianificate
🤖
MISSIONI ✓
completate
🚚
SPEDITI
al cliente

Ogni stage mostra un dot pulsante (evento in corso), un delta "+1" animato e il contatore cumulativo della sessione.

Time cards

SIM
Giorno 23 · 14:35
Giorno simulato e ora del magazzino
REALE
00:08:42
Tempo reale dall'avvio sessione
VELOCITÀ
50×
1 min reale = 50 min simulati
PROSSIMA
04:12
Countdown prossimo procurement
FINE EST.
~21 min
Tempo reale rimanente a fine sim

Corpo principale — 2 colonne

Colonna sinistra — Mappa SVG

Planimetria interattiva del magazzino con 12 zone colorate per tipo (receiving, storage, picking, packing, shipping, quarantine, returns).

Layer chips — selezionabili via bottoni sopra la mappa:

  • FLOW — frecce animate dei flussi merce
  • TRAIL — scia percorsi AGV recenti
  • HEAT — heatmap occupazione bin (rosso = pieno)
  • MISS — posizione missioni attive in corso
  • SCAN — flash scanner su eventi barcode
  • AMB — overlay temperatura ambiente (cold chain)

Click su zona → drilldown panel a destra con dettaglio: bin count, occupazione %, temperatura, missioni in zona.

Colonna destra — 7 Pannelli OPS

  1. Wave Attiva — % completamento, ordini in wave, stats PICK/PACK/DISP
  2. Missioni Attive — lista 8 missioni con progress bar e AGV assegnato
  3. Queue Mezzi — camion in arrivo, ETA, carrier
  4. Stato Dock — porte INBOUND/OUTBOUND con colore stato (🟢 libera / 🔴 occupata)
  5. Operatori — lista operatori in turno con role e device
  6. Vital Stats — 3 ring circle: 🛡 SLA% · ⚡ OEE% · 🎯 ACCURATEZZA
  7. KPI Grid — card metriche (varia per scenario, vedi §6)

Drilldown Panel

Un pannello slide-in da destra che appare quando si clicca una zona sulla mappa SVG. Mostra dettaglio zona: bin disponibili, % occupazione, temperatura attuale, elenco missioni in quella zona, ultimi movimenti.

04 I 5 Tab del pannello inferiore

Il pannello inferiore occupa ~30% dell'altezza cockpit ed è suddiviso in 5 tab ridimensionabili tramite drag verticale.

📋 LOG
🤖 MISSIONI
🐛 BUG
💰 BUDGET
🔍 AUDIT WMS

Tab 1 — LOG

Event log in tempo reale. Ogni riga ha un colore per livello:

Buffer circolare: max 500 entry, le più vecchie vengono eliminate automaticamente per evitare memory leak su run lunghi. Bottone CLR per svuotare.

Tab 2 — MISSIONI

Lista dettagliata delle missioni AGV con: tipo, stato, agente assegnato, bin origine/destinazione, percentuale completamento.

Bottoni stress test (utili in demo per mostrare resilienza operativa):

Dopo un guasto si può osservare: toast rosso "Equipment breakdown", KPI OEE% che scende, missioni riassegnate ad altri AGV, alert critico nel log.

Tab 3 — BUG

Lista dei discrepanze rilevate automaticamente dal motore di simulazione — es. stock spedito senza wave associata, missione completata su bin errato, quantità FEFO non rispettata.

Ogni bug mostra: expected vs got, severity (warning / error / critical), timestamp simulato.

Il contatore bug nell'header si incrementa e cambia colore (arancione → rosso) al superamento di soglie.

🎯
Valore commerciale Il tab BUG dimostra in tempo reale la capacità di self-validation del sistema: il WMS conosce le proprie regole operative e segnala automaticamente ogni deviazione, senza intervento umano.

Tab 4 — BUDGET

Confronto Budget vs Venduto vs Spedito per SKU. Ogni prodotto ha una barra tricolore:

Mostra visivamente gap di fulfillment (venduto > spedito = arretrato) e gap commerciale (venduto < budget = sotto-performance).

Tab 5 — AUDIT WMS

Pannello a due colonne:

Colonna sinistra — Audit Trail WMS

Feed degli eventi di audit dal backend reale (GET /api/audit/search). Filtrabile per tipo entità e azione. Mostra: chi ha fatto cosa, quando, su quale record.

Colonna destra — IDB API Stats

Statistiche SimIDB in tempo reale: top 10 endpoint per latenza media, numero totale chiamate, tasso errori. Si aggiorna ad ogni apertura del tab.

🧪
Questo tab è il test L4 integrato Il pannello IDB Stats equivale a eseguire infrastructure/test-simulator-apis.sh ma in modalità live e continua: ogni API call del simulatore viene misurata e aggregata automaticamente.

05 I 7+1 Scenari

Il simulatore include 7 scenari progressivi (S1-S7) + un ottavo scenario speciale CUSTOM per dati reali. Ogni scenario è costruito sopra il precedente. S1 è il "motore base"; ogni scenario successivo aggiunge un layer di complessità senza rompere la "Giostra" sottostante.

S1
FOOD · BASELINE
Logitech Food Group
Il cuore del simulatore. Una "Giostra" auto-sostenuta: procurement → ricezione → put-away → picking wave → packing → spedizione → riordino automatico. 2 facility (NORD/SUD), singolo tenant.
30 SKU food 10 clienti 8 fornitori FEFO SLA 3gg Bug detection
S2
4PL · ENTERPRISE
4PL Group Enterprise
3 tenant logistici (FoodGroup, PharmaNet, RetailDistrib) in 5 facility. Aggiunge: resi, guasti equipment, flash sale, customs hold, billing cycle per tenant, SLA tracking con deadline.
5 facility 3 tenant 4PL SLA compliance OEE equipment Billing cycles Returns
S3
NETWORK · FILIERA
Rete Filiera™
Flusso Procure-to-Pay cross-tenant completo: buyer emette ordine d'acquisto → seller conferma → spedizione → ricezione → fatturazione. 6 tabelle wms_agile_db, ref NET-YYYYMMDD-NNNN.
Cross-tenant P2P Network orders Labour KPI Yard utilization WCS dispatched EDI X12/EDIFACT
S4
PHARMA · GDP
PharmaNet GDP
Magazzino farmaceutico Good Distribution Practice. Zona C (2-8°C) con gauge temperatura in tempo reale. Batch control obbligatorio, quarantine workflow, chain of custody, serializzazione GS1.
Cold chain 2-8°C GDP compliance Batch control Serializzazione Quarantine
S5
E-COMMERCE · B2C
RetailDistrib E-Commerce
Facility D ottimizzata per B2C. Webhook e-commerce (WooCommerce/Shopify/Magento con HMAC), carrier pickup automatico (BRT, NCR), flash sale spike ×5, ordini monoprodotto ad alta frequenza.
Webhook e-comm BRT / NCR carrier Flash sale spike Single-item pick Same-day SLA
S6
RETURNS · REVERSE
Returns & Reverse Logistics
Facility E dedicata ai resi. Quality inspection all'ingresso, routing per condizione (restock / refurbish / scrap), NCR generation automatica, crediti nota a cliente, KPI returns rate per SKU.
Reverse logistics NCR auto Quality inspection Returns rate KPI Credit note
S7
FULL · ENTERPRISE
Full Enterprise Suite
Scenario completo: tutte le 5 facility attive, tutti e 3 i tenant 4PL, cold chain, e-commerce, rete filiera, AI assistant attivo, WCS robotics, calendar integrato. Per demo enterprise di alto livello.
5 facility Tutti gli scenari AI assistant WCS robotics Full EDI Calendar ms
CUSTOM · DATI REALI
Setup Wizard — Tuoi Dati
Carica i tuoi prodotti, clienti e fornitori reali tramite CSV o JSON. Il Setup Wizard guida in 7 passi: selezione, upload, health check, configurazione e lancio automatico. I dati sostituiscono il catalogo base.
Upload CSV/JSON Dati personalizzati 7-step wizard Health check Auto-launch
🪄 Avvia Setup Wizard →

La "Giostra" — ciclo auto-sostenuto (S1)

Il cuore del simulatore è un ciclo a 4 fasi auto-alimentanti:

1
Procurement automatico — Quando stock di un SKU scende sotto ROP (Reorder Point) viene emesso automaticamente un purchase order al fornitore. Lead time: 3 giorni simulati.
2
Ricezione & Put-away — Il camion arriva, viene ricevuto al dock, qualità verificata (QC pass/fail), merce messa a scaffale con logica FEFO.
3
Wave Picking — Gli ordini cliente in coda vengono raggruppati in wave, assegnati ad AGV, picking completato, packing e labelling, assegnazione carrier.
4
Spedizione & Riordino — Carrier pickup, tracking aggiornato, stock decrementato → trigger procurement se sotto ROP → torna al passo 1.

06 KPI per scenario — tabella completa

I KPI sono distribuiti su 3 griglie nel cockpit, visibili in base allo scenario attivo. Ogni KPI ha soglie di colore (verde/arancione/rosso) per visual management immediato.

KPI S1S2S3 Unità Soglia OK Soglia Warning Soglia Critica
📦 Ordini spediti count
🤖 Missioni robot count
🚛 Camion ricevuti count
⚠️ Alert attivi count01-3>3
🎯 Precisione pick %≥99%97-99%<97%
🐛 Bug rilevati count01-2>2
⏱️ SLA Compliance %≥95%80-95%<80%
⚡ Equipment OEE %≥85%70-85%<70%
💶 4PL Fatturato € cum.
🔴 In manutenzione count01≥2
↩️ Resi processati count
🚚 Carrier Pickup count
🔗 Filiera™ Attivi count
👷 Labour KPI %≥80%60-80%<60%
🏗️ Yard Utilization %<85%85-95%≥95%
📦 Carton Utilization %≥75%50-75%<50%
🤖 WCS Dispatched count
📄 EDI Received count
📄 EDI Processed %≥95%80-95%<80%

✓ = KPI visibile in quel scenario · — = non disponibile

07 Gaming System — Achievements & Combos

Il simulatore include un sistema di gamification che trasforma la demo in un'esperienza coinvolgente: achievement sbloccabili, combo multiplier, streaks e un punteggio cumulativo.

I 9 Achievement

🚛
First Truck
Primo camion ricevuto al dock
Condizione: truck_arrives × 1
🌊
Wave Master
10 wave completate al 100%
Condizione: wave_completed × 10
Speed Demon
Simulazione a 100× per 5 min reali
Condizione: speed=100 per 300s
🥶
FEFO Guardian
50 pick FEFO corretti consecutivi
Condizione: fefo_streak ≥ 50
🌡️
Cold Keeper
Zona PHARMA sempre in range 2-8°C
Condizione: temp_breach = 0 per 24h sim
🤖
Fleet Commander
100 missioni AGV completate
Condizione: missions_completed × 100
🏆
SLA Champion
SLA ≥ 98% per 7 giorni simulati
Condizione: sla ≥ 98% × 7gg
💶
4PL Mogul
€10.000 di fatturato 4PL accumulato
Condizione: slaBilledEur ≥ 10000
🌙
Night Shift
Wave completata tra mezzanotte e 6:00 sim
Condizione: wave_completed tra 00-06 sim

Combo Multiplier

Ogni 3 missioni AGV completate consecutive senza errori viene mostrato un banner COMBO con moltiplicatore crescente:

🔥 3 missioni = COMBO ×2
🔥🔥 6 missioni = COMBO ×3
🔥🔥🔥 9+ missioni = COMBO ×5

Un bug nel tab BUG azzera la streak corrente.

Streaks attivi

Score System

Il punteggio nell'header si incrementa ad ogni evento positivo con un pop float animato (+10, +25, +50 punti a seconda dell'evento). Il punteggio è puramente visivo: dimostra all'audience il livello di "salute operativa" del magazzino.

08 SimRecorder — Replay event-driven

SimRecorder è il sistema di registrazione e replay delle sessioni di simulazione. A differenza dei recorder time-based (un frame ogni N secondi), SimRecorder cattura un frame per ogni evento significativo del motore.

Come attivare

  1. Nel setup step 3, abilitare Audit Trail
  2. Nell'header comparirà il bottone REC 🔴
  3. Premere REC per avviare la registrazione
  4. Il bottone lampeggia rosso durante la registrazione
  5. Premere nuovamente per fermare → appare bottone REPLAY

Architettura della registrazione

Frame structure

Ogni frame contiene:

  • idx — indice progressivo
  • t — timestamp simulato (ms)
  • eventType — tipo evento (es. wave_completed)
  • eventLabel — etichetta human-readable
  • level — info / warning / error / critical
  • kpi — snapshot di tutti i KPI al momento
  • score — punteggio corrente
  • eq — stato equipment (OEE, breakdown)

Parametri tecnici

  • MAX_SNAPSHOTS: 5.000 frame
  • DEBOUNCE_REAL_MS: 30ms (evita duplicati rapidi)
  • ALWAYS_SNAP: bypass debounce per eventi critici (bug, fefo_alert, stock_low, equipment_breakdown, sla_breach, customs_hold, quality_hold, flash_sale_start)
  • Thinning: quando pieno, elimina 1 frame su 2 mantenendo gli eventi critici

Pannello Replay

Apribile con il bottone REPLAY nell'header. Mostra:

AI Summary (SimRecorder + Claude)

Il pannello replay include un bottone "Analisi AI" che invia la sessione a Claude:

  1. SimRecorder genera un istogramma degli eventi (tipo → frequenza)
  2. Campiona una timeline di 50-100 frame rappresentativi
  3. Invia il tutto via SSE a /api/ai/chat con prompt: "Analizza questa sessione del simulatore WMS e dammi insight sulle performance operative"
  4. La risposta Claude appare in streaming nel pannello replay

Export

Il bottone Export JSON scarica tutti i frame come wms-sim-session-{timestamp}.json per analisi offline o caricamento in BI tool.

09 SimIDB — API Call Logger

SimIDB è il logger delle chiamate API fatte dal simulatore verso il backend WMS. Usa IndexedDB (non localStorage) per stare fuori dall'heap V8 — essenziale per sessioni lunghe senza OOM.

Caratteristiche tecniche

Storage

  • Database: wms-sim-idb
  • Store: calls
  • Max entries: 5.000 FIFO
  • Auto-prune stocastico: ~1% ad ogni write
  • Fuori heap V8 → no impatto su run lunghi (90gg a 50×)

Record structure

{
  method:    "GET",
  path:      "/api/missions/:id",
  status:    200,
  latencyMs: 47,
  ts:        1709123456789
}

Path normalization

I path con ID variabili vengono normalizzati per permettere statistiche aggregate:

Path realePath normalizzato
/api/missions/123/api/missions/:id
/api/products/456/api/products/:id
/api/outbound/orders/TRK-001/api/outbound/orders/:id

API pubblica

MetodoDescrizione
SimIDB.logCall(method, path, status, latencyMs)Logga una chiamata API
SimIDB.getCalls(limit)Ultime N chiamate ordinate per timestamp
SimIDB.getStats()Statistiche aggregate: top endpoint, latency avg, error rate
SimIDB.clearCalls()Svuota il database
SimIDB.countCalls()Numero totale entry correnti
SimIDB.init()Inizializzazione async (chiamata automaticamente al caricamento)

Pannello AUDIT WMS — lato IDB Stats

Il tab AUDIT mostra 3 card KPI da SimIDB:

Totale chiamate
2.847
API calls dall'avvio sessione
Latenza media
43ms
Average response time
Error rate
0.3%
Risposte 4xx/5xx sul totale

Sotto le card: barchart dei top 10 endpoint per latenza media, utile per identificare colli di bottiglia del backend durante la demo.

Hook in simulator.js

Ogni chiamata della funzione api() nel simulatore logga automaticamente il risultato:

const _t0 = Date.now();
const res = await fetch(url, opts);
SimIDB.logCall(method, path, res.status, Date.now() - _t0);

10 SimCoverage — 69 Feature Tracker

SimCoverage traccia in tempo reale quante delle 69 funzionalità WMS vengono esercitate durante una sessione di simulazione. È uno strumento pensato per dimostrare la breadth funzionale del sistema a prospect e manager.

Come funziona

Categorie di feature tracciate

CategoriaFeatureEsempi
Inbound8Purchase Order, Receiving, QC, Put-away, FEFO, LPN, SSCC, Deconsolidation
Outbound10Sales Order, Wave Planning, Picking, Packing, Labelling, Carrier, Tracking, Return
Inventory8Stock Level, Lot Control, Serial, UOM, Bin Management, Cycle Count, Adjustment
Warehouse9Zone Management, Slotting, AGV Missions, Dock Scheduling, Operator, NCR, Sensor
4PL / Multi-tenant7Tenant Isolation, 4PL Billing, SLA Profiles, Filiera™, Network Orders, EDI
AI / Analytics8AI Chat, Forecast, Demand Planning, Snapshot Vision, SSE Realtime, KPI Dashboard
Compliance6Audit Trail, GDPR, Cold Chain GDP, Cartonization, WCS, Calendar
Integration6Webhook e-commerce, TMS, REST API, JWT Auth, Multi-lingua, PWA mobile
Gaming / UX7Achievements, Combo, Score, SimRecorder, SimIDB, SimCoverage, Mappa SVG
🎯
Target demo ottimale: 50+ feature in 15 minuti Usando lo scenario S7 (Full Enterprise) a 50× e attivando manualmente un guasto + un flash sale, si riesce a toccare oltre 50 feature in meno di 15 minuti di demo.

11 Web Worker — Motore off-thread

Il SimEngine (simulator.js) gira dentro un Web Worker (sim-worker.js), separato dal thread UI principale. Questo risolve un problema critico per demo lunghe: il timer throttling di Chrome.

Il problema: Chrome timer throttling

Chrome riduce la frequenza dei timer (setTimeout, setInterval) nei tab non attivi a max 1Hz (invece dei normali 60Hz). Per un simulatore a 100× questo significa che il tempo simulato si ferma quasi completamente quando l'utente guarda un altro tab.

Con una simulazione di 90 giorni a 50×, il throttling faceva perdere ore di tempo simulato in pochi secondi di tab switching.

La soluzione: Web Worker

I Web Workers non sono soggetti al timer throttling. Il motore SimEngine gira nel Worker e continua a calcolare il tempo simulato alla velocità corretta indipendentemente da quale tab è visibile.

Protocollo di comunicazione

Main Thread Worker Thread ────────────── ────────────── sim-worker-init.js sim-worker.js │ │ │──── postMessage({ │ │ type:'init', │ │ scenario:'s2', │ │ options:{...} │ │ }) ──────────────────────►│ │ │◄── importScripts(simulator-data.js) │ │◄── importScripts(simulator.js) │ │── SimEngine.init(options) │◄── {type:'ready'} ──────────│ │ │ │──── {type:'start'} ────────►│── SimEngine.start() │ │ │◄── {type:'event', │ │ event:'truck_arrives', │◄── SimEngine.emit('truck_arrives', data) │ data:{...}} ─────────────│ │── emit() verso SimUI │ │── SimRecorder.onEvent() │ │── SimIDB.logCall() │ │ │ [per ogni messaggio] [per ogni tick]

Stub browser API nel Worker

I Web Workers non hanno accesso a window, localStorage, sessionStorage. Il file sim-worker.js include stub per permettere a simulator.js (scritto per il browser) di girare nel Worker:

// Alias window → self
if (typeof window === 'undefined') self.window = self;

// localStorage stub (con sync al main thread)
const _lsData = {};
self.localStorage = {
  getItem:  (k) => _lsData[k] ?? null,
  setItem:  (k, v) => {
    _lsData[k] = String(v);
    self.postMessage({ type: '_ls_sync', key: k, val: v });
  },
};

Comandi disponibili (Main → Worker)

Tipo messaggioPayloadEffetto
initscenario, optionsInizializza SimEngine con lo scenario scelto
startAvvia il motore
pauseCongela il motore (stato preservato)
resumeRiprende dalla pausa
setSpeedmultiplier (1-100)Cambia velocità simulazione
resetReset completo stato motore
getStateidRisponde con state_response (tutti i KPI)
getLogidRisponde con log_response (ultimi eventi)
getBugsidRisponde con bugs_response

12 Snapshot AI Vision

Il simulatore può catturare screenshot automatici del cockpit e inviarli a Claude per analisi visiva. Funzionalità abilitata dallo step 3 del setup (opzione "Snapshot AI").

Come funziona

  1. Catturahtml2canvas renderizza l'intero div #sim-cockpit (mappa SVG + pannelli + KPI) in un canvas HTML5
  2. Compressione — il canvas viene convertito in PNG base64 (qualità 0.7)
  3. Upload — POST a /api/ai/snapshot con il PNG + metadati (scenario, KPI correnti, evento trigger)
  4. Analisi — Claude analizza l'immagine e restituisce insight operativi via SSE streaming
  5. Fallback — se html2canvas fallisce, viene catturato l'SVG della mappa direttamente

Auto-trigger su eventi critici

Uno snapshot viene catturato automaticamente (senza premere SNAP) per 8 tipi di eventi:

🐛 bug
❄️ fefo_alert
📉 stock_low
🔴 equipment_breakdown
⏱️ sla_breach
🛃 customs_hold
🔬 quality_hold
⚡ flash_sale_start

Cooldown e deduplication

Trigger manuale

Il bottone SNAP 📸 nell'header cattura uno snapshot manuale in qualsiasi momento, utile per salvare un momento interessante durante una demo.

Integrazione con SimRecorder

Quando sia Audit Trail che Snapshot AI sono attivi, ogni snapshot manuale viene anche salvato come frame in SimRecorder (con eventType: 'manual_snap'), così appare nel replay slider.

13 Integrazione con il sistema di test

Il simulatore è parte integrante della strategia di test a 5 livelli di WMS Agile. In particolare, il tab AUDIT del simulatore implementa il test L4 in modalità live e continua.

Mappa simulatore ↔ livelli di test

LivelloScript esternoEquivalente nel simulatore
L1 Smoke infrastructure/test-smoke.sh Header indicators: se i servizi sono down il simulatore non fa login e mostra errore visivo. Non sostituisce L1 ma dà feedback immediato.
L2 E2E infrastructure/test-e2e.sh Ogni run del simulatore esegue de-facto un ciclo WMS completo (inbound → wave → pick → outbound). Non misura exit code ma esercita gli stessi path.
L3 PHPUnit infrastructure/test-phpunit.sh ❌ Non integrabile (richiede PHP + Docker). Solo via SSH.
L4 SimAPIs infrastructure/test-simulator-apis.sh Completamente integrato nel tab AUDIT via SimIDB. Ogni API call del simulatore viene misurata con latenza reale e aggregata per endpoint.
L5 Playwright infrastructure/test-ui.sh ❌ Non integrabile (browser che controlla un browser).
Stress Test infrastructure/test-stress.sh ⚠️ Parzialmente: i bottoni "🚻 Pausa Ops" e "🔧 Guasto" nel tab MISSIONI simulano scenari di carico. Per stress concorrente reale usare lo script esterno.

Come eseguire i test completi

Master Test Runner (da terminale)

./infrastructure/test-master.sh https://wms.agile.software

# Variabili opzionali:
WMS_SKIP_L3=1  ./infrastructure/test-master.sh   # Salta PHPUnit
WMS_VERBOSE=1  ./infrastructure/test-master.sh   # Output completo
WMS_SKIP_L5=1  ./infrastructure/test-master.sh   # Salta Playwright

Genera un report HTML in /tmp/wms-test-report-{data}.html con risultati per livello, log e badge PASS/FAIL.

Livelli test in parallelo (FASE 1)

  • L1 Smoke (17 check, ~5s)
  • L3 PHPUnit (OutboundMS + InventoryMS + InboundMS)
  • L4 SimAPIs (30+ endpoint con latenza)

I tre girono in parallelo con & per massimizzare la velocità.

Livelli sequenziali

  • L2 E2E (FASE 2 — dopo L1)
  • L5 Playwright 19 test (FASE 3 — ultima)
  • Stress Test (separato, a richiesta)

Se L1 fallisce viene emesso warning ma L2/L5 continuano.

CI/CD — Gitea Actions

Il file .gitea/workflows/wms-tests.yml esegue tutti i livelli ad ogni push su main o develop:

Job CILivelloDipendenza
smokeL1
phpunit-outboundL3
phpunit-inventoryL3
phpunit-inboundL3
e2eL2smoke
simulator-apisL4smoke
playwright-uiL5smoke
summarytutti (if: always)

Export SimIDB per analisi post-sessione

Per analizzare le performance API dopo una demo, è possibile esportare i dati SimIDB:

// Nel browser console durante/dopo la demo:
const data = await SimIDB.getCalls(5000);
const blob = new Blob([JSON.stringify(data, null, 2)], {type:'application/json'});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'wms-api-calls-' + Date.now() + '.json';
a.click();

14 Setup Wizard — Avvio guidato 7 step

Il Setup Wizard è una pagina standalone che guida utenti e prospect in 7 passi attraverso la configurazione e il lancio del simulatore. Accessibile da: wms.agile.software/sim-wizard.html

🪄
Setup Wizard — Accesso rapido
Nessun login richiesto per scorrere i passi. Login necessario solo per salvare dataset personalizzati sul server.
▶ Apri Setup Wizard

I 7 passi del wizard

1
Benvenuto & Overview

Animazione SVG "La Giostra", 5 feature card. Il prospect capisce immediatamente cosa fa il simulatore prima ancora di configurarlo.

2
Selezione Scenario

Griglia S1–S7 + card CUSTOM "Dati Personalizzati". Selezionando CUSTOM si sblocca il passo 3. Scenari predefiniti saltano direttamente al passo 4.

3
Caricamento Dati Reali [solo CUSTOM]

Dropzone CSV (products / customers / suppliers) con PapaParse client-side + preview prime 5 righe. In alternativa: singolo file JSON. Template CSV scaricabili inline. Salvataggio server-side con ID univoco (POST /api/ai/sim-dataset).

products.csv: sku, name, category, weight_kg, expiry_days, price_unit, temp_zone, tenant
customers.csv: name, type, order_freq_min, order_freq_max, avg_lines, priority, sla_hours
suppliers.csv: name, category, skus, lead_days, avg_qty, reliability, facility
4
Health Check Servizi

Verifica automatica in parallelo (Promise.allSettled, timeout 6s) di 7 microservizi: auth, inventory, warehouse, inbound, outbound, report, ai. Indicatore ● verde/rosso per servizio. Warning se offline, non blocca il lancio.

5
Configurazione Simulazione

Velocità: 1× / 5× / 10× / 25× / 50× / 100×. Durata: slider 7–365 giorni (default 90). Toggle: Audit Trail, Snapshot AI, Mission Planner (AGV).

6
Dataset Salvati [solo CUSTOM]

Lista dataset server-side del tenant (GET /api/ai/sim-datasets). Card con nome, #prodotti/#clienti/#fornitori, data upload. Selezione dataset esistente invece di ricaricare il file.

7
Riepilogo & Lancio

Summary completo configurazione. Pulsante ▶ LANCIA SIMULAZIONE → redirect a simulator.html?scenario=CUSTOM&autolaunch=1&speed=50&days=90. I dati custom vengono salvati in sessionStorage e il simulatore si avvia automaticamente senza passare per il modal di selezione.

Integrazione tecnica Wizard → Simulator

MeccanismoDettaglio
URL params ?scenario=CUSTOM&autolaunch=1&speed=50&days=90
sessionStorage wms_wizard_dataset → JSON {products, customers, suppliers}
wms_wizard_speed → velocità selezionata (consumed + removed on use)
simulator.html init() Legge URL params, chiama selectScenario('CUSTOM'), poi launch() dopo 250ms
SimScenario.load('CUSTOM') Legge sessionStorage, fa override di window.SimData.PRODUCTS/CUSTOMERS/SUPPLIERS
Dataset API POST/GET/DELETE /api/ai/sim-dataset(s), max 10 per tenant, FIFO rotation
Bind mount /var/www/wms-agile/app/uploads → container wms-ai-ms (persistenza tra rebuild)

WMS Agile · Guida Simulatore v3.1 · Marzo 2026

▶ Apri Simulatore  ·  🪄 Setup Wizard  ·  Guida Funzionale  ·  Playbook Demo  ·  Gap SAP EWM

© 2026 Agile Technology S.r.l. — P.IVA 07776161213  ·  Privacy & Legal