# Vacca su WhatsApp — attivazione

La sezione dell’app è disponibile. Il servizio WhatsApp non è attivo finché non completi il collegamento qui sotto. Nessun messaggio viene inviato dalla sola pubblicazione su Sites.

## 1. Supabase
Usa un progetto dedicato a Vacca, non il database di un altro gestionale. Esegui nell’ordine schema.sql, migration-v2.sql, migration-whatsapp.sql presenti nel repository. Se diario e cloud funzionano già, basta l’ultima migrazione. Le nuove tabelle WhatsApp sono accessibili solo dal backend; il browser non deve usare la chiave service_role.

## 2. Servizio WhatsApp
Configura un’app Meta con WhatsApp Business Platform / Cloud API e un numero aziendale abilitato per l’API. Per prove usa i numeri test e i destinatari consentiti di Meta. La compatibilità di un numero già usato in WhatsApp/WhatsApp Business dipende dall’onboarding e dalla disponibilità della coesistenza: non migrare il tuo numero personale senza verificarla.

Prepara token server, Phone Number ID, App Secret e una versione Graph API supportata dal tuo account. Il nome utente finale (Martina) è modificabile nell’app. Imposta inoltre il contatto di assistenza e le informazioni/privacy del profilo del servizio.

Crea e fai approvare un modello italiano, per esempio `nutria_pasto`, con due parametri nel corpo:

“Hey {{1}}, cosa hai mangiato oggi? Momento {{2}}: raccontami cosa hai mangiato e le quantità. Rispondi STOP per sospendere i promemoria.”

Esempi parametri: vacca / colazione. La categoria e l’approvazione del modello sono decise da Meta. I messaggi fuori dalla finestra di servizio richiedono modelli approvati. Non dare per scontato che il servizio sia gratuito.

## 3. Backend Netlify
Importa il repository completo in Netlify. `dist` è la cartella pubblica, `netlify/functions` contiene il backend e `server` i moduli condivisi. Le funzioni schedulate esistono solo sul deploy di produzione. Configura le variabili server indicate in `server/.env.example` nelle impostazioni Netlify; non inserirle nelle impostazioni pubbliche dell’app né in chat.

Servono chiavi Meta, Supabase server e OpenAI. Quest’ultimo elabora i vocali con trascrizione e le immagini/testi con un modello multimodale. Questi servizi possono avere costi a consumo. Mantieni `WA_REMINDERS_LIVE=false` durante il collaudo. `APP_ALLOWED_ORIGINS` deve contenere l’origin esatto del sito e dell’eventuale frontend Netlify, separati da virgole. `BACKEND_URL` è l’origin Netlify HTTPS.

Webhook Meta:
`https://TUO.netlify.app/.netlify/functions/wa-webhook`

Usa il Verify Token configurato e sottoscrivi il campo `messages`. Il webhook verifica la firma App Secret, registra una coda persistente e delega elaborazione/audio/immagini alla funzione background. Il processo schedulato ogni 5 minuti recupera lavori non completati e controlla gli orari locali Europe/Rome (ora legale inclusa).

## 4. Associa il numero
Nell’app configura Supabase con chiave pubblica, accedi e sincronizza il diario. Nella sezione Assistente WhatsApp inserisci l’indirizzo backend Netlify nelle opzioni avanzate, salva nome e orari, poi genera un codice. Invia il testo COLLEGA al numero del servizio con il codice generato (scade in 10 minuti). Quel messaggio associa il tuo numero all’account, senza pubblicarlo nell’app.

Le preferenze possono essere salvate sul dispositivo anche prima della configurazione: questo non abilita alcun invio. Per i promemoria devono essere attivi consenso, interruttore personale, modello approvato e `WA_REMINDERS_LIVE=true` sul server.

## 5. Prova completa prima dell’attivazione
- Testo: “A pranzo ho mangiato 80 g di riso basmati crudo”. Controlla il riepilogo e conferma con il codice.
- Audio: invia la stessa frase, verifica la trascrizione dal riepilogo e conferma.
- Foto: etichetta nutrizionale nitida con didascalia “Ne ho mangiati 150 g a colazione”. Se manca la quantità, il bot deve chiederla. Se mancano valori, deve chiedere l’etichetta.
- Verifica il salvataggio nell’account cloud e sincronizza l’app. Ricontrolla calorie/macronutrienti e sale.
- Reinvia lo stesso evento webhook: non devono comparire doppie voci. Conferma due volte: non devono comparire doppi consumi.
- Prova STOP, ANNULLA, RIEPILOGO e SCOLLEGA. Prova un secondo account: non deve vedere i dati del primo.
- Prova il modello approvato con un destinatario consentito e controlla la ricezione effettiva. L’accettazione API non garantisce consegna.

## Limiti dichiarati
Le funzioni sono predisposte e testate con servizi simulati. Non sono state eseguite migrazioni su un progetto reale né verificati invii, audio, foto, template o scheduler con account reali. Le risposte AI possono sbagliare: prima del salvataggio viene richiesta una conferma; le stime richiedono CONFERMA STIMA. Non inviare documenti o informazioni sanitarie di terzi. I messaggi del servizio restano dedicati a Vacca/alimentazione/attività, non a consulenza medica o a un assistente generale.

La coda conserva dati testuali/metadati temporanei per massimo 7 giorni; le proposte scadono in 30 minuti. I file non sono salvati dall’app, ma sono elaborati da Meta/OpenAI secondo le rispettive condizioni. Le informazioni confermate rimangono nel diario; le note sono visibili in “Note del giorno”. Le risposte e i promemoria non hanno garanzia di consegna esattamente una volta: un errore di rete può lasciare un invio incerto; i promemoria incerti non vengono automaticamente reinviati. I commit del diario sono transazionali e deduplicati. Il sistema è dimensionato per uso personale/piccolo gruppo (fino a 50 collegamenti nel controllo periodico), non per un servizio di massa.

Fonti tecniche: https://whatsappbusiness.com/policy/ — https://docs.netlify.com/build/functions/scheduled-functions/ — https://developers.openai.com/api/docs/guides/images-vision — https://developers.openai.com/api/docs/guides/structured-outputs — https://platform.openai.com/docs/api-reference/audio

## Solleciti se non rispondi
Nelle preferenze puoi attivare i solleciti: a circa 30 e 60 minuti dal promemoria iniziale, al massimo due per pasto. Il controllo avviene ogni 5 minuti. Qualsiasi messaggio ricevuto dal numero collegato interrompe i solleciti di quel pasto, anche se il vocale non è ancora stato elaborato. STOP, scollegamento, interruttore o consenso disattivato li fermano. Nessun sollecito tra le 22:00 e le 08:00 Europe/Rome. Un invio iniziale dall’esito incerto non genera solleciti.

Fai approvare un secondo template (due parametri nome/pasto), ad esempio: “Hey {{1}}, vuoi aggiornare il diario? È rimasto il momento {{2}}. Quando vuoi, puoi rispondere anche con un vocale. STOP sospende i promemoria.” Configurane il nome in WA_FOLLOWUP_TEMPLATE. Senza il template configurato, i solleciti non vengono inviati. Riesegui la migrazione WhatsApp per aggiungere la colonna followups se necessario.
