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;
|
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 ;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue