# WABOT — Confirmation automatique de commandes COD sur WhatsApp

Bot de confirmation/qualification pour les leads WhatsApp venant de tes Meta Ads
(Click-to-WhatsApp). Indépendant : transport **waboxapp**, intelligence **Gemini**,
stack **PHP/PDO/MySQL**. Conçu pour un VPS Contabo.

Réponses en **darija (arabe ou arabizi) et français**, machine à états +
slot-filling pour des confirmations fiables, garde-fous anti-hallucination de prix,
reprise humaine à tout moment.

---

## 1. Architecture

```
Lead (Meta Ad) ──▶ WhatsApp ──▶ waboxapp ──▶ webhook.php  (stocke + flag pending)
                                                   │
                                          MySQL (contacts, messages, slots)
                                                   │
                              worker.php (boucle, debounce 6s)
                                                   │
                              Gemini (réponse + extraction JSON)
                                                   │
                              waboxapp send ──▶ réponse au lead
                                                   │
                              admin/ (supervision + reprise humaine)
```

- **webhook.php** répond `200` immédiatement et ne fait que stocker → pas de timeout, pas de doublons.
- **worker.php** attend que le client ait fini sa salve de messages (debounce), puis appelle Gemini une seule fois.
- Le **total des commandes est calculé en PHP** depuis le catalogue (le LLM ne décide jamais d'un prix).

---

## 2. Prérequis VPS

- PHP 8.0+ avec `php-cli`, `php-curl`, `php-mysql`
- MySQL 5.7+ ou 8 (colonnes JSON)
- Apache (ou Nginx) avec HTTPS valide (waboxapp exige une URL publique)
- Un compte waboxapp connecté à ton numéro WhatsApp
- Une clé API Gemini (Google AI Studio)

```bash
sudo apt install php-cli php-curl php-mysql
```

---

## 3. Installation

```bash
# 1. Copier le projet dans le webroot
sudo cp -r wabot /var/www/wabot
cd /var/www/wabot

# 2. Base de données
sudo mysql -e "CREATE DATABASE wabot CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER 'wabot'@'localhost' IDENTIFIED BY 'TON_MDP'; GRANT ALL ON wabot.* TO 'wabot'@'localhost';"
sudo mysql wabot < db/schema.sql

# 3. Droits sur les logs
sudo mkdir -p logs && sudo chown -R www-data:www-data logs
```

Puis édite **`config.php`** : identifiants MySQL, `WABOX_TOKEN`, `WABOX_UID`
(ton numéro, ex `212600000000`), `WEBHOOK_SECRET` (invente une longue chaîne),
`GEMINI_API_KEY`, `BRAND_NAME`, `ADMIN_PASSWORD`.

Édite ton **catalogue** : table `products` (via phpMyAdmin ou SQL). Les `ref`/prix
servent au bot. Exemple déjà inséré : `MONTRE01`, `SAC01`.

---

## 4. Configurer le webhook waboxapp

Pointe le docroot de ton domaine (ou sous-domaine) sur `/var/www/wabot`, puis
dans le dashboard waboxapp mets l'URL de webhook (réception) sur :

```
https://TON-DOMAINE/public/webhook.php?secret=TON_WEBHOOK_SECRET
```

> ⚠️ **Mapping du payload** : waboxapp peut nommer ses champs différemment selon
> les versions. Après ton **premier vrai message**, ouvre `logs/webhook.log`,
> repère la ligne `RAW ...`, et vérifie que `parse_inbound()` (dans `public/webhook.php`)
> lit les bons noms de clés (numéro, texte, id, direction). Ajuste les tableaux de
> clés candidates si nécessaire — c'est le seul point susceptible de demander un réglage.

---

## 5. Lancer le worker (en continu)

**Option A — systemd (recommandé)**

```bash
sudo cp wabot-worker.service /etc/systemd/system/
# (édite le chemin/User dans le fichier si besoin)
sudo systemctl daemon-reload
sudo systemctl enable --now wabot-worker
sudo systemctl status wabot-worker
journalctl -u wabot-worker -f   # logs en direct
```

**Option B — cron** (passage unique chaque minute, debounce moins fin)

```cron
* * * * * /usr/bin/php /var/www/wabot/worker.php once >/dev/null 2>&1
```

---

## 6. Tester

```bash
php test_gemini.php       # vérifie la clé/modele Gemini -> doit sortir du JSON
```

Puis envoie un vrai WhatsApp à ton numéro depuis un autre téléphone
(« salam, bghit nchri montre »). Vérifie :
- `logs/webhook.log` → le message arrive
- `logs/worker.log` → traitement
- la réponse arrive sur WhatsApp
- `admin/` → la conversation apparaît

---

## 7. Le panneau d'admin

```
https://TON-DOMAINE/admin/
```

- **Conversations** : état de chaque lead, infos collectées, fil complet.
- **Reprendre la main** / envoi manuel : met le bot en pause sur ce contact.
- **Rendre au bot** : réactive l'auto-réponse.
- **Commandes** : commandes confirmées + export CSV (compatible Excel).

---

## 8. Réglages utiles (`config.php`)

| Constante | Rôle |
|---|---|
| `DEBOUNCE_SECONDS` | Attente avant de répondre (salves de messages) |
| `HUMAN_DELAY_MIN/MAX` | Délai « humain » avant envoi (hygiène anti-ban) |
| `HISTORY_LIMIT` | Messages d'historique envoyés à Gemini |
| `REQUIRED_SLOTS` | Infos obligatoires pour confirmer |
| `GEMINI_MODEL` | `gemini-flash-lite-latest` (le moins cher) |

---

## 9. Notes importantes

- **Anti-ban** : waboxapp passe par ton WhatsApp réel via une connexion non
  officielle. Le bot ne répond qu'à l'**inbound** (jamais d'envoi à froid) et ajoute
  des délais aléatoires. Garde un volume raisonnable.
- **Prix** : jamais inventés par l'IA — ils viennent de la table `products`, et le
  total final stocké est recalculé en PHP.
- **Sécurité** : si ton docroot pointe sur la racine du projet, le `.htaccess` fourni
  bloque `config.php`, `lib/`, `db/`, `logs/`. Idéalement, place le projet hors du
  webroot et n'exposes que `public/` et `admin/`.
- **Darija** : teste la qualité sur de vraies conversations. Tu peux changer de modèle
  (Gemini) en une ligne dans `config.php` ; l'archi est agnostique au modèle.
```
