Fases 7 e 8 — PDFs Prawn + QR + Painel Motorista + Notificações
This commit is contained in:
68
app/services/notificacao_service.rb
Normal file
68
app/services/notificacao_service.rb
Normal file
@@ -0,0 +1,68 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user