# app/services/notificacao_service.rb # # Envia notificações aos motoristas quando uma consolidação é finalizada. # Canais controlados pelas configurações: notificacao_whatsapp / notificacao_email. # Falhas de envio NUNCA quebram o fluxo de finalização (apenas logam). # class NotificacaoService def self.notificar_finalizacao(consolidacao) new(consolidacao).notificar_todos end def initialize(consolidacao) @consolidacao = consolidacao end def notificar_todos @consolidacao.consolidacao_motoristas.each do |cm| user = User.motorista.ativos.find_by('LOWER(nome) = ?', cm.motorista_nome.downcase) next unless user enviar_whatsapp(user, cm) if whatsapp_ativo? enviar_email(user, cm) if email_ativo? && user.email.present? end end private def whatsapp_ativo? Configuracao.valor('notificacao_whatsapp') == 'true' && ENV['TWILIO_ACCOUNT_SID'].present? end def email_ativo? Configuracao.valor('notificacao_email') == 'true' end def mensagem(user, cm) valor = "R$ #{format('%.2f', cm.valor_total)}".gsub('.', ',') "Olá #{user.nome.split.first}! 🚚\n" \ "Seu pagamento de entregas foi fechado.\n" \ "📋 #{@consolidacao.nome}\n" \ "💰 Valor: #{valor}\n" \ "Acesse seu painel para baixar o holerite: " \ "https://#{ENV.fetch('APP_HOST', 'localhost:3000')}/motorista" end def enviar_whatsapp(user, cm) return if user.telefone.blank? require 'twilio-ruby' cliente = Twilio::REST::Client.new(ENV['TWILIO_ACCOUNT_SID'], ENV['TWILIO_AUTH_TOKEN']) cliente.messages.create( from: ENV['TWILIO_WHATSAPP_FROM'], to: "whatsapp:#{user.telefone}", body: mensagem(user, cm) ) Rails.logger.info("[Notificacao] WhatsApp enviado para #{user.nome}") rescue => e Rails.logger.error("[Notificacao] Falha WhatsApp #{user.nome}: #{e.message}") end def enviar_email(user, cm) ConsolidacaoMailer.pagamento_fechado(user, @consolidacao, cm).deliver_later Rails.logger.info("[Notificacao] Email agendado para #{user.email}") rescue => e Rails.logger.error("[Notificacao] Falha email #{user.email}: #{e.message}") end end