# Configuración de WhatsApp — Baileys Bridge

El POS se conecta a WhatsApp mediante un **bridge Node.js directo (Baileys)** que vive en `/opt/whatsapp-bridge/`. No usa Evolution API ni Meta Cloud API (ambos fueron reemplazados en abril 2026).

## Arquitectura

```
Refaccionaria → WhatsApp Web
                     ↓
         /opt/whatsapp-bridge/server.js  ← Baileys (Node 20)
                     ↓ webhook HTTP
         Flask POS /pos/api/whatsapp/webhook  (puerto 5001)
                     ↓
              IA + inventario + cotizador
                     ↓ send HTTP
         bridge → WhatsApp Web → cliente
```

- **Bridge puerto:** 21465 (local)
- **Flask webhook:** `http://localhost:5001/pos/api/whatsapp/webhook`
- **Auth state:** `/opt/whatsapp-bridge/auth/` (creds + pre-keys; sobrevive reinicios)

## Instalación (servidor nuevo)

1. Copiar `server.js` y `package.json` a `/opt/whatsapp-bridge/`
2. `cd /opt/whatsapp-bridge && npm install`
3. Instalar la unidad systemd: `cp docs/systemd/whatsapp-bridge.service /etc/systemd/system/` *(o usar la ya presente en `/etc/systemd/system/whatsapp-bridge.service`)*
4. `systemctl daemon-reload && systemctl enable --now whatsapp-bridge`
5. Vincular WhatsApp (ver siguiente sección)

## Vincular número de WhatsApp

1. Abrir `/pos/whatsapp` en el POS
2. Click en "Conectar WhatsApp"
3. Escanear el QR con el teléfono (WhatsApp → Dispositivos vinculados → Vincular)
4. La sesión queda guardada en `/opt/whatsapp-bridge/auth/` — no hay que re-escanear mientras el teléfono se conecte a internet cada ~14 días.

## Operación

```bash
# Estado del bridge
systemctl status whatsapp-bridge

# Reiniciar (p. ej. tras actualizar server.js)
systemctl restart whatsapp-bridge

# Logs en vivo
journalctl -u whatsapp-bridge -f
# o el archivo plano:
tail -f /var/log/whatsapp-bridge.log
```

## Endpoints del bridge (localhost:21465)

| Método | Path | Uso |
|---|---|---|
| GET | `/status` | Estado de conexión (`disconnected`, `connecting`, `qr`, `open`) |
| GET | `/qr` | QR en base64 para escanear |
| POST | `/connect` | Forzar inicio de conexión |
| POST | `/send` | `{phone, message}` → enviar texto |
| POST | `/logout` | Cerrar sesión |

## Troubleshooting

| Síntoma | Verificar |
|---|---|
| POS dice "error" al consultar estado | `systemctl status whatsapp-bridge` — si está "inactive" → `systemctl start whatsapp-bridge` |
| Puerto 21465 no escucha | `ss -tlnp \| grep 21465` — si vacío, el proceso Node crasheó; ver `journalctl -u whatsapp-bridge -n 100` |
| QR no aparece | Probable que ya esté vinculado → `/status` debe decir `open` |
| Mensajes llegan pero no responde | Verificar que Flask esté escuchando en 5001 y revisar logs del webhook con prefix `[WA-AI]` |
| Tras actualizar `server.js` no toma cambios | `systemctl restart whatsapp-bridge` |
| "Invalid mex newsletter notification" en logs | Ruido normal de Baileys (warn), ignorar |

## Notas

- Cada refaccionaria conecta su propio número; la sesión vive en el servidor local (mini rack).
- Si el teléfono pierde internet por >14 días, WhatsApp desvincula el dispositivo y hay que re-escanear.
- `server.js` usa CommonJS (`package.json` tiene `"type": "commonjs"`). No hay variante `.mjs` — fue removida en abril 2026.
