2026-06-20 23:26:06 +02:00
|
|
|
|
-- ============================================================
|
2026-06-21 01:34:35 +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
|
|
|
|
-- ============================================================
|
|
|
|
|
|
|
2026-06-21 01:34:35 +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,
|
2026-06-22 16:51:56 +02:00
|
|
|
|
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)
|
2026-06-22 15:56:39 +02:00
|
|
|
|
-- DataRitiro e DataConsegna sono eventi indipendenti: nessun vincolo
|
|
|
|
|
|
-- di ordine tra le due date, solo retroattività rispetto a oggi.
|
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,
|
2026-06-22 13:41:47 +02:00
|
|
|
|
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,
|
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
|
2026-06-22 14:03:32 +02:00
|
|
|
|
ON DELETE RESTRICT
|
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 < CURDATE() THEN
|
|
|
|
|
|
SIGNAL SQLSTATE '45000'
|
|
|
|
|
|
SET MESSAGE_TEXT = 'DataRitiro non può essere anteriore alla data odierna';
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
|
|
IF NEW.DataConsegna < CURDATE() THEN
|
|
|
|
|
|
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 <> OLD.DataRitiro AND NEW.DataRitiro < CURDATE() THEN
|
|
|
|
|
|
SIGNAL SQLSTATE '45000'
|
|
|
|
|
|
SET MESSAGE_TEXT = 'DataRitiro non può essere anteriore alla data odierna';
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
|
|
|
|
|
|
IF NEW.DataConsegna <> OLD.DataConsegna AND NEW.DataConsegna < CURDATE() THEN
|
|
|
|
|
|
SIGNAL SQLSTATE '45000'
|
|
|
|
|
|
SET MESSAGE_TEXT = 'DataConsegna non può essere anteriore alla data odierna';
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
END$$
|
|
|
|
|
|
|
|
|
|
|
|
DELIMITER ;
|