++ Prima versione del designer piantine + Skill grafica

This commit is contained in:
2026-08-28 15:32:14 +02:00
parent 8aa29cc467
commit 7e4c8aa9b8
62 changed files with 16340 additions and 4 deletions

View File

@@ -4,7 +4,7 @@ Stato del progetto per chi ci mette mano dopo. Per installazione, deploy e uso
quotidiano vedi [README.md](README.md); qui c'è il contesto che il README non
può dare: perché le cose sono come sono, e cosa resta aperto.
Ultimo aggiornamento: **30 luglio 2026**.
Ultimo aggiornamento: **31 luglio 2026**.
---
@@ -31,6 +31,14 @@ confrontando l'impronta degli asset). `MAX_UPLOAD_MB=2048` è impostato **solo**
su develop; la produzione non è stata toccata e resta sul suo deploy
precedente, senza quella variabile.
**Il 31/07 è nata la sotto-app "Piantine"** (nuova voce nel menu
Amministrazione): KML dell'area città, editor dei poligoni su OpenStreetMap,
immagini HD dal container `map-renderer` e PDF sul modulo S-12 con storico
versioni. Architettura e agganci sono descritti in [Decisioni
architetturali](#le-piantine-sono-una-sotto-app-renderer-esterno-agganci-minimi).
Al primo deploy il compose costruisce anche l'immagine del renderer; non
servono variabili nuove in Dokploy.
Il 30/07 sono state fatte due cose.
**La suite di test, che prima non esisteva**: 79 test eseguibili con un comando,
@@ -156,6 +164,38 @@ messaggio d'errore è più chiaro).
Deliberato: un errore immediato è meglio di un database in produzione con
password `secret`.
### Le piantine sono una sotto-app: renderer esterno, agganci minimi
La pagina **Piantine** (`/piantine`, solo amministratore) genera le mappe dei
territori: si carica il KML dell'area della città, si disegnano i poligoni su
OpenStreetMap (Leaflet), e da ogni poligono si ottiene un'immagine ad alta
definizione e — a scelta — il PDF sul modulo ufficiale S-12
(`resources/pdf/S-12_I.pdf`, importato con FPDI) che sostituisce quello del
territorio. Il PDF precedente finisce nella tabella `territorio_pdf_versioni`
ed è ripristinabile dalla stessa pagina.
Il rendering vero e proprio **non sta nell'applicazione**: lo fa il container
`map-renderer` (`docker/renderer/`, Node + sharp), che scarica le tessere OSM
(cache persistente nel volume `tile_cache`, User-Agent identificante,
attribuzione impressa sull'immagine come da licenza), le cuce, disegna il
confine e attenua l'esterno. L'app gli parla solo via HTTP sulla rete interna
(`config/piantine.php`, default `http://map-renderer:3000`: nessuna variabile
da aggiungere in Dokploy). Se il container è giù, l'unica cosa che smette di
funzionare è la generazione delle immagini; il resto del gestionale non lo sa
nemmeno.
Gli agganci al core sono deliberatamente pochi: la rotta nel gruppo
`settings.manage`, la voce di menu, e l'aggiornamento di
`pdf_path`/`thumbnail_path` sul territorio quando si sostituisce un PDF (stesso
percorso `territori-pdf/` + `TerritorioThumbnailService` dell'upload manuale).
Le geometrie vivono nella tabella separata `territorio_mappe`, l'area KML in
`storage/app/piantine/`: rimuovere la sotto-app significa togliere questi
pezzi, non disfare il gestionale.
La rigenerazione massiva (`Jobs/RigeneraPiantine`) usa lo stesso schema di
avanzamento di backup e import PDF (`PiantineOperationState`, cache + poll
della pagina, un'operazione alla volta).
### Modifica/cancellazione delle assegnazioni: solo amministratore
L'unico punto in cui un'assegnazione **esistente** si modifica o si cancella è