# app/services/pdf/totais_motorista_pdf.rb # # Relatório "total por motorista no período" — o mesmo documento serve às duas # telas, porque os números vêm do mesmo Analytics::TotaisPorMotorista: # # • admin (todos os motoristas): resumo por motorista + as consolidações que # compõem o total de cada um; # • motorista (um só): o total fechado dele no período + as consolidações que # formam esse valor, com espaço de assinatura para servir de comprovante. # module Pdf class TotaisMotoristaPdf < BasePdf VERDE = '22C55E' AMBAR = 'D97706' # totais: Analytics::TotaisPorMotorista já montado (ele conhece o recorte). # detalhar: inclui, para cada motorista, a lista de consolidações. Sempre # ligado quando o relatório é de um motorista só. def initialize(totais:, detalhar: true, titulo: nil) super() @t = totais @detalhar = detalhar || @t.motorista.present? @titulo = titulo end private def corpo secao(@titulo || (@t.motorista ? 'MEU TOTAL NO PERÍODO' : 'TOTAL POR MOTORISTA')) @pdf.text "Período: #{@t.periodo_label}", size: 11, style: :bold @pdf.fill_color CINZA @pdf.text(@t.motorista ? "Motorista: #{@t.motorista}" : "Motoristas: #{@t.linhas.size}", size: 10) @pdf.text "Consolidações no período: #{@t.total_consolidacoes}", size: 10 @pdf.fill_color '000000' secao 'TOTAIS' kpis if @t.vazio? @pdf.fill_color CINZA @pdf.text 'Nenhuma consolidação fechada neste período.', size: 10 @pdf.fill_color '000000' return end unless @t.motorista secao 'RESUMO POR MOTORISTA' tabela_resumo end return unless @detalhar @t.linhas.each do |linha| @pdf.start_new_page if @pdf.cursor < 160 secao "COMPOSIÇÃO — #{linha[:motorista].upcase}" tabela_composicao(@t.consolidacoes_de(linha[:motorista])) end assinaturas(motorista: @t.motorista) if @t.motorista end def kpis linhas = [ ['Total do período', moeda(@t.total_geral)], ['Pago', moeda(@t.total_pago)], ['A receber', moeda(@t.total_pendente)] ] @pdf.table(linhas, width: 300, cell_style: { size: 11, padding: [6, 10] }) do |t| t.columns(0).font_style = :bold t.columns(1).align = :right t.row(1).text_color = VERDE t.row(2).text_color = AMBAR t.cells.borders = [:bottom] t.cells.border_color = 'DDDDDD' end end def tabela_resumo linhas = [['Motorista', 'Consol.', 'Lanç.', 'Pago', 'A receber', 'Total']] @t.linhas.each do |l| linhas << [l[:motorista], l[:consolidacoes].to_s, l[:lancamentos].to_s, moeda(l[:valor_pago]), moeda(l[:valor_pendente]), moeda(l[:valor_total])] end linhas << ['TOTAL', @t.total_consolidacoes.to_s, '', moeda(@t.total_pago), moeda(@t.total_pendente), moeda(@t.total_geral)] @pdf.table(linhas, header: true, width: @pdf.bounds.width, column_widths: { 1 => 50, 2 => 50, 3 => 80, 4 => 80, 5 => 85 }, 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(1..5).align = :right t.row(-1).font_style = :bold t.row(1..-1).borders = [:bottom] t.row(1..-1).border_color = 'DDDDDD' end end # As consolidações que compõem o valor — é o "clicar no motorista" da tela, # em papel. def tabela_composicao(cms) linhas = [['Consolidação', 'Período', 'Situação', 'Pago em', 'Valor']] cms.each do |cm| c = cm.consolidacao linhas << [ c.nome, "#{c.data_inicio.strftime('%d/%m/%y')}–#{c.data_fim.strftime('%d/%m/%y')}", cm.pago? ? 'Pago' : 'A receber', cm.pago? ? cm.pago_em.strftime('%d/%m/%Y') : '—', moeda(cm.valor_total) ] end linhas << ['TOTAL', '', '', '', moeda(cms.sum { |cm| cm.valor_total || 0 })] @pdf.table(linhas, header: true, width: @pdf.bounds.width, column_widths: { 1 => 90, 2 => 70, 3 => 70, 4 => 80 }, 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).font_style = :bold t.row(1..-1).borders = [:bottom] t.row(1..-1).border_color = 'DDDDDD' end end end end