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:
122
HANDOFF.md
122
HANDOFF.md
@@ -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: **28 agosto 2026**.
|
||||
Ultimo aggiornamento: **12 ottobre 2026** — vedi [Lavori in corso](#lavori-in-corso--12-ottobre-2026-riprendere-da-qui).
|
||||
|
||||
---
|
||||
|
||||
@@ -75,6 +75,74 @@ e l'unica che richiede una decisione, non del lavoro.
|
||||
|
||||
---
|
||||
|
||||
## Lavori in corso — 12 ottobre 2026 (riprendere da qui)
|
||||
|
||||
### Già fatto e committato su `dev` (commit `d433c93`, NON ancora pushato)
|
||||
|
||||
- **Modulo S-13** riscritto su modulo ufficiale (FPDI), regole decise con l'utente:
|
||||
20 righe/foglio, tutti i territori attivi, ciclo da 4 con riporto, riporto
|
||||
iniziale = ultimo rientro prima dell'anno, assegnazioni a cavallo d'anno su
|
||||
entrambi i fogli (sul vecchio senza rientro), nomi "Cognome I.", scelta per
|
||||
data. Codice in `app/Services/Registro/ModuloS13.php`.
|
||||
- **Blocco 1 della revisione** (integrità dati): date export/import che
|
||||
slittavano di un giorno, import XML che accettava file estranei, caratteri di
|
||||
controllo, territori senza zona scartati, admin estromesso dall'import,
|
||||
doppia assegnazione (`Assegnazione::sovrappostaA()` + lock), ultimo admin,
|
||||
`APP_KEY` sovrascritta dall'entrypoint (`APP_KEY_ROTATE=1`). Vedi la tabella
|
||||
"Bug corretti". Suite: 328 test verdi.
|
||||
- Il push su `dev` fa partire il deploy su demo: va fatto quando si decide.
|
||||
|
||||
### Finito, NON ancora committato: riprogettazione dell'Editor Piantine
|
||||
|
||||
Decisioni dell'utente: due pagine separate (gestione / editor); **un solo
|
||||
pulsante "Pubblica"** (immagine + PDF) con **anteprima obbligatoria** da
|
||||
confermare, disponibile da editor e gestione; dall'editor **si modificano i
|
||||
dati del territorio** (salvati subito nel gestionale); uso soprattutto da PC ma
|
||||
anche **tablet**; **stato di bozza**: in bozza va solo il disegno, salvata
|
||||
**automaticamente**; stati Bozza / Pubblicata / Modifiche da pubblicare.
|
||||
Come funziona: sezione [Le piantine sono una sotto-app](#le-piantine-sono-una-sotto-app-renderer-esterno-agganci-minimi).
|
||||
|
||||
Stato al 12/10/2026:
|
||||
- Codice completo: modello, servizio di pubblicazione + job, finestra condivisa,
|
||||
editor e gestione riscritti, JS e CSS. Migrazione
|
||||
`2026_10_09_000010_bozza_e_pubblicazione_piantine`.
|
||||
- Test: `PiantineEditorTest` (22), `PiantineManagerTest`,
|
||||
`PubblicazionePiantinaTest` (nuovo). Suite intera: **360 test verdi**.
|
||||
- Provato in browser (Playwright + Edge, in locale) su PC 1440, iPad
|
||||
orizzontale e verticale, iPhone: disegno, modifica vertici (8 maniglie su
|
||||
poligono), collegamento, anteprima generata dal renderer vero, conferma,
|
||||
stato "Pubblicata", filtri della gestione. Corretti lì: tendina territori che
|
||||
segnava tutti "(disattivato)" (colonna `attivo` non caricata), zoom sopra la
|
||||
ricerca dell'elenco, barra strumenti sopra il pannello su tablet e fuori
|
||||
schermo su telefono, crediti mappa stampati sul foglio del pannello.
|
||||
- Aggiunto `.gitattributes` (`*.sh text eol=lf`): con `core.autocrlf=true`
|
||||
l'entrypoint usciva con CRLF e il container locale non partiva ("no such
|
||||
file or directory"). Nel repository era già LF: il deploy non era a rischio.
|
||||
- **Non provato:** modifica vertici al tocco su un tablet vero, MultiPolygon
|
||||
in modifica vertici (si modifica il primo poligono).
|
||||
- Visto e **non** corretto (fuori tema): su telefono la barra superiore
|
||||
dell'app trabocca con nome/email lunghi ("Esci" fuori schermo);
|
||||
`/favicon.ico` risponde 404.
|
||||
|
||||
### Revisione profonda: blocchi ancora aperti
|
||||
|
||||
- **Blocco 2:** avvisi in tutte le ~10 pagine che oggi li perdono (usare il
|
||||
trait `Avvisa`); PDF dei territori serviti da nginx su `/storage` senza
|
||||
autenticazione (spostare su disco privato); ripristino non atomico e blocco
|
||||
"una sola operazione" ignorato da import XML/PDF; piantine e storico PDF
|
||||
assenti dal backup; import PDF da cartella (`1-A` sovrascrive `1`, solo 20
|
||||
file per `max_file_uploads`, `Thumbs.db` blocca tutto, `12 B` ambiguo).
|
||||
- **Blocco 3:** `/cambia-password` senza password attuale, sessioni non
|
||||
invalidate, `trustProxies('*')`, nomi in chiaro nell'activity log, export XML
|
||||
con hash/token, campagne (ultimo giorno, percentuali), `retry_after` 90 s,
|
||||
`stop_grace_period` del worker, Redis `allkeys-lru`, cache statica di
|
||||
`Setting` nel worker, azzeramento che lascia piantine e KML.
|
||||
- Produzione: al 12/10/2026 non esiste ancora (il sito gira in Docker sul PC
|
||||
di sviluppo, più la demo da `dev`). Nessuna correzione una tantum delle date
|
||||
slittate da fare.
|
||||
|
||||
---
|
||||
|
||||
## Da dove veniamo
|
||||
|
||||
Il progetto aveva un difetto strutturale nel deploy: il `Dockerfile` compilava
|
||||
@@ -212,13 +280,48 @@ non esiste, lo si crea dall'editor col solo numero. La chiave esterna è
|
||||
`nullOnDelete`, non più `cascadeOnDelete`: cancellare un territorio, o svuotare
|
||||
`territori` come fa ogni import XML, non porta più via i disegni.
|
||||
|
||||
**Due pagine, non una.** `/piantine` tiene area, generazione, collegamenti e
|
||||
storico; `/piantine/editor` è l'editor a schermo intero, con un telaio suo
|
||||
(`layouts/editor`) senza barra laterale. Tagliare un confine su una mappa larga
|
||||
un terzo di schermo vuol dire sbagliarlo, e quel disegno finisce stampato.
|
||||
**Due pagine, non una.** `/piantine` è il quadro d'insieme: stato di ogni
|
||||
piantina con ricerca e filtri (tutte / bozze / da pubblicare / pubblicate /
|
||||
scollegate), area KML e storico dei PDF sostituiti (paginato). Da lì si apre,
|
||||
si pubblica e si elimina. `/piantine/editor` è l'editor a schermo intero, con
|
||||
un telaio suo (`layouts/editor`) senza barra laterale: tagliare un confine su
|
||||
una mappa larga un terzo di schermo vuol dire sbagliarlo. Elenco e pannello
|
||||
galleggiano sopra la mappa; barra strumenti e controlli Leaflet si spostano
|
||||
nello spazio libero (variabili `--libero-sx`/`--libero-dx`); sotto i 720px il
|
||||
pannello sale dal basso. Su tablet i vertici sono più grandi (`pointer: coarse`).
|
||||
|
||||
La rigenerazione massiva è stata tolta: job, stato in cache e interfaccia. Si
|
||||
rigenera un territorio alla volta dall'elenco.
|
||||
**Bozza e pubblicazione (ottobre 2026).** Nell'editor tutto si salva da solo:
|
||||
il confine a ogni disegno o spostamento di vertice, nome e collegamento appena
|
||||
cambiano. È bozza: il PDF del territorio non si tocca. I dati del territorio
|
||||
(numero, zona, tipologia, confini) sono invece dati del gestionale e si salvano
|
||||
subito, colonna per colonna (un campo non valido non trascina gli altri). Il
|
||||
PDF cambia solo con **Pubblica**, uguale in editor e gestione
|
||||
(`Livewire\Piantine\Pubblicazione`): `PubblicazionePiantina::avvia()` mette in
|
||||
coda `PreparaAnteprimaPiantina` (il primo rendering può superare i 100 s di
|
||||
Cloudflare), che genera immagine e PDF sul disco **privato**
|
||||
(`storage/app/piantine-anteprime/`, stato in cache sotto un token di 40
|
||||
caratteri, servito da `piantine.anteprima`); la finestra controlla ogni 2 s e
|
||||
mostra il PDF; solo **Conferma** lo rende ufficiale. Se nel frattempo è cambiato
|
||||
qualcosa di stampato, la conferma rifiuta.
|
||||
|
||||
Gli stati (`TerritorioMappa::stato()`): **Bozza** (mai pubblicata),
|
||||
**Pubblicata**, **Modifiche da pubblicare**. Il confronto è sull'`impronta()`:
|
||||
sha256 di confine, territorio, numero, nome della zona e confini — cambia uno
|
||||
qualunque e la piantina torna da pubblicare anche col disegno identico. Vale
|
||||
"Pubblicata" solo se anche il PDF in uso è ancora uno composto da una piantina
|
||||
(`territori-pdf/piantina-{territorio}-…`): un ripristino dallo storico, un
|
||||
upload a mano o un import la riportano "da pubblicare". "Ripristina il confine
|
||||
pubblicato" riporta la bozza a `geojson_pubblicato`. La migrazione
|
||||
`2026_10_09_000010` ha segnato pubblicate le piantine esistenti solo se il PDF
|
||||
in vigore del territorio veniva da una piantina.
|
||||
|
||||
Disegnare crea **sempre** una piantina nuova; per cambiare quella aperta ci
|
||||
sono "Modifica vertici" e "Ridisegna confine", espliciti. Con la mappa si
|
||||
parla per eventi: i dati di tutte le piantine li chiede il JS una volta
|
||||
(`datiMappa()`), poi arriva solo la piantina cambiata (`piantina-aggiornata`).
|
||||
Gli avvisi passano dall'evento `avviso` (trait `Livewire\Concerns\Avvisa`,
|
||||
componente `<x-avvisi>`): i flash di sessione nel telaio non si vedono dopo
|
||||
un'azione Livewire.
|
||||
|
||||
**La cartolina e la piantina sono due pagine distinte.** Il riquadro dell'S-12 è
|
||||
largo sette centimetri: una mappa di quartiere lì dentro non si legge. Quindi
|
||||
@@ -234,11 +337,6 @@ nome divergono prima o poi, e sulla carta finisce quello sbagliato. L'elenco
|
||||
marca i territori collegati senza zona: senza, l'intestazione della cartolina
|
||||
esce vuota e ce se ne accorge in stampa.
|
||||
|
||||
**L'anteprima non tocca niente.** `piantine.anteprima` compone il PDF al volo e
|
||||
lo serve `inline`: non aggiorna `pdf_path`, non archivia versioni, non lascia
|
||||
file. «Genera PDF» manda il documento in vigore, e scoprire un confine sbagliato
|
||||
dopo significa trovarselo già nello storico.
|
||||
|
||||
**L'immagine è JPEG, sovracampionata e nella forma della pagina.** Tre scelte
|
||||
che vanno lette insieme (`config/piantine.php`, `docker/renderer/server.js`):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user