setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 1. Registra il tenant nel DB centrale $pdo->exec("CREATE DATABASE IF NOT EXISTS gestofficina_centrale"); $pdo->exec("USE gestofficina_centrale"); $stmt_check = $pdo->prepare("SELECT COUNT(*) FROM tenants WHERE sottodominio = :sub"); $stmt_check->execute([':sub' => $sottodominio]); if ($stmt_check->fetchColumn() > 0) { throw new Exception("Il sottodominio '$sottodominio' esiste già."); } $stmt_ins = $pdo->prepare("INSERT INTO tenants (sottodominio, nome_officina, email_referente, data_creazione, scadenza_abbonamento, stato) VALUES (:sub, :nome, :email, CURRENT_DATE(), DATE_ADD(CURRENT_DATE(), INTERVAL 1 YEAR), 'attivo')"); $stmt_ins->execute([':sub' => $sottodominio, ':nome' => $nome_officina, ':email' => $email]); // 2. Crea il Database Isolato per l'officina $db_officina = "db_officina_" . $sottodominio; $pdo->exec("CREATE DATABASE `$db_officina` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); $pdo->exec("USE `$db_officina`"); // 3. Inietta la struttura delle tabelle nel nuovo DB $sql_struttura = " CREATE TABLE impostazioni ( id INT AUTO_INCREMENT PRIMARY KEY, nome_officina VARCHAR(255), indirizzo VARCHAR(255), telefono VARCHAR(50), email VARCHAR(100), partita_iva VARCHAR(50), logo VARCHAR(255) DEFAULT 'logo.png' ); CREATE TABLE utenti ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, ruolo VARCHAR(20) DEFAULT 'admin' ); CREATE TABLE clienti ( id INT AUTO_INCREMENT PRIMARY KEY, nome_cognome VARCHAR(255) NOT NULL, telefono VARCHAR(50), email VARCHAR(100), partita_iva_cf VARCHAR(50) ); CREATE TABLE commesse ( id INT AUTO_INCREMENT PRIMARY KEY, numero_commessa VARCHAR(50) NOT NULL UNIQUE, id_cliente INT NOT NULL, marca_modello VARCHAR(255) NOT NULL, targa VARCHAR(20) NOT NULL, telaio VARCHAR(50), km_entrata INT, data_accettazione DATE, data_previsione DATE, data_prossimo_controllo DATE DEFAULT NULL, stato_pagamento VARCHAR(50) DEFAULT 'Da saldare', metodo_pagamento VARCHAR(50), acconto DECIMAL(10,2) DEFAULT 0.00 ); CREATE TABLE lavorazioni ( id INT AUTO_INCREMENT PRIMARY KEY, id_commessa INT NOT NULL, codice VARCHAR(50), descrizione TEXT, qta DECIMAL(10,2) NOT NULL DEFAULT 1, prezzo_unitario DECIMAL(10,2) NOT NULL DEFAULT 0, totale DECIMAL(10,2) NOT NULL DEFAULT 0, FOREIGN KEY (id_commessa) REFERENCES commesse(id) ON DELETE CASCADE ); CREATE TABLE preventivi ( id INT AUTO_INCREMENT PRIMARY KEY, numero_preventivo VARCHAR(50) NOT NULL UNIQUE, id_cliente INT NOT NULL, marca_modello VARCHAR(255) NOT NULL, targa VARCHAR(20) NOT NULL, telaio VARCHAR(50), km_entrata INT, data_preventivo DATE, data_previsione DATE ); CREATE TABLE lavorazioni_preventivi ( id INT AUTO_INCREMENT PRIMARY KEY, id_preventivo INT NOT NULL, codice VARCHAR(50), descrizione TEXT, qta DECIMAL(10,2) NOT NULL DEFAULT 1, prezzo_unitario DECIMAL(10,2) NOT NULL DEFAULT 0, totale DECIMAL(10,2) NOT NULL DEFAULT 0, FOREIGN KEY (id_preventivo) REFERENCES preventivi(id) ON DELETE CASCADE ); CREATE TABLE prima_nota ( id INT AUTO_INCREMENT PRIMARY KEY, data_operazione DATE NOT NULL, tipo ENUM('entrata', 'uscita') NOT NULL, causale VARCHAR(255) NOT NULL, importo DECIMAL(10,2) NOT NULL, metodo_pagamento VARCHAR(50) DEFAULT 'Contanti' ); "; $pdo->exec($sql_struttura); // 4. Inserisce le impostazioni di base $stmt_conf = $pdo->prepare("INSERT INTO impostazioni (nome_officina, email) VALUES (:nome, :email)"); $stmt_conf->execute([':nome' => $nome_officina, ':email' => $email]); // 5. Inserisce l'amministratore dell'officina $hash = password_hash($password_admin_officina, PASSWORD_DEFAULT); $stmt_user = $pdo->prepare("INSERT INTO utenti (username, password_hash) VALUES ('admin', :hash)"); $stmt_user->execute([':hash' => $hash]); $messaggio = "
✅ Ambiente per $nome_officina creato con successo!
URL: $sottodominio.gestofficina.it
Database: $db_officina
"; } catch (Exception $e) { $messaggio = "
❌ Errore: " . $e->getMessage() . "
"; } } ?> Master Admin - ifrmobile

🛠️ Generatore Multi-Tenant GestOfficina

.tuodominio.it
Solo lettere minuscole e numeri, senza spazi.