# 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