-- https://www.phpmyadmin.net/
--
-- Creato il: Gen 19, 2026 alle 16:00
-- Versione del server: 10.11.14-MariaDB-0+deb12u2
-- Versione PHP: 8.2.29

START TRANSACTION;



--
-- Database: `enigma`
--

-- --------------------------------------------------------

--
-- Struttura della tabella `audit_log`
--

CREATE TABLE `audit_log` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `id_user` int(11) DEFAULT NULL,
  `azione` varchar(255) DEFAULT NULL,
  `modulo` varchar(50) DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT current_timestamp(),
  `dettagli` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`dettagli`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `inv_cache_prodotti`
--

CREATE TABLE `inv_cache_prodotti` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `codice_barcode` varchar(255) NOT NULL,
  `dati_cassanova` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`dati_cassanova`)),
  `cache_timestamp` timestamp NULL DEFAULT current_timestamp(),
  `ttl` int(11) DEFAULT 86400
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `inv_giacenze`
--

CREATE TABLE `inv_giacenze` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `id_sede` int(11) NOT NULL,
  `id_prodotto` varchar(255) NOT NULL,
  `id_variante` varchar(255) DEFAULT NULL,
  `quantita` bigint(20) DEFAULT 0,
  `quantita_in_arrivo` bigint(20) DEFAULT 0,
  `quantita_in_uscita` bigint(20) DEFAULT 0,
  `soglia_minima` bigint(20) DEFAULT 0,
  `gestisci_giacenza` tinyint(1) DEFAULT 1,
  `data_sincronizzazione` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `inv_log_barcode`
--

CREATE TABLE `inv_log_barcode` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `id_sessione` int(11) NOT NULL,
  `codice_barcode` varchar(255) NOT NULL,
  `timestamp` timestamp NULL DEFAULT current_timestamp(),
  `azione` enum('scansionato','errore','corretto') DEFAULT 'scansionato'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `inv_risultati_inventario`
--

