160 lines
6.6 KiB
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;
|
|
}
|
|
}
|