132 lines
7.3 KiB
PHP
132 lines
7.3 KiB
PHP
@extends('admin.layouts.netgescon')
|
|
|
|
@section('title', 'Diagnostica FE / PDF')
|
|
|
|
@section('breadcrumb')
|
|
<a href="{{ route('superadmin.dashboard') }}" class="text-blue-700 hover:underline">SuperAdmin</a>
|
|
<span class="mx-2 text-gray-400">/</span>
|
|
<span>Diagnostica FE / PDF</span>
|
|
@endsection
|
|
|
|
@section('content')
|
|
<div class="space-y-6">
|
|
<div class="netgescon-card p-4">
|
|
<div class="flex items-start justify-between gap-4">
|
|
<div>
|
|
<h2 class="text-xl font-semibold mb-1">Diagnostica Fatture Elettroniche (PDF/XML)</h2>
|
|
<p class="text-gray-600 text-sm">
|
|
Controlli rapidi per individuare record con PDF mancanti, file non presenti su storage, o path duplicati.
|
|
</p>
|
|
</div>
|
|
<div class="flex items-center gap-2">
|
|
<a href="{{ route('superadmin.dashboard') }}" class="netgescon-btn netgescon-btn-outline-secondary netgescon-btn-sm">Torna al pannello</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
<div class="netgescon-card p-4">
|
|
<div class="text-sm text-gray-600">Totale FE</div>
|
|
<div class="text-2xl font-semibold">{{ number_format((int) $totalFe, 0, ',', '.') }}</div>
|
|
</div>
|
|
<div class="netgescon-card p-4">
|
|
<div class="text-sm text-gray-600">PDF path mancanti</div>
|
|
<div class="text-2xl font-semibold text-red-700">{{ number_format((int) $missingPdfPathCount, 0, ',', '.') }}</div>
|
|
</div>
|
|
<div class="netgescon-card p-4">
|
|
<div class="text-sm text-gray-600">PDF path duplicati</div>
|
|
<div class="text-2xl font-semibold text-amber-700">{{ number_format((int) $duplicatePdfPathsCount, 0, ',', '.') }}</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="netgescon-card p-4">
|
|
<div class="flex flex-wrap items-center justify-between gap-3">
|
|
<div>
|
|
<h3 class="text-base font-semibold">Problemi rilevati (campione)</h3>
|
|
<div class="text-sm text-gray-600">
|
|
Verifica esistenza file PDF su storage: controllati {{ number_format((int) $pdfExistenceChecked, 0, ',', '.') }} record recenti con PDF path valorizzato.
|
|
Trovati {{ number_format((int) $missingPdfOnDiskCount, 0, ',', '.') }} casi con file mancante.
|
|
</div>
|
|
<div class="text-sm text-gray-600">XML mancanti (né path né contenuto): {{ number_format((int) $missingXmlPathCount, 0, ',', '.') }}.</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mt-4 overflow-x-auto">
|
|
<table class="min-w-full text-sm">
|
|
<thead>
|
|
<tr class="text-left text-gray-600">
|
|
<th class="py-2 pr-4">ID</th>
|
|
<th class="py-2 pr-4">Stabile</th>
|
|
<th class="py-2 pr-4">Fornitore</th>
|
|
<th class="py-2 pr-4">Data / Numero</th>
|
|
<th class="py-2 pr-4">Totale</th>
|
|
<th class="py-2 pr-4">Problemi</th>
|
|
<th class="py-2 pr-4">PDF</th>
|
|
<th class="py-2 pr-4">Azioni</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y">
|
|
@forelse($rows as $r)
|
|
<tr>
|
|
<td class="py-2 pr-4 whitespace-nowrap">#{{ $r['id'] }}</td>
|
|
<td class="py-2 pr-4 whitespace-nowrap">{{ $r['stabile_id'] ?: '-' }}</td>
|
|
<td class="py-2 pr-4">
|
|
<div class="font-medium">{{ $r['fornitore'] !== '' ? $r['fornitore'] : '-' }}</div>
|
|
@if($r['sdi_file'] !== '')
|
|
<div class="text-xs text-gray-500">SDI: {{ $r['sdi_file'] }}</div>
|
|
@endif
|
|
</td>
|
|
<td class="py-2 pr-4 whitespace-nowrap">
|
|
<div>{{ $r['data'] ?: '-' }}</div>
|
|
<div class="text-xs text-gray-500">{{ $r['numero'] !== '' ? $r['numero'] : '-' }}</div>
|
|
</td>
|
|
<td class="py-2 pr-4 whitespace-nowrap">{{ number_format((float) $r['totale'], 2, ',', '.') }} €</td>
|
|
<td class="py-2 pr-4">
|
|
<div class="flex flex-wrap gap-1">
|
|
@foreach($r['issues'] as $i)
|
|
@php($cls = match($i['type']) {
|
|
'danger' => 'netgescon-badge netgescon-badge-danger',
|
|
'warning' => 'netgescon-badge',
|
|
default => 'netgescon-badge'
|
|
})
|
|
<span class="{{ $cls }}">{{ $i['label'] }}</span>
|
|
@endforeach
|
|
@if(count($r['issues']) === 0)
|
|
<span class="netgescon-badge netgescon-badge-success">OK</span>
|
|
@endif
|
|
</div>
|
|
@if($r['pdf_path'] !== '')
|
|
<div class="mt-1 text-xs text-gray-500 truncate" title="{{ $r['pdf_path'] }}">{{ $r['pdf_path'] }}</div>
|
|
@endif
|
|
</td>
|
|
<td class="py-2 pr-4 whitespace-nowrap">
|
|
@if($r['pdf_path'] === '')
|
|
<span class="text-xs text-gray-500">—</span>
|
|
@else
|
|
@if($r['pdf_exists'])
|
|
<span class="netgescon-badge netgescon-badge-success">Presente</span>
|
|
@else
|
|
<span class="netgescon-badge netgescon-badge-danger">Assente</span>
|
|
@endif
|
|
@endif
|
|
</td>
|
|
<td class="py-2 pr-4 whitespace-nowrap">
|
|
<div class="flex flex-wrap gap-2">
|
|
<a class="netgescon-btn netgescon-btn-sm netgescon-btn-outline-primary" href="{{ $r['filament_url'] }}" target="_blank" rel="noopener">Scheda</a>
|
|
<a class="netgescon-btn netgescon-btn-sm netgescon-btn-outline-secondary" href="{{ $r['pdf_inline_url'] }}" target="_blank" rel="noopener">PDF</a>
|
|
<a class="netgescon-btn netgescon-btn-sm netgescon-btn-outline-secondary" href="{{ $r['xml_download_url'] }}" target="_blank" rel="noopener">XML</a>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td class="py-6 text-gray-600" colspan="8">Nessun problema trovato nel campione (o nessuna FE presente).</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endsection
|