CREATE TABLE `inv_risultati_inventario` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `id_sessione` int(11) NOT NULL,
  `codice_prodotto` varchar(255) DEFAULT NULL,
  `barcode` varchar(255) DEFAULT NULL,
  `product_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`product_data`)),
  `found_in_api` tinyint(1) DEFAULT 0,
  `manual_entry` tinyint(1) DEFAULT 0,
  `scanned_at` datetime DEFAULT NULL,
  `categoria` varchar(255) DEFAULT NULL,
  `nome_prodotto` varchar(255) DEFAULT NULL,
  `quantita_sistema` int(11) DEFAULT NULL,
  `quantita_fisica` int(11) DEFAULT NULL,
  `sconto` decimal(5,2) DEFAULT NULL,
  `costo` decimal(10,2) DEFAULT NULL,
  `prezzo_pubblico` decimal(10,2) DEFAULT NULL,
  `differenza` int(11) DEFAULT NULL,
  `data_caricamento` timestamp NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `inv_sedi`
--

CREATE TABLE `inv_sedi` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `nome` varchar(255) NOT NULL,
  `indirizzo` text DEFAULT NULL,
  `città` varchar(100) DEFAULT NULL,
  `data_creazione` timestamp NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `inv_sessioni_inventario`
--

CREATE TABLE `inv_sessioni_inventario` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `id_sede` int(11) NOT NULL,
  `id_user` int(11) DEFAULT NULL,
  `nome_sessione` varchar(255) DEFAULT NULL,
  `timestamp_inizio` timestamp NULL DEFAULT current_timestamp(),
  `timestamp_fine` timestamp NULL DEFAULT NULL,
  `stato` enum('aperta','chiusa') DEFAULT 'aperta',
  `note` text DEFAULT NULL,
  `total_items` int(11) DEFAULT 0,
  `total_scans` int(11) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `tenants`
--

CREATE TABLE `tenants` (
  `id` int(11) NOT NULL,
  `codice` varchar(20) NOT NULL,
  `nome` varchar(255) NOT NULL,
  `email_admin` varchar(255) NOT NULL,
  `data_creazione` timestamp NULL DEFAULT current_timestamp(),
  `stato` enum('attivo','sospeso','cancellato') DEFAULT 'attivo'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura della tabella `tenant_users`
--

CREATE TABLE `tenant_users` (
  `id` int(11) NOT NULL,
  `id_tenant` int(11) NOT NULL,
  `email` varchar(255) NOT NULL,
  `nome` varchar(255) NOT NULL,
  `password_hash` varchar(255) NOT NULL,
  `ruolo` enum('admin','manager','operatore') DEFAULT 'operatore',
  `data_creazione` timestamp NULL DEFAULT current_timestamp(),
  `ultimo_accesso` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Struttura stand-in per le viste `v_active_sessions`
-- (Vedi sotto per la vista effettiva)
--
CREATE TABLE `v_active_sessions` (
`id` int(11)
,`tenant_id` int(11)
,`user_id` int(11)
,`sede_id` int(11)
,`status` enum('aperta','chiusa')
,`started_at` timestamp
,`closed_at` timestamp
,`total_items` int(11)
,`total_scans` int(11)
,`notes` text
,`user_email` varchar(255)
,`user_name` varchar(255)
,`user_role` enum('admin','manager','operatore')
,`current_items_count` bigint(21)
,`duration_minutes` bigint(21)
);

-- --------------------------------------------------------

--
-- Struttura stand-in per le viste `v_session_summary`
-- (Vedi sotto per la vista effettiva)
--
CREATE TABLE `v_session_summary` (
`id` int(11)
,`tenant_id` int(11)
,`user_id` int(11)
,`sede_id` int(11)
,`status` enum('aperta','chiusa')
,`started_at` timestamp
,`closed_at` timestamp
,`total_items` int(11)
,`total_scans` int(11)
,`notes` text
,`user_email` varchar(255)
,`user_name` varchar(255)
,`items_count` bigint(21)
,`found_items` decimal(22,0)
,`not_found_items` decimal(22,0)
,`manual_items` decimal(22,0)
,`total_value` decimal(42,2)
,`duration_minutes` bigint(21)
);

-- --------------------------------------------------------

--
-- Struttura per vista `v_active_sessions`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`enigma_user`@`localhost` SQL SECURITY DEFINER VIEW `v_active_sessions`  AS SELECT `s`.`id` AS `id`, `s`.`id_tenant` AS `tenant_id`, `s`.`id_user` AS `user_id`, `s`.`id_sede` AS `sede_id`, `s`.`stato` AS `status`, `s`.`timestamp_inizio` AS `started_at`, `s`.`timestamp_fine` AS `closed_at`, `s`.`total_items` AS `total_items`, `s`.`total_scans` AS `total_scans`, `s`.`note` AS `notes`, `u`.`email` AS `user_email`, `u`.`nome` AS `user_name`, `u`.`ruolo` AS `user_role`, count(`r`.`id`) AS `current_items_count`, timestampdiff(MINUTE,`s`.`timestamp_inizio`,current_timestamp()) AS `duration_minutes` FROM ((`inv_sessioni_inventario` `s` left join `tenant_users` `u` on(`s`.`id_user` = `u`.`id`)) left join `inv_risultati_inventario` `r` on(`s`.`id` = `r`.`id_sessione`)) WHERE `s`.`stato` = 'aperta' GROUP BY `s`.`id`, `s`.`id_tenant`, `s`.`id_user`, `s`.`id_sede`, `s`.`stato`, `s`.`timestamp_inizio`, `s`.`timestamp_fine`, `s`.`total_items`, `s`.`total_scans`, `s`.`note`, `u`.`email`, `u`.`nome`, `u`.`ruolo` ;

-- --------------------------------------------------------

--
-- Struttura per vista `v_session_summary`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`enigma_user`@`localhost` SQL SECURITY DEFINER VIEW `v_session_summary`  AS SELECT `s`.`id` AS `id`, `s`.`id_tenant` AS `tenant_id`, `s`.`id_user` AS `user_id`, `s`.`id_sede` AS `sede_id`, `s`.`stato` AS `status`, `s`.`timestamp_inizio` AS `started_at`, `s`.`timestamp_fine` AS `closed_at`, `s`.`total_items` AS `total_items`, `s`.`total_scans` AS `total_scans`, `s`.`note` AS `notes`, `u`.`email` AS `user_email`, `u`.`nome` AS `user_name`, count(`r`.`id`) AS `items_count`, sum(case when `r`.`found_in_api` = 1 then 1 else 0 end) AS `found_items`, sum(case when `r`.`found_in_api` = 0 then 1 else 0 end) AS `not_found_items`, sum(case when `r`.`manual_entry` = 1 then 1 else 0 end) AS `manual_items`, sum(`r`.`prezzo_pubblico` * `r`.`quantita_fisica`) AS `total_value`, timestampdiff(MINUTE,`s`.`timestamp_inizio`,coalesce(`s`.`timestamp_fine`,current_timestamp())) AS `duration_minutes` FROM ((`inv_sessioni_inventario` `s` left join `tenant_users` `u` on(`s`.`id_user` = `u`.`id`)) left join `inv_risultati_inventario` `r` on(`s`.`id` = `r`.`id_sessione`)) GROUP BY `s`.`id`, `s`.`id_tenant`, `s`.`id_user`, `s`.`id_sede`, `s`.`stato`, `s`.`timestamp_inizio`, `s`.`timestamp_fine`, `s`.`total_items`, `s`.`total_scans`, `s`.`note`, `u`.`email`, `u`.`nome` ;

--
-- Indici per le tabelle scaricate
--

--
-- Indici per le tabelle `audit_log`
--
ALTER TABLE `audit_log`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_tenant` (`id_tenant`),
  ADD KEY `idx_timestamp` (`timestamp`);

