correção do filtro de veiculos na area de consolidação

This commit is contained in:
2026-07-03 10:19:10 -03:00
parent eca6df39eb
commit 0a6b5a68fc
8 changed files with 144 additions and 61 deletions

View File

@@ -464,36 +464,9 @@ class ConsolidacaoEntregasController < ApplicationController
# { 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).
# Status por veículo do motorista: { vehicle, eligible, classificadas, completo,
# fechado, arquivado }. `completo` = 100% classificado (verde, pode consolidar);
# `fechado` = veículo consolidado (cadeado, vem de consolidacao_veiculos);
# `arquivado` = fora do gate. Une os veículos com entregas elegíveis (rastreio)
# com os que só existem como linha de consolidacao_veiculos (arquivados/manuais).
# Status por veículo do motorista (fonte única no model: Consolidacao#veiculos_do_motorista).
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
estados = @consolidacao.consolidacao_veiculos.where(motorista_nome: motorista).index_by(&:vehicle)
veiculos = (por_veiculo.keys + estados.keys).uniq
veiculos.map do |veiculo|
ids = (por_veiculo[veiculo] || []).map(&:first)
feito = ids.count { |id| classificadas.include?(id) }
cv = estados[veiculo]
{ vehicle: veiculo, eligible: ids.size, classificadas: feito,
completo: ids.size.positive? && feito >= ids.size,
fechado: cv&.fechado? || false,
arquivado: cv&.arquivado? || false }
end.sort_by { |v| v[:vehicle] }
@consolidacao.veiculos_do_motorista(motorista)
end
# Valida que a entrega pertence ao motorista informado e ao período/veículo da

View File

@@ -3,7 +3,7 @@ class ConsolidacoesController < ApplicationController
include Auditavel
before_action :set_consolidacao,
only: %i[show edit update destroy finalizar arquivar reativar wizard
only: %i[show edit update destroy finalizar finalizar_parcial arquivar reativar wizard
registrar_pagamento cancelar_pagamento
arquivar_motorista desarquivar_motorista
excluir_motorista adicionar_motorista
@@ -181,20 +181,20 @@ class ConsolidacoesController < ApplicationController
.apontamentos
.where(motorista_nome: cm.motorista_nome)
.distinct.count(:tracking_id)
# Status por veículo (para o breakdown do card) e estado de fechamento.
veiculos = @consolidacao.consolidacao_veiculos.ativos
.where(motorista_nome: cm.motorista_nome)
.order(:vehicle)
# Status por veículo (breakdown do card): total usados, consolidados (🔒),
# pendentes (não dá p/ consolidar ainda) e prontos (100%, falta consolidar).
vinfo = @consolidacao.veiculos_do_motorista(cm.motorista_nome).reject { |v| v[:arquivado] }
{
registro: cm,
total: total,
classificadas: classificadas,
apontamentos: apontamentos,
veiculos: veiculos,
veiculos_fechados: veiculos.count(&:fechado?),
# Espelha o gate do servidor (todas_entregas_classificadas?): exige tudo
# classificado E todos os veículos ativos fechados (consolidados).
completo: @consolidacao.motorista_completo?(cm.motorista_nome)
registro: cm,
total: total,
classificadas: classificadas,
apontamentos: apontamentos,
veiculos_total: vinfo.size,
veiculos_fechados: vinfo.count { |v| v[:fechado] },
veiculos_prontos: vinfo.count { |v| !v[:fechado] && v[:completo] },
veiculos_pendentes: vinfo.select { |v| !v[:fechado] && !v[:completo] && v[:eligible].positive? }
.map { |v| v[:vehicle] },
completo: @consolidacao.motorista_completo?(cm.motorista_nome)
}
end
end
@@ -213,6 +213,25 @@ class ConsolidacoesController < ApplicationController
end
end
# POST /consolidacoes/:id/finalizar_parcial
# Atalho "finalizar só os veículos consolidados": arquiva os veículos que ainda
# não dá para consolidar (não 100% classificados) e finaliza a consolidação. Os
# veículos consolidados/prontos seguem no fechamento; os pendentes ficam de fora.
def finalizar_parcial
authorize @consolidacao, :update?
arquivados = @consolidacao.arquivar_veiculos_pendentes!(current_user)
if @consolidacao.finalizar!(current_user)
auditar!(:finalizar, @consolidacao, dados_novos: { finalizar_parcial: true, veiculos_arquivados: arquivados })
NotificacaoService.notificar_finalizacao(@consolidacao)
redirect_to @consolidacao,
notice: "Consolidação finalizada. #{arquivados.size} veículo(s) pendente(s) ficaram de fora. Motoristas notificados."
else
redirect_to wizard_consolidacao_path(@consolidacao),
alert: 'Não foi possível finalizar: ainda há entregas pendentes fora dos veículos arquivados.'
end
end
# POST /consolidacoes/:id/arquivar
def arquivar
authorize @consolidacao, :destroy?