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

@@ -3,8 +3,9 @@
# Quanto cada motorista somou no período — e QUAIS consolidações formam esse
# total. É a fonte única das duas telas de "total por motorista":
#
# • admin → /consolidacoes/totais (todos os motoristas + drill-down)
# • motorista→ /motorista/totais (só ele, mesma conta, mesmo PDF)
# • admin → /consolidacoes?visao=motoristas (modo de visualização da própria
# lista, com drill-down no motorista clicado)
# • motorista→ /motorista (o painel, já recortado nele — mesma conta, mesmo PDF)
#
# RECORTE (igual ao filtro da lista de consolidações): entram as consolidações
# ATIVAS cujo período está DENTRO da faixa escolhida (data_inicio >= inicio e
@@ -17,30 +18,36 @@
# bate com a soma dos fechamentos.
module Analytics
class TotaisPorMotorista
def initialize(inicio:, fim:, motorista: nil, incluir_rascunhos: false)
@inicio = inicio.to_date
@fim = fim.to_date
@motorista = motorista.presence
@incluir_rascunhos = incluir_rascunhos
# status: 'finalizada' (padrão — só o que já fechou), 'rascunho' ou
# 'todos'. É o MESMO select de status da lista de consolidações.
# motorista: recorte exato (drill-down / painel do motorista).
# busca: filtro parcial por nome, o campo de busca da lista.
def initialize(inicio:, fim:, motorista: nil, status: 'finalizada', busca: nil)
@inicio = inicio.to_date
@fim = fim.to_date
@motorista = motorista.presence
@status = status.presence || 'finalizada'
@busca = busca.presence
end
attr_reader :inicio, :fim, :motorista
attr_reader :inicio, :fim, :motorista, :status
# ConsolidacaoMotorista do recorte, com a consolidação já carregada (as duas
# telas mostram nome/período/status dela em seguida).
def registros
@registros ||= begin
base = Consolidacao.ativas.no_periodo(@inicio, @fim)
# Só o que já foi FECHADO conta como total do período; rascunho ainda
# muda de valor. `merge` (e não where(consolidacoes: {status: ...}))
# porque status é enum: quem sabe traduzir :finalizada é o próprio model.
base = base.finalizada unless @incluir_rascunhos
# Por padrão só o que já foi FECHADO conta como total do período
# rascunho ainda muda de valor. `merge` (e não where(consolidacoes:
# {status: ...})) porque status é enum: quem traduz :finalizada é o model.
base = base.public_send(@status) if %w[finalizada rascunho].include?(@status)
escopo = ConsolidacaoMotorista.ativos
.joins(:consolidacao)
.merge(base)
.includes(:consolidacao)
escopo = escopo.where(motorista_nome: @motorista) if @motorista
escopo = escopo.where('motorista_nome ILIKE ?', "%#{@busca}%") if @busca
escopo.to_a
end
end