@extends('admin.layouts.netgescon') @section('title', 'Palazzine dello stabile') @section('content')

Palazzine dello stabile {{ $stabile->denominazione ?? $stabile->codice_stabile }}

{{ $stabile->indirizzo ?? 'Indirizzo non disponibile' }}

@php $totalePalazzine = $palazzine->count(); $totaleUnitaStabile = $palazzine->getCollection()->sum(fn ($palazzina) => $palazzina->unitaImmobiliari->count()); $formatPiano = static function ($value): string { if ($value === null || $value === '') { return 'Piano N/D'; } if (is_numeric($value)) { $piano = (int) $value; return match (true) { $piano === 0 => 'Piano terra', $piano < 0 => 'Interrato ' . abs($piano), default => 'Piano ' . $piano, }; } $normalized = strtoupper(trim((string) $value)); return match ($normalized) { 'T', 'PT', 'R', 'PR' => 'Piano terra', 'S', 'PS' => 'Interrato 1', default => 'Piano ' . $normalized, }; }; $sortPiano = static function ($value): int { if ($value === null || $value === '') { return -999; } if (is_numeric($value)) { return (int) $value; } return match (strtoupper(trim((string) $value))) { 'T', 'PT', 'R', 'PR' => 0, 'S', 'PS' => -1, default => is_numeric((string) $value) ? (int) $value : -999, }; }; @endphp
Palazzine
{{ $totalePalazzine }}
Unità visibili
{{ $totaleUnitaStabile }}
Vista operativa
Ogni palazzina mostra le unità per scala e per piano, con adiacenze orizzontali e riferimenti verticali utili per guasti e perdite.
@if($palazzine->isEmpty())

Non ci sono ancora palazzine censite per questo stabile.

Usa il pulsante "Nuova Palazzina" per iniziare oppure importa i dati dallo strumento Gescon.

@else
@foreach($palazzine as $palazzina) @php $totaleUnita = $palazzina->unitaImmobiliari->count(); $unitaOccupate = $palazzina->unitaImmobiliari->whereIn('stato_occupazione', ['occupata_proprietario', 'occupata_inquilino'])->count(); $unitaLibere = $palazzina->unitaImmobiliari->where('stato_occupazione', 'libera')->count(); $scaleGroups = $palazzina->unitaImmobiliari ->groupBy(fn ($unita) => trim((string) ($unita->scala ?? 'A')) ?: 'A') ->sortKeys(); @endphp

Palazzina {{ $palazzina->codice_palazzina ?? '-' }}

{{ $palazzina->denominazione ?? 'Senza denominazione' }}

{{ $totaleUnita }} unità {{ $unitaOccupate }} occupate {{ $unitaLibere }} libere {{ $scaleGroups->count() }} scale
Aggiornata {{ optional($palazzina->updated_at)->diffForHumans() ?? 'N/D' }} Dettagli Modifica
@if($scaleGroups->isEmpty())
Nessuna unità collegata a questa palazzina.
@else
@foreach($scaleGroups as $scala => $scaleUnits) @php $orderedScaleUnits = $scaleUnits->sortBy([ fn ($unit) => -1 * $sortPiano($unit->piano), fn ($unit) => (string) ($unit->interno ?? ''), fn ($unit) => (int) $unit->id, ])->values(); $floorGroups = $scaleUnits ->groupBy(fn ($unit) => (string) ($unit->piano ?? 'nd')) ->sortByDesc(fn ($units, $key) => $sortPiano($key)); @endphp
Scala
{{ $scala }}
{{ $scaleUnits->count() }} unità
@foreach($floorGroups as $pianoKey => $floorUnits) @php $orderedFloorUnits = $floorUnits->sortBy(fn ($unit) => (string) ($unit->interno ?? ''))->values(); @endphp
{{ $formatPiano($pianoKey) }} Adiacenze orizzontali sulla stessa riga
@foreach($orderedFloorUnits as $index => $unita) @php $prev = $orderedFloorUnits->get($index - 1); $next = $orderedFloorUnits->get($index + 1); $stack = $orderedScaleUnits ->filter(fn ($candidate) => trim((string) ($candidate->interno ?? '')) === trim((string) ($unita->interno ?? ''))) ->values(); $stackIndex = $stack->search(fn ($candidate) => (int) $candidate->id === (int) $unita->id); $above = $stackIndex !== false && $stackIndex > 0 ? $stack->get($stackIndex - 1) : null; $below = $stackIndex !== false ? $stack->get($stackIndex + 1) : null; $status = (string) ($unita->stato_occupazione ?? ''); $statusClass = match ($status) { 'occupata_proprietario', 'occupata_inquilino' => 'bg-success-subtle text-success', 'libera' => 'bg-warning-subtle text-warning', default => 'bg-secondary-subtle text-secondary', }; @endphp
Interno {{ $unita->interno ?? 'N/D' }}
{{ $unita->codice_unita ?? ('Unità #' . $unita->id) }}
{{ $status !== '' ? str_replace('_', ' ', $status) : 'stato N/D' }}
{{ $unita->denominazione ?? 'Denominazione non disponibile' }}
Accanto SX: {{ $prev?->interno ? 'Int. ' . $prev->interno : '—' }}
Accanto DX: {{ $next?->interno ? 'Int. ' . $next->interno : '—' }}
Sopra: {{ $above?->piano !== null ? $formatPiano($above->piano) . ' · Int. ' . ($above->interno ?? 'N/D') : '—' }}
Sotto: {{ $below?->piano !== null ? $formatPiano($below->piano) . ' · Int. ' . ($below->interno ?? 'N/D') : '—' }}
@endforeach
@endforeach
@endforeach
@endif
@endforeach
{{ $palazzine->withQueryString()->links() }}
@endif
@endsection