# Inlumia Corsi: guida di progetto

Piattaforma di videocorsi ad abbonamento annuale per le carrozzerie. Il cliente è **Inlumia srl** stessa (Cristiano Ballerani), non fa da intermediario. Preventivo 19/2026 accettato il 2 novembre 2026: prima versione 15 giornate più filigrana. Lo stato e le decisioni stanno nella memoria di progetto.

## Dove sta cosa

- `app/`: l'applicazione SvelteKit. Repo privato `paoloalby/inlumia-corsi`
- `docs/plans/2026-11-03-piattaforma-videocorsi-design.md`: scelte tecniche e modello dati. **Leggerlo prima di toccare il codice.**
- `docs/plans/2026-11-04-piattaforma-videocorsi-implementation.md`: stato del lavoro e prossimi passi (messa online)
- `docs/PRODUCT.md`, `docs/DESIGN.md`: a chi serve la piattaforma e regole del sistema visivo (pulsanti, campi, colori). **Leggere DESIGN.md prima di toccare l'interfaccia.**
- `materiali/`: file ricevuti da Inlumia (logo)
- `Specifica_piattaforma_videocorsi.docx`: la specifica originale del cliente (scritta con ChatGPT, non seguita alla lettera); `Videocorsi - Studio di fattibilità.docx`: la nostra risposta. Restano fuori da git

## Stack

SvelteKit 2 + Svelte 5 + Tailwind 4, Drizzle su Turso (in locale `app/data/dev.db`), Bunny Stream per i video, Resend per le email di servizio, systeme.io per le promozionali, Vercel Pro intestato a Inlumia. Dominio `corsi.inlumia.it`, DNS su Cloudflare (dominio e posta su Register.it). **SvelteKit resta alla 2.x**: la 3 è uscita da poco e cambia molte API.

## Comandi

```bash
cd app
npx drizzle-kit push          # applica lo schema al database (locale se DATABASE_URL è un file)
npx tsx scripts/seed.ts       # utenti di prova, password nell'intestazione del file
npm run dev -- --port 5190    # le email finiscono nel log del server se manca RESEND_API_KEY
npx svelte-check              # controllo dei tipi
npx vitest run                # test (intervalli visti, redirect, CSV)
npx playwright test           # test end-to-end nel browser (Chrome vero): vedi app/e2e/, circa 20 minuti
SCHERMATE=1 npx playwright test   # in più salva le schermate di tutte le pagine in app/e2e/schermate/
npx tsx scripts/crea-admin.ts email nome cognome   # amministratore + link per la password
npx tsx scripts/errori.ts [giorni|CODICE]          # registro errori (log_errori); in produzione con DATABASE_URL e DATABASE_AUTH_TOKEN
sh scripts/deploy-produzione.sh                   # pubblica l'ultimo commit su Vercel (team Inlumia); vedi il commento nello script
```

Il job giornaliero (`/api/cron/giornaliero`, orario in `vercel.json`) in locale si lancia con `curl -H "Authorization: Bearer $CRON_SECRET"`. Il codice TOTP dell'admin di prova si calcola dal segreto in `utenti.totp_segreto` con la libreria `otpauth`.

## Regole

- Ogni funzione nuova o modificata va coperta dai test end-to-end in `app/e2e/` (un file per flusso, in ordine: ogni file parte dai dati lasciati dai precedenti). La suite deve finire senza errori, anche quelli del browser e del registro `log_errori`.

- Interfaccia, testi, codice e commenti in italiano.
- Corsisti: password + codice email sui dispositivi nuovi, massimo 3 dispositivi. Admin: password + TOTP. Le sessioni stanno nel database.
- L'accesso ai video lo decide solo `haAccesso()` in `src/lib/server/abbonamenti.ts`.
- Gli errori imprevisti finiscono in `log_errori` con un codice che l'utente vede (`registraErrore()` lato server, `segnalaErrore()` nel browser). Quando qualcuno segnala un problema, partire da lì.
- Vendita, pagamento e fatturazione degli abbonamenti li gestisce Inlumia fuori dalla piattaforma: qui si attiva a mano.
- Mittente email `corsi@inlumia.it` (non è una casella), risposte a `info@inlumia.it`.
- Nel browser di Paolo c'è Bitwarden: la sua barra di salvataggio password copre la parte alta della pagina e intercetta i clic sui pulsanti dell'intestazione. Nelle prove via JavaScript il primo `form` della pagina è quello di "Esci": puntare a `main form`.
- Bunny confronta i domini ammessi anche con la porta: in locale servono `localhost:5190` (sviluppo) e `localhost:5191` (test end-to-end). La cartella del progetto sta sul NAS (SMB): lì SQLite non può usare il WAL, quindi `app/data/dev.db` resta in modalità normale e una lettura con `sqlite3` mentre il server scrive può bloccarlo. Il database dei test sta invece nella cartella temporanea del Mac (`$TMPDIR/inlumia-corsi-e2e/`).
- Commit e push come `paoloalby <paoloalby@hotmail.com>` (già impostato nella configurazione git del repo).
