-- ============================================================ -- Schema tabelle – Gestione Corrieri -- Allineato alle API: /utenti, /clienti, /cd campi, /prenotazioni -- ============================================================ USE corrieri; -- ------------------------------------------------------------ -- Tabella utenti (API: GET/POST/PUT/DELETE /operatori) -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS operatore ( 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("Amministratore", "Operatore") NOT NULL DEFAULT Operatore, 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) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ------------------------------------------------------------ -- Tabella cliente (API: GET/POST/PUT/DELETE /clienti) -- ------------------------------------------------------------ CREATE TABLE IF NOT EXISTS cliente ( ClienteID INT UNSIGNED NOT NULL AUTO_INCREMENT, Nome VARCHAR(100) NOT NULL, Cognome VARCHAR(100) NOT NULL, Comune VARCHAR(100) NOT NULL, Provincia VARCHAR(2) NOT NULL, Telefono VARCHAR(30) NOT NULL, Email VARCHAR(255) NOT NULL, Note TEXT, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (ClienteID), UNIQUE KEY uk_cliente_email (Email) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ---------------------------------------------------------------- -- Tabella consegna (API: GET/POST/PUT/DELETE /prenotazioni) -- ---------------------------------------------------------------- CREATE TABLE IF NOT EXISTS consegna ( ConsegnaID INT UNSIGNED NOT NULL AUTO_INCREMENT, ClienteID INT UNSIGNED NOT NULL, DataRitiro DATE NOT NULL, DataConsegna DATE NOT NULL, Stato ENUM('da ritirare', 'in deposito', 'in consegna', 'in giacenza') NOT NULL DEFAULT 'in deposito', ChiaveConsegna VARCHAR(8) NOT NULL, PRIMARY KEY (ConsegnaID), UNIQUE KEY uk_chiaveConsegna (ChiaveConsegna), KEY idx_DataConsegna ( DataConsegna), #CONSTRAINT ck_prenotazione_orario_valido # CHECK (OraFine > OraInizio), CONSTRAINT fk_consegna_cliente FOREIGN KEY (ClienteID) REFERENCES cliente (ClienteID) ON UPDATE CASCADE ON DELETE RESTRICT, ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ---------------------------------------------------------------- -- Trigger anti-sovrapposizione (stesso campo, stessa data) -- Le prenotazioni annullate non occupano lo slot. -- ---------------------------------------------------------------- #DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_insert; #DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_update; #DELIMITER $$ #CREATE TRIGGER trg_prenotazione_no_overlap_insert #BEFORE INSERT ON corrieri #FOR EACH ROW #BEGIN # IF NEW.Stato <> 'annullata' AND EXISTS ( # SELECT 1 # FROM corrieri AS p # WHERE p.CampoID = NEW.CampoID # AND p.Data = NEW.Data # AND p.Stato <> 'annullata' # AND NEW.OraInizio < p.OraFine # AND p.OraInizio < NEW.OraFine # ) THEN # SIGNAL SQLSTATE '45000' # SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato'; # END IF; #END$$ #CREATE TRIGGER trg_prenotazione_no_overlap_update #BEFORE UPDATE ON corrieri #FOR EACH ROW #BEGIN # IF NEW.Stato <> 'annullata' AND EXISTS ( # SELECT 1 # FROM corrieri AS p # WHERE p.PrenotazioneID <> NEW.PrenotazioneID # AND p.CampoID = NEW.CampoID # AND p.Data = NEW.Data # AND p.Stato <> 'annullata' # AND NEW.OraInizio < p.OraFine # AND p.OraInizio < NEW.OraFine # ) THEN # SIGNAL SQLSTATE '45000' # SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato'; # END IF; #END$$ #DELIMITER ;