info('🚀 Creazione database GESCON import...'); try { // Usa la connessione gescon_import $connection = DB::connection('gescon_import'); $this->info('📊 Creazione tabelle essenziali...'); // 1. STABILI $connection->statement(" CREATE TABLE IF NOT EXISTS stabili ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) UNIQUE NOT NULL, denominazione VARCHAR(255) NOT NULL, indirizzo VARCHAR(255), cap VARCHAR(10), citta VARCHAR(255), provincia VARCHAR(5), codice_fiscale VARCHAR(16), cf_amministratore VARCHAR(16), scale INT, n_interni INT, codice_directory VARCHAR(10) NOT NULL, flag_attivo BOOLEAN DEFAULT TRUE, iban VARCHAR(34), superficie_totale DECIMAL(10,2), note TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_cod_stabile (cod_stabile), INDEX idx_directory (codice_directory) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 2. ANNI GESTIONE $connection->statement(" CREATE TABLE IF NOT EXISTS anni_gestione ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, anno YEAR NOT NULL, data_inizio DATE, data_fine DATE, chiuso BOOLEAN DEFAULT FALSE, budget_preventivo_euro DECIMAL(12,2), consuntivo_euro DECIMAL(12,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), UNIQUE KEY unique_stabile_anno (cod_stabile, anno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 3. CONDOMINI $connection->statement(" CREATE TABLE IF NOT EXISTS condomini ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, id_cond INT NOT NULL, cod_cond VARCHAR(20), cognome VARCHAR(255), nome VARCHAR(255), codice_fiscale VARCHAR(16), indirizzo VARCHAR(255), cap VARCHAR(10), citta VARCHAR(255), telefono VARCHAR(255), email VARCHAR(255), tipo_soggetto ENUM('proprietario', 'inquilino', 'amministratore', 'altro') DEFAULT 'proprietario', millesimi_proprieta DECIMAL(8,3), superficie_mq DECIMAL(8,2), attivo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), INDEX idx_stabile_cond (cod_stabile, id_cond), INDEX idx_cf (codice_fiscale) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 4. VOCI SPESA $connection->statement(" CREATE TABLE IF NOT EXISTS voci_spesa ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, anno YEAR NOT NULL, cod_voce VARCHAR(20) NOT NULL, descrizione VARCHAR(255) NOT NULL, tabella_millesimi VARCHAR(50), perc_proprietario DECIMAL(5,2), perc_inquilino DECIMAL(5,2), preventivo_euro DECIMAL(10,2), consuntivo_euro DECIMAL(10,2), tipo_spesa ENUM('ordinaria', 'straordinaria', 'fondo') DEFAULT 'ordinaria', note TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), INDEX idx_stabile_anno_voce (cod_stabile, anno, cod_voce) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 5. OPERAZIONI $connection->statement(" CREATE TABLE IF NOT EXISTS operazioni ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, anno YEAR NOT NULL, id_operazione INT NOT NULL, numero_spesa INT NOT NULL, data_spesa DATE NOT NULL, cod_spesa VARCHAR(20), importo_euro DECIMAL(10,2) NOT NULL, beneficiario VARCHAR(255), fornitore VARCHAR(255), numero_fattura VARCHAR(255), data_fattura DATE, natura ENUM('spesa', 'entrata', 'credito', 'debito') NOT NULL, note TEXT, incluso_bilancio BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), INDEX idx_stabile_anno_spesa (cod_stabile, anno, numero_spesa) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 6. RATE $connection->statement(" CREATE TABLE IF NOT EXISTS rate ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, anno YEAR NOT NULL, id_cond INT NOT NULL, numero_rata INT NOT NULL, data_emissione DATE NOT NULL, data_scadenza DATE, importo_euro DECIMAL(10,2) NOT NULL, importo_pagato_euro DECIMAL(10,2) DEFAULT 0, stato ENUM('emessa', 'pagata', 'parziale', 'scaduta') DEFAULT 'emessa', dettaglio_voci TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), INDEX idx_stabile_anno_cond (cod_stabile, anno, id_cond), INDEX idx_scadenza_stato (data_scadenza, stato) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 7. INCASSI $connection->statement(" CREATE TABLE IF NOT EXISTS incassi ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, anno YEAR NOT NULL, id_cond INT NOT NULL, data_pagamento DATE NOT NULL, importo_euro DECIMAL(10,2) NOT NULL, modalita_pagamento VARCHAR(50), riferimento VARCHAR(255), numero_rata_collegata INT, riconciliato BOOLEAN DEFAULT FALSE, note TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), INDEX idx_stabile_anno_data (cod_stabile, anno, data_pagamento), INDEX idx_cond_riconciliato (id_cond, riconciliato) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 8. MILLESIMI DETTAGLIO $connection->statement(" CREATE TABLE IF NOT EXISTS millesimi_dettaglio ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_stabile VARCHAR(10) NOT NULL, cod_tabella VARCHAR(20) NOT NULL, id_cond INT NOT NULL, millesimi DECIMAL(8,3) NOT NULL, preventivo_euro DECIMAL(10,2), consuntivo_euro DECIMAL(10,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (cod_stabile) REFERENCES stabili(cod_stabile), INDEX idx_stabile_tabella_cond (cod_stabile, cod_tabella, id_cond) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 9. FORNITORI $connection->statement(" CREATE TABLE IF NOT EXISTS fornitori ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cod_fornitore VARCHAR(20) UNIQUE NOT NULL, ragione_sociale VARCHAR(255) NOT NULL, codice_fiscale VARCHAR(16), partita_iva VARCHAR(11), indirizzo VARCHAR(255), cap VARCHAR(10), citta VARCHAR(255), provincia VARCHAR(5), telefono VARCHAR(255), email VARCHAR(255), iban VARCHAR(34), categoria ENUM('manutenzione', 'utilities', 'servizi', 'altro') DEFAULT 'altro', attivo BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_cf (codice_fiscale), INDEX idx_piva (partita_iva) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); // 10. IMPORT LOG $connection->statement(" CREATE TABLE IF NOT EXISTS import_log ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, tabella_origine VARCHAR(50) NOT NULL, cod_stabile VARCHAR(10), record_originale_id INT, stato ENUM('pending', 'imported', 'duplicate', 'error') DEFAULT 'pending', dettagli TEXT, data_import TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_tabella_stato (tabella_origine, stato), INDEX idx_stabile_data (cod_stabile, data_import) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "); $this->info('✅ Database GESCON import creato con successo!'); // Verifica tabelle create $tables = $connection->select("SHOW TABLES"); $this->info('📋 Tabelle create: ' . count($tables)); foreach ($tables as $table) { $tableName = array_values((array)$table)[0]; $this->line(" - {$tableName}"); } $this->info('🎯 Pronto per importazione dati GESCON!'); } catch (\Exception $e) { $this->error('❌ Errore: ' . $e->getMessage()); return 1; } return 0; } }