Correção Dash board e implantação Relaório de ADM

This commit is contained in:
2026-06-22 17:11:53 -03:00
parent e23ca0f10d
commit 94d8420bbd
16 changed files with 453 additions and 39 deletions

View File

@@ -39,7 +39,8 @@ class ConsolidacaoEntregasController < ApplicationController
entrega_normal: Configuracao.preco_entrega,
retirada: Configuracao.preco_retirada,
bonus: Configuracao.preco_bonus,
desconto: Configuracao.preco_desconto
desconto: Configuracao.preco_desconto,
extraordinaria: Configuracao.preco_extraordinaria
}
end
@@ -62,7 +63,7 @@ class ConsolidacaoEntregasController < ApplicationController
tracking_id: params[:tracking_id],
motorista_nome: params[:motorista],
tipo: params[:tipo],
valor_aplicado: valor_para_tipo(params[:tipo]),
valor_aplicado: valor_classificacao(params[:tipo]),
created_by: current_user.id
)
ativo = true
@@ -106,7 +107,7 @@ class ConsolidacaoEntregasController < ApplicationController
.destroy_all
else
# ADICIONA o pilar às entregas (não remove os demais já marcados).
valor = valor_para_tipo(tipo)
valor = valor_classificacao(tipo)
tracking_ids.each do |tid|
ce = @consolidacao.consolidacao_entregas.find_or_initialize_by(tracking_id: tid, tipo: tipo)
ce.assign_attributes(motorista_nome: motorista,
@@ -296,6 +297,18 @@ class ConsolidacaoEntregasController < ApplicationController
ConsolidacaoEntrega.valor_para(tipo)
end
# Valor a aplicar na classificação. Para o pilar "extraordinária" o admin pode
# informar um valor customizado (params[:valor]) por ser uma exceção; se vier
# ausente/inválido, cai no preço padrão de Configurações. Demais pilares usam
# sempre o preço configurado.
def valor_classificacao(tipo)
return valor_para_tipo(tipo) unless tipo.to_s == 'extraordinaria'
valor = params[:valor].to_s.strip.tr(',', '.')
valor = BigDecimal(valor) rescue nil
valor.present? && valor >= 0 ? valor : Configuracao.preco_extraordinaria
end
def recalcular_motorista(nome)
@consolidacao.recalcular_motorista!(nome)
end

View File

@@ -5,7 +5,8 @@ class ConsolidacoesController < ApplicationController
before_action :set_consolidacao,
only: %i[show edit update destroy finalizar arquivar reativar wizard
registrar_pagamento cancelar_pagamento
preview_holerite gerar_pdf_relatorio gerar_pdf_holerite]
preview_holerite gerar_pdf_relatorio gerar_pdf_holerite
gerar_pdf_financeiro]
# Formas de pagamento aceitas (o select da UI usa esta mesma lista).
FORMAS_PAGAMENTO = %w[pix transferencia dinheiro].freeze
@@ -271,6 +272,19 @@ class ConsolidacoesController < ApplicationController
disposition: 'attachment'
end
# GET /consolidacoes/:id/gerar_pdf_financeiro — relatório financeiro da consolidação
def gerar_pdf_financeiro
authorize @consolidacao, :show?
pdf = Pdf::RelatorioFinanceiroConsolidacaoPdf.new(consolidacao: @consolidacao)
auditar!(:editar, @consolidacao, dados_novos: { pdf: 'financeiro' })
send_data pdf.render,
filename: "financeiro_#{@consolidacao.nome.parameterize}_#{@consolidacao.id}.pdf",
type: 'application/pdf',
disposition: 'attachment'
end
# GET /consolidacoes/:id/gerar_pdf_holerite?motorista=X
def gerar_pdf_holerite
autorizar_holerite!(params[:motorista])

View File

@@ -12,6 +12,44 @@ class DashboardController < ApplicationController
carregar_dados_dashboard
end
# GET /dashboard/relatorio_financeiro?inicio=&fim=&operacoes[]=
# Relatório financeiro do período (PDF) — mesmos números da tela.
def relatorio_financeiro
skip_authorization
return redirect_to(motorista_dashboard_path) if current_user.motorista?
@periodo_inicio, @periodo_fim = periodo_selecionado
carregar_dados_dashboard
op_label = @operacao_filtro.present? ? @operacao_filtro.map { |t| Operacao.label(t) }.join(', ') : 'Todas'
dados = {
custo_total: @fin_custo_total,
ticket_medio: @fin_ticket_medio,
pago: @fin_pago,
pendente: @fin_pendente,
por_operacao: @fin_por_operacao,
por_motorista: @fin_por_motorista,
por_tipo: @fin_por_tipo,
pagamentos_feitos: @pagamentos_feitos,
pagamentos_pendentes: @pagamentos_pendentes,
pag_pago_valor: @pag_pago_valor,
pag_pago_qtd: @pag_pago_qtd,
pag_pend_valor: @pag_pend_valor,
pag_pend_qtd: @pag_pend_qtd
}
pdf = Pdf::RelatorioFinanceiroPeriodoPdf.new(
periodo_inicio: @periodo_inicio, periodo_fim: @periodo_fim,
operacao_label: op_label, dados: dados
)
send_data pdf.render,
filename: "financeiro_#{@periodo_inicio.strftime('%Y%m%d')}_#{@periodo_fim.strftime('%Y%m%d')}.pdf",
type: 'application/pdf',
disposition: 'attachment'
end
private
# Faixa de datas vinda do filtro de calendário (params inicio/fim).