# Sistema WhatsApp com Baileys 📱

Este sistema utiliza a biblioteca **Baileys** para conectar diretamente com o WhatsApp Web, eliminando a necessidade de APIs externas pagas.

## 🚀 Vantagens do Baileys

- ✅ **Gratuito**: Não precisa de APIs pagas
- ✅ **Direto**: Conecta diretamente com WhatsApp Web
- ✅ **Confiável**: Biblioteca mantida ativamente
- ✅ **Sem limites**: Não há limitações de mensagens
- ✅ **Multi-device**: Suporta WhatsApp Multi-Device

## 📦 Dependências Instaladas

```bash
npm install @whiskeysockets/baileys@latest @hapi/boom pino pino-pretty
```

## ⚙️ Configuração

### 1. Arquivo .env

```env
# Configurações do WhatsApp com Baileys
WHATSAPP_SESSION_DIR=./whatsapp-sessions
```

### 2. Primeira Conexão

Quando você iniciar o servidor pela primeira vez, será gerado um **QR Code**. Você pode acessar de 3 formas:

**🌐 Interface Web (Recomendado):**
1. Inicie o servidor: `npm start`
2. Acesse: `http://localhost:3005/whatsapp/qr`
3. Escaneie o QR Code diretamente na página

**📱 Via Terminal:**
1. Inicie o servidor: `npm start`
2. Observe o terminal - aparecerá um QR Code em texto

**🔗 Via API:**
1. GET `http://localhost:3005/whatsapp/qrcode.png` - Imagem PNG
2. GET `http://localhost:3005/whatsapp/qrcode` - JSON com base64

**Passos para conectar:**
1. Abra o WhatsApp no seu celular
2. Vá em **Dispositivos Conectados** → **Conectar um dispositivo**
3. Escaneie o QR Code
4. Pronto! O WhatsApp está conectado

### 3. Arquivos de Sessão

- As credenciais ficam salvas em `./whatsapp-sessions/`
- **Não delete** esta pasta - ela mantém você conectado
- Faça backup desta pasta para não precisar escanear o QR novamente

## 🔌 API Endpoints

### Status da Conexão
```http
GET /whatsapp/status
```

**Resposta:**
```json
{
  "connected": true,
  "socketExists": true,
  "hasQR": false,
  "needsQR": false,
  "timestamp": "2024-10-07T10:30:00.000Z"
}
```

### QR Code (JSON com imagem base64)
```http
GET /whatsapp/qrcode
```

**Resposta:**
```json
{
  "qr": "texto_do_qr_code",
  "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
  "format": "data:image/png;base64"
}
```

### QR Code (Imagem PNG)
```http
GET /whatsapp/qrcode.png
```
Retorna diretamente a imagem PNG do QR Code.

### Interface Web do QR Code 🌐
```http
GET /whatsapp/qr
```
Abre uma página web bonita para escanear o QR Code facilmente!

### Enviar por Setor
```http
POST /whatsapp/enviar-setor
Content-Type: application/json

{
  "setor": "SGI",
  "subject": "Título da mensagem",
  "text": "Corpo da mensagem"
}
```

### Enviar por Usuário
```http
POST /whatsapp/enviar-usuario
Content-Type: application/json

{
  "usuario": "Nome do Usuario",
  "subject": "Título da mensagem", 
  "text": "Corpo da mensagem"
}
```

### Reconectar Manualmente
```http
POST /whatsapp/reconectar
```

### Teste Direto
```http
POST /whatsapp/teste
Content-Type: application/json

{
  "numero": "5511999999999",
  "mensagem": "Mensagem de teste"
}
```

## 🔄 Cron Jobs Automáticos

O sistema inclui os mesmos cron jobs do email, mas para WhatsApp:

### RNC Vencida (8:00 AM)
- **Arquivo**: `controllers/SGI/VerificacaoWhatsApp/RNCVencidaWhatsApp.js`
- **Função**: Notifica sobre RNCs vencidas via WhatsApp

### RNC a Vencer (8:00 AM)
- **Arquivo**: `controllers/SGI/VerificacaoWhatsApp/RNCVencerWhatsApp.js`
- **Função**: Notifica sobre RNCs que vão vencer via WhatsApp

### Análise SGI Vencida (8:00 AM)
- **Arquivo**: `controllers/SGI/VerificacaoWhatsApp/registrodenaoconformidadeVencidaWhatsApp.js`
- **Função**: Notifica sobre análises SGI vencidas via WhatsApp

## 📱 Formato das Mensagens

As mensagens seguem este padrão:

```
*TÍTULO DA MENSAGEM*

Olá [Nome do Usuário],

[Corpo da mensagem]
```

**Exemplo:**
```
*🚨 RNC Vencida - Notificação Urgente*

Olá João Silva,

Você possui RNCs vencidas que precisam de atenção imediata.
Por favor, acesse o sistema para verificar.
```

## 🛠️ Solução de Problemas - MELHORADA

