125 lines
4.6 KiB
SQL
125 lines
4.6 KiB
SQL
-- ============================================================
|
||
-- 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 ;
|