Correção def adicionar_motorista authorize @consolidacao, :update?e na busca na adição dos motoristas

This commit is contained in:
2026-06-26 11:38:35 -03:00
parent 1ad1d4c143
commit b659a66612
3 changed files with 51 additions and 5 deletions

View File

@@ -6,6 +6,7 @@ class ConsolidacoesController < ApplicationController
only: %i[show edit update destroy finalizar arquivar reativar wizard
registrar_pagamento cancelar_pagamento
arquivar_motorista desarquivar_motorista
excluir_motorista adicionar_motorista
preview_extrato gerar_pdf_relatorio gerar_pdf_extrato
gerar_pdf_financeiro]
@@ -165,8 +166,10 @@ class ConsolidacoesController < ApplicationController
authorize @consolidacao, :update?
@arquivados = @consolidacao.consolidacao_motoristas.arquivados.order(:motorista_nome)
# Alimenta o datalist do "Adicionar motorista" (mesma fonte da criação).
@motoristas_disponiveis = Entrega.motoristas_ativos
# Alimenta o datalist do "Adicionar motorista": motoristas PREVISTOS no período
# da consolidação (atendidas, respeitando filtros de veículo/operação) e os
# veículos que cada um usou — para o usuário escolher com contexto.
@motoristas_periodo = motoristas_previstos_no_periodo
@motoristas = @consolidacao.consolidacao_motoristas.ativos.order(:motorista_nome).map do |cm|
total = @consolidacao.entregas_elegiveis_count(cm.motorista_nome)
classificadas = @consolidacao.classificadas_count(cm.motorista_nome)
@@ -447,6 +450,22 @@ class ConsolidacoesController < ApplicationController
@consolidacao = Consolidacao.find(params[:id])
end
# Motoristas com entregas atendidas no período da consolidação (respeitando os
# filtros de veículo/operação dela), com os veículos que cada um usou. Alimenta
# o datalist de "Adicionar motorista". Retorna [{ nome:, veiculos: [..] }, ...].
def motoristas_previstos_no_periodo
rel = Entrega.atendidas.da_conta_gade
.no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim)
rel = rel.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present?
rel = rel.da_operacoes(@consolidacao.operacoes) if @consolidacao.operacoes.present?
rel.pluck(:driver, :vehicle)
.group_by(&:first)
.map { |nome, linhas| { nome: nome, veiculos: linhas.filter_map { |(_, v)| v.presence }.uniq.sort } }
.reject { |m| m[:nome].blank? }
.sort_by { |m| m[:nome] }
end
# Um motorista específico (consolidacao_motorista_id) ou todos da consolidação.
# "Todos" cobre apenas os ATIVOS — motorista arquivado não recebe pagamento.
def motoristas_alvo

View File

@@ -20,4 +20,12 @@ export default class extends Controller {
fundo(event) {
if (event.target === this.modalTarget) this.fechar()
}
// Preenche o input com o motorista escolhido na lista de previstos.
selecionar(event) {
if (this.hasInputTarget) {
this.inputTarget.value = event.currentTarget.dataset.nome
this.inputTarget.focus()
}
}
}

View File

@@ -122,15 +122,34 @@
<p class="text-gray-400 text-sm mb-4">Inclua um motorista nesta consolidação. Se ele estava arquivado, será restaurado.</p>
<%= form_with url: adicionar_motorista_consolidacao_path(@consolidacao), method: :post do |f| %>
<label class="block text-gray-400 text-sm mb-1">Motorista</label>
<label class="block text-gray-400 text-sm mb-1">Motorista <span class="text-gray-600">(previstos no período)</span></label>
<input data-adicionar-motorista-target="input" type="text" name="motorista_nome"
list="motoristas-disponiveis" placeholder="Nome do motorista" autocomplete="off"
class="w-full bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-3 text-base focus:border-orange-500 focus:outline-none mb-4">
<datalist id="motoristas-disponiveis">
<% Array(@motoristas_disponiveis).each do |nome| %>
<option value="<%= nome %>"></option>
<% Array(@motoristas_periodo).each do |m| %>
<option value="<%= m[:nome] %>" label="<%= '🚚 ' + m[:veiculos].join(', ') if m[:veiculos].any? %>"></option>
<% end %>
</datalist>
<%# Lista de previstos no período (nome + veículos usados) — clique para preencher %>
<% if Array(@motoristas_periodo).any? %>
<p class="text-gray-500 text-xs mb-1">Previstos neste período (clique para escolher):</p>
<div class="max-h-48 overflow-y-auto space-y-1 mb-4 pr-1">
<% @motoristas_periodo.each do |m| %>
<button type="button" data-action="adicionar-motorista#selecionar" data-nome="<%= m[:nome] %>"
class="w-full text-left px-3 py-2 bg-[#0a0a0a] border border-[#2a2a2a] hover:border-orange-500 rounded-lg">
<span class="block text-white text-sm font-semibold"><%= m[:nome] %></span>
<% if m[:veiculos].any? %>
<span class="block text-gray-500 text-xs">🚚 <%= m[:veiculos].join(', ') %></span>
<% end %>
</button>
<% end %>
</div>
<% else %>
<p class="text-gray-500 text-xs mb-4">Nenhum motorista previsto no período — você ainda pode digitar um nome manualmente.</p>
<% end %>
<button type="submit"
class="w-full bg-green-600 hover:bg-green-500 text-white font-bold py-3.5 rounded-lg min-h-[48px]">
Adicionar ✓