Criação da visão geral da consolidação por motorista e Estilização

This commit is contained in:
2026-08-26 15:15:44 -03:00
parent cd99a22553
commit 7a8ec1bc16
14 changed files with 508 additions and 525 deletions

View File

@@ -13,10 +13,21 @@ class ConsolidacoesController < ApplicationController
# Formas de pagamento aceitas (o select da UI usa esta mesma lista).
FORMAS_PAGAMENTO = %w[pix transferencia dinheiro].freeze
# GET /consolidacoes — lista com filtros
# GET /consolidacoes?visao=lista|motoristas — a MESMA tela em dois modos de
# visualização, com os mesmos filtros:
#
# lista → um card por CONSOLIDAÇÃO (o de sempre);
# motoristas → um card por MOTORISTA, com o total dele no período e, ao
# clicar, as consolidações que compõem aquele valor.
#
# São duas leituras do mesmo recorte: o trabalho é organizado por consolidação,
# mas o pagamento é por motorista — antes, para saber quanto um motorista tinha
# fechado no mês, era preciso abrir consolidação por consolidação e somar à mão.
def index
authorize Consolidacao
@visao = params[:visao] == 'motoristas' ? 'motoristas' : 'lista'
@consolidacoes = Consolidacao.ativas.recentes.includes(:criador)
# Filtros
@@ -38,42 +49,25 @@ class ConsolidacoesController < ApplicationController
if %w[pago pendente parcial].include?(params[:pagamento])
@consolidacoes = @consolidacoes.public_send("pagamento_#{params[:pagamento]}")
end
montar_totais if @visao == 'motoristas'
end
# GET /consolidacoes/totais?inicio=&fim=&motorista=&rascunhos=1
#
# "Quanto cada motorista somou no período". A lista de consolidações mostra um
# card por CONSOLIDAÇÃO, mas o pagamento é por MOTORISTA: para saber quanto um
# motorista fechou no mês era preciso abrir consolidação por consolidação e
# somar à mão. Aqui o total vem pronto e, clicando no motorista (?motorista=),
# a tela abre as consolidações que compõem aquele valor.
def totais
authorize Consolidacao, :index?
@inicio, @fim = periodo_totais
@incluir_rascunhos = params[:rascunhos] == '1'
@motorista = params[:motorista].presence
@totais = Analytics::TotaisPorMotorista.new(
inicio: @inicio, fim: @fim, incluir_rascunhos: @incluir_rascunhos
)
# Drill-down: as consolidações do motorista clicado (a tabela geral continua
# na tela, então o service é montado sem recorte de motorista).
@detalhe = @motorista ? @totais.consolidacoes_de(@motorista) : nil
end
# GET /consolidacoes/totais_pdf — o mesmo relatório em PDF. Com ?motorista=
# sai só o extrato daquele motorista (com espaço de assinatura).
# GET /consolidacoes/totais_pdf — o modo "Por motorista" em PDF, com os mesmos
# filtros da tela. Com ?detalhe=NOME sai só o extrato daquele motorista (com
# espaço de assinatura).
def totais_pdf
authorize Consolidacao, :index?
inicio, fim = periodo_totais
totais = Analytics::TotaisPorMotorista.new(
inicio: inicio, fim: fim,
motorista: params[:motorista].presence,
incluir_rascunhos: params[:rascunhos] == '1'
motorista: params[:detalhe].presence,
status: params[:status].presence || 'todos',
busca: params[:motorista].presence
)
nome = params[:motorista].presence&.parameterize(separator: '_')
nome = params[:detalhe].presence&.parameterize(separator: '_')
arquivo = ['totais', nome, inicio.strftime('%Y%m%d'), fim.strftime('%Y%m%d')].compact.join('_')
send_data Pdf::TotaisMotoristaPdf.new(totais: totais, detalhar: params[:detalhar] != '0').render,
filename: "#{arquivo}.pdf",
@@ -490,6 +484,20 @@ class ConsolidacoesController < ApplicationController
private
# Modo "Por motorista": os totais saem do MESMO recorte da lista (período,
# status e busca por motorista), para as duas visões nunca contarem coisas
# diferentes. `detalhe` é o motorista aberto (o clique na linha).
def montar_totais
@inicio, @fim = periodo_totais
@totais = Analytics::TotaisPorMotorista.new(
inicio: @inicio, fim: @fim,
status: params[:status].presence || 'todos',
busca: params[:motorista].presence
)
@detalhe_motorista = params[:detalhe].presence
@detalhe = @detalhe_motorista ? @totais.consolidacoes_de(@detalhe_motorista) : nil
end
# Período do relatório de totais. Default: o MÊS CORRENTE INTEIRO — o fim é o
# último dia do mês, não "hoje", porque o recorte exige a consolidação inteira
# dentro da faixa (Consolidacao.no_periodo) e um fechamento que vai até 31/08