+++fix: add thumbnail support for territori

This commit is contained in:
2026-04-08 09:32:07 +00:00
parent aac13522e5
commit 777f239c7a
43 changed files with 1957 additions and 12 deletions

View File

@@ -82,6 +82,14 @@
</a>
@endcan
@can('territori.assign')
<a href="{{ route('assegnazioni.assegna') }}"
class="flex items-center gap-3 px-3 py-2 text-sm font-medium rounded-lg {{ request()->routeIs('assegnazioni.assegna') ? 'bg-indigo-50 text-indigo-700' : 'text-gray-700 hover:bg-gray-100' }}">
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/></svg>
Assegnazioni
</a>
@endcan
@can('campagne.manage')
<a href="{{ route('campagne.index') }}"
class="flex items-center gap-3 px-3 py-2 text-sm font-medium rounded-lg {{ request()->routeIs('campagne.*') ? 'bg-indigo-50 text-indigo-700' : 'text-gray-700 hover:bg-gray-100' }}">
@@ -129,6 +137,11 @@
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A2 2 0 013 12V7a4 4 0 014-4z"/></svg>
Tipologie
</a>
<a href="{{ route('xml.exchange') }}"
class="flex items-center gap-3 px-3 py-2 text-sm font-medium rounded-lg {{ request()->routeIs('xml.*') ? 'bg-indigo-50 text-indigo-700' : 'text-gray-700 hover:bg-gray-100' }}">
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 16v4m0 0l-3-3m3 3l3-3M4 12a8 8 0 1116 0v1a3 3 0 01-3 3h-1M7 16H6a2 2 0 01-2-2v-2"/></svg>
XML Exchange
</a>
</div>
@endcan

View File

@@ -1,14 +1,24 @@
<div>
<div class="mb-6">
<h1 class="text-2xl font-bold text-gray-900">Assegna Territorio</h1>
<h1 class="text-2xl font-bold text-gray-900">Assegnazioni</h1>
<p class="text-sm text-gray-500 mt-1">Questa funzione consente un'assegnazione arbitraria, indipendente dalle tre schede della Home.</p>
<a href="{{ route('territori.index') }}" class="text-sm text-indigo-600 hover:text-indigo-800">← Torna ai territori</a>
</div>
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 max-w-lg">
<form wire:submit="save" class="space-y-4">
<div>
@if(!$preselectedTerritorioId)
<label for="territorio_search" class="block text-sm font-medium text-gray-700">Filtra territori</label>
<input wire:model.live.debounce.300ms="territorioSearch"
type="text"
id="territorio_search"
placeholder="Cerca per numero, zona o tipologia"
class="mt-1 mb-2 block w-full rounded-lg border-gray-300 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 text-sm">
@endif
<label for="territorio_id" class="block text-sm font-medium text-gray-700">Territorio *</label>
<select wire:model="territorio_id" id="territorio_id" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 text-sm" @if($preselectedTerritorioId) disabled @endif>
<select wire:model.live="territorio_id" id="territorio_id" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 text-sm" @if($preselectedTerritorioId) disabled @endif>
<option value="">Seleziona un territorio</option>
@foreach($territoriDisponibili as $t)
<option value="{{ $t->id }}">N° {{ $t->numero }} — {{ $t->zona?->nome }} ({{ $t->tipologia?->nome }})</option>
@@ -18,6 +28,21 @@
<input type="hidden" wire:model="territorio_id" value="{{ $preselectedTerritorioId }}">
@endif
@error('territorio_id') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
@if($territorio_id)
<div class="mt-3">
<p class="text-xs text-gray-500 mb-1">Anteprima territorio</p>
@if($this->selectedThumbnailUrl)
<img src="{{ $this->selectedThumbnailUrl }}"
alt="Anteprima territorio"
class="rounded-lg border border-gray-200 shadow-sm max-h-64 w-auto">
@else
<div class="rounded-lg border border-dashed border-gray-300 bg-gray-50 px-4 py-6 text-sm text-gray-500">
Nessun PDF disponibile per questo territorio.
</div>
@endif
</div>
@endif
</div>
<div>

View File

