# DPass 61D2 — Prenotazioni strutture in giorni

Base: progetto locale dopo 61D1. Nessuna modifica al database applicativo.

## Comportamento
Nel solo percorso **Prenota ingresso**, una tariffa oraria con **Importo massimo (€)** positivo e **Periodo del massimale = 24 ore mobili** propone **Numero di giorni** (interi, minimo 1). Non esiste un nuovo interruttore da attivare: si usano i parametri già presenti.

Un giorno = 24 ore effettive a partire dall'ingresso. La data e l'ora d'ingresso restano selezionabili; una previsione della scadenza compare nel form nel fuso del Comune. Il server ricalcola sempre durata, scadenza e prezzo. Nei cambi fra ora legale e solare la scadenza locale può essere un'ora prima/dopo l'orario iniziale: le ore effettive restano 24.

Per le altre tariffe orarie il form continua a usare i minuti. Per le tariffe a importo fisso resta la validità definita dal prodotto, senza chiedere giorni o minuti.

Preventivo, elenco e dettaglio delle nuove prenotazioni giornaliere mostrano, per esempio, **2 giorni · 48 ore**. Le vecchie prenotazioni non vengono reinterpretate né ricalcolate.

## Tariffa: verificare la durata massima
In **Configurazioni → Tariffe**, il campo esistente **Durata massima complessiva (minuti)** resta espresso in minuti. Questa patch non lo aumenta automaticamente.

| Impostazione | Giorni interi acquistabili |
|---|---:|
| 1440 | 1 |
| 2880 | 2 |
| 4320 | 3 |
| 10080 | 7 |

Un limite non multiplo di 1440 si arrotonda per difetto per la scelta dei giorni. Un limite positivo inferiore a 1440 non consente un giorno intero: appare un avviso e l'acquisto di quella tariffa è bloccato, non esteso artificialmente. Se il massimo tariffario è vuoto rimane il limite tecnico d'ingresso preesistente: 527040 minuti, equivalenti a 366 giorni.

## Prezzo: un massimale per periodo, non per l'intera prenotazione
Esempio di collaudo senza soste precedenti, cortesia, pause o altre tariffe: tariffa continua €2/ora, massimo €10 ogni 24 ore. Uno, due e tre giorni costano rispettivamente €10, €20 e €30.

Il massimale NON diventa un prezzo fisso: a €0,20/ora con tetto €10, un giorno costa €4,80 e tre giorni €14,40.

Vengono riutilizzati calendario/gruppi, fasce, pause, festività, scaglioni e minimo del motore esistente. Per le componenti con massimale rolling_24h, il calcolo economico e il tetto vengono riavviati a ogni blocco di 24 ore dall'ingresso. Varianti con tetto per singola sosta o giorno solare conservano il rispettivo periodo. La cortesia iniziale è verificata e riservata **una sola volta per l'intera prenotazione**.

Resta una sola prenotazione, un solo pagamento e un solo titolo, anche per più giorni. Borsellino e PayPal diretto ricevono l'importo complessivo. Nessuna modifica a gateway/callback, cron o meccanismi contabili della 61D.

Il limite numerico degli ingressi della struttura continua a riferirsi alla **sola data di ingresso**. Non diventa un limite di occupazione su tutte le giornate della permanenza.

## Applicazione locale (WSL)
Salvare lo ZIP in `C:\Users\massi\Downloads`, poi incollare tutto il blocco:

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

Successo: `[61D2] PATCH 61D2 APPLICATA E VERIFICATA.`

L'installer richiede il marcatore 61D1, controlla gli hash della base nota, crea un backup e verifica sintassi e test isolati. Se un file è stato modificato localmente si ferma: **non forzare**. Il backup è in `storage/app/patch-backups/dpass_patch_61D2_*`; il marcatore è `storage/app/patches/dpass_patch_61D2.json`.

Non viene letto/scritto il database operativo dai test; con pdo_sqlite disponibile sono eseguiti anche i controlli su SQLite `:memory:`. Senza tale estensione sono eseguiti i controlli senza database e l'installer lo segnala chiaramente.

Non occorrono migration, Composer, NPM o nuove variabili `.env`. Si puliscono soltanto le viste Blade compilate.

## Preventivi aperti e ripristino
Un preventivo giornaliero non ancora acquistato, creato in precedenza in minuti, deve essere ricalcolato dopo la patch. Una prenotazione/pagamento già avviato o già confermato conserva il proprio snapshot, importo e periodo; il nuovo codice non modifica le transazioni esistenti.

In caso di errore dei test durante l'applicazione viene tentato il ripristino automatico dei file. Non si cancellano dati o si eseguono rollback del database. Per un ripristino manuale è disponibile `php /percorso/patch/install.php rollback "$HOME/progetti/dpass"`: usare soltanto dopo verifica, prima di ulteriori patch o vendite. Il ripristino si rifiuta di sovrascrivere modifiche successive. Conservare l'errore e il percorso del backup se il ripristino non è completo.

## Produzione: ancora nessun intervento
Prima collaudare il locale. Le produzioni restano aggiornabili dal locale tramite **File Manager/FTP cPanel e phpMyAdmin**, senza SSH o Terminal.

Lo SQL unico `dpass_strutture_database_cumulativo_61A_61B_61D_phpmyadmin.sql` è identico a quello della 61D, incluso per continuità. Non eseguirlo ora e non eseguire separatamente il vecchio 61B. Il futuro rilascio completo usa questo unico SQL, previa verifica e backup delle singole installazioni. Le patch 61D1 e 61D2 non aggiungono modifiche allo schema.

`FILES_PRODUZIONE_61D2.txt` elenca i file di questo intervento; `FILES_PRODUZIONE_CUMULATIVO_STRUTTURE.txt` aggiorna l'elenco completo. Usare sempre le copie dal locale collaudato, non sovrapporre vecchi payload alle produzioni.

## Collaudo suggerito
In una struttura di prova impostare una tariffa continua €2/ora, massimo €10, periodo 24 ore mobili e durata massima 4320. Verificare che il form permetta 1–3 giorni e prezzi 10/20/30. Provare 4 giorni (rifiutati), un pagamento wallet e uno PayPal sandbox, elenco/dettaglio e quota sul giorno di ingresso. Provare inoltre una tariffa ordinaria in minuti e una fissa, senza cambiamenti ai loro percorsi.

I dettagli dell'ambiente e dei limiti dei test sono in `VERIFICHE_E_LIMITI.md`.
