diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index 7566407..1ec9398 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -11,8 +11,9 @@ amministratore e Profilo Giocatore (lato giocatore e lato admin) sono in produzi Foto profilo (M6) e Scout Live (M7) non dipendono più da `localStorage`: entrambi ora sincronizzano tra dispositivi tramite Supabase. Le serie di presenze sono calcolate sui dati reali (M9). Prima versione pre-release rilasciata (0.9.0); la prima versione stabile, 1.0.0, ha -portato il ruolo allenatore. La versione corrente è la 1.2.0: notifiche su tre canali (push, in-app -ed email) e promemoria che non si ripetono (vedi `docs/CHANGELOG.md`). +portato il ruolo allenatore. La versione corrente è la 1.2.1: notifiche su tre canali (push, in-app +ed email), promemoria che non si ripetono, turno palloni e solleciti presenze automatici (vedi +`docs/CHANGELOG.md`). Cancellare un evento pulisce ora a cascata tutte le tabelle collegate (M14) e le righe orfane da cancellazioni precedenti a M14 sono state bonificate una tantum (M15/M16). @@ -25,10 +26,8 @@ da cancellazioni precedenti a M14 sono state bonificate una tantum (M15/M16). - Cursor e Claude Code come ambienti di sviluppo - Vercel configurato; Environment Variables aggiornate al nuovo Supabase (Preview e Production) - Supabase proprietario attivo — Project Ref: `kfkcldwncxqaixetsjes` -- 37 migration in `supabase/migrations/`, fino a `m26_notifiche_automatiche` (30/09/2026). - Le prime 36 (fino a `m25_promemoria_solo_giocatori`) sono applicate in produzione, verificato con - `npx supabase migration list` il 30/09/2026; **`m26` è verificata solo in locale e non ancora - applicata in produzione** +- 37 migration in `supabase/migrations/`, fino a `m26_notifiche_automatiche` (30/09/2026), tutte + applicate in produzione, verificato con `npx supabase migration list` il 30/09/2026 - Worker delle notifiche email (`mailer/`) in funzione su un Raspberry Pi con Docker dal 29/09/2026: invia via Gmail le notifiche di `notifiche_utente`. Installazione e gestione in [docs/WORKER_EMAIL.md](docs/WORKER_EMAIL.md); il codice con l'interruttore «Email» in Profilo è @@ -207,15 +206,10 @@ collega uno slot lo occupa anche in produzione, e va liberato da un admin. ## Prossimo sviluppo -Niente di assegnato: l'avviso certificati in scadenza (DD-035, 1.1.0) e le notifiche su tre -canali (DD-036–DD-039, 1.2.0) sono implementati (vedi `docs/CHANGELOG.md`). Le voci ancora aperte stanno in +Niente di assegnato: l'avviso certificati in scadenza (DD-035, 1.1.0), le notifiche su tre +canali (DD-036–DD-039, 1.2.0) e quelle automatiche di palloni e solleciti (DD-040, 1.2.1) sono implementati (vedi `docs/CHANGELOG.md`). Le voci ancora aperte stanno in [docs/ROADMAP.md](docs/ROADMAP.md), sotto «Prossimo». -Implementato e verificato in locale, non ancora rilasciato: notifiche automatiche per turno palloni -(12, 6 e 3 ore prima, senza email, con revoca dell'incarico), solleciti presenze (24, 12 e 6 ore prima) e -promemoria con «oggi/domani» (DD-040, migration `m26`, da applicare in produzione). I pulsanti «Avvisa chi -è di turno» e «Sollecita» restano. - --- ## Note diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a4f9a34..91db9c1 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -13,28 +13,54 @@ versioni `0.y.z` erano pre-release. ## [Non rilasciato] -Le notifiche di turno palloni e sollecito presenze partono anche da sole, e i testi sono più formali. -La migration `m26` è verificata in locale e va applicata in produzione insieme a questa versione (DD-040). +## [1.2.1] - 2026-09-30 + +Turno palloni e sollecito presenze partono anche da soli, a orari fissi prima dell'evento, e i testi di +tutte le notifiche legate agli eventi sono più formali e completi (DD-040). La migration `m26` è applicata in +produzione dal 30/09/2026; questa versione porta il codice dell'app che la accompagna. ### Aggiunto - **Turno palloni automatico** — 12, 6 e 3 ore prima di allenamenti e partite con un incaricato confermato, - all'incaricato e a chi aveva i palloni all'evento precedente. Se l'incaricato cambia, chi era stato avvisato - riceve una sola volta «Turno palloni: incarico revocato». Arriva come push e nel centro notifiche, non per - email. -- **Sollecito presenze automatico** — 24, 12 e 6 ore prima dell'evento, ai convocati che in quel momento non - hanno risposto o hanno risposto «forse»; chi risponde smette di riceverlo. Un evento creato tardi riceve solo - il sollecito della sua fascia. -- Nuovo test di integrazione `notifiche-automatiche` sui job veri del database, più test unitari dei testi e - dei destinatari. + all'incaricato («incarico assegnato») e a chi aveva i palloni all'evento precedente («riconsegna»), se è + un'altra persona. Se l'incaricato cambia, chi era stato avvisato riceve una sola volta «Turno palloni: + incarico revocato». Arriva come push e nel centro notifiche, non per email. Il pulsante «Avvisa chi è di + turno» resta. +- **Sollecito presenze automatico** — 24, 12 e 6 ore prima dell'evento, ai convocati (o a tutta la rosa + attiva se non ce ne sono) che in quel momento non hanno risposto o hanno risposto «forse», mai + all'allenatore; chi risponde smette di riceverlo. Un evento creato tardi riceve solo il sollecito della sua + fascia. Push, notifica in app ed email. Il pulsante «Sollecita» resta. +- **Migration `m26_notifiche_automatiche`** — tipi di notifica nuovi (`turno_palloni_12h`, `_6h`, `_3h`, + `turno_palloni_revocato`, `sollecita_presenze_24h`, `_12h`, `_6h`), funzioni SQL dei job e due job + `pg_cron` ogni 15 minuti (`avvisi-palloni-automatici`, `solleciti-presenze-automatici`), riservati alla + service role. Ogni notifica automatica si genera una sola volta per giocatore, evento e tipo, anche se + viene eliminata (registro `promemoria_eventi_generati`). Le fasce sono contigue: un evento creato tardi + non riceve tutte le notifiche insieme. +- **Test** — nuovo test di integrazione `notifiche-automatiche` (26 prove) sui job veri del database: + finestre, destinatari, doppioni, revoca, code push ed email, permessi, pianificazione, e confronto con i + testi e l'ordine del codice TypeScript. Nuovi test unitari di testi, destinatari, date e a capo delle + notifiche; aggiornati i test di promemoria, code push ed email, worker e route dei pulsanti. +- **Documentazione** — DD-040 in `DESIGN_DECISIONS.md`; sezione «Testi delle notifiche» nel catalogo di + `modules/notifiche.md`; tabella delle funzioni SQL e dei job in `DATABASE.md`. ### Modificato -- **Testi delle notifiche** — promemoria con «domani» o «oggi», data, ora e luogo; turno palloni e sollecito - con righe etichettate (Evento, Data, Ora, Luogo, Incarico, Azione). Stessi testi per i pulsanti e per i job. -- **Sollecito manuale** — il pulsante «Sollecita» ora segue i convocati dell'evento, come l'automatico, invece - di tutti i giocatori attivi; il testo dice la risposta attuale e chi lo ha chiesto. -- Le righe del corpo di una notifica vanno a capo nel centro notifiche. +- **Testi delle notifiche** — i promemoria a 24 e 3 ore dicono «domani» se l'evento è domani, «oggi» + altrimenti, con data, ora e luogo. Turno palloni e sollecito hanno righe etichettate (Evento, Data, Ora, + Luogo, Incarico, Azione). Stessi testi per i pulsanti e per i job. I promemoria già generati non cambiano. +- **Sollecito manuale** — il pulsante «Sollecita» ora segue i convocati dell'evento, come l'automatico, + invece di tutti i giocatori attivi; il testo dice la risposta attuale e chi lo ha chiesto. Il turno + palloni manuale non parte più per email. +- **Turno palloni manuale** — senza un incaricato per l'evento non parte più nessun avviso, nemmeno quello + di riconsegna, come già descritto nel catalogo. +- **Ordine degli eventi dei palloni** — data, poi ora, poi id (prima solo la data): «evento precedente» e + «successivo» coincidono con quelli dei job del database. +- **Centro notifiche** — le righe del corpo di una notifica vanno a capo. +- Il sollecito e il turno palloni non sono più descritti come «solo manuali» nel catalogo delle notifiche. + +### Corretto + +- `PROJECT_STATE.md` dava `m23`–`m25` come non applicate in produzione: lo sono dal 29/09/2026. ## [1.2.0] - 2026-09-29 diff --git a/package.json b/package.json index 505bffc..4c9380c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "crapp", - "version": "1.2.0", + "version": "1.2.1", "private": true, "sideEffects": false, "type": "module",