### Conexão caindo/instável 🔧
```bash
# 1. Forçar reconexão imediata
curl -X POST http://localhost:3005/whatsapp/reconectar

# 2. Usar script de monitoramento
./monitor-whatsapp.sh force-reconnect

# 3. Verificar e reconectar automaticamente
curl -X POST http://localhost:3005/whatsapp/check-reconnect

# 4. Monitor automático (recomendado para produção)
node monitor-conexao.js start
```

### Sistema de Reconexão Automática 🔄
O sistema agora inclui:
- ✅ **Backoff exponencial** - Delays progressivos entre tentativas
- ✅ **Limite de tentativas** - Máximo 5 tentativas automáticas
- ✅ **Reset inteligente** - Contador reseta após conexão bem-sucedida
- ✅ **Retry com timeout** - Timeout de 30s para operações
- ✅ **Delay entre mensagens** - Evita rate limiting
- ✅ **Monitor automático** - Verificação contínua da conexão

### QR Code não aparece no PM2
```bash
# Ver logs em tempo real
pm2 logs geocontrole-api

# Reiniciar aplicação
pm2 restart geocontrole-api

# Verificar se aplicação está rodando
pm2 status

# Limpar sessões e reiniciar
rm -rf whatsapp-sessions/
pm2 restart geocontrole-api
```

### Monitor Automático de Conexão 🤖
```bash
# Iniciar monitor (verifica a cada 30s)
node monitor-conexao.js start

# Ou com PM2 (recomendado)
pm2 start ecosystem-with-monitor.config.json

# Verificar logs do monitor
pm2 logs whatsapp-monitor

# Comandos do monitor
node monitor-conexao.js status     # Status único
node monitor-conexao.js test       # Mensagem teste
node monitor-conexao.js reconnect  # Forçar reconexão
```

### Script de monitoramento não funciona
```bash
# Verificar se script é executável
chmod +x monitor-whatsapp.sh

# Verificar se jq está instalado (para JSON)
sudo apt install jq  # Ubuntu/Debian
# ou
brew install jq      # macOS
```

### Comandos PM2 Úteis 🔧

```bash
# Visualizar aplicações
pm2 list

# Ver logs em tempo real
pm2 logs geocontrole-api

# Ver logs das últimas 100 linhas
pm2 logs geocontrole-api --lines 100

# Monitorar recursos (CPU, Memória)
pm2 monit

# Reiniciar aplicação
pm2 restart geocontrole-api

# Parar aplicação
pm2 stop geocontrole-api

# Deletar aplicação do PM2
pm2 delete geocontrole-api

# Salvar configuração atual do PM2
pm2 save

# Auto-iniciar PM2 no boot do sistema
pm2 startup

# Ver logs de erro apenas
pm2 logs geocontrole-api --err

# Limpar logs
pm2 flush

# Recarregar aplicação (zero-downtime)
pm2 reload geocontrole-api
```

### Número não existe no WhatsApp
- O sistema verifica automaticamente se o número está registrado
- Números inválidos são rejeitados com erro específico

### Mensagem não entregue
- Verifique se o WhatsApp no celular está online
- Confirme se o número está correto (formato: 5511999999999)
- Verifique os logs para detalhes do erro

## 📊 Logs

Todos os eventos são registrados nos arquivos:

- `logs/whatsapp-combined.log` - Todos os logs
- `logs/whatsapp-error.log` - Apenas erros
- `logs/combined.log` - Logs gerais do sistema

## 🔐 Segurança

- **Sessões Criptografadas**: Baileys usa criptografia end-to-end
- **Backup das Sessões**: Faça backup da pasta `whatsapp-sessions/`
- **Logs Seguros**: Números de telefone são parcialmente mascarados nos logs

## 🚀 Iniciando o Sistema

### Desenvolvimento (Node.js direto)
```bash
# 1. Instalar dependências (já feito)
npm install

# 2. Iniciar servidor
npm start
# ou
node app.js
```

### Produção (PM2) 🔥
```bash
# 1. Instalar PM2 (se não tiver)
npm install -g pm2

# 2. Opção A: Apenas API
pm2 start ecosystem.config.json

# 3. Opção B: API + Monitor Automático (RECOMENDADO)
pm2 start ecosystem-with-monitor.config.json

# 4. Monitorar logs (QR Code aparece aqui)
pm2 logs geocontrole-api

# 5. Ver logs do monitor (se usando opção B)
pm2 logs whatsapp-monitor

# 6. Ver apenas logs do WhatsApp
pm2 logs geocontrole-api | grep -i whatsapp

# 7. Scripts de monitoramento facilitado
./monitor-whatsapp.sh status          # Ver status
./monitor-whatsapp.sh force-reconnect # Forçar reconexão
./monitor-whatsapp.sh auto-monitor    # Monitor automático

# 8. Parar aplicações
pm2 stop all

# 9. Reiniciar aplicações
pm2 restart all
```