--
-- Indici per le tabelle `inv_cache_prodotti`
--
ALTER TABLE `inv_cache_prodotti`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `unique_barcode_per_tenant` (`id_tenant`,`codice_barcode`),
  ADD KEY `idx_tenant` (`id_tenant`);

--
-- Indici per le tabelle `inv_giacenze`
--
ALTER TABLE `inv_giacenze`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_giacenza` (`id_tenant`,`id_sede`,`id_prodotto`,`id_variante`),
  ADD KEY `id_tenant` (`id_tenant`,`id_sede`),
  ADD KEY `id_prodotto` (`id_prodotto`),
  ADD KEY `idx_ricerca` (`id_tenant`,`id_sede`,`id_prodotto`);

--
-- Indici per le tabelle `inv_log_barcode`
--
ALTER TABLE `inv_log_barcode`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_tenant` (`id_tenant`),
  ADD KEY `idx_sessione` (`id_sessione`),
  ADD KEY `idx_barcode` (`codice_barcode`);

--
-- Indici per le tabelle `inv_risultati_inventario`
--
ALTER TABLE `inv_risultati_inventario`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_tenant` (`id_tenant`),
  ADD KEY `idx_sessione` (`id_sessione`),
  ADD KEY `idx_prodotto` (`codice_prodotto`),
  ADD KEY `idx_barcode` (`barcode`),
  ADD KEY `idx_found_api` (`found_in_api`),
  ADD KEY `idx_scanned` (`scanned_at`);

--
-- Indici per le tabelle `inv_sedi`
--
ALTER TABLE `inv_sedi`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_tenant` (`id_tenant`);

--
-- Indici per le tabelle `inv_sessioni_inventario`
--
ALTER TABLE `inv_sessioni_inventario`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_tenant` (`id_tenant`),
  ADD KEY `idx_sede` (`id_sede`),
  ADD KEY `idx_user` (`id_user`);

--
-- Indici per le tabelle `tenants`
--
ALTER TABLE `tenants`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `codice` (`codice`);

--
-- Indici per le tabelle `tenant_users`
--
ALTER TABLE `tenant_users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `unique_email_per_tenant` (`id_tenant`,`email`);

--
-- AUTO_INCREMENT per le tabelle scaricate
--

--
-- AUTO_INCREMENT per la tabella `audit_log`
--
ALTER TABLE `audit_log`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `inv_cache_prodotti`
--
ALTER TABLE `inv_cache_prodotti`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `inv_giacenze`
--
ALTER TABLE `inv_giacenze`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `inv_log_barcode`
--
ALTER TABLE `inv_log_barcode`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `inv_risultati_inventario`
--
ALTER TABLE `inv_risultati_inventario`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `inv_sedi`
--
ALTER TABLE `inv_sedi`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `inv_sessioni_inventario`
--
ALTER TABLE `inv_sessioni_inventario`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `tenants`
--
ALTER TABLE `tenants`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT per la tabella `tenant_users`
--
ALTER TABLE `tenant_users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- Limiti per le tabelle scaricate
--

--
-- Limiti per la tabella `audit_log`
--
ALTER TABLE `audit_log`
  ADD CONSTRAINT `audit_log_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE;

--
-- Limiti per la tabella `inv_cache_prodotti`
--
ALTER TABLE `inv_cache_prodotti`
  ADD CONSTRAINT `inv_cache_prodotti_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE;

--
-- Limiti per la tabella `inv_log_barcode`
--
ALTER TABLE `inv_log_barcode`
  ADD CONSTRAINT `inv_log_barcode_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `inv_log_barcode_ibfk_2` FOREIGN KEY (`id_sessione`) REFERENCES `inv_sessioni_inventario` (`id`) ON DELETE CASCADE;

--
-- Limiti per la tabella `inv_risultati_inventario`
--
ALTER TABLE `inv_risultati_inventario`
  ADD CONSTRAINT `inv_risultati_inventario_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `inv_risultati_inventario_ibfk_2` FOREIGN KEY (`id_sessione`) REFERENCES `inv_sessioni_inventario` (`id`) ON DELETE CASCADE;

--
-- Limiti per la tabella `inv_sedi`
--
ALTER TABLE `inv_sedi`
  ADD CONSTRAINT `inv_sedi_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE;

--
-- Limiti per la tabella `inv_sessioni_inventario`
--
ALTER TABLE `inv_sessioni_inventario`
  ADD CONSTRAINT `inv_sessioni_inventario_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `inv_sessioni_inventario_ibfk_2` FOREIGN KEY (`id_sede`) REFERENCES `inv_sedi` (`id`) ON DELETE CASCADE;

--
-- Limiti per la tabella `tenant_users`
--
ALTER TABLE `tenant_users`
  ADD CONSTRAINT `tenant_users_ibfk_1` FOREIGN KEY (`id_tenant`) REFERENCES `tenants` (`id`) ON DELETE CASCADE;
COMMIT;

