200 lines
16 KiB
PHP
Executable File
200 lines
16 KiB
PHP
Executable File
<x-filament-panels::page>
|
||
@php($stats = $this->stats)
|
||
@php($contratti = $this->contrattiRows)
|
||
@php($scadenze = $this->upcomingScadenze)
|
||
@php($acqua = $this->acquaSnapshot)
|
||
@php($acquaDiagnostics = $this->acquaExtractionDiagnostics)
|
||
|
||
<div class="space-y-6">
|
||
<div class="rounded-2xl border border-slate-200 bg-gradient-to-r from-cyan-50 via-white to-emerald-50 p-5">
|
||
<div class="flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between">
|
||
<div>
|
||
<div class="text-sm font-semibold uppercase tracking-[0.18em] text-slate-500">Stabile</div>
|
||
<h2 class="mt-2 text-2xl font-semibold text-slate-900">HUB Contratti {{ $this->stabileAttivo?->denominazione ? '· ' . $this->stabileAttivo->denominazione : '' }}</h2>
|
||
<p class="mt-2 max-w-3xl text-sm text-slate-600">Qui registriamo il contratto, i riferimenti tecnici e le scadenze operative da inviare anche al calendario. Il collegamento documentale e contabile parte da qui.</p>
|
||
</div>
|
||
<div class="rounded-xl border border-white/70 bg-white/80 px-4 py-3 shadow-sm">
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Collegamenti</div>
|
||
<div class="mt-2 text-sm text-slate-700">Fornitore, manutentore, servizio, utenza, documento e codici tecnici nello stesso record.</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mt-5 grid gap-3 md:grid-cols-2 xl:grid-cols-4">
|
||
<div class="rounded-xl border bg-white p-4">
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Contratti</div>
|
||
<div class="mt-2 text-2xl font-semibold text-slate-900">{{ $stats['totale'] ?? 0 }}</div>
|
||
</div>
|
||
<div class="rounded-xl border bg-white p-4">
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Attivi</div>
|
||
<div class="mt-2 text-2xl font-semibold text-slate-900">{{ $stats['attivi'] ?? 0 }}</div>
|
||
</div>
|
||
<div class="rounded-xl border bg-white p-4">
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Scadenze 45 gg</div>
|
||
<div class="mt-2 text-2xl font-semibold text-slate-900">{{ $stats['scadenze'] ?? 0 }}</div>
|
||
</div>
|
||
<div class="rounded-xl border bg-white p-4">
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Documenti contratto</div>
|
||
<div class="mt-2 text-2xl font-semibold text-slate-900">{{ $stats['documenti'] ?? 0 }}</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid gap-6 xl:grid-cols-[minmax(0,1.4fr)_minmax(320px,0.6fr)]">
|
||
<x-filament::section>
|
||
<x-slot name="heading">Registro contratti</x-slot>
|
||
<x-slot name="description">MVP: contratto, riferimenti essenziali, documento principale e generazione scadenze.</x-slot>
|
||
|
||
<div class="space-y-4">
|
||
@forelse($contratti as $contratto)
|
||
<div class="rounded-xl border border-slate-200 bg-white p-4">
|
||
<div class="flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between">
|
||
<div>
|
||
<div class="flex flex-wrap items-center gap-2">
|
||
<div class="text-lg font-semibold text-slate-900">{{ $contratto->titolo }}</div>
|
||
<span class="inline-flex items-center rounded-full bg-{{ $this->contractBadgeColor($contratto->stato) }}-50 px-2.5 py-1 text-xs font-semibold text-{{ $this->contractBadgeColor($contratto->stato) }}-700">
|
||
{{ strtoupper($contratto->stato) }}
|
||
</span>
|
||
<span class="inline-flex items-center rounded-full bg-slate-100 px-2.5 py-1 text-xs font-medium text-slate-700">
|
||
{{ $this->contractTypeLabel($contratto->tipo_contratto) }}
|
||
</span>
|
||
</div>
|
||
<div class="mt-2 text-sm text-slate-600">
|
||
{{ $contratto->servizio_label ?: 'Servizio non specificato' }}
|
||
@if($contratto->fornitore)
|
||
· {{ $contratto->fornitore->ragione_sociale ?: trim(($contratto->fornitore->nome ?? '') . ' ' . ($contratto->fornitore->cognome ?? '')) }}
|
||
@endif
|
||
</div>
|
||
</div>
|
||
<div class="text-sm text-slate-500 lg:text-right">
|
||
<div>Decorrenza: {{ $contratto->decorrenza_dal?->format('d/m/Y') ?: '—' }}</div>
|
||
<div>Fine: {{ $contratto->decorrenza_al?->format('d/m/Y') ?: ($contratto->rinnovo_automatico ? 'rinnovo automatico' : '—') }}</div>
|
||
<div>Frequenza: {{ $contratto->frequenza_scadenze ? str_replace('_', ' ', $contratto->frequenza_scadenze) : '—' }}</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4 text-sm">
|
||
<div>
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Codice</div>
|
||
<div class="mt-1 font-medium text-slate-900">{{ $contratto->codice_contratto ?: '—' }}</div>
|
||
</div>
|
||
<div>
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Riferimento</div>
|
||
<div class="mt-1 font-medium text-slate-900">{{ $contratto->riferimento_esterno ?: '—' }}</div>
|
||
</div>
|
||
<div>
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Importo</div>
|
||
<div class="mt-1 font-medium text-slate-900">{{ $contratto->importo_periodico !== null ? '€ ' . number_format((float) $contratto->importo_periodico, 2, ',', '.') : '—' }}</div>
|
||
</div>
|
||
<div>
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Documento</div>
|
||
<div class="mt-1 font-medium text-slate-900">{{ $contratto->documentoPrincipale?->numero_protocollo ?: ($contratto->documentoPrincipale?->nome ?: '—') }}</div>
|
||
</div>
|
||
</div>
|
||
|
||
@if(!empty($contratto->codici_collegati))
|
||
<div class="mt-4 flex flex-wrap gap-2">
|
||
@foreach($contratto->codici_collegati as $code)
|
||
<span class="inline-flex items-center rounded-full bg-cyan-50 px-3 py-1 text-xs font-medium text-cyan-800">
|
||
{{ $code['chiave'] ?? 'Dato' }}: {{ $code['valore'] ?? '—' }}
|
||
</span>
|
||
@endforeach
|
||
</div>
|
||
@endif
|
||
|
||
@if($contratto->note)
|
||
<div class="mt-4 rounded-lg bg-slate-50 px-3 py-2 text-sm text-slate-600">{{ $contratto->note }}</div>
|
||
@endif
|
||
</div>
|
||
@empty
|
||
<div class="rounded-xl border border-dashed bg-white px-4 py-10 text-center text-sm text-slate-500">Nessun contratto registrato per lo stabile attivo.</div>
|
||
@endforelse
|
||
</div>
|
||
</x-filament::section>
|
||
|
||
<div class="space-y-6">
|
||
<x-filament::section>
|
||
<x-slot name="heading">Scadenze programmate</x-slot>
|
||
<x-slot name="description">Le nuove scadenze vengono registrate sulla tabella calendario operativa.</x-slot>
|
||
|
||
<div class="space-y-3">
|
||
@forelse($scadenze as $scadenza)
|
||
<div class="rounded-xl border bg-white px-4 py-3">
|
||
<div class="flex items-start justify-between gap-3">
|
||
<div>
|
||
<div class="text-sm font-semibold text-slate-900">{{ $scadenza->stabileContratto?->titolo ?: $scadenza->descrizione_sintetica }}</div>
|
||
<div class="mt-1 text-xs text-slate-500">{{ $scadenza->stabileContratto?->tipo_contratto ? $this->contractTypeLabel($scadenza->stabileContratto->tipo_contratto) : 'Scadenza contratto' }}</div>
|
||
</div>
|
||
<div class="text-sm font-semibold text-slate-900">{{ $scadenza->data_scadenza?->format('d/m/Y') ?: '—' }}</div>
|
||
</div>
|
||
@if(!empty($scadenza->legacy_payload['codice_contratto']))
|
||
<div class="mt-2 text-xs text-slate-500">Codice: {{ $scadenza->legacy_payload['codice_contratto'] }}</div>
|
||
@endif
|
||
</div>
|
||
@empty
|
||
<div class="rounded-xl border border-dashed bg-white px-4 py-6 text-sm text-slate-500">Nessuna scadenza contrattuale registrata.</div>
|
||
@endforelse
|
||
</div>
|
||
</x-filament::section>
|
||
|
||
<x-filament::section>
|
||
<x-slot name="heading">Acqua operativa</x-slot>
|
||
<x-slot name="description">Allineamento tra servizio acqua dello stabile e contratto registrato nell'hub.</x-slot>
|
||
|
||
<div class="space-y-3 text-sm text-slate-600">
|
||
<div class="rounded-xl border bg-white px-4 py-3">
|
||
<div class="text-xs uppercase tracking-wide text-slate-500">Servizio</div>
|
||
<div class="mt-1 font-medium text-slate-900">{{ $acqua['servizio_nome'] ?: 'Servizio acqua non configurato' }}</div>
|
||
</div>
|
||
<div class="rounded-xl border bg-white px-4 py-3">
|
||
<div>Fornitore: <span class="font-medium text-slate-900">{{ $acqua['fornitore'] ?: '—' }}</span></div>
|
||
<div class="mt-1">Utenza: <span class="font-medium text-slate-900">{{ $acqua['utenza'] ?: '—' }}</span></div>
|
||
<div class="mt-1">Cliente: <span class="font-medium text-slate-900">{{ $acqua['cliente'] ?: '—' }}</span></div>
|
||
<div class="mt-1">Contratto: <span class="font-medium text-slate-900">{{ $acqua['contratto'] ?: '—' }}</span></div>
|
||
<div class="mt-1">Matricola: <span class="font-medium text-slate-900">{{ $acqua['matricola'] ?: '—' }}</span></div>
|
||
<div class="mt-2 text-xs text-slate-500">Record HUB acqua: {{ $acqua['contratto_hub_id'] ? ('#' . $acqua['contratto_hub_id']) : 'non ancora registrato' }}</div>
|
||
</div>
|
||
|
||
@if(auth()->user()?->hasAnyRole(['super-admin', 'admin']))
|
||
<div class="rounded-xl border {{ count($acquaDiagnostics['warnings'] ?? []) > 0 ? 'border-amber-200 bg-amber-50' : 'border-emerald-200 bg-emerald-50' }} px-4 py-3">
|
||
<div class="text-xs uppercase tracking-wide {{ count($acquaDiagnostics['warnings'] ?? []) > 0 ? 'text-amber-700' : 'text-emerald-700' }}">Diagnostica estrazione FE acqua</div>
|
||
<div class="mt-2 grid gap-2 text-xs text-slate-700 md:grid-cols-3">
|
||
<div>FE lette: <span class="font-semibold">{{ $acquaDiagnostics['counts']['totale'] ?? 0 }}</span></div>
|
||
<div>Con identificativi: <span class="font-semibold">{{ $acquaDiagnostics['counts']['con_identificativi'] ?? 0 }}</span></div>
|
||
<div>Con dati pagamento: <span class="font-semibold">{{ $acquaDiagnostics['counts']['con_pagamento'] ?? 0 }}</span></div>
|
||
</div>
|
||
@if(!empty($acquaDiagnostics['latest']))
|
||
<div class="mt-3 rounded-lg border border-white/70 bg-white/80 px-3 py-2 text-xs text-slate-700">
|
||
<div class="font-semibold text-slate-900">Ultima FE acqua estratta</div>
|
||
<div class="mt-1">{{ $acquaDiagnostics['latest']['numero_fattura'] ?: ('FE #' . $acquaDiagnostics['latest']['id']) }} · {{ $acquaDiagnostics['latest']['data_fattura'] ?: 'n/d' }}</div>
|
||
<div class="mt-1">Utenza {{ $acquaDiagnostics['latest']['utenza'] ?: '—' }} · Cliente {{ $acquaDiagnostics['latest']['cliente'] ?: '—' }}</div>
|
||
<div class="mt-1">Contratto {{ $acquaDiagnostics['latest']['contratto'] ?: '—' }} · Matricola {{ $acquaDiagnostics['latest']['matricola'] ?: '—' }}</div>
|
||
<div class="mt-1">CBILL {{ $acquaDiagnostics['latest']['cbill'] ?: '—' }} @if(!empty($acquaDiagnostics['latest']['codice_avviso']))· Avviso {{ $acquaDiagnostics['latest']['codice_avviso'] }}@endif @if(!empty($acquaDiagnostics['latest']['sia']))· SIA {{ $acquaDiagnostics['latest']['sia'] }}@endif</div>
|
||
</div>
|
||
@endif
|
||
@if(!empty($acquaDiagnostics['warnings']))
|
||
<div class="mt-3 space-y-2 text-xs text-amber-900">
|
||
@foreach($acquaDiagnostics['warnings'] as $warning)
|
||
<div class="rounded-lg border border-amber-200 bg-white px-3 py-2">{{ $warning }}</div>
|
||
@endforeach
|
||
</div>
|
||
@else
|
||
<div class="mt-3 text-xs text-emerald-800">Nessun disallineamento evidente tra contratto acqua e ultimi dati estratti dalle FE.</div>
|
||
@endif
|
||
</div>
|
||
@endif
|
||
</div>
|
||
</x-filament::section>
|
||
|
||
<x-filament::section>
|
||
<x-slot name="heading">Copertura dati</x-slot>
|
||
<div class="space-y-3 text-sm text-slate-600">
|
||
<div class="rounded-xl border bg-white px-4 py-3">Per acqua, energia e altri impianti usa i codici collegati per registrare POD, PDR, matricole, codice cliente, numero utenza e riferimenti bolletta.</div>
|
||
<div class="rounded-xl border bg-white px-4 py-3">Il SIA resta sul fornitore; qui teniamo i dati specifici del singolo contratto dello stabile.</div>
|
||
<div class="rounded-xl border bg-white px-4 py-3">Il documento principale può essere un PDF già registrato nell’archivio documentale con categoria contratto.</div>
|
||
</div>
|
||
</x-filament::section>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</x-filament-panels::page>
|