initial commit

This commit is contained in:
2025-12-15 13:16:19 +01:00
commit 0b5b9c3485
110 changed files with 13448 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
# Piano di Sviluppo - Zentral (OBIS Safety)
Data: 2025-12-15
Stato: Pianificazione Iniziale
## Obiettivo
Creare una Web App SaaS ("Zentral") per la gestione della formazione sicurezza OBIS, sostituendo Excel con un sistema automatizzato.
## 1. Architettura del Sistema
### Backend (Node.js)
- **Framework**: Express.js con TypeScript.
- **Struttura**: Modulare (vedi `src/backend/src/modules`).
- **Database**:
- **ORM**: Prisma (Supporto nativo per SQLite in dev e PostgreSQL in prod).
- **Dev**: SQLite (`dev.db`).
- **Prod**: PostgreSQL.
- **API**: RESTful standard `api/[modulo]/[risorsa]`.
- **Sicurezza**: Helmet, CORS, input validation (Zod/Joi), password hashing (Argon2/Bcrypt).
### Frontend (React)
- **Build Tool**: Vite.
- **Linguaggio**: TypeScript.
- **UI/UX**:
- Design System: Custom basato su "Material Design" ma con estetica "Premium" (colori vibranti, glassmorphism).
- Styling: Vanilla CSS (Variabili CSS per temi) + CSS Modules per scoping.
- Componenti: React standard.
- **Stato**: React Context + Hooks per gestione globale semplice.
## 2. Roadmap di Implementazione
### Fase 1: Setup e Fondamenta (Oggi)
- [x] Inizializzazione Repository e Cartelle (`src/backend`, `src/frontend`).
- [x] Setup Backend: Express, Prisma, Struttura Modulare base.
- [x] Setup Frontend: Vite React, Configurazione CSS Base (Design Tokens), Layout App Shell (Sidebar, Header).
- [x] Configurazione Database iniziale (Schema Prisma: User, Company preliminary).
### Fase 2: Gestione Anagrafiche
- [x] Modulo Aziende (Companies): CRUD, Sedi.
- [x] Modulo Lavoratori (Workers): CRUD, Associazione Azienda.
- [x] UI per Anagrafiche: Tabelle moderne, Form di inserimento laterali o modali.
### Fase 3: Core Formazione
- [x] Modulo Corsi (Courses): Catalogo, tipologie, validità.
- [x] Modulo Eventi (TrainingEvents): Gestione eventi, upload attestati (Parziale).
- [x] Logica Calcolo Scadenze (Service layer dedicate).
### Fase 4: Scadenzario e Dashboard
- [x] Dashboard KPI: Grafici di copertura.
- [x] Scadenzario: Datatable avanzata (Filtri, Sort, Export Excel).
### Fase 5: Notifiche e Comunicazioni
- [x] Sistema Code Mail (Redis/Bull o tabella DB semplice per MVP).
- [x] Template Engine (Mock/Simple).
- [x] Workflow approvazione manuale invii.
## 3. Modello Dati Preliminare (Schema ER semplificato)
- **Company**: id, name, vatNumber, email, phone, status...
- **Site**: id, companyId, address, city...
- **Worker**: id, companyId, siteId, firstName, lastName, taxCode (CF), jobTitle, status...
- **Course**: id, title, type, validityYears, hasPostExpiryReminder...
- **TrainingEvent**: id, workerId, courseId, eventDate, expiryDate, provider, status (Valid/Expiring/Expired), certificateUrl...
- **Notification**: id, companyId, type (Pre/At/Post), status (Pending/Sent/Error), scheduledDate...
## 4. Azioni Immediate
1. Creare struttura cartelle.
2. Inizializzare Backend (`npm init`, installazione dipendenze base).
3. Inizializzare Frontend (`npm create vite`).
4. Definire Schema Prisma iniziale.

View File

