diff --git a/.env.example b/.env.example index c3b4c29..35c17f0 100644 --- a/.env.example +++ b/.env.example @@ -79,10 +79,11 @@ NOTIFICACAO_SECRET= APP_HOST=localhost:3000 APP_NAME=Reem Logística -# ── WhatsApp (Baileys — sessão pareada por QR code) ──────────────────────── +# ── WhatsApp (ponte própria — sessão pareada por QR code) ────────────────── # Token compartilhado entre o Rails e o container `whatsapp`. Qualquer string # longa e aleatória: `openssl rand -hex 32`. Sem ele a ponte recusa TUDO. WHATSAPP_TOKEN=troque_por_uma_string_aleatoria_longa # URL da ponte dentro da rede do compose (não mexa, a menos que troque o nome # do serviço no docker-compose.yml). -BAILEYS_URL=http://whatsapp:3001 +# (o nome antigo `BAILEYS_URL` ainda é aceito, para .env já em produção) +WHATSAPP_URL=http://whatsapp:3001 diff --git a/app/models/configuracao_notificacao.rb b/app/models/configuracao_notificacao.rb index 5ff8836..55d1ad4 100644 --- a/app/models/configuracao_notificacao.rb +++ b/app/models/configuracao_notificacao.rb @@ -123,8 +123,13 @@ class ConfiguracaoNotificacao < ApplicationRecord def baileys_exigido? = whatsapp_ativo? && baileys? # URL e token da ponte: banco > .env, mesma hierarquia do resto da tela. + # + # `WHATSAPP_URL` é o nome atual — a tela e o .env.example falam em "ponte do + # WhatsApp", não no nome da biblioteca. `BAILEYS_URL` continua sendo lido para + # não quebrar quem já tem a variável antiga no .env em produção. def baileys_url_efetiva - baileys_url.presence || ENV['BAILEYS_URL'].presence || BAILEYS_URL_PADRAO + baileys_url.presence || ENV['WHATSAPP_URL'].presence || + ENV['BAILEYS_URL'].presence || BAILEYS_URL_PADRAO end def baileys_token_efetivo diff --git a/app/services/notificacao/cliente_whatsapp.rb b/app/services/notificacao/cliente_whatsapp.rb index 5c0581c..bbc57d4 100644 --- a/app/services/notificacao/cliente_whatsapp.rb +++ b/app/services/notificacao/cliente_whatsapp.rb @@ -97,6 +97,12 @@ module Notificacao def mensagem_de_erro(resposta, dados) return 'Token da ponte do WhatsApp inválido.' if resposta.code == '401' return 'WhatsApp desconectado — leia o QR code na tela.' if resposta.code == '503' + # 404 = a ponte respondeu, mas não conhece a rota: a imagem do container + # `whatsapp` é anterior a ela. "rota desconhecida" cru na tela não diz o + # que fazer; o conserto é rebuildar a ponte, não mexer no Rails. + if resposta.code == '404' + return 'Ponte do WhatsApp desatualizada (não conhece esta rota) — refaça o build do container `whatsapp`.' + end dados['erro'].presence || "HTTP #{resposta.code}" end diff --git a/app/views/admin/configuracao_notificacoes/show.html.erb b/app/views/admin/configuracao_notificacoes/show.html.erb index 8714221..8487387 100644 --- a/app/views/admin/configuracao_notificacoes/show.html.erb +++ b/app/views/admin/configuracao_notificacoes/show.html.erb @@ -181,7 +181,7 @@ - <%# Provedor: sem este seletor as colunas do Baileys existiam no banco mas + <%# Provedor: sem este seletor as colunas da ponte existiam no banco mas não havia como sair do Twilio pela tela — o pareamento por QR ficava inalcançável. %>
Modo QR code
++ <%= icone :telefone, tamanho: 'w-4 h-4', espaco: false %> Modo QR code +
⚠️ Canal não oficial — a Meta pode banir o número.
Use um chip dedicado. Em branco, os dois campos abaixo usam
- BAILEYS_URL e
+ WHATSAPP_URL e
WHATSAPP_TOKEN do .env.
Modo Twilio
++ <%= icone :chave, tamanho: 'w-4 h-4', espaco: false %> Modo Twilio +
Credenciais em Twilio Console → Account Info
+ <%= pluralize(contato.errors.count, 'erro', 'erros') %> encontrado<%= contato.errors.count > 1 ? 's' : '' %>: +
Como aparece nas listas e em {{contato}}.
Pode digitar com máscara — é normalizado ao salvar.
+Como aparece nas listas e em {{contato}}.
Como falar com esta pessoa
+Pode digitar com máscara — é normalizado ao salvar.
+Sem e-mail, este contato só recebe WhatsApp.
+