Adição do botão de entrega manual

This commit is contained in:
2026-06-25 11:35:41 -03:00
parent 022aac2616
commit 0c5b5bcbe6
22 changed files with 615 additions and 67 deletions

View File

@@ -31,6 +31,9 @@ class ConsolidacaoEntregasController < ApplicationController
@total_entregas = @consolidacao.entregas_elegiveis_count(@motorista)
@classificadas = @consolidacao.classificadas_count(@motorista)
# Nomes dos motoristas ATIVOS — alimenta o seletor do apontamento 100% manual.
@motoristas_consolidacao = @consolidacao.consolidacao_motoristas.ativos.pluck(:motorista_nome)
# Filtro "apenas não classificadas"
if params[:apenas_pendentes] == '1'
@entregas = @entregas.reject { |e| @classificacoes.key?(e.tracking_id) }
@@ -157,8 +160,8 @@ class ConsolidacaoEntregasController < ApplicationController
@pagy, @classificacoes = pagy(todas.order(:created_at), limit: @por_pagina, page: 1)
end
# Próximo motorista pendente (para botão "Próximo Motorista")
nomes_completos = @consolidacao.consolidacao_motoristas.map(&:motorista_nome)
# Próximo motorista pendente (para botão "Próximo Motorista") — só ativos
nomes_completos = @consolidacao.consolidacao_motoristas.ativos.map(&:motorista_nome)
@proximo = nomes_completos.find do |nome|
next false if nome == @motorista
total = @consolidacao.entregas_elegiveis_count(nome)
@@ -207,6 +210,36 @@ class ConsolidacaoEntregasController < ApplicationController
render_apontamento_erro(e.message)
end
# POST /consolidacoes/:consolidacao_id/consolidacao_entregas/apontar_manual
# Apontamento 100% MANUAL — não consulta a base de rastreio. O admin informa o
# motorista (pode ser outro que não o da tela), a NF (texto livre), uma
# observação/local e os pilares. Usado quando o motorista foi ao local mas a
# NF ficou registrada com outro motorista no rastreio.
def apontar_manual
authorize @consolidacao, :update?
motorista = @consolidacao.adicionar_apontamento_manual!(
motorista: params[:motorista].to_s.strip,
tipos: tipos_param,
nf: params[:nf],
obs: params[:obs],
valor_extra: valor_extraordinaria_param,
user: current_user
)
auditar!(:editar, @consolidacao,
dados_novos: { apontamento_100_manual: params[:nf], motorista: motorista, tipos: tipos_param })
respond_to do |format|
format.json { render json: resumo_json(motorista).merge(motorista: motorista) }
format.html do
redirect_to validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: motorista),
notice: "Apontamento manual adicionado para #{motorista}."
end
end
rescue ArgumentError => e
render_apontamento_erro(e.message)
end
# DELETE /consolidacoes/:consolidacao_id/consolidacao_entregas/remover_apontamento
# Remove um apontamento manual — por ?id= (um pilar) ou por ?tracking_id=&motorista=
# (todos os pilares daquela nota). Não passa pelo guard de elegibilidade, pois o
@@ -246,9 +279,9 @@ class ConsolidacaoEntregasController < ApplicationController
redirect_to @consolidacao, alert: 'Consolidação finalizada — apenas admin/gerente podem editar.'
end
# Motorista realmente faz parte desta consolidação?
# Motorista realmente faz parte desta consolidação? (ignora arquivados)
def motorista_na_consolidacao?(nome)
nome.present? && @consolidacao.consolidacao_motoristas.exists?(motorista_nome: nome)
nome.present? && @consolidacao.consolidacao_motoristas.ativos.exists?(motorista_nome: nome)
end
# tracking_ids atendidos/elegíveis para o motorista no período (respeita veículos).
@@ -311,6 +344,17 @@ class ConsolidacaoEntregasController < ApplicationController
valor.present? && valor >= 0 ? valor : Configuracao.preco_extraordinaria
end
# Valor customizado da Extraordinária vindo do formulário (params[:valor]),
# aceitando vírgula decimal. Retorna nil se ausente/inválido — aí o model usa
# o preço padrão de Configurações.
def valor_extraordinaria_param
bruto = params[:valor].to_s.strip.tr(',', '.')
return nil if bruto.blank?
valor = BigDecimal(bruto) rescue nil
valor if valor && valor >= 0
end
def recalcular_motorista(nome)
@consolidacao.recalcular_motorista!(nome)
end