netgescon-day0/app/Services/GesconImport/Steps/HandlesDirittiStep.php

190 lines
7.1 KiB
PHP

<?php
namespace App\Services\GesconImport\Steps;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
trait HandlesDirittiStep
{
private function stepDiritti(?int $limit): int
{
if (!Schema::connection('gescon_import')->hasTable('condomin')) {
return 0;
}
if (!Schema::hasTable('proprieta') || !Schema::hasTable('unita_immobiliari') || !Schema::hasTable('soggetti')) {
return 0;
}
$created = 0;
$updated = 0;
$skipped = 0;
$processed = 0;
$batch = $limit ? min(max(1, $limit), 1000) : 1000;
$offset = 0;
while (true) {
$q = DB::connection('gescon_import')->table('condomin');
if ($this->option('stabile')) {
$q->where('cod_stabile', $this->option('stabile'));
}
if ($this->option('scala')) {
$q->where('scala', $this->option('scala'));
}
$q->limit($batch)->offset($offset);
$rows = $q->get();
if ($rows->isEmpty()) {
break;
}
foreach ($rows as $r) {
// Resolve unità
$unita = $this->findUnitaByStagingRow($r);
if (!$unita) {
$skipped++;
continue;
}
// Resolve soggetto (già creato in stepSoggetti)
$nome = isset($r->nome) ? trim((string)$r->nome) : null;
$cognome = isset($r->cognome) ? trim((string)$r->cognome) : null;
if ($nome === '') {
$nome = null;
}
if ($cognome === '') {
$cognome = null;
}
$sog = $this->findExistingSoggetto(
trim($r->codice_fiscale ?? '') ?: null,
trim($r->email ?? '') ?: null,
$nome,
$cognome
);
if (!$sog) {
$sog = $this->createSoggettoFromDirittiRow($r);
if (!$sog) {
$skipped++;
continue;
}
}
$this->ensurePersonaForSoggetto($sog);
$tipo = ($r->proprietario ?? 0) ? 'proprieta' : (($r->inquilino ?? 0) ? 'locazione' : 'proprieta');
$exists = DB::table('proprieta')
->where('unita_immobiliare_id', $unita->id)
->where('soggetto_id', $sog->id)
->first();
if ($exists) {
if (($exists->tipo_diritto ?? '') !== $tipo) {
DB::table('proprieta')->where('id', $exists->id)->update([
'tipo_diritto' => $tipo,
'updated_at' => now(),
]);
$updated++;
} else {
$skipped++;
}
} else {
DB::table('proprieta')->insert([
'unita_immobiliare_id' => $unita->id,
'soggetto_id' => $sog->id,
'tipo_diritto' => $tipo,
'percentuale_possesso' => null,
'data_inizio' => null,
'data_fine' => null,
'created_at' => now(),
'updated_at' => now()
]);
$created++;
}
$processed++;
if ($limit && $processed >= $limit) {
break 2;
}
}
$offset += $batch;
}
$this->line(" → diritti: creati {$created}, aggiornati {$updated}, skip {$skipped}");
$this->dedupProprietaPairs();
return $created + $updated;
}
private function createSoggettoFromDirittiRow(object $row): ?object
{
if (!Schema::hasTable('soggetti')) {
return null;
}
$cf = trim((string)($row->codice_fiscale ?? '')) ?: null;
if ($cf) {
$cf = strtoupper($cf);
}
$email = trim((string)($row->email ?? '')) ?: null;
$nome = isset($row->nome) ? trim((string)$row->nome) : null;
$cognome = isset($row->cognome) ? trim((string)$row->cognome) : null;
if ($nome === '') {
$nome = null;
}
if ($cognome === '') {
$cognome = null;
}
if (!$nome && !$cognome) {
return null;
}
$tipo = ($row->inquilino ?? 0) ? 'inquilino' : 'proprietario';
$data = [
'old_id' => $this->safeOldId($row->cod_cond ?? null),
'nome' => $nome,
'cognome' => $cognome,
'ragione_sociale' => null,
'codice_fiscale' => $cf,
'partita_iva' => null,
'email' => $email,
'telefono' => $row->telefono ?? null,
'indirizzo' => $row->indirizzo_corrispondenza ?? null,
'cap' => null,
'citta' => null,
'provincia' => null,
'tipo' => $tipo,
'attivo' => Schema::hasColumn('soggetti', 'attivo') ? true : null,
'created_at' => now(),
'updated_at' => now(),
];
if (Schema::hasColumn('soggetti', 'codice_univoco')) {
$baseKey = $this->normalizeNameKey($nome, $cognome) ?: ($email ?: 'ND');
$code = $this->generateStableCondKey('S', $row->cod_stabile ?? 'S0', $baseKey);
$tries = 0;
while (DB::table('soggetti')->where('codice_univoco', $code)->exists() && $tries < 5) {
$salt = ($row->cod_cond ?? '') . '-' . ($tries + 1);
$code = $this->generateStableCondKey('S', $row->cod_stabile ?? 'S0', $baseKey . '|' . $salt);
$tries++;
}
$data['codice_univoco'] = $code;
$existingByCode = DB::table('soggetti')->where('codice_univoco', $code)->first();
if ($existingByCode) {
$patch = [];
foreach (
[
'nome' => $nome,
'cognome' => $cognome,
'codice_fiscale' => $cf,
'email' => $email,
'telefono' => $row->telefono ?? null,
'indirizzo' => $row->indirizzo_corrispondenza ?? null,
] as $field => $value
) {
if ($value && (empty($existingByCode->$field) || $existingByCode->$field === 'ND')) {
$patch[$field] = $value;
}
}
if (!empty($patch)) {
$patch['updated_at'] = now();
DB::table('soggetti')->where('id', $existingByCode->id)->update($patch);
}
return DB::table('soggetti')->where('id', $existingByCode->id)->first();
}
}
$this->dynamicInsert('soggetti', $data);
return $this->findExistingSoggetto($cf, $email, $nome, $cognome);
}
}