@include('filament.components.page-breadcrumbs', [ 'breadcrumbs' => [ ['label' => 'Condomini', 'url' => route('admin.dashboards.condomini')], ['label' => 'Unità immobiliari', 'url' => \App\Filament\Pages\Condomini\UnitaImmobiliariArchivio::getUrl(panel: 'admin-filament')], ['label' => 'Scheda unità'], ], 'backUrl' => $this->getBackUrl(), 'backLabel' => 'Torna indietro', ]) @php $unitaOptions = $this->getUnitaOptions(); $prevUrl = $this->getPrevUnitaUrl(); $nextUrl = $this->getNextUnitaUrl(); $visibilityOptions = [ 'attive' => 'Attive', 'tutte' => 'Tutte', 'archiviate' => 'Archiviate', ]; @endphp
Prec. @if($prevUrl) @else @endif
Unità
{{ $this->getSchema('unitaPicker') }}
Succ. @if($nextUrl) @else @endif
Visibilità: @foreach($visibilityOptions as $key => $label) @endforeach
@if(!$unita)
Nessuna unità immobiliare trovata.
@else {{-- Header compatto --}} @php $isArchivedUnita = method_exists($unita, 'trashed') && $unita->trashed(); @endphp
Unità immobiliare @if($isArchivedUnita) Archiviata @endif
@php $labelUnita = (string) ($unita->denominazione ?? ''); if ($labelUnita !== '' && preg_match('/^\s*area\s+condominiale\s*$/i', $labelUnita)) { $labelUnita = ''; } $condominoDaCondomin = trim((string) ($this->getLegacyCondominoRiferimentoNome() ?? '')); $proprietariAttivi = collect($relazioniPerTipo['proprietari'] ?? []); $condominoRiferimento = $proprietariAttivi ->first(fn (array $relazione): bool => strtolower(trim((string) ($relazione['tipo_raw'] ?? ''))) !== 'comproprietario') ?? ($relazioniPerTipo['proprietari'][0] ?? null); $condominoNome = $condominoDaCondomin !== '' ? $condominoDaCondomin : (string) ($condominoRiferimento['nome'] ?? ''); $condominoCf = trim((string) ($this->getLegacyCondominoRiferimentoCodiceFiscale() ?? '')); if ($condominoCf === '') { $condominoCf = (string) ($condominoRiferimento['codice_fiscale'] ?? ''); } $inquilinoNome = (string) ($relazioniPerTipo['inquilini'][0]['nome'] ?? ''); $comproprietariCount = $proprietariAttivi ->filter(fn (array $relazione): bool => strtolower(trim((string) ($relazione['tipo_raw'] ?? ''))) === 'comproprietario') ->count(); $labelStoricoScaduto = $labelUnita !== '' && collect($nominativiStorici ?? [])->contains(function (array $nominativo) use ($labelUnita, $condominoNome, $inquilinoNome): bool { $nome = trim((string) ($nominativo['nominativo'] ?? '')); return $nome !== '' && trim($labelUnita) === $nome && trim($labelUnita) !== trim($condominoNome) && trim($labelUnita) !== trim($inquilinoNome); }); if ($labelUnita === '' || $labelStoricoScaduto) { $labelUnita = (string) ($unita->codice_unita ?? $unita->codice_completo ?? 'Unità'); } @endphp @if($labelUnita !== '' && $condominoNome !== '' && trim($labelUnita) !== trim($condominoNome))
{{ $labelUnita }}
@endif
Condomino di riferimento: {{ $condominoNome !== '' ? $condominoNome : '—' }}
@if($comproprietariCount > 0)
Comproprietari collegati: {{ $comproprietariCount }}
@endif
Inquilino: {{ $inquilinoNome !== '' ? $inquilinoNome : '—' }}
{{ trim(($unita->indirizzo ?? '').' '.($unita->civico ?? '').' '.($unita->comune ?? '')) }}
@php $rateCondominiHeader = $rateEmessePerCategoria['condomini'] ?? []; $rateInquiliniHeader = $rateEmessePerCategoria['inquilini'] ?? []; $sumHeader = function (array $items, string $field): float { $s = 0.0; foreach ($items as $it) { $s += (float) ($it[$field] ?? 0); } return $s; }; $totCAddebH = $sumHeader($rateCondominiHeader, 'totale_addebitato'); $totCPagH = $sumHeader($rateCondominiHeader, 'totale_pagato'); $totCResH = $sumHeader($rateCondominiHeader, 'residuo'); $totIAddebH = $sumHeader($rateInquiliniHeader, 'totale_addebitato'); $totIPagH = $sumHeader($rateInquiliniHeader, 'totale_pagato'); $totIResH = $sumHeader($rateInquiliniHeader, 'residuo'); $hasInquilino = !empty($relazioniPerTipo['inquilini'][0]['nome'] ?? null); if (empty($rateCondominiHeader) && empty($rateInquiliniHeader) && !$hasInquilino) { $totCAddebH = (float) collect($estrattoCompattoRateRows ?? [])->sum(fn (array $row): float => (float) ($row['dovuto'] ?? 0)); $totCPagH = (float) collect($estrattoCompattoIncassi ?? [])->sum(fn (array $row): float => (float) ($row['importo'] ?? 0)); $totCResH = round($totCAddebH - $totCPagH, 2); } @endphp
Condomino di riferimento
{{ $condominoNome !== '' ? $condominoNome : '—' }}
CF: {{ $condominoCf !== '' ? $condominoCf : '—' }}
Inquilino
{{ $inquilinoNome !== '' ? $inquilinoNome : '—' }}
CF: {{ $relazioniPerTipo['inquilini'][0]['codice_fiscale'] ?? '—' }}
Estratto rapido
{{-- Tabs + contenuto --}}
@php $tabs = [ 'riepilogo' => ['icon' => 'heroicon-o-rectangle-group', 'label' => 'Riepilogo'], 'millesimi' => ['icon' => 'heroicon-o-chart-pie', 'label' => 'Tabelle millesimali'], 'persone' => ['icon' => 'heroicon-o-user-group', 'label' => 'Persone collegate'], 'acqua' => ['icon' => 'heroicon-o-beaker', 'label' => 'Acqua'], 'estratto' => ['icon' => 'heroicon-o-document-text', 'label' => 'Estratto conto'], 'economico' => ['icon' => 'heroicon-o-banknotes', 'label' => 'Economico'], ]; @endphp @foreach($tabs as $key => $cfg) @endforeach
@if($tab === 'riepilogo')
Indicatori principali Superficie, millesimi, percentuale, valore
@foreach([ ['Superficie', ($unita->superficie_commerciale ?? 0) . ' m²'], ['Millesimi', $unita->millesimi_proprieta ?? $unita->millesimi_generali ?? 0], ['Percentuale', ($unita->millesimi_proprieta ?? $unita->millesimi_generali) ? number_format((($unita->millesimi_proprieta ?? $unita->millesimi_generali)/1000)*100,2) . '%' : '0%'], ['Valore stimato', ($unita->valore_commerciale_stimato ?? 0) . ' €'], ] as [$label, $value])
{{ $label }}
{{ $value }}
@endforeach
Identificazione Tipologia e stato
@foreach([ ['Tipologia', $unita->tipo_unita ?? 'ND'], ['Stato occupazione', $unita->stato_occupazione ?? 'ND'], ['Utilizzo', $unita->utilizzo_attuale ?? 'ND'], ['Codice stabile', $unita->stabile?->codice_operatore ?? $unita->stabile?->codice_stabile ?? 'ND'], ] as [$label, $value])
{{ $label }}
{{ $value }}
@endforeach
Dati catastali Identificativi e classamento
@foreach([ ['Sezione urbana', $unita->sezione_urbana ?? 'ND'], ['Foglio', $unita->foglio ?? 'ND'], ['Particella', $unita->particella ?? 'ND'], ['Subalterno', $unita->subalterno ?? 'ND'], ['Categoria', $unita->categoria_catastale ?? 'ND'], ['Classe', $unita->classe ?? 'ND'], ['Consistenza', $unita->consistenza ?? 'ND'], ['Rendita', $unita->rendita_catastale ?? 'ND'], ] as [$label, $value])
{{ $label }}
{{ $value }}
@endforeach
Persone collegate Proprietari, inquilini, altri
@foreach([ 'proprietari' => ['label' => 'Proprietari', 'color' => 'text-primary-700'], 'inquilini' => ['label' => 'Inquilini', 'color' => 'text-emerald-700'], 'altri' => ['label' => 'Altri soggetti', 'color' => 'text-gray-700'], ] as $key => $cfg) @php $relazioni = $relazioniPerTipo[$key] ?? []; @endphp
{{ $cfg['label'] }} ({{ count($relazioni) }})
@if(empty($relazioni))
Nessun soggetto.
@else
@foreach($relazioni as $relazione) @php $tipoRawRelazione = strtolower(trim((string) ($relazione['tipo_raw'] ?? ''))); $roleBadge = null; if ($key === 'proprietari') { $roleBadge = $tipoRawRelazione === 'comproprietario' ? 'Comproprietario' : 'Condomino di riferimento'; } @endphp
{{ $relazione['nome'] }}
@if($roleBadge) {{ $roleBadge }} @endif
CF: {{ $relazione['codice_fiscale'] ?? '—' }}
Quota: {{ $relazione['quota_label'] ?? '—' }}%
@php $dal = $relazione['data_inizio'] ?? null; $al = $relazione['data_fine'] ?? null; @endphp
Periodo: @if($dal || $al) @if($dal) Da {{ $dal }} @endif @if($al) · fino a {{ $al }} @endif @else Da sempre @endif
@if(!empty($relazione['ruolo_rate']))
Ruolo rate: ({{ $relazione['ruolo_rate'] }})
@endif
@endforeach
@endif
@endforeach
Recapiti email per servizio
@if(empty($recapitiServizio))
Nessun recapito email disponibile.
@else
@foreach($recapitiServizio as $service)
{{ $service['label'] ?? 'Servizio' }}
@if(empty($service['rows']))
Nessun recapito risolto.
@else
@foreach($service['rows'] as $recipient)
{{ $recipient['email'] ?? '—' }}
{{ $recipient['persona'] ?: 'Recapito unità' }} · {{ $recipient['sourceLabel'] ?? 'Anagrafica persona' }}
@endforeach
@endif
@endforeach
@endif
Nominativi storici (legacy)
@if(empty($nominativiStorici))
Nessun nominativo storico disponibile.
@else
@foreach($nominativiStorici as $nominativo) @endforeach
Ruolo Nominativo Periodo Quota
{{ $nominativo['ruolo'] ?? '—' }}
{{ $nominativo['nominativo'] ?? '—' }}
@if(!empty($nominativo['fonte']))
Fonte: {{ $nominativo['fonte'] }}
@endif @if(!empty($nominativo['detail']))
{{ $nominativo['detail'] }}
@endif
{{ $nominativo['periodo'] ?? '—' }} {{ $nominativo['percentuale'] ?? '—' }}
@endif
@endif @if($tab === 'millesimi')
Tabelle millesimali assegnate
@php $gruppi = [ 'ordinarie' => 'ORDINARIE', 'riscaldamento' => 'RISCALDAMENTO', 'straordinarie' => 'STRAORDINARIE', ]; @endphp @foreach($gruppi as $key => $label) @endforeach
@if(empty($millesimiPerTabella))
Nessuna tabella millesimale associata.
@else @php $selectedGruppo = $millesimiGruppo ?? 'ordinarie'; $filteredMillesimi = array_values(array_filter($millesimiPerTabella, fn ($r) => ($r['gruppo'] ?? 'ordinarie') === $selectedGruppo)); @endphp
@forelse($filteredMillesimi as $r) @php $tipo = $r['tipo'] ?? 'altro'; $tipoLabel = $tipo; $tipoLabel = str_replace('_', ' ', (string) $tipoLabel); $tipoLabel = ucwords($tipoLabel); $prevTipo = $loop->first ? null : ($filteredMillesimi[$loop->index - 1]['tipo'] ?? 'altro'); @endphp @if($loop->first || $tipo !== $prevTipo) @endif @empty @endforelse
Tabella Denominazione Millesimi
{{ $tipoLabel }}
{{ $r['codice'] }} {{ $r['nome'] }} {{ number_format($r['millesimi'], 4, ',', '.') }}
Nessun millesimo presente
@endif
@endif @if($tab === 'persone')
Persone collegate
@php $blocchiRelazioni = [ 'proprietari' => ['label' => 'Proprietari / comproprietari', 'class' => 'text-primary-700'], 'inquilini' => ['label' => 'Inquilini / conduttori', 'class' => 'text-emerald-700'], 'altri' => ['label' => 'Altri soggetti collegati', 'class' => 'text-gray-700'], ]; @endphp
@foreach($blocchiRelazioni as $key => $cfg) @php $relazioni = $relazioniPerTipo[$key] ?? []; @endphp
{{ $cfg['label'] }} ({{ count($relazioni) }})
@if(empty($relazioni))
Nessun soggetto collegato.
@else
@foreach($relazioni as $relazione)
{{ $relazione['tipo'] ?? 'Relazione' }}
{{ $relazione['nome'] }}
CF: {{ $relazione['codice_fiscale'] ?? '—' }}
Quota: {{ $relazione['quota_label'] ?? '—' }}%
@if(!empty($relazione['telefono']))
Telefono: {{ $relazione['telefono'] }}
@endif @if(!empty($relazione['email']))
Email: {{ $relazione['email'] }}
@endif @if(!empty($relazione['data_inizio']) || !empty($relazione['data_fine']))
Periodo: @if(!empty($relazione['data_inizio'])) Da {{ $relazione['data_inizio'] }} @endif @if(!empty($relazione['data_fine'])) · fino a {{ $relazione['data_fine'] }} @endif
@endif @if(!empty($relazione['rubrica_url'])) @endif
@endforeach
@endif
@endforeach
Recapiti email per servizio
@if(empty($recapitiServizio))
Nessun recapito email disponibile.
@else
@foreach($recapitiServizio as $service)
{{ $service['label'] ?? 'Servizio' }}
@if(empty($service['rows']))
Nessun recapito risolto.
@else
@foreach($service['rows'] as $recipient)
{{ $recipient['email'] ?? '—' }}
{{ $recipient['persona'] ?: 'Recapito unità' }}
Origine: {{ $recipient['sourceLabel'] ?? 'Anagrafica persona' }}
@endforeach
@endif
@endforeach
@endif
@endif @if($tab === 'acqua')
Storico letture acqua unità Andamento letture, consumi e richieste legate a questa utenza immobiliare.
Letture registrate
{{ number_format((int) ($acquaStats['totale_letture'] ?? 0), 0, ',', '.') }}
Consumi storici
{{ number_format((float) ($acquaStats['totale_consumi_mc'] ?? 0), 3, ',', '.') }} mc
Ultima lettura
{{ isset($acquaStats['ultima_lettura']) && $acquaStats['ultima_lettura'] !== null ? number_format((float) $acquaStats['ultima_lettura'], 3, ',', '.') : '—' }}
{{ $acquaStats['ultima_data'] ?? 'nessuna data' }}
Richieste aperte
{{ number_format((int) ($acquaStats['richieste_aperte'] ?? 0), 0, ',', '.') }}
Utenza acqua collegata
Servizio: {{ $acquaStats['servizio_label'] ?? 'non configurato' }}
Matricola: {{ $acquaStats['matricola'] ?? '—' }}
Seriale unità: {{ $unita->acqua_contatore_seriale ?? '—' }}
Gateway ID: {{ $unita->acqua_gateway_device_id ?? '—' }}
Codice utenza: {{ $acquaStats['utenza'] ?? '—' }}
Contratto: {{ $acquaStats['contratto'] ?? '—' }}
Azioni rapide
@if(!empty($acquaQuickLinks['ticket_light'])) Nuova lettura unità @endif @if(!empty($acquaQuickLinks['archivio'])) Archivio letture @endif @if(!empty($acquaQuickLinks['hub_stabile'])) Campagna stabile @endif
Dettaglio letture e consumi nel tempo Storico operativo della singola unità con canale di arrivo, riferimento e protocollo.
@forelse($acquaLettureStorico as $row) @empty @endforelse
Data Periodo Lett. iniziale Lett. finale Consumo Canale / stato Riferimento
{{ $row['data'] ?: '—' }} {{ $row['periodo'] ?: '—' }} {{ isset($row['lettura_inizio']) && $row['lettura_inizio'] !== null ? number_format((float) $row['lettura_inizio'], 3, ',', '.') : '—' }} {{ isset($row['lettura_fine']) && $row['lettura_fine'] !== null ? number_format((float) $row['lettura_fine'], 3, ',', '.') : '—' }} {{ isset($row['consumo_valore']) && $row['consumo_valore'] !== null ? number_format((float) $row['consumo_valore'], 3, ',', '.') . ' ' . ($row['consumo_unita'] ?? 'mc') : '—' }}
{{ $row['canale'] ?: '—' }}
{{ $row['workflow'] ?: '—' }} @if(!empty($row['protocollo'])) · {{ $row['protocollo'] }} @endif
{{ $row['riferimento'] ?: '—' }}
@if(!empty($row['fattura_label']))
{{ $row['fattura_label'] }}
@endif
Nessuna lettura acqua registrata per questa unità.
@endif @if($tab === 'economico')
{{-- Contenuti economici: preventivi/riparti (rate emesse spostate nel tab Estratto conto) --}} @if(!empty($preventiviPerTabella))
Preventivo per tabella
Quote unità e riparto proprietario/inquilino (dett_tab cond_inquil).
@if(!empty($totaliPerGestione))
O: {{ number_format($totaliPerGestione['O'] ?? 0, 2, ',', '.') }} € R: {{ number_format($totaliPerGestione['R'] ?? 0, 2, ',', '.') }} € S: {{ number_format($totaliPerGestione['S'] ?? 0, 2, ',', '.') }} €
@endif
@foreach($preventiviPerTabella as $tabella)
{{ $tabella['tabella_codice'] }} · tipo {{ $tabella['tipo'] }}
{{ $tabella['tabella_nome'] }}
Totale tabella
{{ number_format($tabella['total_preventivo'], 2, ',', '.') }} €
@foreach($tabella['voci'] as $voce) @endforeach
Voce Preventivo Quota unità Prop. Inquilino % Inq.
{{ $voce['codice'] }} · {{ $voce['descrizione'] }} {{ number_format($voce['importo_preventivato'] ?? 0, 2, ',', '.') }} € {{ number_format($voce['quota_unita'] ?? 0, 2, ',', '.') }} € {{ number_format($voce['importo_proprietario'] ?? 0, 2, ',', '.') }} € {{ number_format($voce['importo_inquilino'] ?? 0, 2, ',', '.') }} € {{ number_format($voce['percentuale_inquilino'] ?? 0, 2, ',', '.') }} %
Millesimi unità / tabella
{{ number_format($tabella['unit_millesimi'], 3, ',', '.') }} / {{ number_format($tabella['tabella_millesimi'], 3, ',', '.') }}
Quota unità
{{ number_format($tabella['quota_unit'], 2, ',', '.') }} €
Riparto proprietario / inquilino
{{ number_format($tabella['importo_proprietario'], 2, ',', '.') }} € / {{ number_format($tabella['importo_inquilino'], 2, ',', '.') }} €
% inquilino: {{ number_format($tabella['percentuale_inquilino'] ?? 0, 2, ',', '.') }}
@endforeach
@endif
Voci di spesa per tabella (prop. / inq.)
@if(empty($ripartizioniPerTabella))
Nessuna ripartizione registrata per questa unità.
@else
@foreach($ripartizioniPerTabella as $tabella)
{{ $tabella['tabella_codice'] }} {{ $tabella['tabella_nome'] }}
@foreach($tabella['righe'] as $r) @endforeach
Voce Gestione Calcolo % applicata Quota finale % inquilino Prop. Inq.
{{ $r['voce_codice'] ?? '—' }} {{ $r['voce_descrizione'] ?? '' }} {{ $r['tipo_gestione'] ?? '—' }} {{ $r['calcolo'] ?? '—' }} {{ number_format($r['percentuale_applicata'] ?? 0, 2, ',', '.') }}% {{ number_format($r['quota_finale'] ?? 0, 4, ',', '.') }} {{ number_format($r['percentuale_inquilino'] ?? 0, 2, ',', '.') }}% {{ number_format($r['importo_proprietario'] ?? 0, 4, ',', '.') }} {{ number_format($r['importo_inquilino'] ?? 0, 4, ',', '.') }}
@endforeach
@endif
@endif @if($tab === 'estratto') @php $rateCondomini = $rateEmessePerCategoria['condomini'] ?? []; $rateInquilini = $rateEmessePerCategoria['inquilini'] ?? []; $hasRate = (! empty($rateCondomini)) || (! empty($rateInquilini)); $compactRateRows = $estrattoCompattoRateRows ?? []; $compactIncassi = $estrattoCompattoIncassi ?? []; $sumBlk = function (array $items, string $field): float { $s = 0.0; foreach ($items as $it) { $s += (float) ($it[$field] ?? 0); } return $s; }; $totCAddeb = $sumBlk($rateCondomini, 'totale_addebitato'); $totCPag = $sumBlk($rateCondomini, 'totale_pagato'); $totCRes = $sumBlk($rateCondomini, 'residuo'); $totIAddeb = $sumBlk($rateInquilini, 'totale_addebitato'); $totIPag = $sumBlk($rateInquilini, 'totale_pagato'); $totIRes = $sumBlk($rateInquilini, 'residuo'); $tipoSel = $estrattoTipo ?? 'condomini'; $itemsSel = $tipoSel === 'inquilini' ? $rateInquilini : $rateCondomini; $selectedRole = $tipoSel === 'inquilini' ? 'I' : 'C'; $compactRateRows = array_values(array_filter($compactRateRows, function (array $row) use ($selectedRole, $tipoSel): bool { $tipo = strtoupper(trim((string) ($row['tipo'] ?? ''))); if ($tipo === '') { return $tipoSel === 'condomini'; } return $tipo === $selectedRole; })); $compactIncassi = array_values(array_filter($compactIncassi, function (array $row) use ($selectedRole, $tipoSel): bool { $tipo = strtoupper(trim((string) ($row['tipo'] ?? ''))); if ($tipo === '') { return $tipoSel === 'condomini'; } return $tipo === $selectedRole; })); if (! $hasRate) { $totCAddeb = (float) collect($estrattoCompattoRateRows ?? [])->filter(fn (array $row): bool => strtoupper((string) ($row['tipo'] ?? 'C')) !== 'I')->sum('dovuto'); $totCPag = (float) collect($estrattoCompattoIncassi ?? [])->filter(fn (array $row): bool => strtoupper((string) ($row['tipo'] ?? 'C')) !== 'I')->sum('importo'); $totCRes = $totCAddeb - $totCPag; $totIAddeb = (float) collect($estrattoCompattoRateRows ?? [])->filter(fn (array $row): bool => strtoupper((string) ($row['tipo'] ?? '')) === 'I')->sum('dovuto'); $totIPag = (float) collect($estrattoCompattoIncassi ?? [])->filter(fn (array $row): bool => strtoupper((string) ($row['tipo'] ?? '')) === 'I')->sum('importo'); $totIRes = $totIAddeb - $totIPag; } @endphp
Estratto conto unità
Situazione rate & incassi
@php $movimenti = []; $seenRateKeys = []; foreach ($compactRateRows as $r) { $rateKey = implode('|', [ (string) ($r['gestione'] ?? ''), (string) ($r['tipo'] ?? ''), (string) ($r['data_emissione'] ?? ''), (string) ($r['descrizione'] ?? ''), (string) ($r['avviso'] ?? ''), number_format((float) ($r['dovuto'] ?? 0), 2, '.', ''), number_format((float) ($r['pagato'] ?? 0), 2, '.', ''), ]); if (isset($seenRateKeys[$rateKey])) { continue; } $seenRateKeys[$rateKey] = true; $dovuto = (float) ($r['dovuto'] ?? 0); $pagato = (float) ($r['pagato'] ?? 0); $residuo = (float) ($r['residuo'] ?? ($dovuto - $pagato)); if (abs($dovuto) < 0.00001 && abs($pagato) < 0.00001 && abs($residuo) < 0.00001) { continue; } $movimenti[] = [ 'tipo' => 'rata', 'soggetto_tipo' => $r['tipo'] ?? null, 'gestione' => $r['gestione'] ?? null, 'data' => $r['data_emissione'] ?? null, 'data_pagamento' => $r['data_pagamento'] ?? null, 'descrizione' => $r['descrizione'] ?? null, 'ref' => !empty($r['numero_ricevuta']) ? ('Ric. ' . $r['numero_ricevuta']) : (!empty($r['avviso']) ? ('Avv. ' . $r['avviso']) : null), 'dovuto' => $dovuto, 'residuo' => $residuo, 'incasso' => $pagato, ]; } if (empty($movimenti)) { $seenIncassoKeys = []; foreach ($compactIncassi as $i) { $incasso = (float) ($i['importo'] ?? 0); if (abs($incasso) < 0.00001) { continue; } $incassoKey = implode('|', [ (string) ($i['tipo'] ?? ''), (string) ($i['data'] ?? ''), (string) ($i['descrizione'] ?? ''), (string) ($i['n_ricevuta'] ?? ''), number_format($incasso, 2, '.', ''), ]); if (isset($seenIncassoKeys[$incassoKey])) { continue; } $seenIncassoKeys[$incassoKey] = true; $movimenti[] = [ 'tipo' => 'incasso', 'soggetto_tipo' => $i['tipo'] ?? null, 'gestione' => $i['gestione'] ?? null, 'data' => $i['data'] ?? null, 'data_pagamento' => $i['data'] ?? null, 'descrizione' => $i['descrizione'] ?? null, 'ref' => !empty($i['n_ricevuta']) ? ('Ric. ' . $i['n_ricevuta']) : null, 'dovuto' => null, 'residuo' => null, 'incasso' => $incasso, ]; } } foreach ($estrattoConguagliIniziali ?? [] as $c) { $importoConguaglio = (float) ($c['importo'] ?? 0); if (abs($importoConguaglio) < 0.00001) { continue; } $movimenti[] = [ 'tipo' => 'conguaglio', 'soggetto_tipo' => $selectedRole, 'gestione' => $c['gestione_label'] ?? null, 'data' => $c['data'] ?? null, 'data_pagamento' => null, 'descrizione' => $c['descrizione'] ?? null, 'ref' => trim((string) (($c['gestione_label'] ?? '') . ' ' . ($c['tipo'] ?? ''))), 'dovuto' => $importoConguaglio, 'residuo' => $importoConguaglio, 'incasso' => null, ]; } usort($movimenti, function ($a, $b) { $da = $a['data'] ? \Carbon\Carbon::createFromFormat('d/m/Y', $a['data'])->timestamp : 0; $db = $b['data'] ? \Carbon\Carbon::createFromFormat('d/m/Y', $b['data'])->timestamp : 0; return $da <=> $db; }); $movimentiByGestione = []; foreach ($movimenti as $m) { $gestioneLabel = trim((string) ($m['gestione'] ?? '')); $anno = null; if ($gestioneLabel === '' && ! empty($m['data'])) { try { $anno = \Carbon\Carbon::createFromFormat('d/m/Y', $m['data'])->format('Y'); } catch (\Throwable $e) { $anno = null; } } $key = $gestioneLabel !== '' ? $gestioneLabel : ($anno ?: 'Senza data'); $movimentiByGestione[$key][] = $m; } @endphp @if(empty($movimenti))
Nessuna rata o incasso disponibile.
@else
@php $totDovutoAll = 0.0; $totIncassoAll = 0.0; @endphp @foreach($movimentiByGestione as $gestione => $rows) @php $totDovuto = 0.0; $totIncasso = 0.0; @endphp @foreach($rows as $m) @php $totDovuto += (float) ($m['dovuto'] ?? 0); $totIncasso += (float) ($m['incasso'] ?? 0); @endphp @endforeach @php $totDovutoAll += $totDovuto; $totIncassoAll += $totIncasso; $saldo = $totDovuto - $totIncasso; @endphp @endforeach @php $saldoAll = $totDovutoAll - $totIncassoAll; @endphp
Data Tipo Descrizione Rif. Dovuto Pagato Residuo
Gestione {{ $gestione }}
{{ $m['data'] ?? '—' }} {{ $m['tipo'] === 'rata' ? 'Rata' : ($m['tipo'] === 'conguaglio' ? 'Conguaglio' : 'Incasso') }}
{{ $m['descrizione'] ?? '—' }}
@if(!empty($m['data_pagamento']) && $m['tipo'] !== 'incasso')
Pagato il {{ $m['data_pagamento'] }}
@endif
{{ $m['ref'] !== '' ? $m['ref'] : '—' }} {{ $m['dovuto'] !== null ? number_format($m['dovuto'], 2, ',', '.') . ' €' : '—' }} {{ $m['incasso'] !== null ? number_format($m['incasso'], 2, ',', '.') . ' €' : '—' }} {{ $m['residuo'] !== null ? number_format($m['residuo'], 2, ',', '.') . ' €' : '—' }}
Subtotale gestione {{ number_format($totDovuto, 2, ',', '.') }} € {{ number_format($totIncasso, 2, ',', '.') }} € Saldo {{ number_format($saldo, 2, ',', '.') }} €
Totale generale {{ number_format($totDovutoAll, 2, ',', '.') }} € {{ number_format($totIncassoAll, 2, ',', '.') }} € Saldo {{ number_format($saldoAll, 2, ',', '.') }} €
@endif
@if(! $hasRate)
Nessuna rata emessa trovata per questa unità.
@else
{{ $tipoSel === 'inquilini' ? 'Inquilino / altro' : 'Condomino (proprietari)' }} ({{ count($itemsSel) }})
@if(empty($itemsSel))
Nessuna rata per questa categoria.
@else
@foreach($itemsSel as $r) @php $sid = (int) ($r['soggetto_id'] ?? 0); $schedaUrl = null; if ($sid > 0) { $base = \App\Filament\Pages\Contabilita\EstrattoContoSoggetto::getUrl(panel: 'admin-filament', parameters: ['record' => $sid]); $schedaUrl = $base . '?' . http_build_query([ 'vista' => 'unita', 'unita_id' => (int) ($this->unita?->id ?? 0), ]); } @endphp @endforeach
Soggetto N. Addebito Pagato Residuo Scadute Scheda
{{ $r['nome'] ?? '—' }}
CF: {{ $r['codice_fiscale'] ?? '—' }}
{{ $r['numero_rate'] ?? 0 }} {{ number_format((float) ($r['totale_addebitato'] ?? 0), 2, ',', '.') }} € {{ number_format((float) ($r['totale_pagato'] ?? 0), 2, ',', '.') }} € {{ number_format((float) ($r['residuo'] ?? 0), 2, ',', '.') }} € {{ $r['scadute'] ?? 0 }} @if($schedaUrl) Apri @else @endif
@endif
@endif
@endif
@endif