dbManager = $dbManager; } public function handle(): int { $adminCode = $this->argument('admin_code'); $stabileCode = $this->argument('stabile_code'); $force = $this->option('force'); $this->info("๐Ÿ—๏ธ Creazione struttura stabile: {$stabileCode} (Admin: {$adminCode})"); // Trova amministratore $amministratore = Amministratore::where('codice_univoco', $adminCode)->first(); if (!$amministratore) { $this->error("โŒ Amministratore {$adminCode} non trovato"); return 1; } // Trova stabile $stabile = $amministratore->stabili()->where('codice_stabile', $stabileCode)->first(); if (!$stabile) { $this->error("โŒ Stabile {$stabileCode} non trovato per amministratore {$adminCode}"); return 1; } // Verifica se struttura esiste giร  if ($stabile->database_dedicato && !$force) { $this->warn("โš ๏ธ Struttura stabile giร  esistente. Usa --force per ricreare"); return 0; } // 1. Crea database dedicato stabile $this->info("๐Ÿ’พ Creazione database dedicato stabile..."); $dbResult = $this->dbManager->createStabileDatabase($stabile); if (!$dbResult['success']) { $this->error("โŒ Errore creazione database: " . $dbResult['error']); return 1; } $this->info("โœ… Database stabile creato: " . $dbResult['database_name']); // 2. Crea struttura cartelle dettagliata $this->info("๐Ÿ“ Creazione struttura cartelle stabile..."); $this->createDetailedStabileStructure($stabile); // 3. Crea configurazioni specifiche $this->info("โš™๏ธ Creazione configurazioni stabile..."); $this->createStabileConfigurations($stabile); // 4. Popola database con dati iniziali $this->info("๐Ÿ“Š Popolamento database iniziale..."); $this->populateStabileDatabase($stabile); $this->info("๐ŸŽ‰ Struttura stabile {$stabileCode} creata con successo!"); return 0; } private function createDetailedStabileStructure(Stabile $stabile): void { $adminCode = $stabile->amministratore->codice_univoco; $stabileCode = $stabile->codice_stabile; $basePath = "amministratori/{$adminCode}/stabili/{$stabileCode}"; $folders = [ // Documenti amministrativi 'documenti/amministrazione/delibere', 'documenti/amministrazione/comunicazioni', 'documenti/amministrazione/relazioni_annuali', 'documenti/amministrazione/regolamenti', // Assemblee 'documenti/assemblee/convocazioni', 'documenti/assemblee/verbali', 'documenti/assemblee/allegati', 'documenti/assemblee/presenze', // Contratti e fornitori 'documenti/contratti/manutenzione', 'documenti/contratti/pulizie', 'documenti/contratti/utenze', 'documenti/contratti/assicurazioni', 'documenti/contratti/altri_servizi', // Contabilitร  dettagliata 'contabilita/fatture/entrate/quote_condominiali', 'contabilita/fatture/entrate/altre_entrate', 'contabilita/fatture/uscite/ordinarie', 'contabilita/fatture/uscite/straordinarie', 'contabilita/fatture/uscite/utenze', 'contabilita/ricevute/pagamenti', 'contabilita/ricevute/incassi', 'contabilita/bilanci/preventivi', 'contabilita/bilanci/consuntivi', 'contabilita/ripartizioni/spese_ordinarie', 'contabilita/ripartizioni/spese_straordinarie', // Proprietari e unitร  'anagrafica/proprietari/documenti_identita', 'anagrafica/proprietari/contratti_compravendita', 'anagrafica/proprietari/deleghe', 'anagrafica/unita/planimetrie', 'anagrafica/unita/modifiche_interne', 'anagrafica/unita/certificazioni', // Manutenzioni 'manutenzioni/ordinarie/ascensori', 'manutenzioni/ordinarie/impianti_elettrici', 'manutenzioni/ordinarie/impianti_idrici', 'manutenzioni/ordinarie/pulizie', 'manutenzioni/straordinarie/progetti', 'manutenzioni/straordinarie/preventivi', 'manutenzioni/straordinarie/collaudi', // Database e backup 'database/backups/daily', 'database/backups/weekly', 'database/backups/monthly', 'database/exports/contabilita', 'database/exports/anagrafica', 'database/scripts', // Report specifici 'reports/situazione_contabile/mensili', 'reports/situazione_contabile/annuali', 'reports/morosi', 'reports/movimenti', 'reports/assemblee', 'reports/manutenzioni', // Corrispondenza 'corrispondenza/inviate', 'corrispondenza/ricevute', 'corrispondenza/enti_pubblici', 'corrispondenza/condomini', // Archivio temporale 'archivio/per_anno', 'archivio/fatture_pagate', 'archivio/pratiche_chiuse', 'archivio/assemblee_passate', // File temporanei 'temp/upload', 'temp/processing', 'temp/import_export', 'temp/generazione_report', // Log specifici stabile 'logs/accessi_condomini', 'logs/operazioni_contabili', 'logs/modifiche_anagrafica', 'logs/backup_restore', ]; foreach ($folders as $folder) { Storage::disk('local')->makeDirectory("{$basePath}/{$folder}"); } // File informativi per cartelle principali $infoFiles = [ 'documenti/README.md' => $this->generateDocumentiReadme($stabile), 'contabilita/README.md' => $this->generateContabilitaReadme($stabile), 'anagrafica/README.md' => $this->generateAnagraficaReadme($stabile), 'manutenzioni/README.md' => $this->generateManutenzioniReadme($stabile), ]; foreach ($infoFiles as $file => $content) { Storage::disk('local')->put("{$basePath}/{$file}", $content); } } private function createStabileConfigurations(Stabile $stabile): void { $adminCode = $stabile->amministratore->codice_univoco; $stabileCode = $stabile->codice_stabile; $basePath = "amministratori/{$adminCode}/stabili/{$stabileCode}"; // 1. Configurazione principale stabile $config = [ 'stabile' => [ 'codice' => $stabile->codice_stabile, 'denominazione' => $stabile->denominazione, 'indirizzo_completo' => $stabile->indirizzo . ', ' . $stabile->cap . ' ' . $stabile->citta . ' (' . $stabile->provincia . ')', 'amministratore' => [ 'codice' => $stabile->amministratore->codice_univoco, 'nome_completo' => $stabile->amministratore->nome_completo, 'studio' => $stabile->amministratore->denominazione_studio, ], 'database_dedicato' => $stabile->database_dedicato, 'created_at' => $stabile->created_at->toISOString(), 'version' => '2.1.0', ], 'database' => [ 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => $stabile->database_dedicato, 'backup_path' => 'database/backups', 'retention_days' => 90, ], 'backup' => [ 'enabled' => true, 'frequency' => 'daily', 'time' => '03:00', 'retention_days' => 90, 'include_files' => true, 'include_database' => true, 'compress' => true, ], 'folders' => [ 'documenti' => 'documenti', 'contabilita' => 'contabilita', 'anagrafica' => 'anagrafica', 'manutenzioni' => 'manutenzioni', 'database' => 'database', 'reports' => 'reports', 'corrispondenza' => 'corrispondenza', 'archivio' => 'archivio', 'temp' => 'temp', 'logs' => 'logs', ], 'contabilita' => [ 'anno_contabile' => date('Y'), 'moneta' => 'EUR', 'arrotondamento' => 2, 'iva_default' => 22, 'millesimi_totali' => 1000, ], 'anagrafica' => [ 'validazione_cf' => true, 'richiedi_documenti' => true, 'privacy_gdpr' => true, ], 'reports' => [ 'automatici' => true, 'frequenza_mensili' => true, 'email_notifiche' => true, 'formato_default' => 'pdf', ] ]; Storage::disk('local')->put( "{$basePath}/stabile_config.json", json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) ); // 2. README principale stabile $readme = $this->generateStabileReadme($stabile); Storage::disk('local')->put("{$basePath}/README.md", $readme); // 3. Script manutenzione stabile $maintenanceScript = $this->generateStabileMaintenanceScript($stabile); Storage::disk('local')->put("{$basePath}/scripts/maintenance.sh", $maintenanceScript); // 4. Log iniziale $logEntry = date('Y-m-d H:i:s') . " - Struttura stabile {$stabile->codice_stabile} creata\n"; Storage::disk('local')->put("{$basePath}/logs/creation.log", $logEntry); } private function populateStabileDatabase(Stabile $stabile): void { try { $connection = $this->dbManager->getStabileConnection($stabile); // Inserisci record stabile di riferimento nella tabella interna $connection->table('stabili_ref')->updateOrInsert( ['codice_stabile' => $stabile->codice_stabile], [ 'denominazione' => $stabile->denominazione, 'indirizzo' => $stabile->indirizzo, 'cap' => $stabile->cap, 'citta' => $stabile->citta, 'provincia' => $stabile->provincia, 'amministratore_codice' => $stabile->amministratore->codice_univoco, 'updated_at' => now(), 'created_at' => now(), ] ); $this->info("โœ… Database stabile popolato con dati iniziali"); } catch (\Exception $e) { $this->error("โš ๏ธ Errore popolamento database: " . $e->getMessage()); } } private function generateStabileReadme(Stabile $stabile): string { return "# ๐Ÿข Stabile: {$stabile->denominazione} ## ๐Ÿ“‹ Informazioni Generali - **Codice Stabile**: `{$stabile->codice_stabile}` - **Denominazione**: {$stabile->denominazione} - **Indirizzo**: {$stabile->indirizzo}, {$stabile->cap} {$stabile->citta} ({$stabile->provincia}) - **Amministratore**: {$stabile->amministratore->nome_completo} - **Studio**: {$stabile->amministratore->denominazione_studio} - **Database Dedicato**: `{$stabile->database_dedicato}` - **Creato**: {$stabile->created_at->format('d/m/Y H:i')} ## ๐Ÿ“ Struttura Archivio Stabile ### ๐Ÿ“„ Documenti Amministrativi - `documenti/amministrazione/` - Delibere, comunicazioni, relazioni - `documenti/assemblee/` - Convocazioni, verbali, allegati - `documenti/contratti/` - Contratti di servizio e manutenzione ### ๐Ÿ’ฐ Contabilitร  - `contabilita/fatture/entrate/` - Quote condominiali e altre entrate - `contabilita/fatture/uscite/` - Spese ordinarie, straordinarie, utenze - `contabilita/bilanci/` - Preventivi e consuntivi - `contabilita/ripartizioni/` - Ripartizioni spese per condomino ### ๐Ÿ‘ฅ Anagrafica - `anagrafica/proprietari/` - Documenti proprietari - `anagrafica/unita/` - Planimetrie e certificazioni unitร  ### ๐Ÿ”ง Manutenzioni - `manutenzioni/ordinarie/` - Manutenzioni periodiche - `manutenzioni/straordinarie/` - Progetti e interventi straordinari ### ๐Ÿ’พ Database e Backup - `database/backups/daily/` - Backup giornalieri - `database/backups/weekly/` - Backup settimanali - `database/backups/monthly/` - Backup mensili - `database/exports/` - Esportazioni dati ### ๐Ÿ“Š Reports - `reports/situazione_contabile/` - Report contabili - `reports/morosi/` - Elenchi morosi - `reports/movimenti/` - Report movimenti - `reports/assemblee/` - Report assemblee ### ๐Ÿ“ฌ Corrispondenza - `corrispondenza/inviate/` - Comunicazioni inviate - `corrispondenza/ricevute/` - Comunicazioni ricevute - `corrispondenza/enti_pubblici/` - Corrispondenza istituzionale ### ๐Ÿ“š Archivio - `archivio/per_anno/` - Archivio temporale - `archivio/fatture_pagate/` - Fatture saldate - `archivio/pratiche_chiuse/` - Pratiche concluse ## ๐Ÿ”ง Funzionalitร  Specifiche ### ๐Ÿ’พ Database Dedicato - **Nome**: `{$stabile->database_dedicato}` - **Backup**: Automatici giornalieri - **Isolamento**: Completo da altri stabili - **Migrazione**: Supportata via package ### ๐Ÿ“Š Contabilitร  Integrata - Gestione completa entrate/uscite - Ripartizioni automatiche per millesimi - Bilanci preventivi e consuntivi - Report morosi automatici ### ๐Ÿ‘ฅ Gestione Condomini - Anagrafica completa proprietari - Storico variazioni proprietร  - Gestione deleghe e rappresentanze - Privacy GDPR compliant ### ๐Ÿ—๏ธ Manutenzioni - Programmazione interventi - Gestione preventivi e collaudi - Storico manutenzioni - Scadenzari automatici ## โš™๏ธ Configurazioni ### ๐Ÿ”„ Backup Automatici - **Frequenza**: Giornaliera alle 03:00 - **Retention**: 90 giorni - **Includes**: Database + Files - **Compressione**: Abilitata ### ๐Ÿ’ฐ Impostazioni Contabili - **Anno Contabile**: " . date('Y') . " - **Moneta**: EUR - **Arrotondamento**: 2 decimali - **IVA Default**: 22% - **Millesimi Totali**: 1000 ## ๐Ÿš€ Comandi Utili ### Backup Stabile ```bash php artisan netgescon:backup-stabile {$stabile->amministratore->codice_univoco} {$stabile->codice_stabile} ``` ### Migrazione Stabile ```bash php artisan netgescon:migrate-stabile {$stabile->codice_stabile} ``` ### Report Contabile ```bash php artisan netgescon:report-stabile {$stabile->codice_stabile} --type=contabile ``` ### Manutenzione ```bash bash scripts/maintenance.sh ``` --- *Struttura generata automaticamente da NetGescon v2.1.0* *Stabile: {$stabile->denominazione}* *Amministratore: {$stabile->amministratore->nome_completo}* "; } private function generateDocumentiReadme(Stabile $stabile): string { return "# ๐Ÿ“„ Documenti Stabile: {$stabile->denominazione} ## ๐Ÿ“‹ Organizzazione Documenti ### ๐Ÿ›๏ธ Amministrazione - **delibere/** - Delibere assembleari - **comunicazioni/** - Comunicazioni ufficiali - **relazioni_annuali/** - Relazioni amministratore - **regolamenti/** - Regolamenti condominiali ### ๐Ÿ—ณ๏ธ Assemblee - **convocazioni/** - Convocazioni assemblee - **verbali/** - Verbali assemblee - **allegati/** - Allegati alle assemblee - **presenze/** - Fogli presenze ### ๐Ÿ“ Contratti - **manutenzione/** - Contratti manutenzione - **pulizie/** - Contratti pulizie - **utenze/** - Contratti utenze - **assicurazioni/** - Polizze assicurative - **altri_servizi/** - Altri contratti ## ๐Ÿ“ Naming Convention ### Delibere `YYYY-MM-DD_delibera_numero_oggetto.pdf` ### Verbali `YYYY-MM-DD_verbale_assemblea_[ordinaria|straordinaria].pdf` ### Contratti `YYYY-MM-DD_contratto_[fornitore]_[servizio].pdf` ## ๐Ÿ” Note Sicurezza - File sensibili: protezione password - Backup automatici - Versionamento documenti - Log accessi "; } private function generateContabilitaReadme(Stabile $stabile): string { return "# ๐Ÿ’ฐ Contabilitร  Stabile: {$stabile->denominazione} ## ๐Ÿ“Š Struttura Contabile ### ๐Ÿ’ต Entrate - **quote_condominiali/** - Bollettini quote - **altre_entrate/** - Entrate varie ### ๐Ÿ’ธ Uscite - **ordinarie/** - Spese ordinarie - **straordinarie/** - Spese straordinarie - **utenze/** - Bollette utenze ### ๐Ÿงพ Ricevute - **pagamenti/** - Ricevute pagamenti - **incassi/** - Ricevute incassi ### ๐Ÿ“ˆ Bilanci - **preventivi/** - Bilanci preventivi - **consuntivi/** - Bilanci consuntivi ### โš–๏ธ Ripartizioni - **spese_ordinarie/** - Ripartizioni ordinarie - **spese_straordinarie/** - Ripartizioni straordinarie ## ๐Ÿ“ Naming Convention ### Fatture `YYYY-MM-DD_fattura_[numero]_[fornitore].pdf` ### Bollettini `YYYY-MM_bollettino_quote_[tipologia].pdf` ### Bilanci `YYYY_bilancio_[preventivo|consuntivo].pdf` ## ๐Ÿ“Š Report Automatici - Situazione contabile mensile - Elenco morosi - Movimenti per periodo - Ripartizioni spese "; } private function generateAnagraficaReadme(Stabile $stabile): string { return "# ๐Ÿ‘ฅ Anagrafica Stabile: {$stabile->denominazione} ## ๐Ÿ“‹ Gestione Proprietari ### ๐Ÿ†” Documenti Identitร  - **documenti_identita/** - Copie documenti - **contratti_compravendita/** - Atti compravendita - **deleghe/** - Deleghe e procure ### ๐Ÿ  Unitร  Immobiliari - **planimetrie/** - Planimetrie catastali - **modifiche_interne/** - Modifiche interne - **certificazioni/** - Certificazioni energetiche ## ๐Ÿ“ Naming Convention ### Proprietari `[cognome]_[nome]_[tipo_documento]_YYYY-MM-DD.pdf` ### Unitร  `unita_[numero]_[tipo_documento]_YYYY-MM-DD.pdf` ## ๐Ÿ” Privacy GDPR - Consenso trattamento dati - Protezione dati sensibili - Diritto cancellazione - Log accessi dati "; } private function generateManutenzioniReadme(Stabile $stabile): string { return "# ๐Ÿ”ง Manutenzioni Stabile: {$stabile->denominazione} ## ๐Ÿ› ๏ธ Tipologie Manutenzione ### ๐Ÿ”„ Ordinarie - **ascensori/** - Manutenzioni ascensori - **impianti_elettrici/** - Impianti elettrici - **impianti_idrici/** - Impianti idrici - **pulizie/** - Servizi pulizie ### โšก Straordinarie - **progetti/** - Progetti interventi - **preventivi/** - Preventivi lavori - **collaudi/** - Collaudi finali ## ๐Ÿ“ Naming Convention ### Manutenzioni Ordinarie `YYYY-MM-DD_manutenzione_[impianto]_[ditta].pdf` ### Progetti `YYYY_progetto_[descrizione]_[tecnico].pdf` ### Collaudi `YYYY-MM-DD_collaudo_[intervento]_[ente].pdf` ## ๐Ÿ“… Scadenzari - Manutenzioni periodiche - Certificazioni obbligatorie - Controlli di legge - Revisioni contrattuali "; } private function generateStabileMaintenanceScript(Stabile $stabile): string { $adminCode = $stabile->amministratore->codice_univoco; $stabileCode = $stabile->codice_stabile; return "#!/bin/bash # Script manutenzione stabile {$stabileCode} # Amministratore: {$adminCode} ADMIN_CODE=\"{$adminCode}\" STABILE_CODE=\"{$stabileCode}\" BASE_PATH=\"/var/www/netgescon/storage/app/amministratori/\$ADMIN_CODE/stabili/\$STABILE_CODE\" LOG_FILE=\"\$BASE_PATH/logs/maintenance.log\" echo \"๐Ÿข Avvio manutenzione stabile \$STABILE_CODE\" | tee -a \$LOG_FILE # Pulizia file temporanei vecchi (> 3 giorni) echo \"๐Ÿ—‘๏ธ Pulizia file temporanei...\" | tee -a \$LOG_FILE find \"\$BASE_PATH/temp\" -type f -mtime +3 -delete 2>/dev/null find \"\$BASE_PATH/temp\" -type d -empty -delete 2>/dev/null # Pulizia log vecchi (> 180 giorni) echo \"๐Ÿ“ Pulizia log vecchi...\" | tee -a \$LOG_FILE find \"\$BASE_PATH/logs\" -name \"*.log\" -mtime +180 -delete 2>/dev/null # Pulizia backup vecchi (> 90 giorni) echo \"๐Ÿ’พ Pulizia backup vecchi...\" | tee -a \$LOG_FILE find \"\$BASE_PATH/database/backups\" -name \"*.sql\" -mtime +90 -delete 2>/dev/null # Backup database stabile echo \"๐Ÿ’พ Backup database stabile...\" | tee -a \$LOG_FILE BACKUP_DIR=\"\$BASE_PATH/database/backups/daily\" BACKUP_FILE=\"backup_stabile_\${STABILE_CODE}_\$(date +%Y-%m-%d_%H-%M-%S).sql\" mkdir -p \"\$BACKUP_DIR\" mysqldump -h127.0.0.1 -uroot -p\${MYSQL_ROOT_PASSWORD} netgescon_stabile_\${STABILE_CODE} > \"\$BACKUP_DIR/\$BACKUP_FILE\" 2>/dev/null if [ \$? -eq 0 ]; then echo \"โœ… Backup database creato: \$BACKUP_FILE\" | tee -a \$LOG_FILE gzip \"\$BACKUP_DIR/\$BACKUP_FILE\" else echo \"โŒ Errore backup database\" | tee -a \$LOG_FILE fi # Verifica integritร  database echo \"๐Ÿ” Verifica integritร  database...\" | tee -a \$LOG_FILE TABLES_COUNT=\$(mysql -h127.0.0.1 -uroot -p\${MYSQL_ROOT_PASSWORD} -e \"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='netgescon_stabile_\${STABILE_CODE}'\" | tail -1) echo \"๐Ÿ“Š Tabelle database: \$TABLES_COUNT\" | tee -a \$LOG_FILE # Calcola statistiche TOTAL_SIZE=\$(du -sh \"\$BASE_PATH\" | cut -f1) FILE_COUNT=\$(find \"\$BASE_PATH\" -type f | wc -l) DOC_COUNT=\$(find \"\$BASE_PATH/documenti\" -name \"*.pdf\" | wc -l 2>/dev/null || echo 0) echo \"๐Ÿ“Š Statistiche stabile:\" | tee -a \$LOG_FILE echo \" ๐Ÿ“ File totali: \$FILE_COUNT\" | tee -a \$LOG_FILE echo \" ๐Ÿ“„ Documenti PDF: \$DOC_COUNT\" | tee -a \$LOG_FILE echo \" ๐Ÿ’ฝ Spazio totale: \$TOTAL_SIZE\" | tee -a \$LOG_FILE echo \"โœ… Manutenzione stabile completata: \$(date)\" | tee -a \$LOG_FILE echo \"\" >> \$LOG_FILE "; } }