Editor piantine: bozza automatica e pubblicazione con anteprima
- Il disegno è bozza e si salva da solo; i dati del territorio si modificano dall'editor e valgono subito nel gestionale. - Un solo "Pubblica" (immagine + PDF), uguale in editor e gestione: anteprima preparata in coda su disco privato, conferma obbligatoria, rifiutata se nel frattempo è cambiato qualcosa di stampato. - Stati Bozza / Pubblicata / Modifiche da pubblicare, calcolati sull'impronta di confine e dati stampati e sul PDF in uso. - Gestione riscritta: stato, ricerca, filtri, storico paginato. - Editor ridisegnato a tre zone, utilizzabile anche su tablet e telefono. - Avvisi via evento (trait Avvisa + <x-avvisi>). - .gitattributes: script shell sempre LF, altrimenti il container locale su Windows non parte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -36,15 +36,24 @@ class PiantinaPdfService
|
||||
) {
|
||||
}
|
||||
|
||||
/** Il PDF completo, come stringa binaria. */
|
||||
public function genera(Territorio $territorio, TerritorioMappa $mappa): string
|
||||
/**
|
||||
* Il PDF completo, come stringa binaria.
|
||||
*
|
||||
* $immagine è il percorso assoluto di un'immagine diversa da quella
|
||||
* salvata nella piantina: l'anteprima della pubblicazione compone il PDF
|
||||
* con l'immagine appena generata, senza averla ancora resa ufficiale.
|
||||
*/
|
||||
public function genera(Territorio $territorio, TerritorioMappa $mappa, ?string $immagine = null): string
|
||||
{
|
||||
if (! $mappa->image_path || ! Storage::disk('public')->exists($mappa->image_path)) {
|
||||
throw new RuntimeException('Prima di generare il PDF va generata l\'immagine della piantina.');
|
||||
if ($immagine === null) {
|
||||
if (! $mappa->image_path || ! Storage::disk('public')->exists($mappa->image_path)) {
|
||||
throw new RuntimeException('Prima di generare il PDF va generata l\'immagine della piantina.');
|
||||
}
|
||||
|
||||
$immagine = Storage::disk('public')->path($mappa->image_path);
|
||||
}
|
||||
|
||||
$immagine = Storage::disk('public')->path($mappa->image_path);
|
||||
$dimensioni = getimagesize($immagine);
|
||||
$dimensioni = @getimagesize($immagine);
|
||||
if ($dimensioni === false) {
|
||||
throw new RuntimeException('L\'immagine della piantina non è leggibile: rigenerala.');
|
||||
}
|
||||
@@ -92,7 +101,7 @@ class PiantinaPdfService
|
||||
($h - $imgH) / 2,
|
||||
$imgW,
|
||||
$imgH,
|
||||
$this->tipoImmagine($mappa->image_path)
|
||||
$this->tipoImmagine($immagine)
|
||||
);
|
||||
|
||||
return $pdf->Output('S');
|
||||
@@ -179,13 +188,26 @@ class PiantinaPdfService
|
||||
*/
|
||||
public function sostituisci(Territorio $territorio, TerritorioMappa $mappa, string $origine = 'piantine'): void
|
||||
{
|
||||
$binario = $this->genera($territorio, $mappa);
|
||||
$this->sostituisciConPdf($territorio, $this->genera($territorio, $mappa), $origine);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rende ufficiale un PDF già composto, archiviando il precedente.
|
||||
*
|
||||
* Prima si scrive il nuovo file, poi si archivia il vecchio: nell'ordine
|
||||
* inverso un errore di scrittura (disco pieno) lasciava pdf_path puntato
|
||||
* a un file già spostato nello storico, e i link delle assegnazioni in 404.
|
||||
*/
|
||||
public function sostituisciConPdf(Territorio $territorio, string $binario, string $origine = 'piantine'): void
|
||||
{
|
||||
$disk = Storage::disk('public');
|
||||
|
||||
$this->archiviaCorrente($territorio, $origine);
|
||||
|
||||
$nuovoPath = 'territori-pdf/piantina-' . $territorio->id . '-' . now()->format('Ymd-His') . '.pdf';
|
||||
$disk->put($nuovoPath, $binario);
|
||||
if (! $disk->put($nuovoPath, $binario)) {
|
||||
throw new RuntimeException('Non è stato possibile scrivere il nuovo PDF sul disco: il PDF in vigore non è stato toccato.');
|
||||
}
|
||||
|
||||
$this->archiviaCorrente($territorio, $origine);
|
||||
|
||||
$territorio->update([
|
||||
'pdf_path' => $nuovoPath,
|
||||
|
||||
Reference in New Issue
Block a user