Correção Dash board e implantação Relaório de ADM
This commit is contained in:
154
app/services/pdf/relatorio_financeiro_periodo_pdf.rb
Normal file
154
app/services/pdf/relatorio_financeiro_periodo_pdf.rb
Normal file
@@ -0,0 +1,154 @@
|
||||
# app/services/pdf/relatorio_financeiro_periodo_pdf.rb
|
||||
#
|
||||
# Relatório Financeiro consolidado de um período: espelha a visão financeira do
|
||||
# dashboard (KPIs, custo por operação/motorista/tipo e pagamentos) num PDF para
|
||||
# o admin imprimir para conferência e histórico. Recebe os agregados já
|
||||
# calculados pelo DashboardController (mesma fonte de números da tela).
|
||||
#
|
||||
module Pdf
|
||||
class RelatorioFinanceiroPeriodoPdf < BasePdf
|
||||
VERDE = '22C55E'
|
||||
|
||||
def initialize(periodo_inicio:, periodo_fim:, operacao_label:, dados:)
|
||||
super()
|
||||
@inicio = periodo_inicio
|
||||
@fim = periodo_fim
|
||||
@op = operacao_label
|
||||
@d = dados
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def corpo
|
||||
secao "RELATÓRIO FINANCEIRO — PERÍODO"
|
||||
|
||||
@pdf.text "Período: #{@inicio.strftime('%d/%m/%Y')} a #{@fim.strftime('%d/%m/%Y')}", size: 11, style: :bold
|
||||
@pdf.fill_color CINZA
|
||||
@pdf.text "Operação: #{@op}", size: 10
|
||||
@pdf.fill_color '000000'
|
||||
|
||||
secao "INDICADORES"
|
||||
kpis
|
||||
|
||||
secao "CUSTO POR OPERAÇÃO"
|
||||
tabela_pares(@d[:por_operacao], 'Operação')
|
||||
|
||||
secao "CUSTO POR MOTORISTA"
|
||||
tabela_pares(@d[:por_motorista], 'Motorista')
|
||||
|
||||
secao "COMPOSIÇÃO POR TIPO"
|
||||
tabela_por_tipo
|
||||
|
||||
@pdf.start_new_page if @pdf.cursor < 160
|
||||
secao "PAGAMENTOS REALIZADOS NO PERÍODO"
|
||||
tabela_pagamentos_feitos
|
||||
|
||||
secao "PAGAMENTOS PENDENTES"
|
||||
tabela_pagamentos_pendentes
|
||||
end
|
||||
|
||||
def kpis
|
||||
linhas = [
|
||||
['Custo total', moeda(@d[:custo_total])],
|
||||
['Ticket médio', moeda(@d[:ticket_medio])],
|
||||
['Pago', moeda(@d[:pago])],
|
||||
['A pagar', moeda(@d[: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(2).text_color = VERDE
|
||||
end
|
||||
end
|
||||
|
||||
# pares: Array de [label, valor]
|
||||
def tabela_pares(pares, titulo_col)
|
||||
if pares.present?
|
||||
linhas = [[titulo_col, 'Valor']]
|
||||
pares.each { |label, valor| linhas << [label.to_s, moeda(valor)] }
|
||||
@pdf.table(linhas, header: true, width: @pdf.bounds.width,
|
||||
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
|
||||
t.columns(1).align = :right
|
||||
t.row(1..-1).borders = [:bottom]
|
||||
t.row(1..-1).border_color = 'DDDDDD'
|
||||
end
|
||||
else
|
||||
sem_dados
|
||||
end
|
||||
end
|
||||
|
||||
def tabela_por_tipo
|
||||
if @d[:por_tipo].present?
|
||||
linhas = [['Tipo', 'Valor']]
|
||||
@d[:por_tipo].each { |h| linhas << [h[:label], moeda(h[:valor])] }
|
||||
@pdf.table(linhas, header: true, width: 360, 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
|
||||
t.columns(1).align = :right
|
||||
end
|
||||
else
|
||||
sem_dados
|
||||
end
|
||||
end
|
||||
|
||||
def tabela_pagamentos_feitos
|
||||
registros = @d[:pagamentos_feitos]
|
||||
if registros.present?
|
||||
linhas = [['Pago em', 'Motorista', 'Consolidação', 'Forma', 'Valor']]
|
||||
registros.each do |cm|
|
||||
linhas << [
|
||||
cm.pago_em.strftime('%d/%m/%Y'),
|
||||
cm.motorista_nome,
|
||||
cm.consolidacao.nome,
|
||||
cm.forma_pagamento&.humanize || '—',
|
||||
moeda(cm.valor_total)
|
||||
]
|
||||
end
|
||||
tabela_listagem(linhas)
|
||||
@pdf.move_down 6
|
||||
@pdf.fill_color VERDE
|
||||
@pdf.text "Total pago no período: #{moeda(@d[:pag_pago_valor])} · #{@d[:pag_pago_qtd]} pagamento(s)", size: 10, style: :bold
|
||||
@pdf.fill_color '000000'
|
||||
else
|
||||
sem_dados('Nenhum pagamento realizado neste período.')
|
||||
end
|
||||
end
|
||||
|
||||
def tabela_pagamentos_pendentes
|
||||
registros = @d[:pagamentos_pendentes]
|
||||
if registros.present?
|
||||
linhas = [['Motorista', 'Consolidação', 'Valor']]
|
||||
registros.each do |cm|
|
||||
linhas << [cm.motorista_nome, cm.consolidacao.nome, moeda(cm.valor_total)]
|
||||
end
|
||||
tabela_listagem(linhas)
|
||||
@pdf.move_down 6
|
||||
@pdf.text "Total a pagar: #{moeda(@d[:pag_pend_valor])} · #{@d[:pag_pend_qtd]} motorista(s)", size: 10, style: :bold
|
||||
else
|
||||
sem_dados('Nenhuma pendência no período.')
|
||||
end
|
||||
end
|
||||
|
||||
def tabela_listagem(linhas)
|
||||
@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(-1).align = :right
|
||||
t.row(1..-1).borders = [:bottom]
|
||||
t.row(1..-1).border_color = 'DDDDDD'
|
||||
end
|
||||
end
|
||||
|
||||
def sem_dados(msg = 'Sem dados no período.')
|
||||
@pdf.fill_color CINZA
|
||||
@pdf.text msg, size: 10
|
||||
@pdf.fill_color '000000'
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user