Fases 7 e 8 — PDFs Prawn + QR + Painel Motorista + Notificações
This commit is contained in:
77
app/services/pdf/relatorio_motorista_pdf.rb
Normal file
77
app/services/pdf/relatorio_motorista_pdf.rb
Normal file
@@ -0,0 +1,77 @@
|
||||
# app/services/pdf/relatorio_motorista_pdf.rb
|
||||
#
|
||||
# Relatório Individual: detalhe de todas as entregas classificadas
|
||||
# de um motorista em uma consolidação.
|
||||
#
|
||||
module Pdf
|
||||
class RelatorioMotoristaPdf < BasePdf
|
||||
def initialize(consolidacao:, motorista:)
|
||||
super()
|
||||
@consolidacao = consolidacao
|
||||
@motorista = motorista
|
||||
@entregas = consolidacao.consolidacao_entregas
|
||||
.where(motorista_nome: motorista)
|
||||
.order(:created_at)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def corpo
|
||||
secao "RELATÓRIO INDIVIDUAL DE ENTREGAS"
|
||||
|
||||
@pdf.text "Consolidação: #{@consolidacao.nome}", size: 11, style: :bold
|
||||
@pdf.text "Motorista: #{@motorista}", size: 11
|
||||
@pdf.text "Período: #{@consolidacao.data_inicio.strftime('%d/%m/%Y')} a #{@consolidacao.data_fim.strftime('%d/%m/%Y')}", size: 10
|
||||
@pdf.text "Status: #{@consolidacao.status.humanize}", size: 10, color: CINZA
|
||||
|
||||
secao "ENTREGAS (#{@entregas.size})"
|
||||
|
||||
if @entregas.any?
|
||||
linhas = [['#', 'Tracking', 'NF / Local', 'Tipo', 'Valor']]
|
||||
@entregas.each_with_index do |e, i|
|
||||
original = e.entrega_original
|
||||
linhas << [
|
||||
(i + 1).to_s,
|
||||
e.tracking_id.to_s.first(14),
|
||||
original ? "NF #{original.numero_nf} · #{original.local.to_s.first(30)}" : '—',
|
||||
e.tipo_cor[:label],
|
||||
(e.desconto? ? '-' : '') + moeda(e.valor_aplicado)
|
||||
]
|
||||
end
|
||||
|
||||
@pdf.table(linhas, header: true, width: @pdf.bounds.width,
|
||||
cell_style: { size: 8, padding: [4, 6] }) do |t|
|
||||
t.row(0).background_color = PRETO
|
||||
t.row(0).text_color = 'FFFFFF'
|
||||
t.row(0).font_style = :bold
|
||||
t.columns(4).align = :right
|
||||
t.row(1..-1).borders = [:bottom]
|
||||
t.row(1..-1).border_color = 'DDDDDD'
|
||||
end
|
||||
else
|
||||
@pdf.text 'Nenhuma entrega classificada.', size: 10, color: CINZA
|
||||
end
|
||||
|
||||
# Totais por tipo
|
||||
secao "RESUMO"
|
||||
resumo = @entregas.group(:tipo).count
|
||||
total = @entregas.sum { |e| e.desconto? ? -e.valor_aplicado : e.valor_aplicado }
|
||||
|
||||
resumo_linhas = [['Tipo', 'Quantidade']]
|
||||
ConsolidacaoEntrega::TIPO_CORES.each do |tipo, cfg|
|
||||
resumo_linhas << [cfg[:label], (resumo[tipo] || 0).to_s]
|
||||
end
|
||||
|
||||
@pdf.table(resumo_linhas, width: 250, cell_style: { size: 9, padding: [4, 8] }) do |t|
|
||||
t.row(0).background_color = LARANJA
|
||||
t.row(0).text_color = '000000'
|
||||
t.row(0).font_style = :bold
|
||||
end
|
||||
|
||||
@pdf.move_down 14
|
||||
@pdf.fill_color LARANJA
|
||||
@pdf.text "TOTAL A PAGAR: #{moeda(total)}", size: 16, style: :bold
|
||||
@pdf.fill_color '000000'
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user