# DPass — Patch 61C
## Dashboard e operatività delle strutture prepagate

Base: progetto `dpass(1).zip` e relazione di continuità ricevuti il 19 settembre 2026, con 61B v2 già installata.
Destinazione iniziale: **solo progetto locale `~/progetti/dpass`**. Le produzioni si aggiornano successivamente da questo progetto.

### Cosa cambia

- Dashboard Strutture: filtro per struttura, targhe con sosta valida ora/+30/+60, disponibilità stimata, verifiche di accesso di oggi, ultime verifiche, ultime soste e soste in scadenza entro 60 minuti.
- Elenco strutture dedicato: filtri per nome/codice, stato, modalità di accesso e prepagato; capienza, targhe attive, posti stimati e stato della configurazione. Esportazione CSV del filtro.
- Monitoraggio dedicato delle soste nelle strutture: targa, struttura, fonte, stato, cortesia, inizio nel periodo e scadenza entro 30/60 minuti; CSV con gli stessi filtri.
- Le rotte dedicate impongono il tipo struttura sul server. Cambiare `area_type` nella query non può includere le soste su strada. Il filtro Azzera mantiene il modulo; anche il monitoraggio su strada conserva `area_type=street`.
- Il filtro Cortesia lasciato vuoto non esclude più implicitamente le soste di cortesia.
- Dashboard, elenco e report Disponibilità strutture adottano il medesimo calcolo normalizzato. Il report su strada mantiene il calcolo precedente.
- Collegamenti di configurazione mostrati soltanto agli utenti con `catalog.manage`.

### Cosa NON cambia

Nessuna migration e nessuna modifica allo schema o ai dati operativi. Non eseguire SQL per questa patch.
Nessuna modifica a `.env`, dipendenze, risorse compilate, tariffe, preventivi, acquisto, pagamenti, ricariche, abbonamenti, cron, API pubbliche, middleware di log API o decisioni di ingresso/uscita.
Il comportamento `verify` della 61B v2 non viene reinterpretato o modificato qui. Non si introducono pagamento all'uscita, presenza fisica, permanenze aperte né apertura delle sbarre.

## Applicazione locale

Salvare lo ZIP in `C:\Users\massi\Downloads` e incollare in Ubuntu/WSL **l'intero blocco**, comprese le parentesi. Il sottoprocesso evita che un errore chiuda la shell interattiva.

```bash
(
  set -e
  cd ~/progetti/dpass
  PATCH_DIR="$(mktemp -d /tmp/dpass_patch_61C.XXXXXX)"
  unzip -q /mnt/c/Users/massi/Downloads/dpass_patch_61C_strutture_operative.zip -d "$PATCH_DIR"
  bash "$PATCH_DIR/apply_patch.sh" "$PWD"
)
```

Lo ZIP contiene direttamente `apply_patch.sh`: non è presente un ulteriore livello di cartelle.
Non servono `composer install`, `npm run build` o `php artisan migrate`.

### Comportamento dell'installer

1. Verifica PHP >= 8.3, progetto Laravel, dipendenze vendor e marcatore della 61B.
2. Verifica SHA-256 del pacchetto, hash della base e dipendenze direttamente interessate. Non accetta file diversi dalla base o dal risultato esatto della 61C. **Non forzare un conflitto.**
3. Esegue controlli sintattici, crea un backup dei soli file da aggiornare e sostituisce i file con scritture atomiche.
4. Esegue i test isolati: calcoli, rotte e Blade; se il PHP CLI ha `pdo_sqlite`, aggiunge query, controller, pagine e CSV su un database SQLite **in memoria**. Se l'estensione manca, lo segnala esplicitamente senza modificare PHP o il database applicativo.
5. In caso di test falliti ripristina i file precedenti. Non sovrascrive cambiamenti concorrenti non riconosciuti: in quel caso segnala il backup e interrompe il ripristino per proteggere le modifiche.
6. Pulisce esclusivamente le cache generate di configurazione, rotte, eventi e viste. Mantiene `packages.php`, `services.php`, `.gitignore`, cache applicativa, sessioni e documenti.
7. Scrive `storage/app/patches/dpass_patch_61C.json`.

Backup: `storage/app/patch-backups/dpass_patch_61C_<data>_<identificatore>/`.
Seconda applicazione sulla stessa versione: controlli e test, nessuna sovrascrittura e nessun nuovo backup.
I test non eseguono le migration storiche del progetto e non leggono o modificano il database locale/produzione. Usano dati sintetici e configurazione di test isolata; non inviano email o pagamenti.

