2026-10-06 10:18:22 +02:00
|
|
|
# DD-047 — Notifica di compleanno
|
|
|
|
|
|
|
|
|
|
**Data:** 6 ottobre 2026
|
2026-11-15 18:55:46 +01:00
|
|
|
**Stato:** Accettata (migration `m31`, non ancora applicata in produzione; nasce dalla issue #11 «notifica»)
|
|
|
|
|
**Codice:** `supabase/migrations/20261006120000_m31_notifica_compleanno.sql`
|
2026-10-06 10:18:22 +02:00
|
|
|
|
|
|
|
|
**Contesto**
|
|
|
|
|
I compleanni si vedono solo aprendo il Calendario, dove `compleanniEventi()` li calcola dalla data di
|
|
|
|
|
nascita pubblica (`giocatori_squadra.nascita`, DD-031). Nessun avviso arriva ad app chiusa. La issue #11
|
|
|
|
|
chiede una notifica del tipo «oggi è il compleanno di _tizio_».
|
|
|
|
|
|
|
|
|
|
**Decisione**
|
|
|
|
|
|
|
|
|
|
1. **Una notifica vera, automatica, su tutti e tre i canali** (DD-038): push, centro notifiche in-app ed
|
|
|
|
|
email. Nasce nel database come le altre notifiche automatiche (DD-040): un job `pg_cron` scrive in
|
|
|
|
|
`notifiche_utente`, il worker `mailer/` manda push ed email.
|
|
|
|
|
2. **Quando:** una volta al giorno, **dalle 8:00 (fuso `Europe/Rome`)**. Il job gira ogni ora e agisce solo
|
|
|
|
|
dalle 8 in poi; un registro ricorda a chi l'avviso del giorno è già stato generato, quindi un giro
|
|
|
|
|
mancato si recupera all'ora dopo e non si genera mai due volte.
|
|
|
|
|
3. **Chi compie gli anni** è chi ha `nascita` con lo stesso giorno e mese di oggi tra i membri **attivi**
|
|
|
|
|
della squadra (`giocatori_squadra.attivo`), allenatori compresi. Senza data di nascita o non attivo:
|
|
|
|
|
nessun avviso.
|
|
|
|
|
4. **Destinatari: tutti i membri attivi**, allenatori compresi (il compleanno è un fatto della squadra,
|
|
|
|
|
non una notifica di gioco: DD-039 non si applica). Due messaggi diversi, entrambi **senza l'età**:
|
|
|
|
|
- **il festeggiato** riceve **solo gli auguri**: titolo `Buon compleanno, <Nome>! 🎂`, **senza corpo**;
|
|
|
|
|
- **tutti gli altri** ricevono **solo l'avviso**: titolo `Oggi è il compleanno di <Nome>`, **senza corpo**.
|
|
|
|
|
5. **Più compleanni lo stesso giorno: un solo messaggio per destinatario.** Chi non compie gli anni riceve
|
|
|
|
|
un unico avviso con tutti i nomi: titolo `Oggi è il compleanno di <A> e <B>` (con tre o più: `A, B e C`,
|
|
|
|
|
in ordine alfabetico per nome), sempre senza corpo. Ogni festeggiato riceve **solo i propri auguri**,
|
|
|
|
|
senza i nomi degli altri.
|
|
|
|
|
6. **Registro.** Nuova tabella `compleanni_notificati (giocatore_id, giorno)`: una riga per destinatario e
|
|
|
|
|
giorno. Il registro, e non `notifiche_utente`, impedisce il doppione anche se il giocatore elimina la
|
|
|
|
|
notifica (stessa logica di DD-037). Il registro non è legato a un evento: i compleanni non sono
|
|
|
|
|
`eventi_app`.
|
|
|
|
|
7. **Tipi** (`CHECK` di `notifiche_utente`): `compleanno` (l'avviso agli altri) e `compleanno_auguri` (gli
|
|
|
|
|
auguri). Nessun pulsante manuale: la notifica parte solo dal job. Il trigger delle push accoda
|
|
|
|
|
entrambi; quello delle email li lascia passare, quindi arrivano anche per email.
|
|
|
|
|
8. **29 febbraio: per ora non gestito.** Chi è nato il 29 febbraio viene avvisato solo negli anni bisestili,
|
|
|
|
|
perché il confronto è tra giorno e mese. Negli altri anni non parte nulla (né il 28 febbraio né il 1°
|
|
|
|
|
marzo). È un limite noto, accettato: oggi non interessa nessuno in squadra.
|
|
|
|
|
|
|
|
|
|
**Alternative scartate**
|
|
|
|
|
|
|
|
|
|
- **Card in Home, senza push né migration** → più semplice, ma non avvisa chi non apre l'app: non è ciò che
|
|
|
|
|
chiede la issue.
|
|
|
|
|
- **Un messaggio per festeggiato anche a chi lo riceve da altri** → con due compleanni lo stesso giorno
|
|
|
|
|
sarebbero due notifiche e due mail al giorno per lo stesso destinatario.
|
|
|
|
|
- **Registro per `(destinatario, festeggiato, giorno)`** → serve solo a chi vuole due avvisi separati, che
|
|
|
|
|
abbiamo scartato; la chiave `(destinatario, giorno)` basta.
|
|
|
|
|
- **Allenatori esclusi** → scartata su indicazione esplicita: «tutti».
|
|
|
|
|
- **Gestire il 29 febbraio il 28 febbraio** → rimandato (punto 8).
|
|
|
|
|
|
|
|
|
|
**Conseguenze**
|
|
|
|
|
|
|
|
|
|
- Ogni giorno con un compleanno ogni membro attivo riceve una notifica e, se ha account, email e le email
|
|
|
|
|
accese, una mail. Con molti compleanni nello stesso periodo il tetto giornaliero di invio del worker
|
|
|
|
|
(`mailer/`) può farsi sentire: il compleanno non ha priorità sulle altre mail.
|
|
|
|
|
- Chi inserisce la propria data di nascita **il giorno stesso** del compleanno, dopo le 8 e dopo che gli
|
|
|
|
|
altri sono già stati avvisati, non genera un secondo avviso (il registro ha già il giorno per i
|
|
|
|
|
destinatari). Chi la inserisce prima delle 8 viene incluso.
|
|
|
|
|
- Un nuovo membro che si aggiunge dopo l'avviso della giornata non riceve quello del giorno.
|
|
|
|
|
- Il compleanno resta anche in Calendario, invariato.
|
|
|
|
|
|
|
|
|
|
**Riesame**
|
|
|
|
|
Se le mail di compleanno risultano troppe, spegnerle e tenere solo push e centro notifiche (come il turno
|
|
|
|
|
palloni, DD-040). Se in squadra arriva qualcuno nato il 29 febbraio, gestire quel caso (punto 8).
|