13 KiB
13 KiB
VigilanzaTurni - Sistema Gestione Turni per Istituti di Vigilanza
Overview
Sistema professionale di gestione turni 24/7 per istituti di vigilanza con:
- Autenticazione multi-ruolo (Admin, Coordinatore, Guardia, Cliente)
- Gestione anagrafica guardie con skill matrix e certificazioni
- Pianificazione turni con calendario 24/7
- Gestione siti/commesse con tipologie servizio
- Dashboard operativa con KPI live
- Reportistica ore lavorate
- Sistema notifiche
Project Architecture
Stack Tecnologico
- Frontend: React + TypeScript + Tailwind CSS + Shadcn UI
- Backend: Express.js + TypeScript
- Database: PostgreSQL (Neon) con Drizzle ORM
- Autenticazione: Replit Auth (OIDC)
- State Management: TanStack Query v5
- Routing: Wouter
Design System
- Font Principale: Inter (sans-serif)
- Font Monospace: JetBrains Mono (per matricole, ID)
- Colori:
- Primary: Blue (210, 100%, 45-50%) - operativo, affidabile
- Status Active: Green (140, 60%, 45%)
- Status Late/Warning: Orange (25, 90%, 55%)
- Status Emergency: Red (0, 70%, 55%)
- Status Inactive: Gray (220, 15%, 50%)
- Tema: Dark mode di default con supporto light mode
- Componenti: Shadcn UI con design operativo
Database Schema
Core Tables
users (Replit Auth):
- id, email, firstName, lastName, profileImageUrl
- role: admin | coordinator | guard | client
- createdAt, updatedAt
guards:
- id, userId (FK), badgeNumber (unique), phoneNumber
- Skills: isArmed, hasFireSafety, hasFirstAid, hasDriverLicense
- languages: array
certifications:
- id, guardId (FK), type, name
- issueDate, expiryDate
- status: valid | expiring_soon | expired
sites:
- id, name, address, clientId (FK)
- shiftType: fixed_post | patrol | night_inspection | quick_response
- minGuards, requiresArmed, requiresDriverLicense
- isActive
shifts:
- id, siteId (FK)
- startTime, endTime
- status: planned | active | completed | cancelled
shift_assignments:
- id, shiftId (FK), guardId (FK)
- checkInTime, checkOutTime
notifications:
- id, userId (FK), title, message, type
- isRead, relatedEntityId
Scheduling & Constraints Tables
guard_constraints (Vincoli Operatori):
- id, guardId (FK unique)
- preferredShiftType: morning | afternoon | night | any
- maxHoursPerDay, maxHoursPerWeek
- preferredDaysOff: array
- availableOnHolidays: boolean
site_preferences (Preferenze Siti):
- id, siteId (FK), guardId (FK)
- preference: preferred | blacklisted
- priority, reason
- Unique constraint: (siteId, guardId)
contract_parameters (Parametri CCNL):
- contractType (unique, default: CCNL_VIGILANZA_2023)
- maxHoursPerDay (8), maxOvertimePerDay (2)
- maxHoursPerWeek (40), maxOvertimePerWeek (8)
- minDailyRestHours (11), minWeeklyRestHours (24)
- maxNightHoursPerWeek (48)
- Maggiorazioni: holidayPayIncrease (30%), nightPayIncrease (20%), overtimePayIncrease (15%)
training_courses (Formazione):
- id, guardId (FK)
- courseName, courseType (mandatory/optional)
- scheduledDate, completionDate, expiryDate
- status: scheduled | completed | expired | cancelled
- provider, hours, certificateUrl
holidays (Festività):
- id, name, date, year
- isNational: boolean
- Unique constraint: (date, year)
holiday_assignments (Rotazioni Festività):
- id, holidayId (FK), guardId (FK), shiftId (FK nullable)
- Unique constraint: (holidayId, guardId)
absences (Assenze/Malattie):
- id, guardId (FK), type: sick_leave | vacation | personal_leave | injury
- startDate, endDate
- isApproved, needsSubstitute, substituteGuardId (FK nullable)
- certificateUrl, notes
absence_affected_shifts (Turni Impattati da Assenza):
- id, absenceId (FK), shiftId (FK)
- isSubstituted: boolean
- Unique constraint: (absenceId, shiftId)
API Endpoints
Authentication
GET /api/login- Inizia flow OIDCGET /api/callback- Callback OIDCGET /api/logout- LogoutGET /api/auth/user- Current user (protected)
Users
GET /api/users- Lista utenti (admin only)PATCH /api/users/:id- Modifica ruolo utente (admin only, non self)
Guards
GET /api/guards- Lista guardie con certificazioniPOST /api/guards- Crea guardiaPATCH /api/guards/:id- Aggiorna guardiaDELETE /api/guards/:id- Elimina guardia
Sites
GET /api/sites- Lista sitiPOST /api/sites- Crea sitoPATCH /api/sites/:id- Aggiorna sitoDELETE /api/sites/:id- Elimina sito
Shifts
GET /api/shifts- Lista tutti i turniGET /api/shifts/active- Solo turni attiviPOST /api/shifts- Crea turnoPATCH /api/shifts/:id- Aggiorna turnoDELETE /api/shifts/:id- Elimina turno
Notifications
GET /api/notifications- Lista notifiche utentePATCH /api/notifications/:id/read- Segna come letto
Frontend Routes
| Route | Accesso | Descrizione |
|---|---|---|
/ |
Public/Protected | Landing page o Dashboard |
/guards |
Admin, Coordinator | Gestione guardie |
/sites |
Admin, Coordinator, Client | Gestione siti |
/shifts |
Admin, Coordinator, Guard | Pianificazione turni |
/reports |
Admin, Coordinator, Client | Reportistica |
/notifications |
Admin, Coordinator, Guard | Notifiche |
/users |
Admin | Gestione utenti e ruoli |
User Roles
Admin
- Accesso completo a tutte le funzionalità
- Gestione guardie, siti, turni
- Visualizzazione reportistica completa
Coordinator
- Pianificazione turni
- Assegnazione guardie
- Gestione siti operativi
- Reportistica
Guard
- Visualizzazione turni assegnati
- Timbratura (future)
- Notifiche
- Profilo personale
Client
- Visualizzazione siti di competenza
- Reportistica servizi
- KPI e SLA
Key Features
Dashboard Operativa
- KPI Cards: Turni attivi, Guardie totali, Siti attivi, Certificazioni in scadenza
- Live status turni in corso
- Alert certificazioni in scadenza (< 30 giorni)
Gestione Guardie
- Anagrafica completa con foto profilo
- Skill matrix (armato, antincendio, primo soccorso, patente)
- Gestione certificazioni con scadenze automatiche
- Badge number univoco
Gestione Siti/Commesse
- Tipologie servizio: Presidio fisso, Pattugliamento, Ispettorato notturno, Pronto intervento
- Requisiti minimi (n° guardie, armato, patente)
- Geolocalizzazione (future)
Pianificazione Turni
- Calendario 24/7
- Assegnazione manuale guardie
- Vincoli base (future: riposi, orari massimi)
- Stati turno: pianificato, attivo, completato, annullato
Reportistica
- Ore totali lavorate
- Ore mensili per guardia
- Statistiche turni completati
- Export dati (future)
Development
Setup
npm install
npm run db:push # Setup database
npm run dev # Start application
Environment Variables
DATABASE_URL- PostgreSQL connection stringSESSION_SECRET- Session encryption keyREPLIT_DOMAINS- Authorized domains for OIDCISSUER_URL- OIDC provider URL (default: https://replit.com/oidc)REPL_ID- Replit application ID
Testing
All interactive elements have data-testid attributes for automated testing.
Recent Changes
2025-10-11
- Implementato schema database completo
- Creato frontend con tutte le pagine operative
- Configurato Replit Auth per autenticazione multi-ruolo
- Implementati endpoint API per CRUD completo
- Aggiunto sistema notifiche
- Fix definitivo conversione date nei turni:
- Implementato
insertShiftFormSchemacon zodResolver - Validazione robusta: string → refine (check valid date) → transform to Date
- Frontend: form validation client-side con messaggi errore chiari
- Backend: validazione ISO strings prima di conversione a Date
- Test e2e passati con successo ✅
- Implementato
- Sistema assegnazione guardie ai turni ✅:
- Dialog assegnazione con validazione skills vs requisiti sito
- Mostra competenze guardie (Armato, Patente, Primo Soccorso, Antincendio)
- Solo guardie idonee possono essere assegnate
- Add/Remove assignments con sync real-time (refetchQueries)
- DELETE /api/shift-assignments/:id implementato
- CRUD completo (Backend) ✅:
- PATCH/DELETE /api/guards/:id
- PATCH/DELETE /api/sites/:id
- PATCH/DELETE /api/shifts/:id
- 404 handling quando risorse non esistono
- Storage methods restituiscono entità aggiornate/eliminate
- Gestione Utenti e Ruoli ✅:
- Pagina /users solo per admin (route protetta)
- Modifica ruoli utenti via dropdown (admin, coordinator, guard, client)
- Protezione: impossibile modificare il proprio ruolo
- GET /api/users e PATCH /api/users/:id con controlli autorizzazione
- UI con avatar, email, ruolo corrente
- Funzionalità Modifica Record ✅:
- Pulsanti edit (icona matita) su Guards, Sites, Shifts
- Dialog di modifica con form precompilati
- Validazione zodResolver per tutti i form
- PATCH mutations con cache invalidation automatica
- Toast notifiche successo/errore
- Auto-close dialog dopo aggiornamento
- Test e2e passati per tutte le pagine ✅
- Estensione Schema Database per Pianificazione Avanzata ✅:
- guard_constraints: vincoli operatori (preferenze turno, max ore, riposi, disponibilità festività)
- site_preferences: continuità servizio (operatori preferiti/blacklisted per sito)
- contract_parameters: parametri CCNL (limiti orari, riposi, maggiorazioni)
- training_courses: formazione obbligatoria con scadenze e tracking
- holidays + holiday_assignments: festività nazionali con rotazioni operatori
- absences + absence_affected_shifts: assenze/malattie con sistema sostituzione automatica
- Tutti unique indexes e FK integrity implementati per garantire coerenza dati
- Schema pronto per algoritmo pianificazione automatica turni
- Pagina Pianificazione Avanzata ✅:
- Rotta /planning accessibile a admin e coordinator
- UI con 3 tabs: Formazione, Assenze, Festività
- CRUD completo per training courses (mandatory/optional, scheduled/completed)
- CRUD completo per absences (sick_leave, vacation, personal_leave, injury)
- CRUD completo per holidays con filtraggio per anno
- Dialogs di creazione con validazione form
- Fix cache invalidation bug: TanStack Query ora invalida correttamente con parametri year
- Data formatting italiano con date-fns locale
- Toast notifications per feedback operazioni
- API Routes Pianificazione ✅:
- GET/POST /api/guard-constraints/:guardId - vincoli operatore (upsert)
- GET/POST/DELETE /api/site-preferences - preferenze sito-guardia
- GET/POST/PATCH/DELETE /api/training-courses - formazione (con filtro guardId)
- GET/POST/DELETE /api/holidays - festività (con filtro year)
- GET/POST/PATCH/DELETE /api/absences - assenze (con filtro guardId)
- Storage Layer Completo ✅:
- DatabaseStorage esteso con metodi CRUD per tutte le nuove entità
- Guard constraints: upsert semantics (create o update se esiste)
- Gestione relazioni FK con cascading deletes dove appropriato
- Query con ordering e filtering per date/status
- Aggiunto SEO completo (title, meta description, Open Graph)
- Tutti i componenti testabili con data-testid attributes
- Sistema Deployment Automatico ✅:
- Pipeline CI/CD GitLab (.gitlab-ci.yml) con stages build/test/deploy
- Script setup server AlmaLinux 9 (deploy/setup-server.sh)
- Script deployment automatico (deploy/deploy.sh)
- Configurazione Nginx reverse proxy con SSL
- Password PostgreSQL autogenerata (sicurezza)
- Workflow: Replit → GitLab → CI/CD → Server produzione
- Documentazione completa (DEPLOYMENT.md, QUICKSTART-DEPLOYMENT.md)
- Helper script push-to-gitlab.sh per deployment rapido
Deployment
Setup Produzione
Il sistema supporta deployment automatico su server AlmaLinux 9 tramite GitLab CI/CD:
Workflow Deployment:
Replit (modifiche) → Git Push → GitLab CI/CD → Deploy Server
File Deployment:
.gitlab-ci.yml- Pipeline CI/CD (build, test, deploy, rollback)deploy/setup-server.sh- Setup iniziale server (Node, PostgreSQL, Nginx, PM2)deploy/deploy.sh- Script deployment automaticodeploy/nginx.conf- Configurazione reverse proxy.env.production.example- Template variabili ambiente produzione
Documentazione:
DEPLOYMENT.md- Guida completa step-by-stepQUICKSTART-DEPLOYMENT.md- Setup rapido 15 minuti
Security:
- Password PostgreSQL autogenerata (non hard-coded)
- SSL/TLS con Let's Encrypt
- Firewall configurato automaticamente
Future Enhancements
Priorità Alta
- App mobile guardie con geofencing e timbratura GPS
- Motore ottimizzazione turni con vincoli avanzati
- Sistema ronde con checkpoint NFC/QR
- Panic button e incident reporting
Priorità Media
- Portale clienti dedicato
- Gestione dotazioni (armi, bodycam, radio)
- Integrazione payroll (Zucchetti/Teamsystem)
- Export reportistica avanzata
Priorità Bassa
- Dashboard analytics avanzata
- Audit trail completo
- API pubblica per integrazioni terze
User Preferences
- Interfaccia in italiano
- Dark mode di default
- Design operativo e funzionale (non decorativo)
- Focus su efficienza e densità informativa
Test 1