netgescon-master/app/Console/Commands/CreateAmministratore.php
Pikappa2 3005bf46b0 Feature: Sistema completo Amministratori con cartelle dedicate
 Aggiunto:
- Comando 'netgescon:create-amministratore' completo
- Auto-creazione cartelle per ogni amministratore
- Struttura dati organizzata (documenti, backup, temp, logs, exports)
- Codici univoci 8 caratteri (ADM + 5 random)
- Integrazione con ruoli e permessi

🏢 Amministratore creato:
- Marco Bianchi (marco.bianchi@esempio.it)
- Password: Admin4853!
- Codice: KPL9F3XP
- Stabile: Condominio Porta Nuova Milano

🎯 Prossimo: Test interfaccia grafica per amministratori
2025-07-07 18:30:03 +02:00

207 lines
7.6 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\User;
use App\Models\Amministratore;
use App\Models\Stabile;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Spatie\Permission\Models\Role;
class CreateAmministratore extends Command
{
/**
* The name and signature of the console command.
*/
protected $signature = 'netgescon:create-amministratore
{nome : Nome dell\'amministratore}
{cognome : Cognome dell\'amministratore}
{email : Email dell\'amministratore}
{--password= : Password (se non specificata, viene generata)}
{--studio= : Nome dello studio}
{--piva= : Partita IVA}
{--cf= : Codice fiscale}
{--telefono= : Telefono}
{--indirizzo= : Indirizzo}
{--cap= : CAP}
{--citta= : Città}
{--provincia= : Provincia}
{--pec= : Email PEC}
{--multi-db : Abilita database dedicato}';
/**
* The console command description.
*/
protected $description = 'Crea un nuovo amministratore con cartelle e permessi';
/**
* Execute the console command.
*/
public function handle()
{
$this->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");
}
}