-- ============================================================ -- Schema tabelle – esameits24-26 (Academy aziendale) -- Allineato alle API: /utenti, /corsi, /assegnazioni-corsi, /statistiche -- @author: "villari.andrea@libero.it" -- @version:"1.0.0 2026-07-14" -- ============================================================ USE `esameits24-26`; -- ------------------------------------------------------------ -- Tabella UTENTE -- Ruoli: Dipendente | Referente Academy -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS utente ( UtenteID INT UNSIGNED NOT NULL AUTO_INCREMENT, Nome VARCHAR(100) NOT NULL, Cognome VARCHAR(100) NOT NULL, Email VARCHAR(255) NOT NULL, PasswordHash VARCHAR(255) NOT NULL COMMENT 'Password salvata come hash (es. bcrypt)', Ruolo ENUM('Dipendente', 'Referente Academy') NOT NULL DEFAULT 'Dipendente', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (UtenteID), UNIQUE KEY uk_utente_email (Email), KEY idx_utente_ruolo (Ruolo) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ------------------------------------------------------------ -- Tabella CORSO (catalogo Academy) -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS corso ( CorsoID INT UNSIGNED NOT NULL AUTO_INCREMENT, Titolo VARCHAR(200) NOT NULL, Descrizione TEXT NULL, Categoria VARCHAR(100) NOT NULL, DurataOre SMALLINT UNSIGNED NOT NULL, Obbligatorio TINYINT(1) NOT NULL DEFAULT 0, Attivo TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (CorsoID), KEY idx_corso_categoria (Categoria), KEY idx_corso_attivo (Attivo), CONSTRAINT chk_corso_durata_ore CHECK (DurataOre > 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ------------------------------------------------------------ -- Tabella ASSEGNAZIONE_CORSO -- Stati: Assegnato | Completato | Scaduto | Annullato -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS assegnazione_corso ( AssegnazioneID INT UNSIGNED NOT NULL AUTO_INCREMENT, CorsoID INT UNSIGNED NOT NULL, DipendenteID INT UNSIGNED NOT NULL, DataAssegnazione DATE NOT NULL, DataScadenza DATE NOT NULL, Stato ENUM('Assegnato', 'Completato', 'Scaduto', 'Annullato') NOT NULL DEFAULT 'Assegnato', DataCompletamento DATE NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (AssegnazioneID), KEY idx_assegnazione_corso (CorsoID), KEY idx_assegnazione_dipendente (DipendenteID), KEY idx_assegnazione_stato (Stato), KEY idx_assegnazione_data_assegnazione (DataAssegnazione), KEY idx_assegnazione_data_scadenza (DataScadenza), CONSTRAINT fk_assegnazione_corso FOREIGN KEY (CorsoID) REFERENCES corso (CorsoID) ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT fk_assegnazione_dipendente FOREIGN KEY (DipendenteID) REFERENCES utente (UtenteID) ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT chk_assegnazione_scadenza CHECK (DataScadenza >= DataAssegnazione), CONSTRAINT chk_assegnazione_completamento CHECK (DataCompletamento IS NULL OR DataCompletamento >= DataAssegnazione), CONSTRAINT chk_assegnazione_completato CHECK ( (Stato = 'Completato' AND DataCompletamento IS NOT NULL) OR (Stato <> 'Completato' AND DataCompletamento IS NULL) ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;