corrieribackend/initdb/01_schema.sql
AV77web de33e61496
All checks were successful
Deploy to VPS / build (push) Successful in 14s
Deploy to VPS / deploy (push) Successful in 12s
corretto file 01_schema.sql
2026-06-22 15:56:39 +02:00

117 lines
4.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================
-- Schema tabelle Gestione Corrieri
-- Allineato alle API: /utenti, /clienti, /consegne
-- ============================================================
USE corrieri;
-- ------------------------------------------------------------
-- Tabella utenti (API: GET/POST/PUT/DELETE /operatori)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS utente (
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)',
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 (UtenteID),
UNIQUE KEY uk_utente_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,
Comune VARCHAR(100) NOT NULL,
Provincia VARCHAR(2) 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 consegna (API: GET/POST/PUT/DELETE /consegna)
-- DataRitiro e DataConsegna sono eventi indipendenti: nessun vincolo
-- di ordine tra le due date, solo retroattività rispetto a oggi.
-- ----------------------------------------------------------------
CREATE TABLE IF NOT EXISTS consegna (
ConsegnaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
ClienteID 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 (ConsegnaID),
UNIQUE KEY uk_chiaveConsegna (ChiaveConsegna),
KEY idx_DataConsegna (DataConsegna),
CONSTRAINT fk_consegna_cliente
FOREIGN KEY (ClienteID)
REFERENCES cliente (ClienteID)
ON UPDATE CASCADE
ON DELETE RESTRICT
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ----------------------------------------------------------------
-- 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 ;