-- Modulo Equipos (inventario alimentado por el agente GLPI). Idempotente: CREATE TABLE IF NOT EXISTS. -- Un equipo = una fila en `devices`, upsert por `deviceid` (identificador estable que genera el -- agente; el hostname cambia). Los componentes se reemplazan completos en cada reporte. SET NAMES utf8mb4; -- Tokens que autentican al agente en la ingesta. Se guarda el HASH (sha256), nunca el token. CREATE TABLE IF NOT EXISTS inventory_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, label VARCHAR(120) NOT NULL, token_hash CHAR(64) NOT NULL UNIQUE, is_active TINYINT(1) NOT NULL DEFAULT 1, last_used_at DATETIME NULL, created_by INT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_inventory_tokens_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS devices ( id INT AUTO_INCREMENT PRIMARY KEY, deviceid VARCHAR(255) NOT NULL UNIQUE, hostname VARCHAR(190) NULL, kind ENUM('desktop','laptop','server','virtual','printer','network','other') NOT NULL DEFAULT 'other', manufacturer VARCHAR(160) NULL, model VARCHAR(190) NULL, serial VARCHAR(160) NULL, os_name VARCHAR(190) NULL, os_version VARCHAR(120) NULL, os_arch VARCHAR(40) NULL, domain VARCHAR(190) NULL, last_user VARCHAR(190) NULL, ip_main VARCHAR(64) NULL, mac_main VARCHAR(40) NULL, cpu_summary VARCHAR(255) NULL, ram_mb INT NULL, disk_total_mb BIGINT NULL, disk_free_mb BIGINT NULL, max_disk_used_pct TINYINT UNSIGNED NULL, agent_version VARCHAR(80) NULL, tag VARCHAR(120) NULL, itemtype VARCHAR(60) NULL, first_seen DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, last_seen DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Baja logica (conserva historial); un nuevo reporte NO reactiva un equipo dado de baja. status ENUM('active','retired') NOT NULL DEFAULT 'active', assigned_user_id INT NULL, department_id INT NULL, notes TEXT NULL, raw_file VARCHAR(255) NULL, extra_json LONGTEXT NULL, KEY idx_devices_hostname (hostname), KEY idx_devices_last_seen (last_seen), CONSTRAINT fk_devices_user FOREIGN KEY (assigned_user_id) REFERENCES users(id) ON DELETE SET NULL, CONSTRAINT fk_devices_department FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_cpus ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, name VARCHAR(255) NULL, manufacturer VARCHAR(120) NULL, cores INT NULL, threads INT NULL, speed_mhz INT NULL, KEY idx_device_cpus_device (device_id), CONSTRAINT fk_device_cpus_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_memories ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, slot VARCHAR(80) NULL, capacity_mb INT NULL, type VARCHAR(60) NULL, speed VARCHAR(40) NULL, manufacturer VARCHAR(120) NULL, serial VARCHAR(120) NULL, KEY idx_device_memories_device (device_id), CONSTRAINT fk_device_memories_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_disks ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, name VARCHAR(190) NULL, model VARCHAR(190) NULL, manufacturer VARCHAR(120) NULL, type VARCHAR(60) NULL, interface VARCHAR(60) NULL, size_mb BIGINT NULL, serial VARCHAR(160) NULL, KEY idx_device_disks_device (device_id), CONSTRAINT fk_device_disks_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_volumes ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, mount VARCHAR(190) NULL, label VARCHAR(190) NULL, filesystem VARCHAR(60) NULL, type VARCHAR(60) NULL, total_mb BIGINT NULL, free_mb BIGINT NULL, KEY idx_device_volumes_device (device_id), CONSTRAINT fk_device_volumes_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_networks ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, description VARCHAR(255) NULL, mac VARCHAR(40) NULL, ip VARCHAR(64) NULL, mask VARCHAR(64) NULL, gateway VARCHAR(64) NULL, type VARCHAR(60) NULL, status VARCHAR(40) NULL, KEY idx_device_networks_device (device_id), CONSTRAINT fk_device_networks_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_monitors ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, manufacturer VARCHAR(120) NULL, model VARCHAR(190) NULL, serial VARCHAR(120) NULL, KEY idx_device_monitors_device (device_id), CONSTRAINT fk_device_monitors_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS device_software ( id INT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, name VARCHAR(255) NOT NULL, version VARCHAR(120) NULL, publisher VARCHAR(190) NULL, install_date VARCHAR(40) NULL, KEY idx_device_software_device (device_id), KEY idx_device_software_name (name(120)), CONSTRAINT fk_device_software_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Diff entre reportes consecutivos (RAM que bajo, disco nuevo, software instalado/desinstalado). CREATE TABLE IF NOT EXISTS device_changes ( id BIGINT AUTO_INCREMENT PRIMARY KEY, device_id INT NOT NULL, change_type VARCHAR(40) NOT NULL, field VARCHAR(120) NULL, old_value TEXT NULL, new_value TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_device_changes_device (device_id, created_at), CONSTRAINT fk_device_changes_device FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;