Per il solo controllo preliminare, dopo aver estratto il pacchetto:

```bash
bash /percorso/estrazione/apply_patch.sh "$HOME/progetti/dpass" --check
```

## Collaudo locale consigliato

Entrare in Gestione Strutture del Comune in uso. Il servizio deve essere abilitato e deve esserci almeno una struttura attiva: la patch non abilita servizi automaticamente.
Controllare filtro dashboard, elenco, soste attive, scadenze e CSV. Verificare una struttura con capienza e una senza capienza: nella seconda la disponibilità è «—», non zero. Confrontare dashboard e report Disponibilità strutture a parità di filtro e di istante.
Controllare che Azzera resti nelle strutture e che Gestione Sosta continui a mostrare le soste su strada. Verificare anche un operatore senza permessi di configurazione.

Rotte:

- `/_dpass/admin/moduli/strutture` — dashboard;
- `/_dpass/admin/strutture/elenco` — elenco operativo e disponibilità;
- `/_dpass/admin/strutture/soste` — monitoraggio dedicato;
- `/_dpass/admin/strutture/verifiche-accesso` — registro 61B invariato.

### Significato dei conteggi

Il totale «targhe con sosta valida» è deduplicato sull'insieme delle strutture filtrate; le righe per struttura sono deduplicate all'interno di ciascuna struttura. Una targa presente in due strutture può comparire in entrambe le righe ma una volta sola nel totale generale.

Solo gli stati `active`/`scheduled` con inizio <= adesso e scadenza effettiva > adesso concorrono alla stima. Un titolo non ancora iniziato, non pagato, annullato o interrotto prima di adesso è escluso.

+30/+60 considerano **le targhe già attive adesso**, mantenendo la scadenza più lontana per i titoli sovrapposti della stessa targa. Non sono previsioni di nuovi ingressi. La scadenza esatta coincide con la fine di validità: un titolo che termina alle 12:30 non è ancora attivo alle 12:30.

Per ogni struttura configurata: `MAX(capienza - targhe attive distinte, 0)`. Il totale dei posti disponibili somma queste disponibilità, senza compensare l'eccedenza di una struttura con i posti di un'altra. Le strutture senza capienza restano fuori dal calcolo dei posti disponibili.

Gli abbonamenti e le chiamate API non sono presenze fisiche. Le verifiche ripetute rimangono chiamate distinte nel contatore giornaliero. Il fuso indicato è quello del Comune, con fallback al tenant e alla convenzione del progetto.

Il numero di tariffe attive descrive la configurazione: non certifica che la tariffa sia selezionabile in ogni giorno/orario. La selezionabilità resta governata dalle regole esistenti.

Gli importi delle soste non sono un nuovo riepilogo degli incassi finanziari; non sommare ricariche e consumi wallet.

## Produzione, soltanto dopo il collaudo locale

Fare backup dei file interessati. **Non c'è SQL 61C da eseguire.** La produzione deve però essere già allineata alla base 61B v2, compresa la sua precedente modifica del database.
Caricare dal progetto locale aggiornato soltanto i file elencati in `FILES_PRODUZIONE.txt`, preservando i percorsi e unendo le cartelle. Non sostituire il progetto completo, non caricare vendor, `.env`, storage di backup o test.

Senza terminale, da File Manager eliminare eventuali `bootstrap/cache/config.php`, `bootstrap/cache/routes-v7.php`/altre cache rotte generate e i PHP compilati in `storage/framework/views` mantenendo `.gitignore`. Non eliminare `packages.php` o `services.php`. Con terminale sono sufficienti `config:clear`, `route:clear`, `view:clear`.

## Ripristino locale

Conservare lo ZIP. Estrarlo di nuovo quando serve. Dopo estrazione:

```bash
bash /percorso/estrazione/rollback.sh "$HOME/progetti/dpass"
```

Il backup viene individuato dal marcatore 61C. In caso di interruzione precedente alla creazione del marcatore, specificarlo:

```bash
bash /percorso/estrazione/rollback.sh "$HOME/progetti/dpass" "$HOME/progetti/dpass/storage/app/patch-backups/dpass_patch_61C_<nome_completo>"
```

Il ripristino verifica **tutti** i file prima di agire e si blocca se trova modifiche successive non riconosciute. Non interviene sul database. Per aggiornare una produzione dopo il ripristino locale, ripristinare anche i corrispondenti file in produzione seguendo il consueto flusso controllato.
