Files
territory-assigner/database.sql
2025-12-06 18:23:43 +01:00

103 lines
3.7 KiB
SQL

-- Database per Gestione Territori
-- Creato il 6 dicembre 2025
CREATE DATABASE IF NOT EXISTS territoryassigner CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE territoryassigner;
-- Tabella utenti
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100),
is_admin TINYINT(1) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabella territori
CREATE TABLE IF NOT EXISTS territories (
id INT AUTO_INCREMENT PRIMARY KEY,
numero VARCHAR(20) NOT NULL,
zona VARCHAR(100) NOT NULL,
tipologia VARCHAR(50) NOT NULL,
image_path VARCHAR(255),
note TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY unique_territory (numero, zona)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabella assegnazioni
CREATE TABLE IF NOT EXISTS assignments (
id INT AUTO_INCREMENT PRIMARY KEY,
territory_id INT NOT NULL,
assigned_to VARCHAR(100) NOT NULL,
assigned_date DATE NOT NULL,
returned_date DATE NULL,
link_token VARCHAR(64) UNIQUE,
link_expires_at DATETIME NULL,
is_priority TINYINT(1) DEFAULT 0,
note TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (territory_id) REFERENCES territories(id) ON DELETE CASCADE,
INDEX idx_territory (territory_id),
INDEX idx_token (link_token),
INDEX idx_dates (assigned_date, returned_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabella configurazione
CREATE TABLE IF NOT EXISTS config (
id INT AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(50) NOT NULL UNIQUE,
config_value VARCHAR(255) NOT NULL,
description TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Inserimento configurazioni di default
INSERT INTO config (config_key, config_value, description) VALUES
('link_expiry_days', '7', 'Giorni di validità dei link temporanei'),
('warning_days_normal', '90', 'Giorni dopo i quali un territorio è da assegnare'),
('warning_days_priority', '180', 'Giorni dopo i quali un territorio è prioritario'),
('warning_days_return', '120', 'Giorni dopo i quali un territorio è da riconsegnare');
-- Utente amministratore di default (password: admin123)
-- IMPORTANTE: Cambiare la password dopo la prima installazione!
INSERT INTO users (username, password, email, is_admin) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin@example.com', 1);
-- Vista per territori attualmente assegnati
CREATE OR REPLACE VIEW current_assignments AS
SELECT
t.id as territory_id,
t.numero,
t.zona,
t.tipologia,
a.id as assignment_id,
a.assigned_to,
a.assigned_date,
a.is_priority,
DATEDIFF(CURDATE(), a.assigned_date) as days_assigned
FROM territories t
LEFT JOIN assignments a ON t.id = a.territory_id
WHERE a.returned_date IS NULL
ORDER BY a.assigned_date ASC;
-- Vista per territori disponibili (in reparto)
CREATE OR REPLACE VIEW available_territories AS
SELECT
t.id as territory_id,
t.numero,
t.zona,
t.tipologia,
t.image_path,
MAX(a.returned_date) as last_returned_date,
DATEDIFF(CURDATE(), MAX(a.returned_date)) as days_in_depot
FROM territories t
LEFT JOIN assignments a ON t.id = a.territory_id
WHERE t.id NOT IN (
SELECT territory_id FROM assignments WHERE returned_date IS NULL
)
GROUP BY t.id, t.numero, t.zona, t.tipologia, t.image_path
ORDER BY last_returned_date ASC NULLS FIRST;