@@ -1,6 +1,13 @@
<div>
<div class="mb-6">
<div class="mb-6 flex items-center justify-between">
<h1 class="text-2xl font-bold text-gray-900">Registro Assegnazioni</h1>
@can('settings.manage')
<button wire:click="openCreate"
style="background:#4f46e5;color:#fff;border:none;border-radius:8px;padding:8px 18px;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;">
<svg xmlns="http://www.w3.org/2000/svg" style="width:16px;height:16px;" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/></svg>
Nuova voce
</button>
@endcan
</div>
{{-- Filters --}}
@@ -50,6 +57,9 @@
<th class="px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase">Giorni</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase">Anno</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase">Campagna</th>
@can('settings.manage')
<th class="px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase">Azioni</th>
@endcan
</tr>
</thead>
<tbody class="divide-y divide-gray-100">
@@ -77,6 +87,18 @@
<span class="text-gray-300">-</span>
@endif
</td>
@can('settings.manage')
<td class="px-3 py-2 whitespace-nowrap">
<button wire:click="openEdit({{ $a->id }})"
style="background:#e0e7ff;color:#4338ca;border:none;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer;margin-right:4px;">
Modifica
</button>
<button wire:click="askDelete({{ $a->id }})"
style="background:#fee2e2;color:#b91c1c;border:none;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer;">
Elimina
</button>
</td>
@endcan
</tr>
@empty
<tr>
@@ -90,4 +112,124 @@
{{ $assegnazioni->links() }}
</div>
</div>
{{-- ─── Modal Crea / Modifica (solo admin) ────────────────── --}}
@can('settings.manage')
@if($showModal)
<div style="position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:50;display:flex;align-items:center;justify-content:center;padding:16px;">
<div style="background:#fff;border-radius:12px;width:100%;max-width:560px;max-height:90vh;overflow-y:auto;padding:24px;">
<h2 style="font-size:18px;font-weight:700;color:#111827;margin-bottom:20px;">
{{ $editingId ? 'Modifica voce' : 'Nuova voce' }}
</h2>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
{{-- Territorio --}}
<div style="grid-column:1/-1;">
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Territorio *</label>
<select wire:model="form_territorio_id" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;">
<option value="">-- seleziona --</option>
@foreach($territori as $t)
<option value="{{ $t->id }}"> {{ $t->numero }} {{ $t->zona?->nome }}</option>
@endforeach
</select>
@error('form_territorio_id') <span style="color:#dc2626;font-size:12px;">{{ $message }}</span> @enderror
</div>
{{-- Proclamatore --}}
<div style="grid-column:1/-1;">
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Proclamatore *</label>
<select wire:model="form_proclamatore_id" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;">
<option value="">-- seleziona --</option>
@foreach($proclamatori as $p)
<option value="{{ $p->id }}">{{ $p->cognome }} {{ $p->nome }}</option>
@endforeach
</select>
@error('form_proclamatore_id') <span style="color:#dc2626;font-size:12px;">{{ $message }}</span> @enderror
</div>
{{-- Anno teocratico --}}
<div>
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Anno teocratico *</label>
<select wire:model="form_anno_id" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;">
<option value="">-- seleziona --</option>
@foreach($anni as $anno)
<option value="{{ $anno->id }}">{{ $anno->label }}</option>
@endforeach
</select>
@error('form_anno_id') <span style="color:#dc2626;font-size:12px;">{{ $message }}</span> @enderror
</div>
{{-- Campagna --}}
<div>
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Campagna</label>
<select wire:model="form_campaign_id" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;">
<option value="">Nessuna</option>
@foreach($campagne as $c)
<option value="{{ $c->id }}">{{ $c->descrizione }}</option>
@endforeach
</select>
@error('form_campaign_id') <span style="color:#dc2626;font-size:12px;">{{ $message }}</span> @enderror
</div>
{{-- Data assegnazione --}}
<div>
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Data assegnazione *</label>
<input type="date" wire:model="form_assigned_at" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;">
@error('form_assigned_at') <span style="color:#dc2626;font-size:12px;">{{ $message }}</span> @enderror
</div>
{{-- Data rientro --}}
<div>
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Data rientro</label>
<input type="date" wire:model="form_returned_at" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;">
@error('form_returned_at') <span style="color:#dc2626;font-size:12px;">{{ $message }}</span> @enderror
</div>
{{-- Contata in campagna --}}
<div style="grid-column:1/-1;display:flex;align-items:center;gap:8px;">
<input type="checkbox" wire:model="form_counted_in_campaign" id="ccb" style="width:16px;height:16px;cursor:pointer;">
<label for="ccb" style="font-size:14px;color:#374151;cursor:pointer;">Contata in campagna</label>
</div>
{{-- Note --}}
<div style="grid-column:1/-1;">
<label style="font-size:13px;font-weight:600;color:#374151;display:block;margin-bottom:4px;">Note</label>
<textarea wire:model="form_note" rows="2" style="width:100%;border:1px solid #d1d5db;border-radius:8px;padding:8px 10px;font-size:14px;resize:vertical;"></textarea>
</div>
</div>
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:20px;">
<button wire:click="$set('showModal', false)"
style="background:#f3f4f6;color:#374151;border:none;border-radius:8px;padding:8px 18px;font-size:14px;cursor:pointer;">
Annulla
</button>
<button wire:click="save"
style="background:#4f46e5;color:#fff;border:none;border-radius:8px;padding:8px 18px;font-size:14px;cursor:pointer;">
{{ $editingId ? 'Salva modifiche' : 'Crea voce' }}
</button>
</div>
</div>
</div>
@endif
{{-- ─── Conferma eliminazione (solo admin) ─────────────────── --}}
@if($showDeleteConfirm)
<div style="position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:50;display:flex;align-items:center;justify-content:center;padding:16px;">
<div style="background:#fff;border-radius:12px;width:100%;max-width:360px;padding:24px;">
<h2 style="font-size:17px;font-weight:700;color:#111827;margin-bottom:10px;">Elimina voce</h2>
<p style="font-size:14px;color:#6b7280;margin-bottom:20px;">Sei sicuro di voler eliminare questa assegnazione? L'operazione non può essere annullata.</p>
<div style="display:flex;justify-content:flex-end;gap:10px;">
<button wire:click="$set('showDeleteConfirm', false)"
style="background:#f3f4f6;color:#374151;border:none;border-radius:8px;padding:8px 18px;font-size:14px;cursor:pointer;">
Annulla
</button>
<button wire:click="deleteConfirmed"
style="background:#dc2626;color:#fff;border:none;border-radius:8px;padding:8px 18px;font-size:14px;cursor:pointer;">
Elimina
</button>
</div>
</div>
</div>
@endif
@endcan
</div>

