netgescon-day0/app/Console/Commands/GesconImportAmministratoriLegacyCommand.php

160 lines
6.6 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Amministratore;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class GesconImportAmministratoriLegacyCommand extends Command
{
protected $signature = 'gescon:import-amministratori-legacy {--mdb= : Percorso opzionale Stabili.mdb}';
protected $description = 'Importa gli amministratori dagli archivi legacy Stabili.mdb e crea i relativi utenti di sistema';
public function handle(): int
{
$this->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'] ?? ''));
$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;
}
}