Implantação da função de controle de consolidaçoes pagas e pendentes

This commit is contained in:
2026-06-17 15:49:24 -03:00
parent 292ac31c66
commit e9def7e21a
17 changed files with 526 additions and 12 deletions

View File

@@ -9,6 +9,11 @@ class NotificacaoService
new(consolidacao).notificar_todos
end
# Avisa UM motorista de que o pagamento dele foi efetuado.
def self.notificar_pagamento(consolidacao, consolidacao_motorista)
new(consolidacao).enviar_aviso_pagamento(consolidacao_motorista)
end
def initialize(consolidacao)
@consolidacao = consolidacao
end
@@ -23,6 +28,14 @@ class NotificacaoService
end
end
def enviar_aviso_pagamento(cm)
user = User.motorista.ativos.find_by('LOWER(nome) = ?', cm.motorista_nome.downcase)
return unless user
enviar_whatsapp_pagamento(user, cm) if whatsapp_ativo?
enviar_email_pagamento(user, cm) if email_ativo? && user.email.present?
end
private
def whatsapp_ativo?
@@ -65,4 +78,37 @@ class NotificacaoService
rescue => e
Rails.logger.error("[Notificacao] Falha email #{user.email}: #{e.message}")
end
# ── Aviso de pagamento efetuado ─────────────────────────────
def mensagem_pagamento(user, cm)
valor = "R$ #{format('%.2f', cm.valor_total)}".gsub('.', ',')
"Olá #{user.nome.split.first}! ✅\n" \
"Seu pagamento foi efetuado.\n" \
"📋 #{@consolidacao.nome}\n" \
"💰 Valor: #{valor}\n" \
"Acesse seu painel para conferir: " \
"https://#{ENV.fetch('APP_HOST', 'localhost:3000')}/motorista"
end
def enviar_whatsapp_pagamento(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_pagamento(user, cm)
)
Rails.logger.info("[Notificacao] WhatsApp pagamento enviado para #{user.nome}")
rescue => e
Rails.logger.error("[Notificacao] Falha WhatsApp pagamento #{user.nome}: #{e.message}")
end
def enviar_email_pagamento(user, cm)
ConsolidacaoMailer.pagamento_efetuado(user, @consolidacao, cm).deliver_later
Rails.logger.info("[Notificacao] Email pagamento agendado para #{user.email}")
rescue => e
Rails.logger.error("[Notificacao] Falha email pagamento #{user.email}: #{e.message}")
end
end

View File

@@ -7,13 +7,19 @@ require 'rqrcode'
module Pdf
class HoleritePdf < BasePdf
def initialize(consolidacao:, motorista:, user_motorista: nil, app_host: nil)
VERDE = '22C55E'
CINZA_BG = 'E5E7EB'
def initialize(consolidacao:, motorista:, user_motorista: nil, app_host: nil,
pago_em: nil, forma_pagamento: nil)
super()
@consolidacao = consolidacao
@motorista = motorista
@user_motorista = user_motorista
@app_host = app_host || ENV.fetch('APP_HOST', 'localhost:3000')
@entregas = consolidacao.consolidacao_entregas.where(motorista_nome: motorista)
@consolidacao = consolidacao
@motorista = motorista
@user_motorista = user_motorista
@app_host = app_host || ENV.fetch('APP_HOST', 'localhost:3000')
@pago_em = pago_em
@forma_pagamento = forma_pagamento
@entregas = consolidacao.consolidacao_entregas.where(motorista_nome: motorista)
end
private
@@ -34,6 +40,8 @@ module Pdf
t.columns(0).width = 120
end
desenhar_selo_pagamento
secao "PROVENTOS E DESCONTOS"
resumo = @entregas.group(:tipo).count
@@ -84,6 +92,26 @@ module Pdf
assinaturas(motorista: @motorista)
end
# Selo de pagamento: faixa verde "PAGO" (com data/forma) ou cinza "PENDENTE".
def desenhar_selo_pagamento
@pdf.move_down 10
pago = @pago_em.present?
cor = pago ? VERDE : CINZA_BG
texto = if pago
via = @forma_pagamento.present? ? " · #{@forma_pagamento.to_s.capitalize}" : ''
"✓ PAGO em #{@pago_em.strftime('%d/%m/%Y')}#{via}"
else
"PAGAMENTO PENDENTE"
end
@pdf.fill_color cor
@pdf.fill_rounded_rectangle [0, @pdf.cursor], 250, 26, 5
@pdf.fill_color(pago ? 'FFFFFF' : '374151')
@pdf.text_box texto, at: [12, @pdf.cursor - 8], width: 238, size: 10, style: :bold
@pdf.fill_color '000000'
@pdf.move_down 34
end
# Monta a URL respeitando o esquema do APP_HOST. Se vier sem http(s)://
# (ex.: "100.75.222.23:3000") assume http — produção em IP:porta normalmente
# não tem TLS. Defina APP_HOST com "https://" se o servidor usar HTTPS.