# 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.fill_color CINZA @pdf.text "Status: #{@consolidacao.status.humanize}", size: 10 @pdf.fill_color '000000' 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.fill_color CINZA @pdf.text 'Nenhuma entrega classificada.', size: 10 @pdf.fill_color '000000' end # Totais por tipo secao "RESUMO" # reorder(nil): remove o .order(:created_at) da relação — senão o Postgres # recusa "GROUP BY tipo ORDER BY created_at" (PG::GroupingError → 500). resumo = @entregas.reorder(nil).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