diff --git a/app/Console/Commands/CreateAmministratore.php b/app/Console/Commands/CreateAmministratore.php new file mode 100644 index 00000000..3495496d --- /dev/null +++ b/app/Console/Commands/CreateAmministratore.php @@ -0,0 +1,206 @@ +info('๐Ÿ—๏ธ Creazione nuovo amministratore...'); + + // Raccolta dati + $nome = $this->argument('nome'); + $cognome = $this->argument('cognome'); + $email = $this->argument('email'); + $password = $this->option('password') ?: $this->generatePassword(); + + // Verifica email univoca + if (User::where('email', $email)->exists()) { + $this->error("โŒ Email {$email} giร  esistente!"); + return 1; + } + + try { + // 1. Crea utente + $this->info("๐Ÿ‘ค Creazione utente {$nome} {$cognome}..."); + $user = User::create([ + 'name' => "{$nome} {$cognome}", + 'email' => $email, + 'password' => Hash::make($password), + 'email_verified_at' => now(), + ]); + + // 2. Assegna ruolo amministratore + $user->assignRole('amministratore'); + $this->info("โœ… Ruolo 'amministratore' assegnato"); + + // 3. Crea record amministratore + $this->info("๐Ÿข Creazione record amministratore..."); + $amministratore = Amministratore::create([ + 'user_id' => $user->id, + 'nome' => $nome, + 'cognome' => $cognome, + 'denominazione_studio' => $this->option('studio') ?: "Studio {$cognome}", + 'partita_iva' => $this->option('piva') ?: null, + 'codice_fiscale_studio' => $this->option('cf') ?: null, + 'telefono_studio' => $this->option('telefono') ?: null, + 'indirizzo_studio' => $this->option('indirizzo') ?: null, + 'cap_studio' => $this->option('cap') ?: null, + 'citta_studio' => $this->option('citta') ?: null, + 'provincia_studio' => $this->option('provincia') ?: null, + 'email_studio' => $email, + 'pec_studio' => $this->option('pec') ?: null, + ]); + + // 4. Crea struttura cartelle + $this->info("๐Ÿ“ Creazione cartelle dati..."); + $this->createAdminFolders($amministratore); + + // 5. Crea stabile di esempio (opzionale) + if ($this->confirm('Vuoi creare uno stabile di esempio?', true)) { + $this->createExampleStabile($amministratore); + } + + // 6. Sistema multi-database (se richiesto) + if ($this->option('multi-db')) { + $this->info("๐Ÿ—„๏ธ Configurazione database dedicato..."); + $this->setupDedicatedDatabase($amministratore); + } + + // Output finale + $this->info(''); + $this->info('๐ŸŽ‰ Amministratore creato con successo!'); + $this->table(['Campo', 'Valore'], [ + ['Nome Completo', $amministratore->nome_completo], + ['Email', $user->email], + ['Password', $password], + ['Codice Univoco', $amministratore->codice_univoco], + ['Studio', $amministratore->denominazione_studio], + ['Cartelle', "storage/app/amministratori/{$amministratore->codice_univoco}/"], + ['Multi-DB', $this->option('multi-db') ? 'Abilitato' : 'Condiviso'], + ]); + + $this->warn('โš ๏ธ IMPORTANTE: Salva la password generata!'); + + return 0; + + } catch (\Exception $e) { + $this->error("โŒ Errore durante la creazione: " . $e->getMessage()); + return 1; + } + } + + /** + * Genera password sicura + */ + private function generatePassword(): string + { + return 'Admin' . rand(1000, 9999) . '!'; + } + + /** + * Crea struttura cartelle per amministratore + */ + private function createAdminFolders(Amministratore $amministratore): void + { + $basePath = "amministratori/{$amministratore->codice_univoco}"; + + $folders = [ + 'documenti/allegati', + 'documenti/contratti', + 'documenti/assemblee', + 'documenti/preventivi', + 'backup/database', + 'backup/files', + 'temp/upload', + 'temp/processing', + 'logs', + 'exports', + ]; + + foreach ($folders as $folder) { + Storage::disk('local')->makeDirectory("{$basePath}/{$folder}"); + $this->line(" ๐Ÿ“‚ {$folder}"); + } + + // Crea file README + $readme = "# Cartella Amministratore: {$amministratore->nome_completo}\n\n"; + $readme .= "**Codice**: {$amministratore->codice_univoco}\n"; + $readme .= "**Creato**: " . now()->format('d/m/Y H:i') . "\n\n"; + $readme .= "## Struttura Cartelle\n\n"; + $readme .= "- `documenti/` - Documenti dell'amministratore\n"; + $readme .= "- `backup/` - Backup automatici\n"; + $readme .= "- `temp/` - File temporanei\n"; + $readme .= "- `logs/` - Log specifici\n"; + $readme .= "- `exports/` - Esportazioni dati\n"; + + Storage::disk('local')->put("{$basePath}/README.md", $readme); + } + + /** + * Crea stabile di esempio + */ + private function createExampleStabile(Amministratore $amministratore): void + { + $denominazione = $this->ask('Nome del condominio', "Condominio {$amministratore->cognome}"); + + $stabile = Stabile::create([ + 'amministratore_id' => $amministratore->id, + 'denominazione' => $denominazione, + 'indirizzo' => $this->ask('Indirizzo', 'Via Roma 1'), + 'cap' => $this->ask('CAP', '00100'), + 'citta' => $this->ask('Cittร ', 'Roma'), + 'provincia' => $this->ask('Provincia', 'RM'), + 'codice_fiscale' => strtoupper(substr($denominazione, 0, 3)) . rand(100000, 999999), + 'stato' => 'attivo', + ]); + + $this->info("๐Ÿข Stabile creato: {$stabile->denominazione}"); + } + + /** + * Configura database dedicato (placeholder) + */ + private function setupDedicatedDatabase(Amministratore $amministratore): void + { + // TODO: Implementare logica multi-database + $dbName = "netgescon_" . strtolower($amministratore->codice_univoco); + $this->line(" ๐Ÿ—„๏ธ Database: {$dbName}"); + $this->warn(" โš ๏ธ Implementazione multi-DB in development"); + } +} diff --git a/app/Models/Amministratore.php b/app/Models/Amministratore.php index 3e8f71dc..7388efbc 100644 --- a/app/Models/Amministratore.php +++ b/app/Models/Amministratore.php @@ -66,8 +66,10 @@ class Amministratore extends Model return $this->hasMany(Fornitore::class, 'amministratore_id', 'id_amministratore'); } - protected static function booted() + protected static function boot() { + parent::boot(); + static::creating(function ($amministratore) { if (empty($amministratore->codice_univoco)) { do { @@ -76,5 +78,68 @@ class Amministratore extends Model $amministratore->codice_univoco = $code; } }); + + // Auto-crea cartelle dopo la creazione + static::created(function ($amministratore) { + $amministratore->createFolderStructure(); + }); + } + + /** + * Crea la struttura di cartelle per l'amministratore + */ + public function createFolderStructure(): void + { + $basePath = "amministratori/{$this->codice_univoco}"; + + $folders = [ + 'documenti/allegati', + 'documenti/contratti', + 'documenti/assemblee', + 'documenti/preventivi', + 'backup/database', + 'backup/files', + 'temp/upload', + 'temp/processing', + 'logs', + 'exports', + ]; + + foreach ($folders as $folder) { + \Storage::disk('local')->makeDirectory("{$basePath}/{$folder}"); + } + + // Crea file README informativo + $readme = "# Cartella Amministratore: {$this->nome_completo}\n\n"; + $readme .= "**Codice**: {$this->codice_univoco}\n"; + $readme .= "**Creato**: " . $this->created_at->format('d/m/Y H:i') . "\n\n"; + $readme .= "## Struttura Cartelle\n\n"; + $readme .= "- `documenti/` - Documenti dell'amministratore\n"; + $readme .= "- `backup/` - Backup automatici\n"; + $readme .= "- `temp/` - File temporanei\n"; + $readme .= "- `logs/` - Log specifici\n"; + $readme .= "- `exports/` - Esportazioni dati\n"; + + \Storage::disk('local')->put("{$basePath}/README.md", $readme); + } + + /** + * Ottieni il path della cartella dell'amministratore + */ + public function getFolderPath(): string + { + return "amministratori/{$this->codice_univoco}"; + } + + /** + * Genera codice univoco alfanumerico 8 caratteri + */ + public function generateCodiceUnivoco(): string + { + do { + $codice = 'ADM' . strtoupper(substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 5)); + } while (self::where('codice_univoco', $codice)->exists()); + + return $codice; } } \ No newline at end of file