# πŸ—³οΈ Focolari Voting System - Welcome Agent ## Panoramica Progetto Sistema di controllo accessi per le assemblee di voto del **Movimento dei Focolari**. Applicazione web ottimizzata per **tablet in orizzontale** che gestisce i varchi d'ingresso alle sale votazione tramite **lettori RFID USB** (emulano tastiera). --- ## Stack Tecnologico ### Backend Mock - **Python 3.11+** con **FastAPI** - **Pydantic** per validazione dati - **Uvicorn** come server ASGI - **Pipenv** per gestione dipendenze ### Frontend - **React 18** + **TypeScript** - **Vite** come build tool - **Tailwind CSS 4** per styling - **React Router** per navigazione --- ## Struttura Progetto ``` VotoFocolari/ β”œβ”€β”€ dev.sh # Script di sviluppo (install, dev, server, ...) β”œβ”€β”€ README.md β”œβ”€β”€ ai-prompts/ # Documentazione sviluppo β”‚ β”œβ”€β”€ 00-welcome-agent.md # Questo file β”‚ β”œβ”€β”€ 01-backend-plan.md # Piano backend β”‚ └── 02-frontend-plan.md # Piano frontend β”œβ”€β”€ backend-mock/ β”‚ β”œβ”€β”€ main.py # Entry point con argparse β”‚ β”œβ”€β”€ Pipfile # Dipendenze Python β”‚ β”œβ”€β”€ API_SPECIFICATION.md # Specifiche per backend reale β”‚ β”œβ”€β”€ api/routes.py # Endpoint API β”‚ β”œβ”€β”€ schemas/models.py # Modelli Pydantic β”‚ └── data/ β”‚ β”œβ”€β”€ users_default.json β”‚ └── users_test.json └── frontend/ β”œβ”€β”€ package.json β”œβ”€β”€ vite.config.ts └── src/ β”œβ”€β”€ App.tsx # State machine principale β”œβ”€β”€ hooks/ # useRFIDScanner β”œβ”€β”€ components/ # UI components β”œβ”€β”€ screens/ # Schermate β”œβ”€β”€ services/ # API client └── types/ # TypeScript types ``` --- ## FunzionalitΓ  Principali ### Flusso Utente 1. **Login Validatore**: Passa badge + inserisci password β†’ Sessione 30 min 2. **Attesa Partecipante**: Schermata grande "Passa il badge" 3. **Visualizzazione Utente**: Card con foto, nome, ruolo, stato ammissione 4. **Conferma Ingresso**: Validatore ripassa il badge β†’ Carosello benvenuto multilingua (8s) ### Gestione RFID - **Multi-pattern**: Supporta layout tastiera US (`;?`) e IT (`Γ²_`), con `\n` dopo fine sequenza - **Timeout 2.5s**: Per scansioni accidentali - **ESC annulla**: Scansione in corso - **Enter handling**: Gestito automaticamente - **Stesso badge ignorato**: Se passato piΓΉ volte di seguito ### Sicurezza Sessioni - Sessione salvata in localStorage - **Invalidazione automatica** se il server riparte - Timeout 30 minuti --- ## Comandi Rapidi ```bash # Setup iniziale ./dev.sh install # Sviluppo (hot reload) ./dev.sh dev # Frontend: http://localhost:5173 # Backend: http://localhost:8000 # Produzione locale ./dev.sh server # App completa: http://localhost:8000 # Debug RFID # Vai a http://localhost:8000/debug ``` --- ## Badge di Test | Badge | Nome | Ruolo | Ammesso | |--------------|----------------|---------|---------------| | `0008988288` | Marco Bianchi | Votante | βœ… | | `0007399575` | Laura Rossi | Votante | βœ… | | `0000514162` | Giuseppe Verdi | Tecnico | ❌ | | `0006478281` | - | - | ⚠️ Non nel DB | **Password validatore:** `focolari` --- ## Dove Trovare Cosa | Cosa cerchi | Dove guardare | |----------------------------|----------------------------------------| | Logica flusso applicazione | `frontend/src/App.tsx` | | Hook lettura RFID | `frontend/src/hooks/useRFIDScanner.ts` | | Chiamate API | `frontend/src/services/api.ts` | | Endpoint backend | `backend-mock/api/routes.py` | | Dati mock utenti | `backend-mock/data/users_default.json` | | Specifiche API produzione | `backend-mock/API_SPECIFICATION.md` | | Configurazione Vite | `frontend/vite.config.ts` | --- ## Note Importanti 1. **Layout Tastiera**: Il lettore RFID potrebbe inviare caratteri diversi in base al layout OS. La pagina `/debug` aiuta a diagnosticare. 2. **Server Restart**: Quando il server riparte, tutte le sessioni frontend vengono invalidate (controllato via `server_start_time`). 3. **Badge Validatore**: Qualsiasi badge puΓ² diventare validatore se la password Γ¨ corretta. Il badge viene memorizzato nella sessione. 4. **NumLock**: Su desktop, viene mostrato un banner per ricordare di attivare NumLock. 5. **Badge Duplicati**: Se lo stesso badge viene passato piΓΉ volte di seguito, viene ignorato (no ricaricamento). 6. **Success Modal Interrompibile**: Se durante il carosello di benvenuto si passa un nuovo badge, la modal si chiude e viene caricato subito il nuovo utente. --- ## TODO (da concordare con committenti) - [ ] Verificare se il badge validatore debba essere validato anche lato server - [ ] Test automatici E2E per regression detection