@@ -0,0 +1,24 @@
# Setup Completato
Data: 2025-12-15
Stato: Completato
## Attività Svolte
1. **Backend**:
- Creato progetto Node.js + TypeScript (`src/backend`).
- Configurato Prisma ORM con SQLite (`dev.db`).
- Definito Schema iniziale (Company, Site, Worker).
- Configurato Express server base.
2. **Frontend**:
- Creato progetto Vite React + TypeScript (`src/frontend`).
- Implementato Design System in `index.css` (CSS Variables, Glassmorphism).
- Creata struttura cartelle modulare.
3. **Verifica**:
- Database inizializzato con successo.
- Script `dev` backend aggiunto.
## Prossimi Passi (Fase 2)
Implementare la gestione Anagrafiche (Aziende e Lavoratori):
- [ ] Backend: Controller e Service per `Companies`.
- [ ] Backend: Controller e Service per `Workers`.
- [ ] Frontend: Pagina lista Aziende.
- [ ] Frontend: Form creazione Azienda.

View File

@@ -0,0 +1,33 @@
# Implementazione Anagrafiche (Aziende e Lavoratori)
Data: 2025-12-15
Stato: In Corso
## Obiettivo
Implementare il modulo gestione anagrafiche completo (Backend API + Frontend UI) per Aziende e Lavoratori.
## Backend (Node.js/Express)
- [ ] Struttura Modulare: setup cartelle `src/modules/{companies,workers}/{controllers,services,routes}`.
- [ ] **Companies Module**:
- [ ] Service: `create`, `findAll`, `findOne`, `update`, `delete`.
- [ ] Controller: Endpoint REST.
- [ ] Routes: `GET /api/companies`, `POST`, `PUT`, `DELETE`.
- [ ] **Workers Module**:
- [ ] Service: CRUD con relazione Azienda/Sede.
- [ ] Controller: Endpoint REST.
- [ ] Routes: `GET /api/workers` (con filtri), `POST`, etc.
## Frontend (React)
- [ ] **Core**:
- [ ] Setup `react-router-dom`.
- [ ] Setup Client API (Axios instance).
- [ ] Layout Component (Sidebar Menu).
- [ ] **Companies UI**:
- [ ] Page: Lista Aziende (Tabella).
- [ ] Component: Form Azienda (Modale o Pagina dedicata).
- [ ] **Workers UI**:
- [ ] Page: Lista Lavoratori.
- [ ] Component: Form Lavoratore.
## Note Tecniche
- Usare `zod` per validazione input backend (se possibile, altrimenti validazione manuale per velocità MVP).
- Frontend: usare componenti riutilizzabili per inputs e tabelle.

View File

@@ -0,0 +1,61 @@
# Fase 3 & 4: Core Formazione e Scadenzario
Data: 2025-12-15
Stato: Pianificazione
## Obiettivo
Implementare il cuore del sistema: Catalogo Corsi, Eventi Formativi e Logica Scadenze, concludendo con la Dashboard Scadenzario.
## 3. Core Formazione (Backend + Frontend)
### Backend
- **Schema Prisma Aggiornato**:
- `Course` (nome, validità anni, isSafety).
- `TrainingEvent` (workerId, courseId, date, expiryDate, fileUrl).
- **Moduli**:
- `src/modules/courses`: CRUD.
- `src/modules/training`:
- CRUD Eventi.
- **Logica Business**: Calcolo automatico `expiryDate` (Data Corso + Validità Corso).
- Upload file (Multer locale per ora).
### Frontend
- **Courses UI**:
- Lista Corsi (Tabella).
- Gestione (Add/Edit) per definire le tipologie.
- **Training UI**:
- Pagina dettaglio Lavoratore: Tab "Formazione".
- Form registrazione evento: Selezione Corso, Data. Calcolo scadenza automatico (mostrato preview).
- Upload file.
### Stato Avanzamento
- [x] Backend: Model `Course` e `TrainingEvent`
- [x] Backend: Service e Controller CRUD Base
- [x] Backend: Calcolo automatico scadenza
- [x] Frontend: Pagina Lista Corsi
- [x] Frontend: Form Creazione/Modifica Corsi
- [x] Frontend: Integrazione Formazione in Dettaglio Lavoratore
- [x] Frontend: Form Aggiunta Evento Formativo
- [ ] Backend: Scheduler per controllo scadenze (Job notturno)
- [ ] Backend: Endpoint Report Scadenze (Dashboard)
## 4. Scadenzario & Dashboard
### Backend
- **Service Scadenzario**:
- Query ottimizzate per trovare scadenze in range (prossimi 60gg).
- Stati: `VALID`, `EXPIRING` (es. < 2 mesi), `EXPIRED`.
### Frontend
- **Dashboard Home**:
- Card KPI (Totale Lavoratori, Scadenze imminenti, Scaduti).
- **Pagina Scadenzario**:
- Grande tabella filtrabile.
- Celle colorate per stato (Verde, Giallo, Rosso).
- Export Excel (lato client con libreria `xlsx` o simile).
## Ordine di esecuzione immediato
1. Aggiornamento schema Prisma (Corsi, Eventi).
2. Backend API Corsi & Eventi.
3. Frontend UI Corsi.
4. Frontend UI Eventi (dentro lavoratore).
5. Dashboard Scadenzario.

