<%# app/views/consolidacao_entregas/validar.html.erb — PASSO 2: Validar entregas %> <% content_for :title, "Validar — #{@motorista}" %>
<%# Cabeçalho + controles fixos no topo (no desktop); só a lista de NFs rola. %>
<%# Cabeçalho compacto: voltar, identificação e progresso numa faixa só. Espaço vertical aqui é CARO — tudo isto fica fixo e é subtraído da lista, que é o que o ADM realmente precisa ver. Antes eram 178px em dois cards. %>
<%= link_to wizard_consolidacao_path(@consolidacao), title: 'Voltar (Passo 1)', class: 'shrink-0 inline-flex items-center justify-center gap-1 bg-[#1a1a1a] hover:bg-[#2a2a2a] text-white border border-[#2a2a2a] hover:border-orange-500 font-semibold px-3 h-11 rounded-lg text-sm' do %> ← <% end %> <%# basis-40: o nome não pode ser espremido até virar "P…" — se não couber com o resto, a linha quebra em vez de esmagar a identificação. %>

<%= icone :caminhao, espaco: false %> <%= @motorista %>

<%= @consolidacao.nome %> · <%= l @consolidacao.data_inicio, format: :short %> → <%= l @consolidacao.data_fim, format: :short %>

<%# Progresso ao lado do título (em vez de um card de 70px só p/ ele). No celular vai para uma linha própria, no fim, para não brigar pelo espaço. Números em branco/negrito: esta é a informação que o ADM confere o tempo todo enquanto classifica — compactar não pode custar a leitura dela. %>

<% if @veiculos_sel.any? %><%= icone :caminhao %> <%= @veiculos_sel.join(', ') %> — <% end %> <%= @classificadas %>/<%= @total_entregas %> classificadas · +<%= @manuais %> manuais

<%= link_to revisar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista), class: 'shrink-0 bg-orange-500 hover:bg-orange-600 text-black font-bold px-4 h-11 rounded-lg flex items-center gap-1 text-sm' do %> Revisar<%= icone :avancar, cor: nil %> <% end %>
<%# Barra com 2 segmentos: laranja = elegíveis classificadas · azul = manuais %>
<%# Fechar por veículo — filtra a tela por carro, mostra o estado (pronto/ consolidado/arquivado) e permite CONSOLIDAR o veículo selecionado. Só aparece quando o motorista usou mais de um veículo no período. %> <% pode_fechar_veiculo = !(@consolidacao.finalizada? && !current_user.pode?('consolidacao.editar_finalizada')) %> <% if @veiculos_status.size > 1 %>
<%= icone :veiculo %> Fechar por veículo: clique no nome para filtrar; consolide o carro quando estiver 100% (<%= icone :travado, cor: nil, tamanho: 'w-3.5 h-3.5' %>)
<%# Chip "Todos" — limpa a seleção (mostra todos os carros) %> <%= link_to validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista), class: "px-3 py-2 rounded-lg text-sm font-semibold border min-h-[40px] flex items-center #{@veiculos_sel.empty? ? 'border-orange-500 text-orange-400 bg-orange-500/10' : 'border-[#2a2a2a] text-gray-300 hover:border-orange-500'}" do %> Todos <% end %> <% @veiculos_status.each do |v| %> <% selecionado = @veiculos_sel.include?(v[:vehicle]) %> <%# Alterna este veículo dentro da seleção atual (multi-seleção) %> <% nova_sel = selecionado ? (@veiculos_sel - [v[:vehicle]]) : (@veiculos_sel + [v[:vehicle]]) %> <%# Cor determinística: selecionado(laranja) > consolidado(verde+cadeado) > pronto(verde) > arquivado(cinza tracejado) > neutro. %> <% cor = if selecionado then 'border-orange-500 text-orange-400 bg-orange-500/10' elsif v[:fechado] then 'border-green-500 text-green-400 bg-green-500/10' elsif v[:completo] then 'border-green-600/50 text-green-400' elsif v[:arquivado] then 'border-dashed border-[#3a3a3a] text-gray-500' else 'border-[#2a2a2a] text-gray-300 hover:border-orange-500' end %> <%= link_to validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista, vehicle: nova_sel.presence), data: { 'validacao-target': 'chipVeiculo', vehicle: v[:vehicle], eligible: v[:eligible] }, class: "px-3 py-2 rounded-lg text-sm font-semibold border min-h-[40px] flex items-center gap-2 transition-colors #{cor}" do %> <%= icone :travado, cor: nil, tamanho: 'w-3.5 h-3.5', espaco: false %> <%= v[:vehicle] %> <%= v[:classificadas] %>/<%= v[:eligible] %> <%= icone :confirmar, cor: nil, tamanho: 'w-3.5 h-3.5', espaco: false %> <% end %> <% end %>
<%# Ação de consolidação — opera sobre o veículo único selecionado. %> <% if pode_fechar_veiculo %> <% sel_unico = @veiculos_sel.size == 1 ? @veiculos_sel.first : nil %> <% status_unico = sel_unico && @veiculos_status.find { |v| v[:vehicle] == sel_unico } %>
<% if status_unico.nil? %>

