++ fix e controlli

This commit is contained in:
2026-07-30 17:05:39 +02:00
parent 712336d652
commit 440d63a6b9
54 changed files with 4921 additions and 1322 deletions

View File

@@ -33,7 +33,15 @@ class XmlExchange extends Component
public array $pdfImportIssues = [];
public ?string $currentPdfImportId = null;
public string $pdfImportStatus = 'idle';
public string $pdfImportLogText = '';
/**
* Quante righe di log dell'import sono gia' state spedite alla console.
*
* La coda dell'import non ha tetto (un import di duemila PDF fa duemila
* righe): rispedirla intera a ogni poll significherebbe trascinarsi dietro
* l'intera cronologia dentro ogni risposta, una volta al secondo.
*/
public int $logPdfSpediti = 0;
public function mount(): void
{
@@ -95,7 +103,57 @@ class XmlExchange extends Component
$this->pdfImportStats = $state['stats'] ?? [];
$this->pdfImportLogs = $state['logs'] ?? [];
$this->pdfImportIssues = $state['issues'] ?? [];
$this->pdfImportLogText = implode(PHP_EOL, $this->pdfImportLogs);
$this->spedisciImportAllaConsole();
}
/**
* Manda alla console unica le righe nuove dell'import PDF.
*
* La console e' un componente Alpine fuori dal ciclo di Livewire: i suoi
* contenuti non possono essere ri-renderizzati dal server senza cancellare
* le righe scritte dal browser, quindi si comunica a eventi. E' lo stesso
* meccanismo di SegueOperazioneBackup, da cui questo componente non eredita
* perche' l'import PDF ha uno stato tutto suo (TerritorioPdfImportState) e
* non partecipa al posto unico: puo' girare mentre un backup lavora.
*/
protected function spedisciImportAllaConsole(): void
{
// Coda accorciata: e' un import nuovo, si riparte da capo.
if (count($this->pdfImportLogs) < $this->logPdfSpediti) {
$this->logPdfSpediti = 0;
}
$nuove = array_slice($this->pdfImportLogs, $this->logPdfSpediti);
$this->logPdfSpediti = count($this->pdfImportLogs);
$totale = (int) ($this->pdfImportStats['total'] ?? 0);
$fatti = (int) ($this->pdfImportStats['processed'] ?? 0);
$this->dispatch(
'console-operazione',
sorgente: 'import-pdf',
righe: array_values($nuove),
etichetta: 'Import PDF',
fase: $totale > 0 ? $fatti . ' / ' . $totale . ' file' : '',
percento: $this->percentualeImportPdf($fatti, $totale),
stato: $this->pdfImportStatus,
);
}
private function percentualeImportPdf(int $fatti, int $totale): int
{
if ($this->pdfImportStatus === 'completed') {
return 100;
}
return $totale > 0 ? (int) min(100, round($fatti / $totale * 100)) : 0;
}
/** Vero mentre l'import PDF e' in coda o in esecuzione. */
public function getImportPdfInCorsoProperty(): bool
{
return in_array($this->pdfImportStatus, ['queued', 'running'], true);
}
protected function dispatchPdfImport(string $importId, array $storedFiles, string $initialLog): void
@@ -108,9 +166,13 @@ class XmlExchange extends Component
$this->pdfImportStats = $state['stats'] ?? [];
$this->pdfImportLogs = $state['logs'] ?? [];
$this->pdfImportIssues = $state['issues'] ?? [];
// Import nuovo: il conto delle righe gia' raccontate riparte, altrimenti
// le prime righe di questo import verrebbero scambiate per quelle del
// precedente e non comparirebbero.
$this->logPdfSpediti = 0;
$this->refreshPdfImportStatus();
session()->flash('success', 'Import PDF avviato in background. I log si aggiorneranno automaticamente.');
session()->flash('success', 'Import PDF avviato in background. L\'avanzamento è nella console in fondo alla pagina.');
}
public function downloadImportLogPdf()