diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md new file mode 100644 index 0000000..4d7a076 --- /dev/null +++ b/.planning/REQUIREMENTS.md @@ -0,0 +1,68 @@ +# Requirements: ClientHub v2.3 Email & Accesso + +**Defined:** 2026-06-21 +**Core Value:** Il cliente apre il link e vede esattamente a che punto è il suo progetto, cosa deve ancora succedere e cosa ha già approvato — senza dover scrivere email per chiedere aggiornamenti. + +## v2.3 Requirements + +### Email OTP Gate (AUTH-OTP-01) + +Portale cliente blindato da email OTP. Nuovo `client_emails` table (whitelist) + `otp_codes` table (codice, email, expires_at, consumed). Resend come provider email. Sessione 30gg con cookie dopo verifica. + +- [ ] **OTP-01**: Admin può aggiungere e rimuovere email dalla whitelist di ogni cliente nell'admin UI +- [ ] **OTP-02**: Cliente senza sessione OTP vede una schermata "inserisci email" invece della dashboard +- [ ] **OTP-03**: Sistema invia OTP via Resend solo se l'email inserita è nella whitelist di quel cliente +- [ ] **OTP-04**: Cliente inserisce il codice OTP ricevuto e ottiene sessione autenticata (cookie 30 giorni) +- [ ] **OTP-05**: Codici OTP scadono dopo 15 minuti dall'invio +- [ ] **OTP-06**: Endpoint OTP è rate-limited per prevenire brute force +- [ ] **OTP-07**: Messaggi di errore OTP non rivelano se l'email è in whitelist o no (no enumeration) + +### Invio Link Preventivo via Email (PUB-03) + +Admin invia link deck pubblico al lead direttamente dall'admin UI. Usa stessa infrastruttura Resend del OTP gate. + +- [ ] **SEND-01**: Admin può inviare link `/preventivo/[slug]` via email al lead con un'azione dall'admin UI +- [ ] **SEND-02**: Email inviata via Resend include link deck + nome cliente, template minimale in italiano + +## v2.4+ Backlog + +### Conversione Commerciale + +- **PROP-03**: Stripe Payment Link su deck pubblico `/preventivo/[slug]` +- **PROP-04**: Auto-provisioning cliente/progetto/fasi al "Vinto" nel CRM + +### Post-Vendita + +- **Phase 13**: Gestione servizi attivi/ricorrenti post-vendita nel portale cliente (congelata da v2.1) + +## Out of Scope + +| Feature | Reason | +|---------|--------| +| Self-registration cliente | Solo whitelist admin-gestita — nessun accesso senza approvazione esplicita | +| Magic link senza OTP | OTP è più sicuro e già deciso come design; magic link = scope creep | +| Email marketing / newsletter | Non pertinente al portale | +| Multi-admin | Ancora single admin per ora | + +## Traceability + +| Requirement | Phase | Status | +|-------------|-------|--------| +| OTP-01 | — | Pending | +| OTP-02 | — | Pending | +| OTP-03 | — | Pending | +| OTP-04 | — | Pending | +| OTP-05 | — | Pending | +| OTP-06 | — | Pending | +| OTP-07 | — | Pending | +| SEND-01 | — | Pending | +| SEND-02 | — | Pending | + +**Coverage:** +- v2.3 requirements: 9 total +- Mapped to phases: 0 (roadmap pending) +- Unmapped: 9 ⚠️ + +--- +*Requirements defined: 2026-06-21* +*Last updated: 2026-06-21 — initial definition*