modifica a init/01_schema.sql
All checks were successful
Deploy to VPS / build (push) Successful in 16s
Deploy to VPS / deploy (push) Successful in 17s

This commit is contained in:
AV77web 2026-06-22 13:41:47 +02:00
parent 845f5bc09c
commit 383d3a630d

View file

@ -6,20 +6,20 @@
USE corrieri; USE corrieri;
-- ------------------------------------------------------------ -- ------------------------------------------------------------
-- Tabella operatore (API: GET/POST/PUT/DELETE /operatori) -- Tabella utenti (API: GET/POST/PUT/DELETE /operatori)
-- ------------------------------------------------------------ -- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS operatore ( CREATE TABLE IF NOT EXISTS operatore (
OperatoreID INT UNSIGNED NOT NULL AUTO_INCREMENT, UtenteID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Nome VARCHAR(100) NOT NULL, Nome VARCHAR(100) NOT NULL,
Cognome VARCHAR(100) NOT NULL, Cognome VARCHAR(100) NOT NULL,
Email VARCHAR(255) NOT NULL, Email VARCHAR(255) NOT NULL,
PasswordHash VARCHAR(255) NOT NULL COMMENT 'Password salvata come hash (es. bcrypt)', PasswordHash VARCHAR(255) NOT NULL COMMENT 'Password salvata come hash (es. bcrypt)',
Admin BOOLEAN NOT NULL DEFAULT FALSE, Ruolo ENUM("Amministratore", "Operatore") NOT NULL DEFAULT Operatore,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (OperatoreID), PRIMARY KEY (UtenteID),
UNIQUE KEY uk_operatore_email (Email) UNIQUE KEY uk_utente_email (Email)
) ENGINE=InnoDB ) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci; COLLATE=utf8mb4_unicode_ci;
@ -32,6 +32,8 @@ CREATE TABLE IF NOT EXISTS cliente (
ClienteID INT UNSIGNED NOT NULL AUTO_INCREMENT, ClienteID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Nome VARCHAR(100) NOT NULL, Nome VARCHAR(100) NOT NULL,
Cognome VARCHAR(100) NOT NULL, Cognome VARCHAR(100) NOT NULL,
Comune VARCHAR(100) NOT NULL,
Provincia VARCHAR(2) NOT NULL,
Telefono VARCHAR(30) NOT NULL, Telefono VARCHAR(30) NOT NULL,
Email VARCHAR(255) NOT NULL, Email VARCHAR(255) NOT NULL,
Note TEXT, Note TEXT,
@ -45,55 +47,30 @@ CREATE TABLE IF NOT EXISTS cliente (
COLLATE=utf8mb4_unicode_ci; COLLATE=utf8mb4_unicode_ci;
-- -------------------------------------------------------------
-- Tabella camposportivo (API: GET/POST/PUT/DELETE /campi)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS camposportivo (
CampoID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Nome VARCHAR(100) NOT NULL,
Tipo ENUM('tennis', 'padel', 'calcetto') NOT NULL,
Coperto BOOLEAN NOT NULL DEFAULT FALSE,
PrezzoOrario DECIMAL(10, 2) NOT NULL,
Attivo BOOLEAN NOT NULL DEFAULT TRUE,
PRIMARY KEY (CampoID),
UNIQUE KEY uk_camposportivo_nome (Nome)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
-- Tabella prenotazione (API: GET/POST/PUT/DELETE /prenotazioni) -- Tabella consegna (API: GET/POST/PUT/DELETE /prenotazioni)
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
CREATE TABLE IF NOT EXISTS prenotazione ( CREATE TABLE IF NOT EXISTS consegna (
PrenotazioneID INT UNSIGNED NOT NULL AUTO_INCREMENT, ConsegnaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Data DATE NOT NULL,
OraInizio TIME NOT NULL,
OraFine TIME NOT NULL,
Stato ENUM('prenotata', 'confermata', 'annullata', 'completata') NOT NULL DEFAULT 'prenotata',
CodicePrenotazione VARCHAR(8) NOT NULL,
ClienteID INT UNSIGNED NOT NULL, ClienteID INT UNSIGNED NOT NULL,
CampoID 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 (PrenotazioneID), PRIMARY KEY (ConsegnaID),
UNIQUE KEY uk_prenotazione_codice (CodicePrenotazione), UNIQUE KEY uk_chiaveConsegna (ChiaveConsegna),
KEY idx_prenotazione_campo_data (CampoID, Data), KEY idx_DataConsegna ( DataConsegna),
CONSTRAINT ck_prenotazione_orario_valido #CONSTRAINT ck_prenotazione_orario_valido
CHECK (OraFine > OraInizio), # CHECK (OraFine > OraInizio),
CONSTRAINT fk_prenotazione_cliente CONSTRAINT fk_consegna_cliente
FOREIGN KEY (ClienteID) FOREIGN KEY (ClienteID)
REFERENCES cliente (ClienteID) REFERENCES cliente (ClienteID)
ON UPDATE CASCADE ON UPDATE CASCADE
ON DELETE RESTRICT, ON DELETE RESTRICT,
CONSTRAINT fk_prenotazione_campo
FOREIGN KEY (CampoID)
REFERENCES camposportivo (CampoID)
ON UPDATE CASCADE
ON DELETE RESTRICT
) ENGINE=InnoDB ) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci; COLLATE=utf8mb4_unicode_ci;
@ -103,46 +80,46 @@ CREATE TABLE IF NOT EXISTS prenotazione (
-- Trigger anti-sovrapposizione (stesso campo, stessa data) -- Trigger anti-sovrapposizione (stesso campo, stessa data)
-- Le prenotazioni annullate non occupano lo slot. -- Le prenotazioni annullate non occupano lo slot.
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_insert; #DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_insert;
DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_update; #DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_update;
DELIMITER $$ #DELIMITER $$
CREATE TRIGGER trg_prenotazione_no_overlap_insert #CREATE TRIGGER trg_prenotazione_no_overlap_insert
BEFORE INSERT ON corrieri #BEFORE INSERT ON corrieri
FOR EACH ROW #FOR EACH ROW
BEGIN #BEGIN
IF NEW.Stato <> 'annullata' AND EXISTS ( # IF NEW.Stato <> 'annullata' AND EXISTS (
SELECT 1 # SELECT 1
FROM corrieri AS p # FROM corrieri AS p
WHERE p.CampoID = NEW.CampoID # WHERE p.CampoID = NEW.CampoID
AND p.Data = NEW.Data # AND p.Data = NEW.Data
AND p.Stato <> 'annullata' # AND p.Stato <> 'annullata'
AND NEW.OraInizio < p.OraFine # AND NEW.OraInizio < p.OraFine
AND p.OraInizio < NEW.OraFine # AND p.OraInizio < NEW.OraFine
) THEN # ) THEN
SIGNAL SQLSTATE '45000' # SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato'; # SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato';
END IF; # END IF;
END$$ #END$$
CREATE TRIGGER trg_prenotazione_no_overlap_update #CREATE TRIGGER trg_prenotazione_no_overlap_update
BEFORE UPDATE ON corrieri #BEFORE UPDATE ON corrieri
FOR EACH ROW #FOR EACH ROW
BEGIN #BEGIN
IF NEW.Stato <> 'annullata' AND EXISTS ( # IF NEW.Stato <> 'annullata' AND EXISTS (
SELECT 1 # SELECT 1
FROM corrieri AS p # FROM corrieri AS p
WHERE p.PrenotazioneID <> NEW.PrenotazioneID # WHERE p.PrenotazioneID <> NEW.PrenotazioneID
AND p.CampoID = NEW.CampoID # AND p.CampoID = NEW.CampoID
AND p.Data = NEW.Data # AND p.Data = NEW.Data
AND p.Stato <> 'annullata' # AND p.Stato <> 'annullata'
AND NEW.OraInizio < p.OraFine # AND NEW.OraInizio < p.OraFine
AND p.OraInizio < NEW.OraFine # AND p.OraInizio < NEW.OraFine
) THEN # ) THEN
SIGNAL SQLSTATE '45000' # SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato'; # SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato';
END IF; # END IF;
END$$ #END$$
DELIMITER ; #DELIMITER ;