View File

@@ -3,6 +3,19 @@
<h1 class="text-2xl font-bold text-gray-900">Impostazioni</h1>
</div>
<div class="mb-6 bg-white rounded-xl shadow-sm border border-gray-200 p-4 max-w-lg">
<p class="text-sm font-medium text-gray-700 mb-3">Import / Export dati XML</p>
<div class="flex flex-wrap gap-2">
<a href="{{ route('xml.exchange') }}" class="inline-flex items-center px-4 py-2 text-sm font-medium text-white bg-amber-600 rounded-lg hover:bg-amber-700 transition">
Import XML
</a>
<a href="{{ route('xml.exchange') }}" class="inline-flex items-center px-4 py-2 text-sm font-medium text-white bg-emerald-600 rounded-lg hover:bg-emerald-700 transition">
Export XML
</a>
</div>
<p class="text-xs text-gray-500 mt-2">I pulsanti aprono la sezione XML Exchange con gli strumenti di conversione, import e export.</p>
</div>
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 max-w-lg">
@if (session()->has('success'))
<div x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 3000)" x-transition.duration.500ms

View File

@@ -0,0 +1,121 @@
<div class="space-y-6">
<div>
<h1 class="text-2xl font-bold text-gray-900">Import/Export XML</h1>
<p class="text-sm text-gray-500 mt-1">Converti dump SQL legacy in XML, importa XML nell'app ed esporta i dati correnti in XML.</p>
</div>
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 space-y-4">
<h2 class="text-lg font-semibold text-gray-900">Conversione dump SQL legacy</h2>
<p class="text-xs text-gray-500">Carica il file SQL (es. dump-termanager-202604071526.sql) e genera un XML compatibile con l'import dell'app.</p>
<div>
<input wire:model="sqlDump" type="file" accept=".sql,.txt,.SQL,.TXT" class="block w-full text-sm text-gray-600 file:mr-3 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100">
@error('sqlDump') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
</div>
<div class="flex gap-2">
<button
wire:click="convertLegacySqlToXml"
type="button"
class="px-4 py-2 text-sm font-medium text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 transition border border-indigo-700"
style="display:inline-flex;align-items:center;justify-content:center;min-height:40px;background:#4f46e5;color:#fff;border:1px solid #3730a3;border-radius:10px;padding:10px 14px;"
>
Converti in XML
</button>
</div>
</div>
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 space-y-4">
<h2 class="text-lg font-semibold text-gray-900">Import XML nell'app</h2>
<p class="text-xs text-gray-500">Importa un XML nel formato TerManager2. L'import sostituisce i dati gestionali (zone, tipologie, proclamatori, territori, anni, campagne, assegnazioni e impostazioni).</p>
<div wire:loading wire:target="importXmlIntoApp" style="padding:10px 12px;border-radius:10px;background:#fffbeb;border:1px solid #f59e0b;color:#92400e;font-size:13px;">
Importazione in corso... attendi il completamento.
</div>
<div>
<input wire:model="xmlImport" type="file" accept=".xml,.txt,.XML,.TXT" class="block w-full text-sm text-gray-600 file:mr-3 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100">
@error('xmlImport') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
</div>
<div class="flex gap-2">
<button
wire:click="importXmlIntoApp"
type="button"
onclick="if(!confirm('Confermi l\'import XML? I dati gestionali correnti verranno sostituiti.')) event.stopImmediatePropagation();"
class="px-4 py-2 text-sm font-medium text-white bg-amber-600 rounded-lg hover:bg-amber-700 transition border border-amber-700"
style="display:inline-flex;align-items:center;justify-content:center;min-height:40px;background:#d97706;color:#fff;border:1px solid #92400e;border-radius:10px;padding:10px 14px;"
>
Importa XML
</button>
</div>
</div>
@if(!empty($importStats))
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 space-y-3">
<h2 class="text-lg font-semibold text-gray-900">Log importazione</h2>
<div class="text-sm text-gray-700" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;">
<div>Zone importate: <strong>{{ $importStats['zone_importate'] ?? 0 }}</strong></div>
<div>Tipologie importate: <strong>{{ $importStats['tipologie_importate'] ?? 0 }}</strong></div>
<div>Proclamatori importati: <strong>{{ $importStats['proclamatori_importati'] ?? 0 }}</strong></div>
<div>Territori importati: <strong>{{ $importStats['territori_importati'] ?? 0 }}</strong></div>
<div>Anni importati: <strong>{{ $importStats['anni_importati'] ?? 0 }}</strong></div>
<div>Campagne importate: <strong>{{ $importStats['campagne_importate'] ?? 0 }}</strong></div>
<div>Assegnazioni importate: <strong>{{ $importStats['assegnazioni_importate'] ?? 0 }}</strong></div>
<div>Territori duplicati saltati: <strong>{{ $importStats['duplicate_territori'] ?? 0 }}</strong></div>
<div>Assegnazioni saltate: <strong>{{ $importStats['assegnazioni_saltate'] ?? 0 }}</strong></div>
</div>
<div class="mt-3">
<button
wire:click="downloadImportLogPdf"
type="button"
style="display:inline-flex;align-items:center;gap:6px;background:#1d4ed8;color:#fff;border:1px solid #1e3a8a;border-radius:8px;padding:8px 14px;font-size:13px;cursor:pointer;"
>
<svg style="width:15px;height:15px;" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10v6m0 0l-3-3m3 3l3-3M3 17v3a1 1 0 001 1h16a1 1 0 001-1v-3"/></svg>
Scarica log PDF
</button>
</div>
@if(!empty($importIssues))
<div class="mt-2" style="max-height:260px;overflow:auto;border:1px solid #e5e7eb;border-radius:10px;">
<table style="width:100%;border-collapse:collapse;font-size:13px;">
<thead style="background:#f9fafb;position:sticky;top:0;">
<tr>
<th style="text-align:left;padding:8px;border-bottom:1px solid #e5e7eb;">Entità</th>
<th style="text-align:left;padding:8px;border-bottom:1px solid #e5e7eb;">Legacy ID</th>
<th style="text-align:left;padding:8px;border-bottom:1px solid #e5e7eb;">Motivo</th>
</tr>
</thead>
<tbody>
@foreach($importIssues as $issue)
<tr>
<td style="padding:8px;border-bottom:1px solid #f3f4f6;">{{ $issue['entity'] }}</td>
<td style="padding:8px;border-bottom:1px solid #f3f4f6;">{{ $issue['legacy_id'] }}</td>
<td style="padding:8px;border-bottom:1px solid #f3f4f6;">{{ $issue['reason'] }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endif
</div>
@endif
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 space-y-4">
<h2 class="text-lg font-semibold text-gray-900">Export XML</h2>
<p class="text-xs text-gray-500">Esporta i dati correnti dell'app in XML.</p>
<div class="flex gap-2">
<button
wire:click="exportCurrentAsXml"
type="button"
class="px-4 py-2 text-sm font-medium text-white bg-emerald-600 rounded-lg hover:bg-emerald-700 transition border border-emerald-700"
style="display:inline-flex;align-items:center;justify-content:center;min-height:40px;background:#059669;color:#fff;border:1px solid #065f46;border-radius:10px;padding:10px 14px;"
>
Esporta XML
</button>
</div>
</div>
</div>

View File

@@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Log Import XML</title>
<style>
body { font-family: DejaVu Sans, sans-serif; font-size: 12px; color: #111; margin: 20px; }
h1 { font-size: 17px; margin-bottom: 4px; }
.meta { font-size: 11px; color: #555; margin-bottom: 16px; }
.stats-grid { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 20px; }
.stat { background: #f3f4f6; border: 1px solid #e5e7eb; border-radius: 6px; padding: 8px 12px; min-width: 180px; }
.stat-label { font-size: 11px; color: #6b7280; }
.stat-value { font-size: 14px; font-weight: bold; color: #1f2937; }
h2 { font-size: 14px; margin-top: 20px; margin-bottom: 8px; border-bottom: 1px solid #e5e7eb; padding-bottom: 4px; }
table { width: 100%; border-collapse: collapse; font-size: 11px; }
thead tr { background: #f9fafb; }
th { text-align: left; padding: 7px 8px; border-bottom: 1px solid #d1d5db; font-size: 11px; color: #374151; }
td { padding: 6px 8px; border-bottom: 1px solid #f3f4f6; vertical-align: top; }
tr:nth-child(even) td { background: #f9fafb; }
.badge-err { color: #b91c1c; font-weight: bold; }
.footer { margin-top: 30px; font-size: 10px; color: #9ca3af; text-align: right; }
</style>
</head>
<body>
<h1>Log Import XML TerManager2</h1>
<div class="meta">Generato il {{ $generatedAt }}</div>
<div class="stats-grid">
<div class="stat"><div class="stat-label">Zone importate</div><div class="stat-value">{{ $stats['zone_importate'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Tipologie importate</div><div class="stat-value">{{ $stats['tipologie_importate'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Proclamatori importati</div><div class="stat-value">{{ $stats['proclamatori_importati'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Territori importati</div><div class="stat-value">{{ $stats['territori_importati'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Anni teocratici</div><div class="stat-value">{{ $stats['anni_importati'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Campagne importate</div><div class="stat-value">{{ $stats['campagne_importate'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Assegnazioni importate</div><div class="stat-value">{{ $stats['assegnazioni_importate'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Territori duplicati saltati</div><div class="stat-value badge-err">{{ $stats['duplicate_territori'] ?? 0 }}</div></div>
<div class="stat"><div class="stat-label">Assegnazioni saltate</div><div class="stat-value badge-err">{{ $stats['assegnazioni_saltate'] ?? 0 }}</div></div>
</div>
@if(!empty($issues))
<h2>Dettaglio righe non importate</h2>
<table>
<thead>
<tr>
<th style="width:18%">Entità</th>
<th style="width:14%">Legacy ID</th>
<th>Motivo</th>
</tr>
</thead>
<tbody>
@foreach($issues as $issue)
<tr>
<td>{{ $issue['entity'] }}</td>
<td>{{ $issue['legacy_id'] }}</td>
<td>{{ $issue['reason'] }}</td>
</tr>
@endforeach
</tbody>
</table>
@else
<p style="color:#16a34a;margin-top:12px;"> Nessun elemento saltato durante l'importazione.</p>
@endif
<div class="footer">TerManager2 Export generato automaticamente</div>
</body>
</html>