Adição da função de configuração de email e whatts
This commit is contained in:
74
app/services/notificacao/teste_whatsapp.rb
Normal file
74
app/services/notificacao/teste_whatsapp.rb
Normal file
@@ -0,0 +1,74 @@
|
||||
# app/services/notificacao/teste_whatsapp.rb
|
||||
#
|
||||
# Dispara um WhatsApp de teste pelo Twilio para o número administrativo e
|
||||
# traduz o código de erro da API para uma instrução acionável em português —
|
||||
# os erros de Sandbox (opt-in) são de longe os mais comuns e o código cru
|
||||
# ("63003") não diz nada para quem está configurando.
|
||||
module Notificacao
|
||||
class TesteWhatsapp
|
||||
MENSAGENS = {
|
||||
20003 => 'Account SID ou Auth Token inválidos: o Twilio recusou a autenticação.',
|
||||
20404 => 'Account SID não encontrado no Twilio. Confira se copiou o SID certo (começa com "AC").',
|
||||
21211 => 'Número de destino inválido. Informe com DDD, ex.: 11 92005-1157.',
|
||||
21606 => 'O número remetente não é um número Twilio habilitado para envio.',
|
||||
21608 => 'Conta trial do Twilio: só é possível enviar para números verificados no console da Twilio.',
|
||||
21610 => 'Este número pediu descadastro (enviou STOP). Ele precisa enviar START para voltar a receber.',
|
||||
63003 => 'O Twilio não encontrou o destinatário nesse canal. No Sandbox do WhatsApp o número ' \
|
||||
'precisa enviar "join <sua-palavra>" para o número do sandbox ANTES de conseguir receber.',
|
||||
63007 => 'O número remetente não está habilitado como canal de WhatsApp. Use exatamente o ' \
|
||||
'número do Sandbox (ou do Sender aprovado) do Twilio.',
|
||||
63015 => 'No Sandbox só dá para enviar a números que fizeram o opt-in ("join <sua-palavra>").',
|
||||
63016 => 'Passou da janela de 24h desde a última mensagem do destinatário — nesse caso o Twilio ' \
|
||||
'só aceita template aprovado. Peça para ele mandar qualquer mensagem e tente de novo.',
|
||||
63018 => 'Limite de mensagens do Twilio atingido. Aguarde e tente novamente.',
|
||||
63038 => 'Limite diário de mensagens da conta Twilio atingido.'
|
||||
}.freeze
|
||||
|
||||
def initialize(config = ConfiguracaoNotificacao.instancia, destino: nil)
|
||||
@config = config
|
||||
@destino = ConfiguracaoNotificacao.canal(destino.presence || config.whatsapp_admin)
|
||||
end
|
||||
|
||||
def executar
|
||||
if @destino.blank?
|
||||
return Resultado.falha('Preencha o "WhatsApp do administrador" com DDD ' \
|
||||
'(ex.: 11 92005-1157) antes de testar.')
|
||||
end
|
||||
|
||||
credenciais = @config.credenciais_whatsapp
|
||||
if credenciais.blank?
|
||||
return Resultado.falha('Marque "Ativar WhatsApp" e preencha Account SID, Auth Token e o ' \
|
||||
'número remetente do Twilio.')
|
||||
end
|
||||
if credenciais[:from].blank?
|
||||
return Resultado.falha('O número remetente do Twilio está vazio ou em formato inválido.')
|
||||
end
|
||||
|
||||
msg = ClienteTwilio
|
||||
.montar(credenciais[:sid], credenciais[:token])
|
||||
.messages.create(from: credenciais[:from], to: @destino, body: corpo)
|
||||
|
||||
Resultado.sucesso("WhatsApp de teste aceito pelo Twilio para " \
|
||||
"#{@destino.sub('whatsapp:', '')} (SID #{msg.sid}, status \"#{msg.status}\"). " \
|
||||
'Atenção: "queued"/"accepted" significa que a Twilio recebeu — ' \
|
||||
'a entrega final ainda pode falhar depois.')
|
||||
rescue Twilio::REST::RestError => e
|
||||
Resultado.falha(MENSAGENS[e.code] || "O Twilio recusou o envio (código #{e.code}).",
|
||||
"[#{e.code}] #{e.message}")
|
||||
rescue Twilio::REST::TwilioError => e
|
||||
Resultado.falha('Não foi possível falar com a API do Twilio (rede ou timeout). ' \
|
||||
'Verifique a saída de internet do servidor.', e.message)
|
||||
rescue StandardError => e
|
||||
Rails.logger.error("[TesteWhatsapp] #{e.class}: #{e.message}")
|
||||
Resultado.falha("Falha inesperada ao enviar (#{e.class}).", e.message)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def corpo
|
||||
"✅ Teste do Reem Notas\n" \
|
||||
"Se você recebeu esta mensagem, a integração com o Twilio está funcionando.\n" \
|
||||
"Enviado em #{Time.current.strftime('%d/%m/%Y às %H:%M')}."
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user