# DPass 61E — Grafici dashboard principale

Base richiesta: locale `~/progetti/dpass` aggiornato e collaudato fino alla 61D8.
Modifica solo `/_dpass/admin`: nessun nuovo endpoint e nessuna modifica agli acquisti.

## Funzioni
Un selettore condiviso 7 / 30 / 90 giorni (default 30), giorni di calendario compreso oggi.
- Soste su strada per data di inizio: titoli unici, nessun doppio conteggio dei prolungamenti.
- Ingressi strutture per data di ingresso: titoli emessi, NON eventi fisici e NON chiamate API.
  Una prenotazione di più giorni conta una volta. Una vendita futura conta nei volumi soltanto alla sua data d'ingresso.
- Prime attivazioni e rinnovi: periodi pagati per data di emissione, separati per tipologia.
- Valore dei servizi venduti: strada, strutture e abbonamenti. Nessuna somma delle ricariche wallet.
Totali e media giornaliera; tabella espandibile con i valori di ogni giorno. Grafici a barre, navigabili
anche da tastiera; dettaglio su passaggio/tocco e tabella utilizzabile anche senza JavaScript.
La giornata in corso è parziale. Il periodo non cambia i contatori di oggi o quelli attivi ora.

Le card attive di strada e strutture ora hanno conteggi separati. La vecchia dicitura «Incassi di oggi»
diventa «Servizi venduti oggi · netto», coerente con la metrica: non è un riepilogo dei movimenti finanziari.
Restano gli accessi ai moduli e i riepiloghi delle richieste/abbonamenti, subordinati ai permessi.

## Ambito e sicurezza
Dati del tenant e Comune selezionati; controlli sul server. I gruppi dipendono dai servizi attivi.
Il grafico strutture richiede, come il modulo, almeno una struttura attiva; le strutture/aree disattivate
restano incluse nello storico del modulo quando esso è disponibile. Se un servizio è disattivato,
i relativi dati non concorrono ai nuovi grafici né ai totali economici della Home.
Contatori operativi: `parking.monitor`; rinnovi: `subscriptions.review` e funzione abbonamenti abilitata;
importi: `reports.view` oppure `payments.view`. Senza permessi economici gli importi non vengono
interrogati o inviati all'HTML, non soltanto nascosti con CSS.
Nessun dato individuale (targhe, nomi, email) viene incluso nelle serie.

## Convenzioni di calcolo
Gli stati di sosta conteggiati sono active, scheduled, expired, completed, stopped.
Titoli collegati a una prenotazione non confermata, tentativi pending_payment, failed e cancelled esclusi.
Soste gratuite e importate incluse. Non si deduplicano targhe distinte: il volume misura i titoli,
non i veicoli unici. Abbonamenti e chiamate di verifica non sono ingressi fisici.

Vendite native: data di pagamento, poi movimento wallet, poi creazione titolo se il riferimento manca.
Vendite esterne: inizio sosta, non data d'importazione. Il valore iniziale esclude i prolungamenti
confermati; ogni prolungamento viene sommato alla sua data di pagamento/creazione, una sola volta.
Abbonamenti: payment_received_at / issued_at / created_at. I rimborsi seguono updated_at, come la
convenzione del riepilogo contabile attuale: non viene creato un nuovo registro rimborsi e un successivo
aggiornamento del record può modificare quell'attribuzione storica. Importi negativi sono rappresentati.
La revoca amministrativa di un servizio non è automaticamente un rimborso finanziario.
Il grafico non sostituisce il riepilogo contabile né costituisce una rilevazione degli accessi fisici.

I giorni si calcolano nel fuso del Comune (ripiego tenant/app); i limiti per le query vengono convertiti
nel fuso di memorizzazione `config('app.timezone')`, come nei servizi di prenotazione e controllo accessi.
Le query aggregano sul database, riempiono i giorni senza movimenti con zero e restituiscono al massimo
90 righe per serie. Non dipendono da CONVERT_TZ, tabelle fusi MySQL, CTE o funzioni esclusive MySQL 8.

## Installazione locale
Scaricare lo ZIP in `C:\Users\massi\Downloads`. In WSL:

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

L'installer controlla integrità, marcatore 61D8 e hash di base; esegue backup, copia controllata,
test isolati e pulizia delle viste compilate standard. Se un file non è riconosciuto si ferma.
Se fallisce un controllo dopo la copia tenta il ripristino automatico senza sovrascrivere modifiche successive.
Il database applicativo non viene aperto dai test: quelli database, quando pdo_sqlite è presente,
usano solo SQLite :memory:. In assenza dell'estensione viene segnalato esplicitamente il salto di quella suite.

Preflight senza applicazione: `bash apply_patch.sh ~/progetti/dpass --check`.
Ripristino: `bash rollback.sh ~/progetti/dpass` (verifica le modifiche successive prima di procedere).
Nessuna migration, modifica .env, cron, Composer, NPM o compilazione frontend.
Non viene eseguito `migrate`, `migrate:rollback`, `db:wipe`, nessuno SQL di produzione.

## Collaudo
Aprire `/_dpass/admin`, provare 7/30/90 giorni, le tabelle espandibili e il cambio Comune.
Verificare che una prenotazione di tre giorni conti una volta sulla data d'ingresso; un titolo futuro
pagato oggi deve risultare nelle vendite oggi ma non negli ingressi dei giorni futuri fuori periodo.
Verificare ruoli con/senza permessi economici, un Comune senza strutture e un periodo senza movimenti.
Confrontare la dashboard con i dati del proprio MySQL, in particolare importazioni, prolungamenti e rimborsi.

## Produzione
Prima collaudo locale. Usare File Manager/FTP cPanel e phpMyAdmin, senza Terminal o SSH.
La 61E non richiede SQL; il cumulativo 61A/61B/61D è incluso identico per il rilascio complessivo futuro.
Non eseguire separatamente il vecchio SQL 61B. Vedere CPANEL_RILASCIO_61E.md e gli elenchi allegati.
