Adição do filtro de veiculon na parte da consolidação
This commit is contained in:
@@ -5,11 +5,15 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
before_action :set_consolidacao
|
||||
before_action :bloquear_se_finalizada, except: %i[validar revisar]
|
||||
|
||||
# Rótulo/sentinela do grupo de entregas sem veículo no filtro "fechar por carro".
|
||||
SEM_VEICULO = '(sem veículo)'.freeze
|
||||
|
||||
# GET /consolidacoes/:consolidacao_id/consolidacao_entregas/validar?motorista=X
|
||||
# WIZARD PASSO 2 — tela de validação com toggles
|
||||
def validar
|
||||
authorize @consolidacao, :show?
|
||||
@motorista = params[:motorista]
|
||||
@veiculo = params[:vehicle].presence # filtro "fechar por carro" (opcional)
|
||||
|
||||
# Entregas atendidas do período no banco existente (read-only): sucesso +
|
||||
# insucesso, pois o motorista foi ao local e a entrega precisa constar.
|
||||
@@ -20,6 +24,7 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
.do_motorista(@motorista)
|
||||
@entregas = @entregas.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present?
|
||||
@entregas = @entregas.da_operacoes(@consolidacao.operacoes) if @consolidacao.operacoes.present?
|
||||
@entregas = filtrar_por_veiculo(@entregas, @veiculo) if @veiculo
|
||||
@entregas = @entregas.order(:checkout)
|
||||
|
||||
# Classificações já feitas — agrupadas por tracking_id (uma entrega pode ter
|
||||
@@ -28,8 +33,17 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
.where(motorista_nome: @motorista)
|
||||
.group_by(&:tracking_id)
|
||||
|
||||
@total_entregas = @consolidacao.entregas_elegiveis_count(@motorista)
|
||||
@classificadas = @consolidacao.classificadas_count(@motorista)
|
||||
# Status "fechado" por veículo (filtro + acompanhamento) e totais com escopo:
|
||||
# quando um carro está selecionado, a barra reflete só aquele carro.
|
||||
@veiculos_status = veiculos_status(@motorista)
|
||||
if @veiculo
|
||||
atual = @veiculos_status.find { |v| v[:vehicle] == @veiculo }
|
||||
@total_entregas = atual ? atual[:eligible] : 0
|
||||
@classificadas = atual ? atual[:classificadas] : 0
|
||||
else
|
||||
@total_entregas = @consolidacao.entregas_elegiveis_count(@motorista)
|
||||
@classificadas = @consolidacao.classificadas_count(@motorista)
|
||||
end
|
||||
|
||||
# Nomes dos motoristas ATIVOS — alimenta o seletor do apontamento 100% manual.
|
||||
@motoristas_consolidacao = @consolidacao.consolidacao_motoristas.ativos.pluck(:motorista_nome)
|
||||
@@ -77,7 +91,7 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
|
||||
respond_to do |format|
|
||||
format.json do
|
||||
render json: resumo_json(params[:motorista]).merge(
|
||||
render json: resumo_json(params[:motorista], vehicle: params[:vehicle].presence).merge(
|
||||
ativo: ativo, tracking_id: params[:tracking_id], tipo: params[:tipo]
|
||||
)
|
||||
end
|
||||
@@ -96,8 +110,9 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
|
||||
return render_nao_elegivel unless motorista_na_consolidacao?(motorista)
|
||||
|
||||
elegiveis = tracking_ids_elegiveis(motorista)
|
||||
# Sem tracking_ids = todas as elegíveis do período (botão "todos").
|
||||
# Recorte por veículo (fechar um carro de cada vez). Sem veículo = todos.
|
||||
elegiveis = tracking_ids_elegiveis(motorista, params[:vehicle].presence)
|
||||
# Sem tracking_ids = todas as elegíveis do período/veículo (botão "todos").
|
||||
# Com tracking_ids → mantém só as que de fato são elegíveis para o motorista.
|
||||
tracking_ids = tracking_ids.empty? ? elegiveis : (tracking_ids & elegiveis)
|
||||
|
||||
@@ -127,10 +142,10 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
qtd: tracking_ids.size, motorista: motorista })
|
||||
|
||||
respond_to do |format|
|
||||
format.json { render json: resumo_json(motorista) }
|
||||
format.json { render json: resumo_json(motorista, vehicle: params[:vehicle].presence) }
|
||||
format.html do
|
||||
verbo = remover ? 'desmarcadas de' : 'marcadas como'
|
||||
redirect_to validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: motorista),
|
||||
redirect_to validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: motorista, vehicle: params[:vehicle].presence),
|
||||
notice: "#{tracking_ids.size} entregas #{verbo} #{tipo.humanize}."
|
||||
end
|
||||
end
|
||||
@@ -286,7 +301,9 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
|
||||
# tracking_ids atendidos/elegíveis para o motorista no período (respeita veículos).
|
||||
# Atendidas = sucesso + insucesso com checkout (o motorista foi ao local).
|
||||
def tracking_ids_elegiveis(motorista)
|
||||
# `vehicle` (opcional) recorta para UM carro — é o que faz "Marcar todos" fechar
|
||||
# só o veículo selecionado.
|
||||
def tracking_ids_elegiveis(motorista, vehicle = nil)
|
||||
return [] unless motorista.present?
|
||||
|
||||
rel = Entrega.atendidas.da_conta_gade
|
||||
@@ -294,9 +311,41 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
.do_motorista(motorista)
|
||||
rel = rel.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present?
|
||||
rel = rel.da_operacoes(@consolidacao.operacoes) if @consolidacao.operacoes.present?
|
||||
rel = filtrar_por_veiculo(rel, vehicle) if vehicle.present?
|
||||
rel.pluck(:tracking_id)
|
||||
end
|
||||
|
||||
# Recorte por um único veículo (trata o grupo "sem veículo").
|
||||
def filtrar_por_veiculo(rel, veiculo)
|
||||
veiculo == SEM_VEICULO ? rel.where(vehicle: [nil, '']) : rel.da_veiculo(veiculo)
|
||||
end
|
||||
|
||||
# Status "fechado" por veículo do motorista: lista de
|
||||
# { vehicle:, eligible:, classificadas:, fechado: }. Fonte única do filtro de
|
||||
# carros e do acompanhamento (chips). 2 queries: elegíveis (com a coluna do
|
||||
# veículo) e as já classificadas (não-manuais).
|
||||
def veiculos_status(motorista)
|
||||
return [] unless motorista.present?
|
||||
|
||||
rel = Entrega.atendidas.da_conta_gade
|
||||
.no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim)
|
||||
.do_motorista(motorista)
|
||||
rel = rel.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present?
|
||||
rel = rel.da_operacoes(@consolidacao.operacoes) if @consolidacao.operacoes.present?
|
||||
|
||||
por_veiculo = rel.pluck(:tracking_id, :vehicle).group_by { |(_id, v)| v.presence || SEM_VEICULO }
|
||||
classificadas = @consolidacao.consolidacao_entregas
|
||||
.where(motorista_nome: motorista, manual: false)
|
||||
.distinct.pluck(:tracking_id).to_set
|
||||
|
||||
por_veiculo.map do |veiculo, linhas|
|
||||
ids = linhas.map(&:first)
|
||||
feito = ids.count { |id| classificadas.include?(id) }
|
||||
{ vehicle: veiculo, eligible: ids.size, classificadas: feito,
|
||||
fechado: ids.size.positive? && feito >= ids.size }
|
||||
end.sort_by { |v| v[:vehicle] }
|
||||
end
|
||||
|
||||
# Valida que a entrega pertence ao motorista informado e ao período/veículo da
|
||||
# consolidação — impede classificar tracking_ids arbitrários via requisição.
|
||||
def entrega_elegivel?(motorista, tracking_id)
|
||||
@@ -359,13 +408,25 @@ class ConsolidacaoEntregasController < ApplicationController
|
||||
@consolidacao.recalcular_motorista!(nome)
|
||||
end
|
||||
|
||||
def resumo_json(motorista)
|
||||
# `vehicle` (opcional): quando presente, `classificadas_escopo` reflete só aquele
|
||||
# carro (para a barra de progresso por veículo). `veiculos_status` acompanha o
|
||||
# payload para o front atualizar os chips sem recarregar.
|
||||
def resumo_json(motorista, vehicle: nil)
|
||||
classificacoes = @consolidacao.consolidacao_entregas.where(motorista_nome: motorista)
|
||||
status = veiculos_status(motorista)
|
||||
classificadas = classificacoes.distinct.count(:tracking_id)
|
||||
escopo = if vehicle.present?
|
||||
(status.find { |v| v[:vehicle] == vehicle } || {})[:classificadas] || 0
|
||||
else
|
||||
classificadas
|
||||
end
|
||||
{
|
||||
ok: true,
|
||||
classificadas: classificacoes.distinct.count(:tracking_id),
|
||||
por_tipo: classificacoes.group(:tipo).count,
|
||||
valor_total: classificacoes.sum { |e| e.tipo == 'desconto' ? -e.valor_aplicado : e.valor_aplicado }.to_f
|
||||
classificadas: classificadas,
|
||||
classificadas_escopo: escopo,
|
||||
por_tipo: classificacoes.group(:tipo).count,
|
||||
valor_total: classificacoes.sum { |e| e.tipo == 'desconto' ? -e.valor_aplicado : e.valor_aplicado }.to_f,
|
||||
veiculos_status: status
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user