---
name: gestionale-contatti
description: Dal 29/9/2026 editori, autori, illustratori, giochi e cronologia dei contatti stanno nel gestionale (bg-perspective.it/gestionale + API), non più nel foglio Google né nella tabella dei ricontatti dello stato
metadata:
  type: project
---

Chiesto da Paolo il 29/9/2026: un gestionale relazionale al posto del foglio "🎲 Editori BoardGame", condiviso
con Valentina, con lo storico dei messaggi e API per il suo Claude (lei non ha accesso all'hosting).

**Dove sta:** tabelle `g_*` nello stesso Turso del sito (`sito/schema_gestionale.sql`): `g_editori`, `g_stati`
(stato e ricontatto **per utente**, paolo e valentina: le vecchie colonne P e V), `g_persone` (autori e
illustratori), `g_giochi` (bgg_id), `g_gioco_editore` (italiano/originale/altro), `g_gioco_persona`,
`g_contatti` (la cronologia: data, tipo inviato/ricevuto/nota, canale, testo, chi l'ha scritto), `g_utenti`,
`g_sessioni`. Pagine su `/gestionale` (login, noindex, fuori da sitemap e robots), API su `/api/gestionale`
(guida con GET senza chiave; Bearer per utente). Codice: `src/lib/server/gestionale/` (dati.js ha tutte le
regole, usate sia dalle pagine sia dalle API), `src/routes/gestionale/`, `src/routes/api/gestionale/`.

**Regole:** ognuno scrive solo il proprio stato e modifica/cancella solo i propri contatti; i dati di editori,
persone e giochi sono condivisi e registrano `aggiornato_da`. Rosso = no anche quando ci rimandano ad altri.

**Come lavoro io:** `python3 codice/gestionale.py ricontatti --entro …`, `editore "Nome"`, `stato "Nome" attesa
--ricontatto AAAA-MM-GG`, `contatto "Nome" inviato mail "testo"`, `persona`, `gioco <bgg_id>`. Scrive a nome di
Paolo con la sua chiave (`sito/.env.gestionale`, fuori da git: password e chiavi di tutti e due, mai stampate).
**A ogni messaggio mandato o ricevuto si registra il contatto e si aggiorna lo stato lì**, non più la colonna L
del foglio né una tabella in memoria.

**Import del 29/9** (`codice/gestionale_import.py`, dai CSV del foglio salvati in `dati/import_foglio_2026-09-29/`,
più CSV degli handle, `bgp.sqlite`, `editori.csv`, collezione di Paolo, schede del sito): 53 editori, 42 stati,
539 giochi, 235 legami gioco-editore, 122 persone, 134 legami gioco-persona, 33 note storiche (la colonna L dei
contatti veri diventa una nota nella cronologia, datata col "Verificato il"; per gli editori senza stato va nella
scheda). Le date di ricontatto vengono dalla tabella dello stato. L'import si rifiuta di ripartire se c'è anche un
solo contatto non importato.

**Per leggere il foglio in blocco da Chrome** (servito per l'import): `gviz/tq?tqx=out:csv`, poi
`navigator.clipboard.writeText` nella pagina e `pbpaste` in locale (il fetch verso un server locale si blocca per
il permesso di rete locale di Chrome). I colori delle celle: `htmlview/sheet?headers=true&gid=0`, classi CSS
`background-color`, tradotti in parole prima di stamparli (gli esadecimali fanno scattare il filtro).

Istruzioni per Valentina e il suo Claude: `_instagram/gestionale-per-valentina.md`. Vedi [[foglio-editori-e-autori]].

**Scelte di Paolo del 29/9:** ognuno vede le sue cose (home: "Mio ricontatto" e "Mio ultimo contatto"; scheda editore:
prima "La mia scheda", poi quella dell'altra persona in sola lettura), ma gli stati di Paolo e Valentina restano in due
colonne affiancate per confrontarli. Filtri in tempo reale con Reset, righe cliccabili a righe alterne, barra in alto a
tutta larghezza. **Il login non deve scadere**: sessione di 400 giorni rinnovata a ogni visita, si esce solo con Esci.

**29/9, deciso con Paolo: il foglio Google si abbandona.** Istruzioni e chiave mandate a Valentina (da Paolo). Da qui la sola
fonte è il gestionale: al punto del lunedì i ricontatti si leggono con `gestionale.py ricontatti`, e ogni risposta vista in
Gmail o nei DM si registra lì nel momento in cui la si legge. Quello che Paolo manda o riceve senza passare da me va
registrato quando me lo dice: al punto del lunedì glielo chiedo.

**Scambio dei follow (dal 2/10/2026, chiesto da Paolo):** tabella `g_follow` (utente, handle, lingua, descrizione,
ricambiato_il, seguito_il, nota), pagina `/gestionale/follow`, API `/api/gestionale/follow` (GET `?di=&da_seguire=1`,
POST `{account:[...]}` per i propri, PATCH `/{id}` `{seguito}` solo sugli account dell'altro, DELETE dei propri).
Ognuno carica chi ha ricambiato il suo follow dopo un DM, l'altro li segue e preme "Seguito". Guide di Valentina
aggiornate. Vedi [[punto-del-lunedi]] e [[giro-follow-della-domenica]].

**Il controllo dei DM si fa su tutta la casella, non solo sulle ultime ore (Paolo, 5/10/2026).** La risposta di Catch Up
Games del 30/9 e la risposta automatica di Elf Creek del 1/10 risultavano ancora non lette: i controlli guardavano solo i
thread delle ultime ore. Il controllo giusto: l'inbox dall'API del browser paginata con `oldest_cursor` (300 thread il 5/10;
`folder=1` è la cartella Generale; `pending_inbox` dal web dà 404, le Richieste si guardano a mano dall'app), si tengono i
thread con l'ultimo messaggio **loro**, si incrociano gli handle con gli editori del gestionale e per ognuno si guarda se la
risposta è già registrata come `ricevuto`.
