Piantine pubblicate anche dopo un ripristino; posto unico senza gare

- Lo stato "Pubblicata" non dipende più dall'id del territorio, che il
  ripristino ricrea: l'impronta usa il numero, e la piantina ricorda il
  percorso del PDF pubblicato (pdf_pubblicato, con migrazione che riconosce
  le piantine già pubblicate).
- BackupOperationState: corrente() in sola lettura e liberaCorrente() sotto
  lo stesso mutex di occupa(), così una lettura non cancella il puntatore
  di un'operazione appena avviata.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 15:33:07 +02:00
parent 426a95211d
commit e7148c7b32
8 changed files with 143 additions and 22 deletions

View File

@@ -33,6 +33,7 @@ class TerritorioMappa extends Model
'geojson',
'geojson_pubblicato',
'impronta_pubblicata',
'pdf_pubblicato',
'pubblicata_at',
'image_path',
'rendered_at',
@@ -110,9 +111,11 @@ class TerritorioMappa extends Model
{
$territorio = $this->territorio;
// Il territorio entra con il numero, non con l'id: il numero è unico e
// il ripristino di un backup ricrea i territori con id nuovi, che
// facevano risultare da pubblicare ogni piantina appena ripristinata.
return hash('sha256', json_encode([
$this->geometria(),
$this->territorio_id,
$territorio ? trim((string) $territorio->numero) : null,
$territorio?->zona?->nome,
$territorio ? trim((string) $territorio->confini) : null,
@@ -131,15 +134,19 @@ class TerritorioMappa extends Model
}
/**
* Il PDF in vigore del territorio è uno composto da una piantina. Se nel
* frattempo è stato sostituito per altre vie (ripristino di una versione,
* caricamento a mano, import), quello che arriva ai proclamatori non è
* più questo disegno, anche se l'impronta torna.
* Il PDF in vigore del territorio è ancora quello prodotto dall'ultima
* pubblicazione. Se nel frattempo è stato sostituito per altre vie
* (ripristino di una versione, caricamento a mano, import), quello che
* arriva ai proclamatori non è più questo disegno, anche se l'impronta
* torna. Si confronta il percorso, che il backup conserva: prima si
* cercava l'id del territorio nel nome del file, e dopo un ripristino
* (id nuovi) non tornava più.
*/
public function pdfInUsoDallaPiantina(): bool
{
return $this->territorio_id !== null
&& str_starts_with((string) $this->territorio?->pdf_path, 'territori-pdf/piantina-' . $this->territorio_id . '-');
return $this->pdf_pubblicato !== null
&& $this->territorio !== null
&& $this->territorio->pdf_path === $this->pdf_pubblicato;
}
/** Il testo dell'etichetta di stato, uguale in ogni pagina. */