220 lines
15 KiB
PHP
220 lines
15 KiB
PHP
<x-filament-panels::page>
|
|
@php
|
|
$disc = $this->discrepancies;
|
|
@endphp
|
|
|
|
<div class="space-y-6">
|
|
<div class="flex flex-wrap items-center justify-between gap-3 bg-white dark:bg-gray-900 border rounded-xl p-3 shadow-xs">
|
|
<div class="flex items-center gap-2">
|
|
<span class="text-sm font-bold text-gray-900 dark:text-gray-100">
|
|
{{ $disc['has_active_stabile'] ? $disc['stabile_nome'] : 'Nessuno stabile attivo' }}
|
|
</span>
|
|
<span class="inline-flex items-center rounded-md bg-red-50 dark:bg-red-900/30 px-2 py-0.5 text-xs font-semibold text-red-700 dark:text-red-300">
|
|
Audit e Revisione Legacy
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
@if(!$disc['has_active_stabile'])
|
|
<div class="rounded-xl border border-yellow-200 bg-yellow-50 p-4 dark:border-yellow-900/50 dark:bg-yellow-950/20 text-yellow-800 dark:text-yellow-200 text-sm">
|
|
Seleziona uno stabile attivo per visualizzare l'audit delle quadrature.
|
|
</div>
|
|
@else
|
|
<!-- 1. Audit Unità Mancanti 1:1 -->
|
|
<div class="rounded-xl border {{ count($disc['missing_units']) > 0 ? 'border-red-200 bg-red-50/50 dark:border-red-900/50 dark:bg-red-950/10' : 'border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900' }} p-5 shadow-xs">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-base font-bold text-gray-900 dark:text-gray-100 flex items-center gap-2">
|
|
<x-filament::icon icon="heroicon-o-home-modern" class="h-5 w-5 text-red-600 dark:text-red-400" />
|
|
Audit Unità Mancanti 1:1 (Legacy vs NetGescon)
|
|
</h3>
|
|
<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-bold {{ count($disc['missing_units']) > 0 ? 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200' : 'bg-green-100 text-green-800' }}">
|
|
{{ count($disc['missing_units']) }} Anomalie
|
|
</span>
|
|
</div>
|
|
|
|
@if(count($disc['missing_units']) > 0)
|
|
<div class="overflow-x-auto">
|
|
<table class="w-full text-left text-xs border-collapse">
|
|
<thead>
|
|
<tr class="border-b border-red-100 dark:border-red-900/20 text-gray-500 uppercase tracking-wider font-semibold">
|
|
<th class="py-2">Codice Condomino</th>
|
|
<th class="py-2">Nominativo Legacy</th>
|
|
<th class="py-2">Scala</th>
|
|
<th class="py-2">Interno</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-red-100/50 dark:divide-red-900/10">
|
|
@foreach($disc['missing_units'] as $u)
|
|
<tr class="text-red-900 dark:text-red-300 font-medium">
|
|
<td class="py-2">{{ $u['cod_cond'] }}</td>
|
|
<td class="py-2">{{ $u['nominativo'] }}</td>
|
|
<td class="py-2">{{ $u['scala'] }}</td>
|
|
<td class="py-2">{{ $u['interno'] }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
@else
|
|
<p class="text-xs text-green-700 dark:text-green-400 font-medium">Tutte le unità del database legacy sono state mappate correttamente 1:1.</p>
|
|
@endif
|
|
</div>
|
|
|
|
<!-- 2. Sbilanciamento millesimale delle tabelle -->
|
|
<div class="rounded-xl border {{ count($disc['tabelle_sbilanciate']) > 0 ? 'border-red-200 bg-red-50/50 dark:border-red-900/50 dark:bg-red-950/10' : 'border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900' }} p-5 shadow-xs">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-base font-bold text-gray-900 dark:text-gray-100 flex items-center gap-2">
|
|
<x-filament::icon icon="heroicon-o-table-cells" class="h-5 w-5 text-red-600 dark:text-red-400" />
|
|
Sbilanciamento Millesimi Tabelle (Somma Dettagli vs Target MDB)
|
|
</h3>
|
|
<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-bold {{ count($disc['tabelle_sbilanciate']) > 0 ? 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200' : 'bg-green-100 text-green-800' }}">
|
|
{{ count($disc['tabelle_sbilanciate']) }} Tabelle Fuori Quadratura
|
|
</span>
|
|
</div>
|
|
|
|
@if(count($disc['tabelle_sbilanciate']) > 0)
|
|
<!-- ALERT CRITICO IN-LINE PER QUADRATURA MILLESIMI -->
|
|
<div class="mb-4 rounded-lg bg-red-50 dark:bg-red-950/30 p-3 border border-red-200 dark:border-red-900/50">
|
|
<div class="flex items-start gap-2">
|
|
<x-filament::icon icon="heroicon-o-calculator" class="h-5 w-5 text-red-600 dark:text-red-400 mt-0.5" />
|
|
<div>
|
|
<h4 class="text-xs font-bold text-red-800 dark:text-red-200">QUADRATURA MILLESIMI FALLITA</h4>
|
|
<p class="text-xxs text-red-700 dark:text-red-300 mt-1">
|
|
La somma dei dettagli millesimali differisce dal totale formalmente definito a database o dallo staging MDB. È vietato applicare fallback. Risolvere le quote millesimali in-place.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="overflow-x-auto">
|
|
<table class="w-full text-left text-xs border-collapse">
|
|
<thead>
|
|
<tr class="border-b border-red-100 dark:border-red-900/20 text-gray-500 uppercase tracking-wider font-semibold">
|
|
<th class="py-2">Codice Tabella</th>
|
|
<th class="py-2">Denominazione</th>
|
|
<th class="py-2">Anno Gestione</th>
|
|
<th class="py-2">Somma Rilevata</th>
|
|
<th class="py-2">Target Atteso (MDB)</th>
|
|
<th class="py-2">Differenza</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-red-100/50 dark:divide-red-900/10">
|
|
@foreach($disc['tabelle_sbilanciate'] as $t)
|
|
<tr class="text-red-900 dark:text-red-300 font-medium">
|
|
<td class="py-2 font-bold">{{ $t['codice'] }}</td>
|
|
<td class="py-2">{{ $t['denominazione'] }}</td>
|
|
<td class="py-2">
|
|
<span class="inline-flex items-center rounded-md bg-slate-100 dark:bg-slate-800 px-1.5 py-0.5 text-xxs font-bold text-slate-700 dark:text-slate-300">
|
|
{{ $t['anno_gestione'] }}
|
|
</span>
|
|
</td>
|
|
<td class="py-2">{{ number_format($t['somma_reale'], 4, ',', '.') }}</td>
|
|
<td class="py-2">{{ number_format($t['atteso_legacy'], 4, ',', '.') }}</td>
|
|
<td class="py-2 text-red-700 font-bold">Δ {{ number_format($t['differenza'], 4, ',', '.') }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
@else
|
|
<p class="text-xs text-green-700 dark:text-green-400 font-medium">Tutte le tabelle millesimali quadrano perfettamente con il target atteso.</p>
|
|
@endif
|
|
</div>
|
|
|
|
<!-- 3. Discrepanze sul calcolo delle teste e dei millesimi presenti nell'assemblea -->
|
|
<div class="rounded-xl border {{ count($disc['discrepanze_assemblee']) > 0 ? 'border-red-200 bg-red-50/50 dark:border-red-900/50 dark:bg-red-950/10' : 'border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900' }} p-5 shadow-xs">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-base font-bold text-gray-900 dark:text-gray-100 flex items-center gap-2">
|
|
<x-filament::icon icon="heroicon-o-user-group" class="h-5 w-5 text-red-600 dark:text-red-400" />
|
|
Discrepanze Presenze Assemblee (Millesimi Unità vs pres_assemblee)
|
|
</h3>
|
|
<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-bold {{ count($disc['discrepanze_assemblee']) > 0 ? 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200' : 'bg-green-100 text-green-800' }}">
|
|
{{ count($disc['discrepanze_assemblee']) }} Discrepanze Rilevate
|
|
</span>
|
|
</div>
|
|
|
|
@if(count($disc['discrepanze_assemblee']) > 0)
|
|
<div class="overflow-x-auto max-h-96">
|
|
<table class="w-full text-left text-xs border-collapse">
|
|
<thead>
|
|
<tr class="border-b border-red-100 dark:border-red-900/20 text-gray-500 uppercase tracking-wider font-semibold">
|
|
<th class="py-2">Anno/Es.</th>
|
|
<th class="py-2">N° Assemblea</th>
|
|
<th class="py-2">Codice Unità</th>
|
|
<th class="py-2">Millesimi DB</th>
|
|
<th class="py-2">Millesimi Legacy</th>
|
|
<th class="py-2">Tipo Presenza</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-red-100/50 dark:divide-red-900/10">
|
|
@foreach($disc['discrepanze_assemblee'] as $d)
|
|
<tr class="text-red-900 dark:text-red-300 font-medium">
|
|
<td class="py-2">{{ $d['anno'] }}</td>
|
|
<td class="py-2">Ass. #{{ $d['assemblea'] }}</td>
|
|
<td class="py-2">{{ $d['unita'] }} ({{ $d['legacy_cond_id'] }})</td>
|
|
<td class="py-2 font-bold text-gray-700 dark:text-gray-300">{{ number_format($d['millesimi_db'], 4, ',', '.') }}</td>
|
|
<td class="py-2 font-bold text-red-700 dark:text-red-400">{{ number_format($d['millesimi_legacy'], 4, ',', '.') }}</td>
|
|
<td class="py-2 uppercase text-[10px] tracking-wider">{{ $d['p_d_a'] }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
@else
|
|
<p class="text-xs text-green-700 dark:text-green-400 font-medium">Nessuna discrepanza millesimale rilevata nelle presenze assemblee.</p>
|
|
@endif
|
|
</div>
|
|
|
|
<!-- 4. Audit delle Anomalie Anagrafiche e dei Record Orfani -->
|
|
<div class="rounded-xl border {{ count($disc['anagrafiche_anomale']) > 0 ? 'border-red-200 bg-red-50/50 dark:border-red-900/50 dark:bg-red-950/10' : 'border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900' }} p-5 shadow-xs">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-base font-bold text-gray-900 dark:text-gray-100 flex items-center gap-2">
|
|
<x-filament::icon icon="heroicon-o-exclamation-triangle" class="h-5 w-5 text-red-600 dark:text-red-400" />
|
|
Audit Anomalie Anagrafiche e Timeline Orfane
|
|
</h3>
|
|
<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-bold {{ count($disc['anagrafiche_anomale']) > 0 ? 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200' : 'bg-green-100 text-green-800' }}">
|
|
{{ count($disc['anagrafiche_anomale']) }} Anomalie
|
|
</span>
|
|
</div>
|
|
|
|
@if(count($disc['anagrafiche_anomale']) > 0)
|
|
<!-- ALERT CRITICO IN-LINE A SCHERMO -->
|
|
<div class="mb-4 rounded-lg bg-red-50 dark:bg-red-950/30 p-3 border border-red-200 dark:border-red-900/50">
|
|
<div class="flex items-start gap-2">
|
|
<x-filament::icon icon="heroicon-o-shield-exclamation" class="h-5 w-5 text-red-600 dark:text-red-400 mt-0.5" />
|
|
<div>
|
|
<h4 class="text-xs font-bold text-red-800 dark:text-red-200">BLOCCO SICUREZZA CONTRATTI / ANAGRAFICHE</h4>
|
|
<p class="text-xxs text-red-700 dark:text-red-300 mt-1">
|
|
Rilevate anomalie bloccanti di associazione 1:1 o dati orfani. La procedura richiede la risoluzione manuale o la correzione degli archivi legacy prima di poter consolidare la chiusura dei conti.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="overflow-x-auto max-h-96">
|
|
<table class="w-full text-left text-xs border-collapse">
|
|
<thead>
|
|
<tr class="border-b border-red-100 dark:border-red-900/20 text-gray-500 uppercase tracking-wider font-semibold">
|
|
<th class="py-2">Tipo Anomalia</th>
|
|
<th class="py-2">Dettaglio Errore</th>
|
|
<th class="py-2">Istruzioni Correzione</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-red-100/50 dark:divide-red-900/10">
|
|
@foreach($disc['anagrafiche_anomale'] as $a)
|
|
<tr class="text-red-900 dark:text-red-300 font-medium">
|
|
<td class="py-2 font-bold">{{ $a['tipo'] }}</td>
|
|
<td class="py-2">{{ $a['dettaglio'] }}</td>
|
|
<td class="py-2 text-xs text-yellow-800 dark:text-yellow-400 italic">{{ $a['istruzioni'] }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
@else
|
|
<p class="text-xs text-green-700 dark:text-green-400 font-medium">Nessuna anomalia o legame orfano rilevato nelle anagrafiche dei condomini.</p>
|
|
@endif
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</x-filament-panels::page>
|