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

@@ -208,6 +208,54 @@ class Consolidacao < ApplicationRecord
.distinct.count(:tracking_id)
end
# Status por veículo do motorista: array de { vehicle, eligible, classificadas,
# completo, fechado, arquivado }. `completo` = 100% classificado (pode consolidar);
# `fechado` = veículo consolidado (🔒); `arquivado` = fora do gate. Une os veículos
# com entregas elegíveis (rastreio) com os que só têm linha em consolidacao_veiculos
# (arquivados / buckets manuais). Fonte única do filtro de carros e do wizard.
def veiculos_do_motorista(motorista)
return [] unless motorista.present?
rel = Entrega.atendidas.da_conta_gade
.no_periodo_checkout(data_inicio, data_fim)
.do_motorista(motorista)
rel = rel.da_veiculo(vehicle_ids) if vehicle_ids.present?
rel = rel.da_operacoes(operacoes) if operacoes.present?
por_veiculo = rel.pluck(:tracking_id, :vehicle).group_by { |(_id, v)| v.presence || SEM_VEICULO }
classificadas = consolidacao_entregas.where(motorista_nome: motorista, manual: false)
.distinct.pluck(:tracking_id).to_set
estados = consolidacao_veiculos.where(motorista_nome: motorista).index_by(&:vehicle)
(por_veiculo.keys + estados.keys).uniq.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] }
end
# Arquiva os veículos PENDENTES (com entregas elegíveis mas não 100% classificadas)
# de todos os motoristas ativos, deixando-os de fora da finalização. Usado pelo
# atalho "arquivar pendentes e finalizar" — os prontos/consolidados seguem no todo.
# Retorna a lista "Motorista · Veículo" arquivada.
def arquivar_veiculos_pendentes!(user)
arquivados = []
consolidacao_motoristas.ativos.each do |cm|
veiculos_do_motorista(cm.motorista_nome).each do |v|
next if v[:fechado] || v[:arquivado] || v[:completo] || v[:eligible].zero?
cv = consolidacao_veiculos.find_or_create_by!(motorista_nome: cm.motorista_nome, vehicle: v[:vehicle])
cv.arquivar!(user)
arquivados << "#{cm.motorista_nome} · #{v[:vehicle]}"
end
end
arquivados
end
# ── Apontamento manual ──────────────────────────────────────
# Adiciona uma entrega "por fora" (NF que chegou depois) com um ou mais pilares
# (tipos). O motorista vem da própria entrega e é incluído na consolidação se