Come funziona il sistema Grenoble + GreenApp, come interagiscono le tre superfici (webapp, app cittadino, app operatore) e il flusso end-to-end del device dal conferimento alla ricollocazione.
Il progetto Grenoble & GreenApp è un sistema digitale end-to-end per la gestione del riuso di dispositivi elettronici (device IT ed elettrodomestici) nella Métropole di Grenoble. È composto da tre superfici coordinate che insieme gestiscono il ciclo vita del device dal conferimento alla ricollocazione (o smaltimento certificato).
Il cuore del sistema: gestionale web per operatori del Pôle R. Single source of truth per tutti i dati. 13 aree funzionali.
App mobile per cittadini, aziende ed enti che vogliono donare device o richiederne ricondizionati. Focus su semplicità + gamification.
App mobile per gli operatori Pôle R in mobilità: ritiri a domicilio, consegne, scansione QR, firme digitali.
In una frase: Grenoble gestisce e decide, GreenApp porta i cittadini nel flusso, Grenoble Mobile permette agli operatori di lavorare fuori ufficio. Tutte e tre condividono il backend.
Il sistema adotta un'architettura client-server a più superfici con backend unificato. Tutte e tre le app parlano con lo stesso set di API, sulla stessa base dati. Questo garantisce coerenza: quando un operatore registra un cambio di stato su Grenoble Mobile, l'utente su GreenApp vede l'aggiornamento in pochi secondi.
Diagramma concettuale:
┌──────────────┐ ┌─────────────────┐ ┌──────────────┐
│ GreenApp │ │ Grenoble │ │ Grenoble │
│ (citoyen) │ │ (webapp) │ │ Mobile │
│ 📱 RN │ │ 🖥 Next │ │ 📱 RN │
└──────┬───────┘ └────────┬────────┘ └──────┬───────┘
│ │ │
│ HTTPS / WSS │ HTTPS / WSS │
└──────────┬─────────┴──────────┬─────────┘
│ │
┌──────▼────────────────────▼──────┐
│ API Gateway │
│ (REST + GraphQL + WebSocket) │
└──────┬─────────────────────┬─────┘
│ │
┌────────▼──────┐ ┌─────────▼──────┐
│ Core API │ │ Auth Service │
│ (Node.js) │ │ (JWT + 2FA) │
└────────┬──────┘ └────────────────┘
│
┌───────────┼───────────┬──────────┐
│ │ │ │
┌───▼──┐ ┌─────▼────┐ ┌───▼────┐ ┌───▼────┐
│Mongo │ │PostgreSQL│ │ Redis │ │ S3 │
│(dati)│ │ (audit) │ │(cache) │ │(files) │
└──────┘ └──────────┘ └────────┘ └────────┘
Chi la usa: operatori dei Pôle R, admin di centro, analisti, super admin Métropole.
Dove: browser desktop (Chrome/Firefox/Safari). Responsive ma ottimizzata per schermi ≥ 1280px.
Ruolo nel sistema: single source of truth. È qui che si decide: valutazione, routing a riparatore, assegnazione beneficiario, chiusura del ciclo. È anche il luogo della reportistica e dell'amministrazione.
Chi la usa: cittadini privati, aziende (referenti CSR), enti (referenti tecnici).
Dove: iOS 16+ e Android 10+. Download da App Store / Play Store.
Ruolo nel sistema: porta d'ingresso e di uscita per il cittadino. Qui si avviano le donazioni, si prenotano i ritiri, si richiedono i device. È il canale che trasforma la passività ("porta la roba al cassonetto") in partecipazione attiva ("traccia dove va il tuo vecchio PC e vedi chi lo riceve").
Chi la usa: operatori Pôle R in mobilità (stessi account della webapp).
Dove: iOS 16+ e Android 10+. Distribuzione interna (MDM / TestFlight / enterprise).
Ruolo nel sistema: estensione mobile del gestionale. Gli operatori non stanno solo in centro: fanno ritiri, consegne, conferimenti esterni. Serve uno strumento nativo con fotocamera, GPS, firma touch, operatività offline.
Decisione importante per la call: valutare se Grenoble Mobile è veramente necessaria come app separata o se una versione mobile responsive della webapp è sufficiente. La nostra raccomandazione: app separata per hardware access (fotocamera nativa, GPS, biometria) e per operatività offline, ma la decisione finale dipende dai volumi di ritiri a domicilio previsti.
Un esempio concreto: un notebook Dell Latitude 5420 donato dal cittadino Marc Dubois, che finisce nelle mani di uno studente del Collège Olympique.
Marc apre GreenApp sul suo telefono. Scatta una foto del notebook; l'AI suggerisce "Notebook · Dell". Compila 3 campi guidati (modello, stato, accessori). Prenota un ritiro a casa per martedì 14–17.
La richiesta arriva automaticamente nel Calendario ritiri di Grenoble webapp. Il responsabile logistica la inserisce nel giro del martedì pomeriggio dell'operatore Luc.
Martedì, Luc apre Grenoble Mobile. Vede la lista ritiri, naviga fino a casa di Marc. Scansiona il device (già etichettato da una sessione precedente, oppure gli attacca un QR), scatta foto, raccoglie firma digitale di Marc.
Al rientro al Pôle R, il device è sincronizzato nel Registro Grenoble. Codice assegnato: GR-2604-0891. Marc riceve una notifica su GreenApp: "Il tuo device è in valutazione".
Un operatore esegue wipe certificato (tool dedicato, report PDF). Poi valuta tecnicamente: stato B, riusabile dopo piccola riparazione (tastiera). Viene generato OL verso Envie Isère.
Il device viene consegnato a Envie Isère. Il loro tecnico (ruolo "Partner" sulla webapp) aggiorna lo stato dell'OL: intervento eseguito in 5 giorni. Marc vede "In riparazione" sulla sua GreenApp con ETA rientro.
Al rientro, il sistema propone automaticamente un matching: Fam. Bouchard, in lista d'attesa sul bando Écoles Numériques 2026, priorità alta (2 figli, QF basso). L'operatore approva il matching.
Luc usa Grenoble Mobile per la consegna: verifica ID del beneficiario, fa firmare il comodato d'uso 24 mesi, scatta foto di consegna. Il device esce ufficialmente da Grenoble.
Marc riceve l'ultima notifica su GreenApp: "Il tuo notebook ora è usato da una famiglia del Collège Olympique. Grazie! +80 punti Green". Punti accumulati, badge sbloccato, posizione in classifica aggiornata.
Ogni device passa attraverso una sequenza ben definita di stati. Ciascuno stato ha precondizioni, azioni possibili, e app/ruolo responsabile.
| # | Stato | Descrizione | Superficie attiva |
|---|---|---|---|
| 1 | Conferito | Device registrato in sistema, anagrafica conferitore collegata, documento firmato. | Grenoble + Mobile |
| 2 | Wipe dati | Cancellazione certificata dati personali (GDPR). Report allegato. | Grenoble |
| 3 | Valutazione | Classificazione A/B/C o scarto. Decisione destinazione iniziale. | Grenoble |
| 4 | In riparazione | Presso partner esterno. OL aperto, rientro previsto. | Grenoble + portale partner |
| 5 | Ricondizionato | Rientrato, collaudato, valore commerciale stimato. | Grenoble |
| 6 | Pronto | In magazzino, listato nel catalogo GreenApp, prenotabile. | Grenoble + GreenApp (catalogo) |
| 7 | Assegnato | Matching con beneficiario approvato. Riservato. | Grenoble |
| 8 | Consegnato / Uscita | Consegna effettuata, comodato firmato, uscita registrata. | Mobile + Grenoble |
| — | Smaltimento RAEE | Fork alternativo: device non riusabile, inviato a gestore autorizzato ADEME. | Grenoble + gestore |
Le transizioni di stato sono tracciate nel PostgreSQL audit log con timestamp, operatore, motivo, eventuali allegati (report wipe, ricevute, firme). Questo permette audit esterni (Métropole, ADEME) e ricostruzione storica completa.
Il modello di interazione è event-driven: ogni azione su una superficie può emettere eventi che altre superfici ascoltano. Esempi tipici:
Principio di design: la webapp è autoritativa, le app mobile sono esecutive. GreenApp può solo proporre richieste e vedere stati; non può cambiare direttamente i dati del device. Grenoble Mobile può cambiare stati, ma solo in quelli permessi al ruolo operatore (es. "consegnato", "wipe eseguito", "ritiro completato").
Quando un utente è attivo in una delle app, mantiene una connessione WebSocket. Il backend pubblica eventi su "room" logiche: user:123, pole:grenoble-centre, role:operator. Gli eventi più frequenti:
device:state-changed → notifica cittadino + aggiornamento dashboardpickup:new → badge sul calendario operatorichat:message → notifica team (Grenoble Mobile)assignment:proposed → suggerimento matchingGli operatori possono lavorare senza connessione (es. ritiro in zona con copertura scarsa). L'app mantiene una coda di operazioni locale:
Redis ospita: sessioni utente, cache del catalogo device (TTL breve), contatori aggregati (KPI dashboard), risultati query matching.
Il sistema usa un modello Role-Based Access Control con 5 ruoli predefiniti, più possibilità di override per utente singolo.
| Ruolo | Scope | Può fare | Non può fare |
|---|---|---|---|
| 👑 Super Admin | Métropole intera | Tutto | — |
| 🛡 Admin Pôle R | Un centro | Gestione completa del proprio Pôle R | Vedere altri Pôle R, gestire utenti di sistema |
| 🎯 Operatore | Un centro | Intake, tracking, ritiri, consegne, stati device | Gestire bandi, anagrafiche non proprie, report |
| 📊 Analista | Métropole (lettura) | Report, export, dashboard | Modificare dati |
| 🔧 Partner riparatore | Solo i propri OL | Aggiornare stato propri OL, caricare ricevute | Vedere altri device, accedere ad anagrafiche |
I ruoli si applicano anche sulle app mobile: Grenoble Mobile accetta solo utenti operatore o admin. GreenApp è per "cittadino" (ruolo separato gestito via France Connect / social login).
Importante: le integrazioni qui elencate sono proposte aggiuntive non presenti nel progetto originale descritto nella mail. Sono tutte da valutare con il cliente in base a: budget, obblighi normativi francesi, priorità di roadmap, possibili alternative open-source o sostituzioni locali.
SSO con identità digitale cittadini. Raccomandato per conformità e fiducia. Alternativa: login email/social.
Registro nazionale gestori RAEE. Necessario per rendicontazione smaltimento. Probabilmente obbligatorio.
Mappe, geocoding, navigazione turn-by-turn. Costo per chiamata. Alternativa: OpenStreetMap + Leaflet.
Push notifiche cross-platform (iOS + Android). Gratuito. Alternativa: OneSignal, APNS diretto.
Firma digitale remota con valore legale (eIDAS). Yousign è FR, preferibile. Alternativa: firma elettronica semplice in-app.
Email transazionali affidabili. Mailjet è FR/EU. Alternativa: SMTP proprio.
Riconoscimento foto device (AI). Comodo per UX ma non essenziale. Alternativa: modello open-source (YOLO) on-prem.
Verifica automatica QF (quotient familial) dei richiedenti bandi sociali. Utile ma richiede convenzione con CAF.
| Layer | Tecnologia | Note |
|---|---|---|
| Webapp Grenoble | React 18 + Next.js 14 + TypeScript | SSR per SEO, ISR per dashboard pubbliche |
| App GreenApp + Mobile | React Native + Expo | Codice condiviso tra iOS e Android (~85%) |
| Backend API | Node.js + Express / Fastify | Performance, ecosistema JS coerente |
| Real-time | Socket.io | Fallback a long-polling se WebSocket bloccati |
| Database primario | MongoDB 6+ | Dati applicativi (device, anagrafiche, richieste) |
| Database audit | PostgreSQL 15+ | Audit log, report analytici |
| Cache & session | Redis 7+ | Sessioni, cache query, contatori |
| Storage file | S3-compatible (MinIO on-prem possibile) | Foto device, PDF documenti |
| Queue async | BullMQ (su Redis) | Wipe reports, matching AI, export |
| Autenticazione | JWT + bcrypt, opz. Keycloak | Keycloak se si vuole SSO enterprise |
| Monitoraggio | Grafana + Prometheus + Sentry | Metriche + error tracking |
| CI/CD | GitHub Actions / GitLab CI | Deploy automatizzato su staging/prod |
| Infra | Docker + Kubernetes (o docker-compose per MVP) | Scalabilità orizzontale se serve |
Proposta di suddivisione in 3 fasi per un MVP utile in 4–5 mesi e poi estensioni.
Da discutere con il cliente nell'incontro del 23/04/2026 ore 15:00: