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

This commit is contained in:
2026-08-26 11:15:52 -03:00
parent 8d24a57579
commit cd99a22553
12 changed files with 841 additions and 3 deletions

View File

@@ -40,6 +40,47 @@ class ConsolidacoesController < ApplicationController
end
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).
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'
)
nome = params[:motorista].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",
type: 'application/pdf',
disposition: 'attachment'
end
# GET /consolidacoes/new
def new
authorize Consolidacao
@@ -449,6 +490,24 @@ class ConsolidacoesController < ApplicationController
private
# 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
# sumiria da tela até o dia 31 chegar.
def periodo_totais
inicio = parse_data_totais(params[:inicio]) || Date.current.beginning_of_month
fim = parse_data_totais(params[:fim]) || Date.current.end_of_month
inicio, fim = fim, inicio if fim < inicio
[inicio, fim]
end
def parse_data_totais(str)
return nil if str.blank?
Date.parse(str)
rescue ArgumentError, TypeError
nil
end
# Acha o User motorista pelo nome para gerar o QR Code de acesso. O
# motorista_nome vem dos dados externos de entrega e o users.nome é digitado
# no admin — então toleramos diferenças de caixa e de espaços (extras/duplos).