2026-06-20 23:26:06 +02:00
|
|
|
|
-- ============================================================
|
2026-06-21 01:34:35 +02:00
|
|
|
|
-- Schema tabelle – Gestione Corrieri
|
|
|
|
|
|
-- Allineato alle API: /utenti, /clienti, /cd campi, /prenotazioni
|
2026-06-20 23:26:06 +02:00
|
|
|
|
-- ============================================================
|
|
|
|
|
|
|
2026-06-21 01:34:35 +02:00
|
|
|
|
USE corrieri;
|
2026-06-20 23:26:06 +02:00
|
|
|
|
|
|
|
|
|
|
-- ------------------------------------------------------------
|
|
|
|
|
|
-- Tabella operatore (API: GET/POST/PUT/DELETE /operatori)
|
|
|
|
|
|
-- ------------------------------------------------------------
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS operatore (
|
|
|
|
|
|
OperatoreID 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,
|
|
|
|
|
|
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)
|
|
|
|
|
|
) 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,
|
|
|
|
|
|
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 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)
|
|
|
|
|
|
-- ----------------------------------------------------------------
|
|
|
|
|
|
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,
|
|
|
|
|
|
ClienteID INT UNSIGNED NOT NULL,
|
|
|
|
|
|
CampoID INT UNSIGNED NOT NULL,
|
|
|
|
|
|
|
|
|
|
|
|
PRIMARY KEY (PrenotazioneID),
|
|
|
|
|
|
UNIQUE KEY uk_prenotazione_codice (CodicePrenotazione),
|
|
|
|
|
|
KEY idx_prenotazione_campo_data (CampoID, Data),
|
|
|
|
|
|
|
|
|
|
|
|
CONSTRAINT ck_prenotazione_orario_valido
|
|
|
|
|
|
CHECK (OraFine > OraInizio),
|
|
|
|
|
|
|
|
|
|
|
|
CONSTRAINT fk_prenotazione_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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- ----------------------------------------------------------------
|
|
|
|
|
|
-- 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
|
2026-06-21 01:57:05 +02:00
|
|
|
|
BEFORE INSERT ON corrieri
|
2026-06-20 23:26:06 +02:00
|
|
|
|
FOR EACH ROW
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
IF NEW.Stato <> 'annullata' AND EXISTS (
|
|
|
|
|
|
SELECT 1
|
2026-06-21 01:57:05 +02:00
|
|
|
|
FROM corrieri AS p
|
2026-06-20 23:26:06 +02:00
|
|
|
|
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
|
2026-06-21 01:57:05 +02:00
|
|
|
|
BEFORE UPDATE ON corrieri
|
2026-06-20 23:26:06 +02:00
|
|
|
|
FOR EACH ROW
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
IF NEW.Stato <> 'annullata' AND EXISTS (
|
|
|
|
|
|
SELECT 1
|
2026-06-21 01:57:05 +02:00
|
|
|
|
FROM corrieri AS p
|
2026-06-20 23:26:06 +02:00
|
|
|
|
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 ;
|