-- ============================================================ -- Schema tabelle – Gestione Rimborsi Spese Aziendali -- ============================================================ USE provapratica; -- ------------------------------------------------------------ -- Tabella UTENTI -- Ruoli: DIPENDENTE | RESPONSABILE_AMMINISTRATIVO -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS utenti ( utente_id INT UNSIGNED NOT NULL AUTO_INCREMENT, nome VARCHAR(100) NOT NULL, cognome VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL, password_hash VARCHAR(255) NOT NULL COMMENT 'Password salvata come hash (es. bcrypt)', ruolo ENUM('DIPENDENTE', 'RESPONSABILE_AMMINISTRATIVO') 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 (utente_id), UNIQUE KEY uk_utenti_email (email), KEY idx_utenti_ruolo (ruolo) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ------------------------------------------------------------ -- Tabella CATEGORIE_SPESA -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS categorie_spesa ( categoria_id INT UNSIGNED NOT NULL AUTO_INCREMENT, descrizione VARCHAR(150) NOT NULL, PRIMARY KEY (categoria_id), UNIQUE KEY uk_categorie_spesa_descrizione (descrizione) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ------------------------------------------------------------ -- Tabella RICHIESTE_RIMBORSO -- Stati: IN_ATTESA | APPROVATA | RIFIUTATA | LIQUIDATA -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS richieste_rimborso ( richiesta_id INT UNSIGNED NOT NULL AUTO_INCREMENT, data_inserimento DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, data_spesa DATE NOT NULL, categoria_id INT UNSIGNED NOT NULL, importo DECIMAL(10, 2) NOT NULL, descrizione VARCHAR(500) NOT NULL, riferimento_giustificativo VARCHAR(255) NULL, stato ENUM('IN_ATTESA', 'APPROVATA', 'RIFIUTATA', 'LIQUIDATA') NOT NULL DEFAULT 'IN_ATTESA', dipendente_id INT UNSIGNED NOT NULL, data_valutazione DATETIME NULL, responsabile_valutazione_id INT UNSIGNED NULL, motivazione_rifiuto VARCHAR(500) NULL, data_liquidazione DATETIME NULL, PRIMARY KEY (richiesta_id), CONSTRAINT fk_richieste_categoria FOREIGN KEY (categoria_id) REFERENCES categorie_spesa (categoria_id) ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT fk_richieste_dipendente FOREIGN KEY (dipendente_id) REFERENCES utenti (utente_id) ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT fk_richieste_responsabile FOREIGN KEY (responsabile_valutazione_id) REFERENCES utenti (utente_id) ON UPDATE CASCADE ON DELETE SET NULL, CONSTRAINT chk_richieste_importo_positivo CHECK (importo > 0), CONSTRAINT chk_richieste_descrizione_non_vuota CHECK (CHAR_LENGTH(TRIM(descrizione)) > 0), CONSTRAINT chk_richieste_data_valutazione CHECK ( data_valutazione IS NULL OR data_valutazione >= data_inserimento ), CONSTRAINT chk_richieste_data_liquidazione CHECK ( data_liquidazione IS NULL OR data_valutazione IS NULL OR data_liquidazione >= data_valutazione ), CONSTRAINT chk_richieste_rifiuto_motivazione CHECK ( stato <> 'RIFIUTATA' OR motivazione_rifiuto IS NOT NULL ), KEY idx_richieste_stato (stato), KEY idx_richieste_data_spesa (data_spesa), KEY idx_richieste_dipendente (dipendente_id), KEY idx_richieste_categoria (categoria_id), KEY idx_richieste_data_inserimento (data_inserimento) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;