View File

@@ -0,0 +1,29 @@
# Implementazione Scadenzario (Deadlines)
Data: 2025-12-15
Stato: In Corso
## Obiettivo
Creare la vista "Scadenzario" che permette di monitorare tutte le scadenze formative. È il cuore operativo del sistema.
## Funzionalità Richieste
1. **Lista Scadenze**: Tabella con Lavoratore, Azienda, Corso, Data Scadenza, Stato.
2. **Filtri**:
- Per Stato (Scaduto, In Scadenza, Valido).
- Per Periodo (Mese/Anno o Range di date).
- Per Azienda.
3. **Indicatori Visivi**: Semafori (Rosso=Scaduto, Arancio=In Scadenza < 30gg, Verde=Valido).
## Piano Tecnico
### Backend (`src/backend/src/modules/deadlines`)
- [x] `deadline.service.ts`: Query su `TrainingEvent` con ordinamento per `expiryDate`.
- [x] `deadline.controller.ts`: API endpoint con supporto query params per filtri.
- [x] `deadlines.routes.ts`: Route `GET /`.
### Frontend (`src/frontend/src/modules/deadlines`)
- [x] `DeadlinesPage.tsx`: Pagina principale.
- [x] Integrazione in `Layout.tsx` (Menu laterale).
- [x] Tabella avanzata con filtri lato server (o client per MVP se i dati sono pochi). *Decisione: Lato Server per scalabilità.*
## Modifiche
...

View File

@@ -0,0 +1,26 @@
# Piano di Sviluppo: Completamento Anagrafiche (Sedi) e Dashboard
Obiettivo: Completare le funzionalità mancanti per rendere l'applicazione pienamente operativa per la gestione della formazione.
## 1. Gestione Sedi (Sites)
Le sedi operative sono fondamentali per allocare i lavoratori.
- [x] **Backend**: Modulo `sites` (CRUD).
- Rotte: `GET /sites`, `GET /sites?companyId=...`, `POST /sites`, `PUT /sites/:id`, `DELETE /sites/:id`.
- [x] **Frontend**: Pagina Dettaglio Azienda.
- Visualizzazione dati azienda.
- Tabella Sedi associate.
- Form (Modal) per Aggiunta/Modifica Sede.
- [x] **Frontend**: Integrazione nel Form Lavoratore.
- Abilitare la select "Sede" filtrata in base all'azienda selezionata.
## 2. Dashboard e Scadenziario
- [x] **Backend**: Endpoint `GET /dashboard/stats`.
- Conteggio scadenze (Scaduti, In scadenza 30gg, Validi).
- Prossimi corsi in programma.
- [x] **Frontend**: Widget Dashboard.
- Cards riepilogative (KPI).
- Tabella "In Scadenza" veloce (Solo KPI per ora).
## 3. Notifiche (Base)
- [x] Implementazione servizio invio mail (Stub/Log per ora).

View File

