{{-- Pagina "Backup e import". Cinque zone numerate, in ordine di quanto sono definitive: 1 Backup completo (BackupManager) 2 Ripristina da backup (BackupManager) 3 Import PDF territori (qui) 4 Dati in formato XML (qui) 5 Zona pericolosa (ZonaPericolosa) Ogni zona ha un'ancora, e l'indice in cima ci porta sopra evidenziandola: con cinque riquadri lunghi, arrivare "circa dalle parti giuste" scorrendo non basta a capire dove si e' atterrati. Backup, ripristino e azzeramento stanno in componenti a se' perche' hanno uno stato proprio e un poll fitto che non deve far ri-renderizzare tutta la pagina — inclusa la tabella degli esiti dell'import, che puo' avere centinaia di righe. L'avanzamento e i log di TUTTE le operazioni finiscono in una sola console, agganciata in fondo alla finestra. Qui dentro non ci sono piu' riquadri di log: ce n'erano cinque, e la stessa operazione si raccontava in tre punti diversi della pagina. --}}

Backup e import

Backup completo dell’applicazione, ripristino, import dei PDF dei territori, scambio dati in XML e azzeramento.

{{-- ─── Indice delle zone ────────────────────────────────────────────── Sposta la pagina e fa lampeggiare la zona, poi porta il focus da tastiera sul primo comando: chi naviga senza mouse deve trovarsi dentro la zona, non doverci arrivare a furia di tabulazioni. --}} {{-- x-data vuoto ma necessario: x-on non funziona senza uno scope Alpine sopra di sé, e queste voci non ne avrebbero altrimenti nessuno. --}} {{-- ═══ Zone 1 e 2 ════════════════════════════════════════════════════ --}} {{-- ═══ Zona 3 — Import PDF territori ═════════════════════════════════ --}}

3 · Import PDF territori

Associa i PDF ai territori già presenti e ne genera le miniature. Il nome del file può variare: basta che contenga il numero di un territorio esistente.

{{-- Due strade per la stessa cosa. La primaria e' una sola — l'archivio ZIP — perche' e' quella che regge i volumi veri: un solo file da caricare invece di centinaia di richieste temporanee. --}}
{{-- Strada consigliata --}}
@csrf

Da archivio ZIP — consigliato

Un solo file: il server estrae i PDF da sé. È la via da usare per grandi volumi.

@error('pdfZip') @enderror
Importa archivio ZIP
{{-- Strada alternativa --}}

Da cartella

Comoda per pochi file. Ogni PDF viaggia come caricamento temporaneo a sé.

@error('pdfFolder') @enderror @error('pdfFolder.*') @enderror

Importa cartella Preparazione import...
{{-- Esito. I log stanno nella console; qui restano i numeri e l'elenco dei file che non sono stati associati, che e' l'unica cosa su cui si deve poi agire a mano. --}} @if($currentPdfImportId && (!empty($pdfImportStats) || !empty($pdfImportIssues)))
importPdfInCorso) wire:poll.1000ms="refreshPdfImportStatus" @endif>
Esito dell’import
{{ match($pdfImportStatus) { 'queued' => 'In coda', 'running' => 'In esecuzione', 'completed' => 'Completato', 'failed' => 'Fallito', default => 'Inattivo', } }}
@if(!empty($pdfImportStats))
Processati
{{ $pdfImportStats['processed'] ?? 0 }} / {{ $pdfImportStats['total'] ?? 0 }}
Aggiornati
{{ $pdfImportStats['updated'] ?? 0 }}
Saltati
{{ $pdfImportStats['skipped'] ?? 0 }}
Errori
{{ $pdfImportStats['errors'] ?? 0 }}
@endif @if(!empty($pdfImportIssues))
File non associati o problematici
@foreach($pdfImportIssues as $issue) @endforeach
File Motivo Territori rilevati
{{ $issue['file'] ?? '-' }} {{ $issue['message'] ?? '-' }} {{ !empty($issue['matched_numbers']) ? implode(', ', $issue['matched_numbers']) : '-' }}
@endif
@endif
{{-- ═══ Zona 4 — Dati in formato XML ══════════════════════════════════ --}}

4 · Dati in formato XML

Scambio dei soli dati gestionali, senza i file caricati. Per un backup davvero completo usa il pacchetto .zip della : ripristinando solo l’XML i territori restano senza PDF né miniature.

{{-- Export --}}

Esporta

Tutti i dati correnti in un file XML, reimportabile qui accanto.

Dati sensibili. Il file include gli utenti con le password (hash) e i nomi dei proclamatori in chiaro: chi lo ottiene può tentare di forzare le password offline.
Esporta XML
{{-- Import --}}

Importa

Sostituisce zone, tipologie, proclamatori, territori, anni, campagne, assegnazioni e impostazioni.

@csrf
@error('xmlImport') @enderror
Importa XML
{{-- Conversione legacy: e' una tantum, quindi sta in fondo alla zona e non si prende una colonna accanto alle due operazioni ricorrenti. --}}
Converti un dump SQL della vecchia applicazione

Carica il file SQL (per esempio dump-termanager-202604071526.sql) e ottieni un XML compatibile con l’import qui sopra. Non scrive niente nell’applicazione: produce solo un file da scaricare.

@csrf
@error('sqlDump') @enderror
Converti in XML
{{-- Esito dell'import XML. L'import e' sincrono (una POST normale), quindi non ha un flusso di log: ha un riepilogo, e sta qui accanto al pulsante che lo ha prodotto. --}} @if(!empty($importStats))
Esito dell’ultimo import XML
Utenti importati: {{ $importStats['utenti_importati'] ?? 0 }}
Zone importate: {{ $importStats['zone_importate'] ?? 0 }}
Tipologie importate: {{ $importStats['tipologie_importate'] ?? 0 }}
Proclamatori importati: {{ $importStats['proclamatori_importati'] ?? 0 }}
Territori importati: {{ $importStats['territori_importati'] ?? 0 }}
Anni importati: {{ $importStats['anni_importati'] ?? 0 }}
Campagne importate: {{ $importStats['campagne_importate'] ?? 0 }}
Assegnazioni importate: {{ $importStats['assegnazioni_importate'] ?? 0 }}
Territori duplicati saltati: {{ $importStats['duplicate_territori'] ?? 0 }}
Assegnazioni saltate: {{ $importStats['assegnazioni_saltate'] ?? 0 }}
Scarica il riepilogo in PDF @if(!empty($importIssues))
@foreach($importIssues as $issue) @endforeach
Entità Legacy ID Motivo
{{ $issue['entity'] }} {{ $issue['legacy_id'] }} {{ $issue['reason'] }}
@endif
@endif
{{-- ═══ Zona 5 ════════════════════════════════════════════════════════ --}} {{-- Console unica, agganciata in fondo alla finestra. --}} @include('livewire.settings.partials.console-operazioni')