Implantação da geração de mensagem de forma livre e mudança na engine de mensagem

This commit is contained in:
2026-08-24 17:32:16 -03:00
parent 94bbe7556f
commit 88f19dd8f5
77 changed files with 4650 additions and 25 deletions

View File

@@ -0,0 +1,80 @@
# app/controllers/admin/whatsapp_sessoes_controller.rb
#
# Pareamento do WhatsApp por QR code (ponte Baileys, container `whatsapp`).
#
# ⚠️ Canal NÃO OFICIAL: parear liga o número da empresa a este servidor por uma
# sessão do WhatsApp Web obtida por engenharia reversa. Está fora dos Termos
# do WhatsApp e a Meta pode banir o número — use um chip dedicado. A tela
# avisa isso em texto, não só no código.
class Admin::WhatsappSessoesController < ApplicationController
def show
authorize :whatsapp_sessao, :show?
@config = ConfiguracaoNotificacao.instancia
@cliente = Notificacao::ClienteWhatsapp.padrao
@estado = consultar
end
# Polling da tela enquanto o QR não é lido — o QR expira em ~20s e a ponte
# gera outro, então a página precisa buscar o novo sozinha.
def status
authorize :whatsapp_sessao, :show?
render json: consultar
end
def testar
authorize :whatsapp_sessao, :testar?
destino = ConfiguracaoNotificacao.normalizar_telefone(params[:numero])
if destino.blank?
return redirect_to(admin_whatsapp_sessao_path, alert: 'Informe um número válido (DDD + número).')
end
resposta = Notificacao::ClienteWhatsapp.padrao.enviar(
para: destino,
texto: "Teste do Reem Notas ✅\nSe você recebeu isto, o WhatsApp está conectado."
)
if resposta.ok?
redirect_to admin_whatsapp_sessao_path, notice: "Mensagem de teste enviada para #{destino}."
else
redirect_to admin_whatsapp_sessao_path, alert: "Falhou: #{resposta.erro}"
end
end
def desconectar
authorize :whatsapp_sessao, :desconectar?
resposta = Notificacao::ClienteWhatsapp.padrao.desconectar
AuditoriaLog.registrar(user: current_user, acao: 'whatsapp_desconectar',
entidade: 'ConfiguracaoNotificacao',
dados_novos: { detalhes: 'Desconectou a sessão do WhatsApp' },
request: request)
if resposta.ok?
ConfiguracaoNotificacao.instancia.update_columns(whatsapp_numero_conectado: nil,
whatsapp_conectado_em: nil)
redirect_to admin_whatsapp_sessao_path, notice: 'Sessão encerrada. Leia o QR para conectar de novo.'
else
redirect_to admin_whatsapp_sessao_path, alert: "Não foi possível desconectar: #{resposta.erro}"
end
end
private
# Consulta a ponte e memoriza o número conectado no banco — assim a tela de
# configuração mostra quem está pareado mesmo com a ponte fora do ar.
def consultar
resposta = Notificacao::ClienteWhatsapp.padrao.status
return { 'conectado' => false, 'erro' => resposta.erro } unless resposta.ok?
dados = resposta.dados || {}
if dados['conectado'] && dados['numero'].present?
config = ConfiguracaoNotificacao.instancia
if config.whatsapp_numero_conectado != dados['numero']
config.update_columns(whatsapp_numero_conectado: dados['numero'],
whatsapp_conectado_em: Time.current)
end
end
dados
end
end