corrieribackend/initdb/01_schema.sql

128 lines
4.9 KiB
MySQL
Raw Normal View History

2026-06-20 23:26:06 +02:00
-- ============================================================
-- Schema tabelle Gestione Corrieri
2026-06-22 15:56:39 +02:00
-- Allineato alle API: /utenti, /clienti, /consegne
2026-06-20 23:26:06 +02:00
-- ============================================================
USE corrieri;
2026-06-20 23:26:06 +02:00
-- ------------------------------------------------------------
2026-06-22 13:41:47 +02:00
-- Tabella utenti (API: GET/POST/PUT/DELETE /operatori)
2026-06-20 23:26:06 +02:00
-- ------------------------------------------------------------
2026-06-22 13:51:46 +02:00
CREATE TABLE IF NOT EXISTS utente (
2026-06-22 13:41:47 +02:00
UtenteID INT UNSIGNED NOT NULL AUTO_INCREMENT,
2026-06-20 23:26:06 +02:00
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)',
2026-06-22 13:59:15 +02:00
Ruolo ENUM("Amministratore", "Operatore") NOT NULL DEFAULT "Operatore",
2026-06-20 23:26:06 +02:00
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
2026-06-22 13:41:47 +02:00
PRIMARY KEY (UtenteID),
UNIQUE KEY uk_utente_email (Email)
2026-06-20 23:26:06 +02:00
) 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,
Via VARCHAR(100) NOT NULL,
2026-06-22 13:41:47 +02:00
Comune VARCHAR(100) NOT NULL,
Provincia VARCHAR(2) NOT NULL,
2026-06-20 23:26:06 +02:00
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;
-- ----------------------------------------------------------------
2026-06-22 13:51:46 +02:00
-- Tabella consegna (API: GET/POST/PUT/DELETE /consegna)
-- DataRitiro = giorno in cui il corriere ritira dal cliente.
-- DataConsegna = giorno in cui il corriere consegna al cliente.
-- Sono eventi indipendenti (nessun vincolo di ordine); almeno una delle due
-- date deve essere valorizzata. Se presente, la data non può essere retroattiva.
2026-06-20 23:26:06 +02:00
-- ----------------------------------------------------------------
2026-06-22 13:41:47 +02:00
CREATE TABLE IF NOT EXISTS consegna (
ConsegnaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
2026-06-20 23:26:06 +02:00
ClienteID INT UNSIGNED NOT NULL,
DataRitiro DATE NULL,
DataConsegna DATE NULL,
2026-06-22 13:41:47 +02:00
Stato ENUM('da ritirare', 'in deposito', 'in consegna', 'in giacenza') NOT NULL DEFAULT 'in deposito',
ChiaveConsegna VARCHAR(8) NOT NULL,
2026-06-20 23:26:06 +02:00
2026-06-22 13:41:47 +02:00
PRIMARY KEY (ConsegnaID),
UNIQUE KEY uk_chiaveConsegna (ChiaveConsegna),
2026-06-22 15:56:39 +02:00
KEY idx_DataConsegna (DataConsegna),
2026-06-20 23:26:06 +02:00
2026-06-22 13:41:47 +02:00
CONSTRAINT fk_consegna_cliente
2026-06-20 23:26:06 +02:00
FOREIGN KEY (ClienteID)
REFERENCES cliente (ClienteID)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT chk_consegna_almeno_una_data
CHECK (DataRitiro IS NOT NULL OR DataConsegna IS NOT NULL)
2026-06-20 23:26:06 +02:00
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
2026-06-22 15:56:39 +02:00
-- ----------------------------------------------------------------
-- Trigger retroattività date (DataRitiro e DataConsegna >= oggi)
-- CURDATE() non è ammesso nei CHECK: validazione dinamica nei trigger.
-- ----------------------------------------------------------------
DROP TRIGGER IF EXISTS trg_consegna_no_retroattivita_insert;
DROP TRIGGER IF EXISTS trg_consegna_no_retroattivita_update;
DELIMITER $$
CREATE TRIGGER trg_consegna_no_retroattivita_insert
BEFORE INSERT ON consegna
FOR EACH ROW
BEGIN
IF NEW.DataRitiro IS NOT NULL AND NEW.DataRitiro < CURDATE() THEN
2026-06-22 15:56:39 +02:00
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'DataRitiro non può essere anteriore alla data odierna';
END IF;
IF NEW.DataConsegna IS NOT NULL AND NEW.DataConsegna < CURDATE() THEN
2026-06-22 15:56:39 +02:00
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'DataConsegna non può essere anteriore alla data odierna';
END IF;
END$$
CREATE TRIGGER trg_consegna_no_retroattivita_update
BEFORE UPDATE ON consegna
FOR EACH ROW
BEGIN
IF NEW.DataRitiro IS NOT NULL
AND (OLD.DataRitiro IS NULL OR NEW.DataRitiro <> OLD.DataRitiro)
AND NEW.DataRitiro < CURDATE() THEN
2026-06-22 15:56:39 +02:00
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'DataRitiro non può essere anteriore alla data odierna';
END IF;
IF NEW.DataConsegna IS NOT NULL
AND (OLD.DataConsegna IS NULL OR NEW.DataConsegna <> OLD.DataConsegna)
AND NEW.DataConsegna < CURDATE() THEN
2026-06-22 15:56:39 +02:00
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'DataConsegna non può essere anteriore alla data odierna';
END IF;
END$$
DELIMITER ;