diff --git a/app/controllers/consolidacoes_controller.rb b/app/controllers/consolidacoes_controller.rb index 134822f..305c076 100644 --- a/app/controllers/consolidacoes_controller.rb +++ b/app/controllers/consolidacoes_controller.rb @@ -140,7 +140,7 @@ class ConsolidacoesController < ApplicationController # GET /consolidacoes/:id/gerar_pdf_holerite?motorista=X def gerar_pdf_holerite - authorize @consolidacao, :show? + autorizar_holerite!(params[:motorista]) motorista = params[:motorista] user_mot = User.motorista.find_by('LOWER(nome) = ?', motorista.to_s.downcase) user_mot&.regenerar_login_token! if user_mot&.login_token.blank? @@ -167,6 +167,17 @@ class ConsolidacoesController < ApplicationController private + # Staff (show?) baixa qualquer holerite. O motorista baixa só o PRÓPRIO — o PDF + # já é filtrado pelo nome dele, então não há vazamento de dados de terceiros. + def autorizar_holerite!(motorista_nome) + if current_user.motorista? + raise Pundit::NotAuthorizedError unless motorista_nome.to_s.casecmp?(current_user.nome.to_s) + skip_authorization + else + authorize @consolidacao, :show? + end + end + def set_consolidacao @consolidacao = Consolidacao.find(params[:id]) end diff --git a/app/javascript/controllers/validacao_controller.js b/app/javascript/controllers/validacao_controller.js index 7676d66..a0c06c5 100644 --- a/app/javascript/controllers/validacao_controller.js +++ b/app/javascript/controllers/validacao_controller.js @@ -6,7 +6,7 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = [ - "linha", "checkbox", "toggles", "barra", "percentual", + "linha", "checkbox", "selecionarTodos", "toggles", "barra", "percentual", "contadorClassificadas", "contadorTotal", "qtdNormal", "qtdRetirada", "qtdBonus", "qtdDesconto", "valorTotal" ] @@ -64,6 +64,12 @@ export default class extends Controller { this.atualizarResumo(resp) } + // ── Selecionar / desmarcar todos os checkboxes ───────────── + selecionarTodos(event) { + const marcar = event.currentTarget.checked + this.checkboxTargets.forEach(c => { c.checked = marcar }) + } + // ── Marcar selecionados como X ───────────────────────────── async marcarSelecionados(event) { const tipo = event.currentTarget.dataset.tipo @@ -81,6 +87,7 @@ export default class extends Controller { }) ids.forEach(id => this.setToggle(id, tipo, true)) this.checkboxTargets.forEach(c => c.checked = false) + if (this.hasSelecionarTodosTarget) this.selecionarTodosTarget.checked = false this.atualizarResumo(resp) } diff --git a/app/services/pdf/relatorio_motorista_pdf.rb b/app/services/pdf/relatorio_motorista_pdf.rb index 1d3a686..17d7868 100644 --- a/app/services/pdf/relatorio_motorista_pdf.rb +++ b/app/services/pdf/relatorio_motorista_pdf.rb @@ -29,13 +29,14 @@ module Pdf secao "ENTREGAS (#{@entregas.size})" if @entregas.any? - linhas = [['#', 'Tracking', 'NF / Local', 'Tipo', 'Valor']] + linhas = [['#', 'Tracking', 'NF', 'Endereço', 'Tipo', 'Valor']] @entregas.each_with_index do |e, i| original = e.entrega_original linhas << [ (i + 1).to_s, e.tracking_id.to_s.first(14), - original ? "NF #{original.numero_nf} · #{original.local.to_s.first(30)}" : '—', + original ? "NF #{original.numero_nf}" : '—', + original ? original.address.to_s.first(45) : '—', e.tipo_cor[:label], (e.desconto? ? '-' : '') + moeda(e.valor_aplicado) ] @@ -46,7 +47,7 @@ module Pdf t.row(0).background_color = PRETO t.row(0).text_color = 'FFFFFF' t.row(0).font_style = :bold - t.columns(4).align = :right + t.columns(5).align = :right t.row(1..-1).borders = [:bottom] t.row(1..-1).border_color = 'DDDDDD' end diff --git a/app/views/consolidacao_entregas/revisar.html.erb b/app/views/consolidacao_entregas/revisar.html.erb index ac4ebf5..eaefbdf 100644 --- a/app/views/consolidacao_entregas/revisar.html.erb +++ b/app/views/consolidacao_entregas/revisar.html.erb @@ -6,7 +6,7 @@
<%= link_to '← Voltar (Passo 2)', validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista), - class: 'text-gray-500 hover:text-orange-500 text-sm' %> + class: 'inline-flex items-center gap-1 bg-[#1a1a1a] hover:bg-[#2a2a2a] text-white border border-[#2a2a2a] hover:border-orange-500 font-semibold px-4 py-2.5 rounded-lg text-sm min-h-[44px]' %>

📋 Revisão — <%= @motorista %>

<%= @consolidacao.nome %>

@@ -52,6 +52,7 @@ Tracking / NF + Endereço Tipo Valor @@ -60,6 +61,7 @@ <% @classificacoes.each do |c| %> <%= c.tracking_id %> + <%= c.entrega_original&.address.presence || '—' %> <%= c.tipo_cor[:label] %> diff --git a/app/views/consolidacao_entregas/validar.html.erb b/app/views/consolidacao_entregas/validar.html.erb index 30f10fc..258ab93 100644 --- a/app/views/consolidacao_entregas/validar.html.erb +++ b/app/views/consolidacao_entregas/validar.html.erb @@ -9,7 +9,8 @@ <%# Header %>
- <%= link_to '← Voltar (Passo 1)', wizard_consolidacao_path(@consolidacao), class: 'text-gray-500 hover:text-orange-500 text-sm' %> + <%= link_to '← Voltar (Passo 1)', wizard_consolidacao_path(@consolidacao), + class: 'inline-flex items-center gap-1 bg-[#1a1a1a] hover:bg-[#2a2a2a] text-white border border-[#2a2a2a] hover:border-orange-500 font-semibold px-4 py-2.5 rounded-lg text-sm min-h-[44px]' %>

🚚 <%= @motorista %>

@@ -44,6 +45,13 @@ ✓ Marcar todos como Normal + +
Selecionados como: