modifica a init/01_schema.sql
This commit is contained in:
parent
845f5bc09c
commit
383d3a630d
1 changed files with 59 additions and 82 deletions
|
|
@ -6,20 +6,20 @@
|
|||
USE corrieri;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- Tabella operatore (API: GET/POST/PUT/DELETE /operatori)
|
||||
-- Tabella utenti (API: GET/POST/PUT/DELETE /operatori)
|
||||
-- ------------------------------------------------------------
|
||||
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,
|
||||
Cognome VARCHAR(100) NOT NULL,
|
||||
Email VARCHAR(255) NOT NULL,
|
||||
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,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
PRIMARY KEY (OperatoreID),
|
||||
UNIQUE KEY uk_operatore_email (Email)
|
||||
PRIMARY KEY (UtenteID),
|
||||
UNIQUE KEY uk_utente_email (Email)
|
||||
) ENGINE=InnoDB
|
||||
DEFAULT CHARSET=utf8mb4
|
||||
COLLATE=utf8mb4_unicode_ci;
|
||||
|
|
@ -32,6 +32,8 @@ 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,
|
||||
|
|
@ -45,55 +47,30 @@ CREATE TABLE IF NOT EXISTS cliente (
|
|||
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 (
|
||||
PrenotazioneID 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,
|
||||
CREATE TABLE IF NOT EXISTS consegna (
|
||||
ConsegnaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
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),
|
||||
UNIQUE KEY uk_prenotazione_codice (CodicePrenotazione),
|
||||
KEY idx_prenotazione_campo_data (CampoID, Data),
|
||||
PRIMARY KEY (ConsegnaID),
|
||||
UNIQUE KEY uk_chiaveConsegna (ChiaveConsegna),
|
||||
KEY idx_DataConsegna ( DataConsegna),
|
||||
|
||||
CONSTRAINT ck_prenotazione_orario_valido
|
||||
CHECK (OraFine > OraInizio),
|
||||
#CONSTRAINT ck_prenotazione_orario_valido
|
||||
# CHECK (OraFine > OraInizio),
|
||||
|
||||
CONSTRAINT fk_prenotazione_cliente
|
||||
CONSTRAINT fk_consegna_cliente
|
||||
FOREIGN KEY (ClienteID)
|
||||
REFERENCES cliente (ClienteID)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT,
|
||||
|
||||
CONSTRAINT fk_prenotazione_campo
|
||||
FOREIGN KEY (CampoID)
|
||||
REFERENCES camposportivo (CampoID)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT
|
||||
) ENGINE=InnoDB
|
||||
DEFAULT CHARSET=utf8mb4
|
||||
COLLATE=utf8mb4_unicode_ci;
|
||||
|
|
@ -103,46 +80,46 @@ CREATE TABLE IF NOT EXISTS prenotazione (
|
|||
-- 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;
|
||||
#DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_insert;
|
||||
#DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_update;
|
||||
|
||||
DELIMITER $$
|
||||
#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_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$$
|
||||
#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 ;
|
||||
#DELIMITER ;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue