[{"data":1,"prerenderedAt":419},["ShallowReactive",2],{"featured-projects":3},[4,192],{"id":5,"title":6,"body":7,"date":175,"description":176,"draft":177,"extension":178,"featured":179,"image":180,"meta":181,"navigation":179,"order":182,"path":183,"sector":184,"seo":185,"stem":186,"tech":187,"type":190,"__hash__":191},"progetti\u002Fprogetti\u002Fsafetrack.md","SafeTrack",{"type":8,"value":9,"toc":161},"minimark",[10,15,19,22,26,29,32,37,45,57,61,64,80,83,87,94,98,105,116,120,123,143,147,154],[11,12,14],"h2",{"id":13},"la-sfida","La sfida",[16,17,18],"p",{},"Un'azienda del settore antincendio e sicurezza nel Sud Italia gestiva tutta la manutenzione   estintori, impianti antincendio, DAE   su carta. Gli operatori uscivano al mattino con fogli stampati, compilavano a mano i report di intervento, tornavano in ufficio e qualcuno li inseriva nel sistema. Un processo che funzionava, certo. Ma funzionava male.",[16,20,21],{},"I problemi erano evidenti: errori di trascrizione, ritardi nella rendicontazione, nessuna visibilità in tempo reale su chi stava facendo cosa. Il management vedeva i dati solo a fine settimana. E quando un cliente chiedeva lo storico degli interventi, servivano ore per ricostruirlo.",[11,23,25],{"id":24},"la-soluzione","La soluzione",[16,27,28],{},"Ho progettato e sviluppato SafeTrack, un'app mobile nativa che accompagna l'operatore in ogni fase del lavoro quotidiano. L'idea era semplice: l'operatore apre l'app, vede la sua lista lavoro, prende in carico gli interventi, li completa e tutto si sincronizza automaticamente con il backoffice.",[16,30,31],{},"Ma la semplicità d'uso nasconde una complessità tecnica significativa.",[33,34,36],"h3",{"id":35},"architettura-offline-first","Architettura offline-first",[16,38,39,40,44],{},"Gli operatori lavorano spesso in seminterrati, garage, capannoni   posti dove il segnale è un lusso. Per questo ho scelto un'architettura ",[41,42,43],"strong",{},"offline-first",": l'app funziona completamente senza connessione. I dati vengono scaricati all'inizio della giornata, gli interventi vengono registrati localmente e la sincronizzazione avviene quando il dispositivo torna online.",[16,46,47,48,52,53,56],{},"Ho utilizzato ",[49,50,51],"code",{},"AsyncStorage"," per i dati operativi e ",[49,54,55],{},"SecureStore"," per i token JWT, garantendo sia la persistenza che la sicurezza.",[33,58,60],{"id":59},"due-workflow-distinti","Due workflow distinti",[16,62,63],{},"Il sistema gestisce due workflow principali:",[65,66,67,74],"ul",{},[68,69,70,73],"li",{},[41,71,72],{},"Prelievo",": l'operatore preleva il dispositivo (estintore, DAE, ecc.), lo porta in laboratorio, esegue la manutenzione e lo riconsegna",[68,75,76,79],{},[41,77,78],{},"SulPosto",": l'operatore esegue la manutenzione direttamente presso il cliente",[16,81,82],{},"Ogni workflow ha i suoi stati, le sue validazioni e le sue regole. Ho implementato una macchina a stati che gestisce le transizioni e impedisce operazioni non valide.",[33,84,86],{"id":85},"gestione-gerarchica-a-3-livelli","Gestione gerarchica a 3 livelli",[16,88,89,90,93],{},"I dispositivi sono organizzati in una gerarchia a tre livelli: ",[41,91,92],{},"Categoria → Tipologia → Dispositivo",". Questa struttura permette di navigare rapidamente tra migliaia di dispositivi e di applicare regole di manutenzione specifiche per ogni tipologia.",[11,95,97],{"id":96},"stack-tecnico","Stack tecnico",[16,99,100,101,104],{},"Il backend è costruito su ",[41,102,103],{},"Strapi 5"," con autenticazione JWT. Ho scelto Strapi perché offre un'API REST completa out-of-the-box e un pannello di amministrazione che il backoffice può usare direttamente.",[16,106,107,108,111,112,115],{},"Il frontend è ",[41,109,110],{},"React Native"," con ",[41,113,114],{},"Expo SDK 54",", TypeScript come linguaggio principale. La scelta di Expo ha accelerato enormemente lo sviluppo e il deployment su entrambe le piattaforme (iOS e Android).",[11,117,119],{"id":118},"risultati","Risultati",[16,121,122],{},"I numeri parlano chiaro:",[65,124,125,131,137],{},[68,126,127,130],{},[41,128,129],{},"-70% tempi di rendicontazione",": quello che prima richiedeva ore di data entry manuale ora è automatico",[68,132,133,136],{},[41,134,135],{},"Eliminazione completa della gestione cartacea",": niente più fogli stampati, niente più errori di trascrizione",[68,138,139,142],{},[41,140,141],{},"Visibilità real-time dal backoffice",": il management vede in tempo reale lo stato degli interventi, senza aspettare fine giornata",[11,144,146],{"id":145},"lezioni-apprese","Lezioni apprese",[16,148,149,150,153],{},"SafeTrack è stata la mia prima app mobile in produzione con architettura offline-first. La lezione più importante? ",[41,151,152],{},"La sincronizzazione dei dati è il problema più difficile da risolvere",". Non è sufficiente salvare i dati localmente e inviarli quando c'è rete   bisogna gestire i conflitti, i retry, i timeout. Ho sviluppato un sistema di coda con retry exponential backoff che ha reso il processo robusto e affidabile.",[16,155,156,157,160],{},"Un'altra lezione: ",[41,158,159],{},"Expo SDK 54 è maturo per la produzione",". I tempi di sviluppo rispetto a React Native CLI sono drasticamente inferiori, e la qualità del risultato è identica.",{"title":162,"searchDepth":163,"depth":163,"links":164},"",2,[165,166,172,173,174],{"id":13,"depth":163,"text":14},{"id":24,"depth":163,"text":25,"children":167},[168,170,171],{"id":35,"depth":169,"text":36},3,{"id":59,"depth":169,"text":60},{"id":85,"depth":169,"text":86},{"id":96,"depth":163,"text":97},{"id":118,"depth":163,"text":119},{"id":145,"depth":163,"text":146},"2024","App mobile per la gestione della manutenzione antincendio. Offline-first con React Native ed Expo, ha eliminato la gestione cartacea e ridotto i tempi di rendicontazione del 70%.",false,"md",true,"\u002Fimages\u002Fprojects\u002Fsafetrack.jpg",{},1,"\u002Fprogetti\u002Fsafetrack","Antincendio \u002F Sicurezza",{"title":6,"description":176},"progetti\u002Fsafetrack",[110,114,188,103,189,51,55],"TypeScript","JWT Auth","Mobile App","wmO6paiFkUljnWkr_4C6MCJk5rIqzXoqdKRtwGrepK0",{"id":193,"title":194,"body":195,"date":397,"description":398,"draft":177,"extension":178,"featured":179,"image":399,"meta":400,"navigation":179,"order":169,"path":401,"sector":402,"seo":403,"stem":404,"tech":405,"type":417,"__hash__":418},"progetti\u002Fprogetti\u002Fdatavision.md","DataVision",{"type":8,"value":196,"toc":384},[197,199,206,209,211,214,218,225,229,232,236,243,247,254,258,269,292,296,299,331,334,336,339,365,367,374,381],[11,198,14],{"id":13},[16,200,201,202,205],{},"Un'azienda di distribuzione nel settore sicurezza industriale aveva un problema molto comune nelle PMI italiane: ",[41,203,204],{},"i dati c'erano, ma nessuno riusciva a usarli",". Il gestionale ERP conteneva anni di dati su vendite, clienti, magazzino, agenti   ma estrarre un report significava chiedere all'ufficio IT, aspettare giorni e ricevere un file Excel con migliaia di righe incomprensibili.",[16,207,208],{},"Il management prendeva decisioni sulla base di sensazioni. Gli agenti non sapevano quali clienti stavano calando. Il magazzino ordinava a occhio. I dati erano lì, ma erano invisibili.",[11,210,25],{"id":24},[16,212,213],{},"Ho progettato e realizzato DataVision, una piattaforma BI completa che trasforma i dati dell'ERP aziendale in dashboard interattive, accessibili da browser. Ogni ruolo aziendale ha la sua vista: agenti, responsabili warehouse, management, direzione.",[33,215,217],{"id":216},"dashboard-venduto-con-drill-down","Dashboard Venduto con drill-down",[16,219,220,221,224],{},"La dashboard principale mostra l'andamento delle vendite con filtri per periodo, agente, zona, categoria prodotto. Ma il vero valore è nel ",[41,222,223],{},"drill-down",": dal totale del venduto si può scendere fino alla singola fattura, passando per cliente, famiglia prodotto, articolo. Il management non deve più chiedere \"perché quel numero è così\"   può scoprirlo da solo.",[33,226,228],{"id":227},"controllo-fido-con-alert","Controllo fido con alert",[16,230,231],{},"Ho implementato un sistema di monitoraggio del fido clienti con alert automatici. Quando un cliente si avvicina o supera il limite, il sistema invia notifiche al responsabile commerciale e all'agente. Questo ha ridotto drasticamente i ritardi nei pagamenti.",[33,233,235],{"id":234},"sistema-premi-agenti","Sistema premi agenti",[16,237,238,239,242],{},"Uno dei moduli più complessi: il sistema di calcolo premi per la rete agenti. La logica di business richiede il ",[41,240,241],{},"calcolo con anti double-counting","   ogni vendita viene attribuita una sola volta, anche quando più regole di premialità si sovrappongono. Ho implementato un motore di regole configurabile che il management può modificare senza intervento tecnico.",[33,244,246],{"id":245},"valutazione-magazzino","Valutazione magazzino",[16,248,249,250,253],{},"Il modulo warehouse calcola l'",[41,251,252],{},"indice di rotazione"," per ogni articolo, identifica le scorte ferme e suggerisce i riordini. I dati vengono aggiornati quotidianamente tramite pipeline ETL automatizzate.",[33,255,257],{"id":256},"integrazione-ai","Integrazione AI",[16,259,260,261,264,265,268],{},"Ho integrato le API di ",[41,262,263],{},"OpenAI"," e ",[41,266,267],{},"Claude"," per aggiungere un layer di intelligenza all'analisi. Il sistema può:",[65,270,271,278,285],{},[68,272,273,274,277],{},"Generare ",[41,275,276],{},"analisi testuali"," a partire dai dati (es. \"Il fatturato zona Nord è calato del 12% rispetto al trimestre precedente, principalmente a causa del cliente X\")",[68,279,280,281,284],{},"Identificare ",[41,282,283],{},"pattern anomali"," nei dati di vendita",[68,286,287,288,291],{},"Suggerire ",[41,289,290],{},"azioni correttive"," basate sui trend",[11,293,295],{"id":294},"architettura-tecnica","Architettura tecnica",[16,297,298],{},"La piattaforma si compone di diversi layer:",[65,300,301,307,313,319,325],{},[68,302,303,306],{},[41,304,305],{},"Frontend",": Vue.js 3 con Composition API per le dashboard interattive",[68,308,309,312],{},[41,310,311],{},"ETL Layer",": Node-RED e n8n per l'estrazione, trasformazione e caricamento dei dati dall'ERP (SQL Server) al database operativo (MySQL)",[68,314,315,318],{},[41,316,317],{},"BI Engine",": Power BI per i report embedded, con misure DAX avanzate per calcoli complessi (YoY, running totals, ranking)",[68,320,321,324],{},[41,322,323],{},"AI Layer",": API OpenAI\u002FClaude per analisi predittive e generazione insights",[68,326,327,330],{},[41,328,329],{},"Infrastructure",": Docker per il deployment, GitHub Actions per la CI\u002FCD",[16,332,333],{},"I flussi ETL girano ogni notte, aggiornando i dati operativi. I dashboard sono sempre aggiornati alla giornata precedente, con alcuni KPI refreshati in near-real-time.",[11,335,119],{"id":118},[16,337,338],{},"I numeri che mi rendono più orgoglioso:",[65,340,341,347,353,359],{},[68,342,343,346],{},[41,344,345],{},"-40% tempi di estrazione dati",": quello che prima richiedeva ore di lavoro manuale ora è accessibile in un clic",[68,348,349,352],{},[41,350,351],{},"Analisi bancaria da 3 ore a 20 secondi",": un report che richiedeva mezza giornata di lavoro ora è istantaneo",[68,354,355,358],{},[41,356,357],{},"40+ utenti attivi",": dagli agenti alla direzione, tutta l'azienda usa DataVision quotidianamente",[68,360,361,364],{},[41,362,363],{},"Autonomia operativa",": il management prende decisioni basate sui dati, senza dipendere dall'ufficio IT",[11,366,146],{"id":145},[16,368,369,370,373],{},"DataVision mi ha insegnato che ",[41,371,372],{},"la BI non è una questione di tecnologia, ma di traduzione",". Il mio lavoro non è stato costruire dashboard   è stato capire le domande che il management si pone e tradurle in visualizzazioni comprensibili.",[16,375,376,377,380],{},"Ho anche imparato il valore di ",[41,378,379],{},"Node-RED e n8n come acceleratori",": per le pipeline ETL, queste piattaforme low-code permettono di iterare velocemente e di coinvolgere anche figure non tecniche nella definizione dei flussi.",[16,382,383],{},"L'integrazione AI è stata la parte più innovativa. Non ho cercato di sostituire l'analisi umana   ho dato agli analisti uno strumento in più per interpretare i dati. Il risultato è che le riunioni commerciali sono diventate più brevi e più focalizzate.",{"title":162,"searchDepth":163,"depth":163,"links":385},[386,387,394,395,396],{"id":13,"depth":163,"text":14},{"id":24,"depth":163,"text":25,"children":388},[389,390,391,392,393],{"id":216,"depth":169,"text":217},{"id":227,"depth":169,"text":228},{"id":234,"depth":169,"text":235},{"id":245,"depth":169,"text":246},{"id":256,"depth":169,"text":257},{"id":294,"depth":163,"text":295},{"id":118,"depth":163,"text":119},{"id":145,"depth":163,"text":146},"2023","Piattaforma di Business Intelligence completa con dashboard per agenti, warehouse e direzione. Integrazione AI per analisi predittive, usata quotidianamente da oltre 40 utenti.","\u002Fimages\u002Fprojects\u002Fdatavision.jpg",{},"\u002Fprogetti\u002Fdatavision","Distribuzione \u002F Sicurezza industriale",{"title":194,"description":398},"progetti\u002Fdatavision",[406,407,408,409,410,411,412,413,414,415,416],"Vue.js 3","Node-RED","n8n","SQL Server","MySQL","Power BI","DAX","OpenAI API","Claude API","Docker","GitHub Actions","BI Dashboard","x0sRY_FqUkyzqPmg9fQ1eqBCUZYpziaDdmtnANQqxpo",1776845660039]