### 🤖 Monitor Automático (NOVO!)
O sistema agora inclui um monitor que:
- ✅ **Verifica conexão** a cada 30 segundos
- ✅ **Reconecta automaticamente** se necessário
- ✅ **Envia testes** para verificar funcionalidade
- ✅ **Logs detalhados** de todas as operações
- ✅ **Roda como serviço** separado no PM2

### 🖥️ QR Code no Terminal com PM2

O QR Code aparecerá automaticamente nos logs do PM2:

```bash
# Ver logs em tempo real
pm2 logs geocontrole-api --lines 50

# Filtrar apenas logs do WhatsApp
pm2 logs geocontrole-api | grep "WHATSAPP QR CODE"

# Usar script de monitoramento
./monitor-whatsapp.sh qr
```

**Exemplo de saída no PM2:**
```
============================================================
📱 WHATSAPP QR CODE - ESCANEIE COM SEU CELULAR
============================================================
█▀▀▀▀▀█ ▀▀  █ ▄▀▄▀ █▀▀▀▀▀█
█ ███ █ ▀█▀▀█▀ ▄██ █ ███ █
█ ▀▀▀ █ █▀█▄▀▄▀▄▀█ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀ █▄▀ █▄▀ ▀▀▀▀▀▀▀
[... QR Code visual ...]
============================================================
💡 Ou acesse: http://localhost:3005/whatsapp/qr
============================================================
```

## 📋 Checklist de Configuração

### Desenvolvimento:
- [x] Dependências instaladas (`@whiskeysockets/baileys`, `qrcode`, `qrcode-terminal`)
- [x] Arquivos criados
- [x] Rotas configuradas
- [ ] Servidor iniciado (`npm start`)
- [ ] QR Code escaneado
- [ ] Teste de envio realizado

### Produção (PM2):
- [x] Dependências instaladas
- [x] Arquivo `ecosystem.config.json` criado
- [x] Script `monitor-whatsapp.sh` criado
- [ ] PM2 instalado (`npm install -g pm2`)
- [ ] Aplicação iniciada (`pm2 start ecosystem.config.json`)
- [ ] QR Code escaneado (via `pm2 logs` ou script)
- [ ] Teste de envio realizado
- [ ] Monitoramento configurado
- [ ] PM2 configurado para auto-start (`pm2 startup` + `pm2 save`)

## 💡 Dicas

1. **Mantenha o celular online**: O WhatsApp precisa estar ativo no celular
2. **Não escaneie em múltiplos servidores**: Isso desconecta dispositivos anteriores
3. **Monitore os logs**: Eles mostram o status da conexão
4. **Backup das sessões**: Evita ter que escanear QR novamente

## 🔄 Exemplo de Uso Completo

```bash
## 🔄 Exemplo de Uso Completo

### Com Node.js direto:
```bash
# 1. Iniciar servidor
npm start

# 2. Acessar interface web do QR Code (recomendado)
# Abra o navegador: http://localhost:3005/whatsapp/qr
```

### Com PM2 (Produção):
```bash
# 1. Iniciar com PM2
pm2 start ecosystem.config.json

# 2. Ver QR Code nos logs
pm2 logs geocontrole-api

# 3. OU usar script de monitoramento
./monitor-whatsapp.sh qr

# 4. OU acessar interface web
# http://localhost:3005/whatsapp/qr

# 5. Monitoramento contínuo
./monitor-whatsapp.sh monitor

# 6. Verificar status da conexão
./monitor-whatsapp.sh status

# 7. Teste de envio
curl -X POST http://localhost:3005/whatsapp/teste \
  -H "Content-Type: application/json" \
  -d '{"numero":"5511999999999","mensagem":"Olá! Sistema funcionando!"}'
```

### 📋 Script de Monitoramento

O script `monitor-whatsapp.sh` oferece várias funcionalidades:

```bash
# Ver status geral
./monitor-whatsapp.sh status

# Ver QR Code atual
./monitor-whatsapp.sh qr

# Ver apenas logs do WhatsApp
./monitor-whatsapp.sh whatsapp

# Monitoramento automático (atualiza a cada 10s)
./monitor-whatsapp.sh monitor

# Reiniciar aplicação
./monitor-whatsapp.sh restart

# Ver logs em tempo real
./monitor-whatsapp.sh logs
```

## 🌐 Interface Web

A interface web em `/whatsapp/qr` oferece:

- ✅ **Visualização do QR Code** em tempo real
- ✅ **Status da conexão** atualizado automaticamente
- ✅ **Instruções passo-a-passo** para conectar
- ✅ **Botão de reconexão** manual
- ✅ **Design responsivo** para mobile/desktop
- ✅ **Auto-refresh** a cada 5 segundos

**Características:**
- 📱 Funciona em qualquer dispositivo
- 🔄 Atualiza automaticamente quando QR Code muda
- 🎨 Interface moderna e intuitiva
- 🔒 Segura (apenas QR Code público)
- ⚡ Rápida e eficiente
```

---

**Sistema pronto para uso! 🎉**

Para suporte técnico, verifique os logs ou use os endpoints de status para diagnosticar problemas.