Selecione um veículo (clique no nome) para consolidá-lo separadamente.

<% elsif status_unico[:fechado] %>
<%= icone :travado, cor: nil %> <%= sel_unico %> consolidado. <%= button_to reabrir_veiculo_consolidacao_consolidacao_entregas_path(@consolidacao), method: :post, params: { motorista: @motorista, vehicle: sel_unico, vehicle_sel: @veiculos_sel }, form: { data: { turbo_confirm: "Reabrir o veículo #{sel_unico} para edição?" } }, class: 'text-gray-400 hover:text-white border border-[#2a2a2a] hover:border-orange-500 px-3 py-2 rounded-lg text-xs min-h-[40px] inline-flex items-center gap-1.5' do %> <%= icone :destravado, cor: nil, tamanho: 'w-4 h-4' %> Reabrir veículo <% end %>
<% else %>
<%# Habilita só quando o carro está 100% classificado; o JS liga/desliga conforme a barra do escopo selecionado chega (ou não) a 100%. %> <%= button_to fechar_veiculo_consolidacao_consolidacao_entregas_path(@consolidacao), method: :post, params: { motorista: @motorista, vehicle: sel_unico, vehicle_sel: @veiculos_sel }, disabled: !status_unico[:completo], data: { 'validacao-target': 'consolidarBtn' }, form: { data: { turbo_confirm: "Consolidar o veículo #{sel_unico}? Você poderá reabrir depois." } }, class: "font-bold px-4 py-2 rounded-lg text-xs min-h-[40px] inline-flex items-center gap-1.5 #{status_unico[:completo] ? 'bg-green-600 hover:bg-green-500 text-white cursor-pointer' : 'bg-[#2a2a2a] text-gray-600 cursor-not-allowed'}" do %> <%= icone :travado, cor: nil, tamanho: 'w-4 h-4' %> Consolidar este veículo <% end %> <%= button_to arquivar_veiculo_consolidacao_consolidacao_entregas_path(@consolidacao), method: :post, params: { motorista: @motorista, vehicle: sel_unico, vehicle_sel: @veiculos_sel }, form: { data: { turbo_confirm: "Arquivar o veículo #{sel_unico}? Ele sai da finalização (as entregas já classificadas continuam no pagamento)." } }, class: 'text-gray-400 hover:text-white border border-[#2a2a2a] hover:border-red-500/50 px-3 py-2 rounded-lg text-xs min-h-[40px] inline-flex items-center gap-1.5' do %> <%= icone :arquivar, cor: nil, tamanho: 'w-4 h-4' %> Arquivar veículo <% end %> <%= status_unico[:completo] ? 'Pronto para consolidar.' : 'Classifique 100% deste veículo para consolidar.' %>
<% end %>
<% end %>
<% end %> <%# Barra de ações — uma linha só. O botão "Adicionar lançamento" (bloco abaixo, que carrega os modais) entra NESTA mesma faixa via flex `order`, sem precisar mover os modais de lugar. %>
<%# Pilares SEMPRE visíveis: são a ação principal da tela e o ADM precisa vê-los para saber o que pode fazer. Sem seleção eles ficam esmaecidos (não escondidos) — a versão anterior os removia do DOM e obrigava a descobrir que existiam depois de marcar algo. %>
<%# Oculta/mostra o resumo lateral (mais largura para a lista) %> <%= link_to params[:apenas_pendentes] == '1' ? 'Mostrar todas' : 'Apenas não classificadas', validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista, vehicle: @veiculos_sel.presence, apenas_pendentes: params[:apenas_pendentes] == '1' ? nil : '1'), class: 'text-orange-400 hover:text-orange-300 text-sm border border-orange-500/40 px-3 h-11 rounded-lg flex items-center' %>
<%# Caixa de ferramentas — concentra os lançamentos avulsos (registro manual de entrega e entrega de termo) num único botão com menu suspenso. Os modais e controllers existentes são reaproveitados; só o gatilho mudou. Fica DENTRO da barra de ações (order-2) para não custar uma linha própria; os modais são `fixed`, então não afetam o layout da faixa. %> <% unless @consolidacao.finalizada? && !current_user.pode?('consolidacao.editar_finalizada') %>
<%# Botão único + menu suspenso %> <%# Modal — registro manual de entrega %> <%# Modal — entrega de termo %>
<% end %>
<%# Fim da barra de ações %>
<%# Fim do cabeçalho fixo — abaixo só a lista de NFs rola. %>
<%# ── Lista de entregas (3 colunas) — área rolável ──── %>
<%# Busca na listagem — filtra os cards por NF, local, endereço ou veículo %>
<%= icone :buscar, cor: 'text-gray-500', espaco: false %>
<% if @entregas.any? %> <% @entregas.each do |e| %> <% tipos_ativos = (@classificacoes[e.tracking_id] || []).map(&:tipo) %>
<%# Checkbox seleção em massa %> <%# Dados da entrega %>