@@ -0,0 +1,22 @@
# Fase 6: Autenticazione e Sicurezza
Data: 2025-12-15
Stato: In Corso
## Obiettivo
Proteggere l'accesso all'applicazione tramite login e gestire gli utenti amministratori.
## Piano Tecnico
### Backend
- [x] Aggiornare Schema: `User` (email, passwordHash, role).
- [x] `auth.service.ts`:
- Funzioni per hashing password (bcrypt/argon2).
- Login (verifica password e emissione JWT).
- [x] `auth.middleware.ts`: Verifica JWT su rotte protette.
- [x] `auth.controller.ts`: Endpoint `/login`, `/me`.
### Frontend
- [x] `AuthContext.tsx`: Gestione stato utente e token.
- [x] `LoginPage.tsx`: Form di login.
- [x] `PrivateRoute.tsx`: Protezione rotte.
- [x] Aggiornare `Layout` con pulsante Logout.

View File

@@ -0,0 +1,26 @@
# Fase 7: Importazione Dati Massiva
Data: 2025-12-15
Stato: In Corso
## Obiettivo
Permettere l'importazione massiva di dati da file Excel per facilitare la migrazione iniziale dai vecchi sistemi.
## Funzionalità
1. **Upload Excel**: L'utente carica un file `.xlsx`.
2. **Parsing & Validazione**: Il sistema legge il file e valida i dati (campi obbligatori, formati).
3. **Inserimento/Upsert**: Creazione o aggiornamento dei record nel database.
4. **Supporto Entità**:
- Aziende
- Lavoratori (collegati ad aziende esistenti o create al volo)
- Storico Formazione (opzionale/avanzato)
## Piano Tecnico
### Backend
- [x] Installare `multer` (upload) e `xlsx` (parsing).
- [x] `import.service.ts`: Logica di lettura Excel e mappatura verso Prisma.
- [x] `import.controller.ts`: Endpoint `POST /api/import/workers`.
### Frontend
- [x] `ImportPage.tsx`: Interfaccia di upload drag & drop.
- [x] Feedback importazione (Righe importate, eventuali errori).

View File

@@ -0,0 +1,26 @@
# Fase 5: Notifiche e Comunicazioni
Data: 2025-12-15
Stato: In Corso
## Obiettivo
Implementare il sistema di generazione e invio delle notifiche di scadenza alle aziende.
## Requisiti
1. **Generazione Automatica**: Il sistema deve identificare i corsi in scadenza (es. preavviso 30gg) e generare una "proposta di notifica".
2. **Review Umana**: Le notifiche non partono subito; l'operatore deve poterle visionare nella sezione "Comunicazioni" e approvarle.
3. **Queue System**: Gestione dello stato della notifica (Pending -> Sending -> Sent/Error).
4. **Email Templates**: Uso di template HTML per le mail.
## Piano Tecnico
### Backend
- [x] Installazione `nodemailer` e `ejs` per templating.
- [x] Aggiornamento Schema Prisma: Aggiunta model `Notification` (type: EXPIRING_REMINDER, status: PENDING/SENT).
- [x] `notification.service.ts`:
- `generateReminders()`: Scansiona `TrainingEvent` e crea record `Notification`.
- `sendPending(ids[])`: Invia le mail selezionate.
- [x] `notification.controller.ts`: Endpoints per lista, generazione e invio.
### Frontend
- [x] `CommunicationsPage.tsx`: Tabella delle notifiche generate.
- [x] Azioni massive: "Genera Nuove" e "Invia Selezionate".

View File

@@ -0,0 +1,19 @@
# Fase 8: Deployment e Configurazione Produzione
Data: 2025-12-15
Stato: In Corso
## Obiettivo
Configurare l'ambiente di produzione utilizzando Docker per garantire replicabilità e stabilità. Passaggio da SQLite (Dev) a PostgreSQL (Prod).
## Requisiti
1. **Containerizzazione**: Dockerfile per Backend e Frontend.
2. **Orchestrazione**: `docker-compose.yml` per gestire i servizi (App, DB, Reverse Proxy).
3. **Database**: PostgreSQL per produzione.
4. **Automazione**: Makefile per comandi rapidi.
## Piano Tecnico
- [x] Creare `src/backend/Dockerfile`.
- [x] Creare `src/frontend/Dockerfile` (Nginx per serve statico).
- [x] Creare `docker-compose.yml` (Backend, Frontend, Postgres).
- [x] Aggiornare Prisma per supportare PostgreSQL via Environment Variable (gestito via `sed` in build).
- [x] Creare `Makefile` per shortcut (build, up, down, logs).

