From dadee62d209053f12a12b1a3ffe38b10827985fe Mon Sep 17 00:00:00 2001 From: michele Date: Wed, 26 Aug 2026 18:59:53 +0200 Subject: [PATCH] fix(unita): add fallback timeline population and normalize inquilini quota split and start dates for active gestion (task-d095b0e23b) --- app/Filament/Pages/UnitaImmobiliarePage.php | 122 +++++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/app/Filament/Pages/UnitaImmobiliarePage.php b/app/Filament/Pages/UnitaImmobiliarePage.php index ec5153e..c325dab 100755 --- a/app/Filament/Pages/UnitaImmobiliarePage.php +++ b/app/Filament/Pages/UnitaImmobiliarePage.php @@ -1256,6 +1256,7 @@ public function hydrateNominativiStorici(): void ->get(); if ($rows->isEmpty()) { + $this->populateNominativiStoriciFallback(); return; } @@ -1344,6 +1345,107 @@ public function hydrateNominativiStorici(): void 'detail' => $details === [] ? null : implode(' · ', $details), ]; })->all(); + + if (empty($this->nominativiStorici)) { + $this->populateNominativiStoriciFallback(); + } + } + + private function populateNominativiStoriciFallback(): void + { + $fallbackList = []; + + if (! $this->unita) { + return; + } + + if (DbSchema::hasTable('persone_unita_relazioni') && DbSchema::hasTable('persone')) { + $purRows = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'pur.persona_id', '=', 'p.id') + ->where('pur.unita_id', $this->unita->id) + ->orderBy('pur.data_inizio') + ->orderByDesc('pur.id') + ->select('pur.*', 'p.cognome', 'p.nome', 'p.ragione_sociale', 'p.codice_fiscale') + ->get(); + + foreach ($purRows as $r) { + $nome = trim((string) ($r->ragione_sociale ?? '')); + if ($nome === '') { + $nome = trim(($r->cognome ?? '') . ' ' . ($r->nome ?? '')); + } + if ($nome === '') { + continue; + } + + $inizio = $r->data_inizio ? Carbon::parse($r->data_inizio)->format('d/m/Y') : null; + $fine = $r->data_fine ? Carbon::parse($r->data_fine)->format('d/m/Y') : null; + $periodo = ($inizio && $fine) ? ('Da ' . $inizio . ' · fino a ' . $fine) : ($inizio ? ('Da ' . $inizio) : ($fine ? ('Fino al ' . $fine) : 'Da sempre')); + + $quota = is_numeric($r->quota_relazione) ? (number_format((float) $r->quota_relazione, 2, ',', '.') . '%') : null; + $ruolo = ucfirst(strtolower((string) ($r->tipo_relazione ?? 'Condomino'))); + + $fallbackList[] = [ + 'ruolo' => $ruolo, + 'nominativo' => $nome, + 'periodo' => $periodo, + 'percentuale' => $quota, + 'fonte' => 'Anagrafica consolidata', + 'detail' => $r->codice_fiscale ? ('CF: ' . $r->codice_fiscale) : null, + ]; + } + } + + if (empty($fallbackList) && DbSchema::hasTable('rubrica_ruoli') && DbSchema::hasTable('rubrica_universale')) { + $rrRows = DB::table('rubrica_ruoli as rr') + ->join('rubrica_universale as ru', 'rr.rubrica_id', '=', 'ru.id') + ->where('rr.unita_immobiliare_id', $this->unita->id) + ->orderBy('rr.data_inizio') + ->orderByDesc('rr.id') + ->select('rr.*', 'ru.cognome', 'ru.nome', 'ru.ragione_sociale', 'ru.codice_fiscale') + ->get(); + + foreach ($rrRows as $r) { + $nome = trim((string) ($r->ragione_sociale ?? '')); + if ($nome === '') { + $nome = trim(($r->cognome ?? '') . ' ' . ($r->nome ?? '')); + } + if ($nome === '') { + continue; + } + + $inizio = $r->data_inizio ? Carbon::parse($r->data_inizio)->format('d/m/Y') : null; + $fine = $r->data_fine ? Carbon::parse($r->data_fine)->format('d/m/Y') : null; + $periodo = ($inizio && $fine) ? ('Da ' . $inizio . ' · fino a ' . $fine) : ($inizio ? ('Da ' . $inizio) : ($fine ? ('Fino al ' . $fine) : 'Da sempre')); + + $ruolo = ucfirst(strtolower((string) ($r->ruolo_standard ?? 'Condomino'))); + + $fallbackList[] = [ + 'ruolo' => $ruolo, + 'nominativo' => $nome, + 'periodo' => $periodo, + 'percentuale' => null, + 'fonte' => 'Rubrica universale', + 'detail' => $r->codice_fiscale ? ('CF: ' . $r->codice_fiscale) : null, + ]; + } + } + + if (empty($fallbackList)) { + foreach (['proprietari', 'inquilini'] as $relType) { + foreach ($this->relazioniPerTipo[$relType] ?? [] as $rel) { + $fallbackList[] = [ + 'ruolo' => $relType === 'inquilini' ? 'Inquilino' : 'Proprietario', + 'nominativo' => $rel['nome'] ?? '—', + 'periodo' => $rel['data_inizio'] ? ('Da ' . $rel['data_inizio']) : 'Da sempre', + 'percentuale' => isset($rel['quota']) && is_numeric($rel['quota']) ? (number_format((float) $rel['quota'], 2, ',', '.') . '%') : null, + 'fonte' => 'Relazione attiva', + 'detail' => ! empty($rel['codice_fiscale']) ? ('CF: ' . $rel['codice_fiscale']) : null, + ]; + } + } + } + + $this->nominativiStorici = $fallbackList; } public function hydrateRecapitiServizio(): void @@ -3099,9 +3201,27 @@ protected function hydrateRelazioni(): void $inquilini = $inquilini->filter(fn($r) => $isRelazioneCorrenteNelAnno($r, $activeAnno))->values(); } + $inqArr = $inquilini->values()->all(); + $inqCount = count($inqArr); + if ($inqCount > 0) { + $equalQuota = round(100.0 / $inqCount, 2); + $startOfYearDate = '01/01/' . $activeAnno; + + foreach ($inqArr as $idx => $inq) { + if ($inq['quota'] === null || (float)$inq['quota'] <= 0) { + $inqArr[$idx]['quota'] = $equalQuota; + $inqArr[$idx]['quota_label'] = number_format($equalQuota, 2, ',', '.'); + } + $dInizio = trim((string) ($inq['data_inizio'] ?? '')); + if ($dInizio === '' || $dInizio === 'Da 01/01/2000' || $dInizio === '01/01/2000') { + $inqArr[$idx]['data_inizio'] = $startOfYearDate; + } + } + } + $this->relazioniPerTipo = [ 'proprietari' => $proprietari->values()->all(), - 'inquilini' => $inquilini->values()->all(), + 'inquilini' => $inqArr, 'altri' => $altri->values()->all(), 'storico' => $relazioniStoriche, ];