NF <%= e.numero_nf %> · <%= e.local %> <% if e.falhada? %> <%= icone :alerta, cor: nil, tamanho: 'w-3.5 h-3.5' %> Insucesso <% else %> <%= icone :confirmar, cor: nil, tamanho: 'w-3.5 h-3.5' %> Entregue <% end %>

<%= icone :local %> <%= e.address.presence || 'sem endereço' %>

<%= icone :calendario %> <%= e.checkout&.strftime('%d/%m/%Y') || '—' %> · <%= icone :caminhao %> <%= e.vehicle.presence || 'sem veículo' %> <% if e.atraso_minutos > 0 %> · <%= icone :relogio, cor: 'text-amber-400' %> atraso <%= e.atraso_minutos %>min<% end %>

<%# Toggles coloridos — laranja=normal, laranja escuro=retirada, branco=bônus, preto=desconto %>
<% [ ['entrega_normal', 'Normal', 'bg-orange-500 text-black'], ['retirada', 'Retirada', 'bg-orange-800 text-white'], ['bonus', 'Bônus', 'bg-white text-black border border-orange-500'], ['desconto', 'Desc.', 'bg-black text-white border border-gray-700'], ['extraordinaria', 'Extra', 'bg-purple-600 text-white'] ].each do |tipo, label, cores| %> <% end %>
<% end %> <% else %>

<%= icone :sucesso, tamanho: 'w-10 h-10', cor: 'text-green-500', espaco: false %>

Nenhuma entrega pendente neste filtro.

<% end %>
<%# ── Resumo lateral (1 coluna) — rola junto se precisar ─────── %>

<%= icone :dashboard, espaco: false %> Resumo

Normal 0
Retirada 0
Bônus 0
Desconto 0
Extraordinária 0
Termo 0
Termo Especial 0
Apontamentos manuais <%= @manuais %>

Total do motorista

R$ 0,00

<%= icone :dinheiro %> Normal: <%= moeda(@precos[:entrega_normal]) %>

<%= icone :retirada %> Retirada: <%= moeda(@precos[:retirada]) %>

<%= icone :bonus %> Bônus: <%= moeda(@precos[:bonus]) %>

<%= icone :desconto %> Desconto: -<%= moeda(@precos[:desconto]) %>

<%= icone :extraordinaria %> Extraordinária: <%= moeda(@precos[:extraordinaria]) %> (valor por entrega)

<%= icone :documento %> Termo: <%= moeda(@precos[:termo]) %>

<%= icone :termo_especial %> Termo Especial: <%= moeda(@precos[:termo_especial]) %>

<%# Estado inicial para o Stimulus %>