View File

@@ -0,0 +1,23 @@
# 2025-12-15 12:30:00 - Bug Fixes and Verification
## Stato Attuale
L'applicazione è stata riparata e verificata.
## Problemi Risolti
1. **Backend non rispondeva/non sincronizzato**: Il servizio backend in esecuzione (`npm run dev`) non era sincronizzato con il database SQLite, portando a errori di autenticazione ("Errore durante l'autenticazione").
- *Soluzione*: Eseguito `npx prisma generate` e `npx prisma db push`. Riavviato il servizio backend sulla porta 3000.
2. **Import Error nel Frontend**: L'applicazione non si avviava a causa di percorsi di import errati per `api.ts` in diversi file.
- *Soluzione*: Corretti i percorsi relativi in `ImportPage.tsx`, `CommunicationsPage.tsx`, `DeadlinesPage.tsx`, `LoginPage.tsx`, `AuthContext.tsx`.
3. **Lint Errors**:
- Rimosso import inutilizzato di `useDebounce` in `DeadlinesPage.tsx`.
- Corretto import `type ReactNode` e rimosso `api`/`useLocation` inutilizzati in `AuthContext.tsx`.
## Verifiche Effettuate
- **Database**: Verificato che lo schema è sincronizzato.
- **Registrazione Utente**: Creato utente admin (`admin@test.com` / `admin`) tramite script diretto.
- **Login**: Accesso via browser riuscito con successo.
- **Dashboard**: La Dashboard si carica correttamente e mostra i contatori a 0.
## Prossimi Passi
- Proseguire con l'implementazione del modulo di Importazione (Phase 7) o popolamento dati.

View File

@@ -0,0 +1,19 @@
# Completamento Sistema: Scheduler Notifiche
Obiettivo: Automatizzare la generazione e l'invio delle notifiche di scadenza.
## Backend
- [x] Installazione `node-cron`.
- [x] Creazione `src/backend/src/scheduler.ts`.
- Job notturno (es. 02:00 AM) per generare i reminder (`generateReminders`).
- Job frequente (es. ogni 10 min o subito dopo) per processare la coda (`sendPending`).
- [x] Integrazione in `src/backend/src/index.ts` per avviare lo scheduler.
## Verifica
- [ ] Avvio backend e verifica log "Scheduler started".
- [ ] Test manuale (trigger via API o modificando crontab per esecuzione immediata).
## Chiusura Progetto
- [ ] Aggiornamento `DEVELOPMENT.md` finale.
- [ ] Verifica `devlog` precedenti e mark as complete.

View File

@@ -0,0 +1,21 @@
# 2025-12-15-123500_ui_overhaul.md
## Objective
Overhaul the UI/UX to create a premium, modern, and aesthetically pleasing experience ("Wow" factor), moving away from the "unwatchable" current state.
## Design Direction
- **Theme:** Modern Dark/Light mode (default Dark deep premium).
- **Palette:** Deep slate/navy backgrounds, vibrant accents (violet/indigo/teal gradients), glassmorphism effects.
- **Typography:** Modern sans-serif (Inter/Roboto).
- **Components:**
- **Sidebar:** Glassmorphism, better spacing, active state indicators.
- **Cards:** Subtle borders, soft shadows, hover lifts.
- **Tables:** Clean headers, spacious rows, hover effects, specific status badges.
- **Animations:** Page transitions, button hover states.
## Tasks
- [x] Define new Color Palette and CSS Variables in `index.css`.
- [x] Refactor `MainLayout` for better structure and glass sidebar.
- [x] Update `Dashboard` widgets style.
- [x] Update `Companies` table style.
- [x] Global typography update.