info('Avvio importazione amministratori da legacy Stabili.mdb...'); $candidateMdbs = [ $this->option('mdb'), '/mnt/gescon-archives/gescon/dbc/Stabili.mdb', '/mnt/gescon-archives/gescon/DBC/Stabili.mdb', '/mnt/gescon-archives/gescon_vuoto/DBC/Stabili.mdb', '/mnt/gescon-archives/id/copie/Stabili.mdb', ]; $mdbPath = null; foreach ($candidateMdbs as $p) { if ($p && file_exists($p) && is_readable($p)) { $mdbPath = $p; break; } } if (! $mdbPath) { $this->error('Nessun file Stabili.mdb valido trovato nei percorsi di archivio.'); return self::FAILURE; } $this->line("Utilizzo file MDB: {$mdbPath}"); $proc = new \Symfony\Component\Process\Process(['mdb-export', $mdbPath, 'Stabili']); $proc->run(); if (! $proc->isSuccessful()) { $this->error('Impossibile eseguire mdb-export sul file Stabili.mdb.'); return self::FAILURE; } $csvContent = $proc->getOutput(); $stream = fopen('php://memory', 'r+'); fwrite($stream, $csvContent); rewind($stream); $header = fgetcsv($stream); if (! $header) { fclose($stream); $this->error('Header CSV non valido in Stabili.mdb.'); return self::FAILURE; } $adminsFound = []; while (($data = fgetcsv($stream)) !== false) { if (count($data) === count($header)) { $row = array_combine($header, $data); $cf = strtoupper(trim((string) ($row['cf_amministratore'] ?? ''))); $cognome = trim((string) ($row['Amm_770_Cognome'] ?? '')); $nome = trim((string) ($row['Amm_770_Nome'] ?? '')); $email = trim((string) ($row['E_mail_amm_x_770'] ?? '')); $tel = trim((string) ($row['Amm_770_Tel_cell'] ?? '')); $indir = trim((string) ($row['Amm_770_indir_resid'] ?? '')); $citta = trim((string) ($row['Amm_770_comune_resid'] ?? '')); $cap = trim((string) ($row['Amm_770_CAP_resid'] ?? '')); $prov = trim((string) ($row['Amm_770_pr_resid'] ?? '')); if ($cf === 'TRDCCL74T52H501R') { $cognome = 'Tordini'; $nome = 'Cecilia'; $email = 'cecilia.tordini@gmail.com'; } $key = $cf ?: strtoupper(trim($cognome . ' ' . $nome)); if ($key !== '' && ! isset($adminsFound[$key])) { $adminsFound[$key] = [ 'cf' => $cf, 'cognome' => $cognome ?: ($cf ? 'Amministratore' : 'Studio'), 'nome' => $nome ?: ($cf ?: 'Legacy'), 'email' => $email ?: (strtolower($cf ?: 'admin') . '@netgescon.it'), 'telefono' => $tel, 'indirizzo' => $indir, 'citta' => $citta, 'cap' => $cap, 'provincia' => $prov, ]; } } } fclose($stream); $imported = 0; foreach ($adminsFound as $data) { // 1. Crea o trova utente di sistema $user = User::query()->where('email', $data['email'])->first(); if (! $user) { $user = User::query()->create([ 'name' => trim($data['nome'] . ' ' . $data['cognome']), 'email' => $data['email'], 'password' => Hash::make('password'), ]); if (method_exists($user, 'assignRole')) { $user->assignRole('admin'); } } // 2. Crea o aggiorna record Amministratore $amm = Amministratore::query()->where('user_id', $user->id)->first(); if (! $amm && $data['cf']) { $amm = Amministratore::query()->where('codice_fiscale_studio', $data['cf'])->first(); } if (! $amm) { $amm = Amministratore::query()->create([ 'user_id' => $user->id, 'nome' => $data['nome'], 'cognome' => $data['cognome'], 'denominazione_studio' => 'Studio ' . trim($data['cognome'] . ' ' . $data['nome']), 'codice_fiscale_studio' => $data['cf'], 'indirizzo_studio' => $data['indirizzo'], 'cap_studio' => $data['cap'], 'citta_studio' => $data['citta'], 'provincia_studio' => $data['provincia'], 'telefono_studio' => $data['telefono'], 'email_studio' => $data['email'], 'attivo' => true, 'abilita_import_stabili'=> true, ]); } else { $amm->update([ 'user_id' => $user->id, 'nome' => $data['nome'], 'cognome' => $data['cognome'], 'codice_fiscale_studio' => $data['cf'] ?: $amm->codice_fiscale_studio, 'indirizzo_studio' => $data['indirizzo'] ?: $amm->indirizzo_studio, 'citta_studio' => $data['citta'] ?: $amm->citta_studio, 'telefono_studio' => $data['telefono'] ?: $amm->telefono_studio, 'email_studio' => $data['email'] ?: $amm->email_studio, ]); } try { $amm->provisionArchiveIfMissing(); } catch (\Throwable $e) { // Ignore provisioning warnings } $imported++; $this->line(" ✓ Amministratore #{$amm->id} [{$amm->codice_univoco}]: {$amm->cognome} {$amm->nome} ({$user->email})"); } $this->info("Importazione completata con successo! Processati {$imported} amministratori."); return self::SUCCESS; } }