diff --git a/Erros/Action Controller_ Exception caught_quando aperta o botão de relatório individual.html b/Erros/Action Controller_ Exception caught_quando aperta o botão de relatório individual.html new file mode 100644 index 0000000..d5cc393 --- /dev/null +++ b/Erros/Action Controller_ Exception caught_quando aperta o botão de relatório individual.html @@ -0,0 +1,4148 @@ + + + + + + + Action Controller: Exception caught + + + + + + +
+

+ Pundit::NotDefinedError + in ConsolidacoesController#gerar_pdf_relatorio +

+
+ +
+
+
unable to find policy `NilClassPolicy` for `nil`
+
+ + + + + + + + + + + + +
+
+ Extracted source (around line #116): +
+
+ + + + + +
+
+114
+115
+116
+117
+118
+119
+              
+
+
+
# GET /consolidacoes/:id/gerar_pdf_relatorio?motorista=X +
def gerar_pdf_relatorio +
authorize @consolidacao, :show? +
motorista = params[:motorista] +
+
pdf = Pdf::RelatorioMotoristaPdf.new(consolidacao: @consolidacao, motorista: motorista) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Rails.root: /app

+ +
+ Application Trace | + Framework Trace | + Full Trace + + + + + + +
+ + + + +

Request

+

Parameters:

{"motorista"=>"Bruno Corgozinho", "id"=>"3"}
+
+ +
+ + +
+ +
+ + +
+ +

Response

+

Headers:

None
+ +
+ + + + diff --git a/Erros/Action Controller_ Exception caught_quando aperta para modificar os usuario .html b/Erros/Action Controller_ Exception caught_quando aperta para modificar os usuario .html new file mode 100644 index 0000000..9129811 --- /dev/null +++ b/Erros/Action Controller_ Exception caught_quando aperta para modificar os usuario .html @@ -0,0 +1,6176 @@ + + + + + + + Action Controller: Exception caught + + + + + + +
+

+ NameError in + Admin::Usuarios#edit +

+
+ +
+

+ Showing /app/app/views/admin/usuarios/_form.html.erb where line #47 raised: +

+
undefined local variable or method `role_options_for_select' for #<ActionView::Base:0x0000000000fb68>
+ + +
+
+ Extracted source (around line #48): +
+
+ + + + + +
+
+46
+47
+48
+49
+50
+51
+              
+
+
+
'.freeze; @output_buffer.append=( f.label :role, 'Perfil de acesso', class: 'block text-sm font-medium text-gray-300 mb-1.5' ); @output_buffer.safe_append=' +
'.freeze; @output_buffer.append=( f.select :role, +
options_for_select(role_options_for_select, usuario.role), +
{}, +
class: 'w-full px-4 py-3 bg-[#0a0a0a] border border-white/10 rounded-xl text-white +
focus:outline-none focus:border-[#f97316] focus:ring-1 focus:ring-[#f97316] +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Trace of template inclusion: #<ActionView::Template app/views/admin/usuarios/edit.html.erb locals=[]>

+ + +

Rails.root: /app

+ +
+ Application Trace | + Framework Trace | + Full Trace + + + + + + +
+ +

Request

+

Parameters:

{"id"=>"1"}
+
+ +
+ + +
+ +
+ + +
+ +

Response

+

Headers:

None
+ +
+ + + + diff --git a/Erros/Action Controller_ Exception caughtquando aperta o botçao de gerar holerite.html b/Erros/Action Controller_ Exception caughtquando aperta o botçao de gerar holerite.html new file mode 100644 index 0000000..58bb3d2 --- /dev/null +++ b/Erros/Action Controller_ Exception caughtquando aperta o botçao de gerar holerite.html @@ -0,0 +1,4148 @@ + + + + + + + Action Controller: Exception caught + + + + + + +
+

+ Pundit::NotDefinedError + in ConsolidacoesController#gerar_pdf_holerite +

+
+ +
+
+
unable to find policy `NilClassPolicy` for `nil`
+
+ + + + + + + + + + + + +
+
+ Extracted source (around line #130): +
+
+ + + + + +
+
+128
+129
+130
+131
+132
+133
+              
+
+
+
# GET /consolidacoes/:id/gerar_pdf_holerite?motorista=X +
def gerar_pdf_holerite +
authorize @consolidacao, :show? +
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? +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Rails.root: /app

+ +
+ Application Trace | + Framework Trace | + Full Trace + + + + + + +
+ + + + +

Request

+

Parameters:

{"motorista"=>"Bruno Corgozinho", "id"=>"3"}
+
+ +
+ + +
+ +
+ + +
+ +

Response

+

Headers:

None
+ +
+ + + + diff --git a/Erros/teste _ Reem Logística_quando aperta a pre visualização do holerite.html b/Erros/teste _ Reem Logística_quando aperta a pre visualização do holerite.html new file mode 100644 index 0000000..888642b --- /dev/null +++ b/Erros/teste _ Reem Logística_quando aperta a pre visualização do holerite.html @@ -0,0 +1,252 @@ + + + + + + + + teste | Reem Logística + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
G
+ Reem Logística +
+
+
+
+ + + + + + +
+ +
+ +
+ ← Consolidações +
+
+
+

teste

+ 📝 Rascunho +
+

+ 📅 01/02/2026 → 28/02/2026 + · Criada por Administrador Gade +

+
+
+ ✏️ Continuar validação +
+
+
+
+ +
+

Valor total da consolidação

+

R$ 5265,00

+
+ +

👥 Motoristas

+
+
+
+
+

Bruno Corgozinho

+

R$ 5265,00

+
+
+ + 📄 Relatório Individual + 🧾 Gerar Holerite +
+
+
+
+
+ + + + + +
+ + + + + + diff --git a/Imagens para correção /Imagem colada (7).png b/Imagens para correção /Imagem colada (7).png new file mode 100644 index 0000000..a2a078e Binary files /dev/null and b/Imagens para correção /Imagem colada (7).png differ diff --git a/Imagens para implantação /Imagem colada (4).png b/Imagens para implantação /Imagem colada (4).png new file mode 100644 index 0000000..9dcfb24 Binary files /dev/null and b/Imagens para implantação /Imagem colada (4).png differ diff --git a/Imagens para implantação /Imagem colada (5).png b/Imagens para implantação /Imagem colada (5).png new file mode 100644 index 0000000..729beb3 Binary files /dev/null and b/Imagens para implantação /Imagem colada (5).png differ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6110295..15570d5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,7 @@ # app/controllers/application_controller.rb class ApplicationController < ActionController::Base include Pundit::Authorization + include Pagy::Backend before_action :authenticate_user! before_action :set_tema diff --git a/app/controllers/consolidacao_entregas_controller.rb b/app/controllers/consolidacao_entregas_controller.rb index b4457f6..f8917a4 100644 --- a/app/controllers/consolidacao_entregas_controller.rb +++ b/app/controllers/consolidacao_entregas_controller.rb @@ -125,15 +125,19 @@ class ConsolidacaoEntregasController < ApplicationController authorize @consolidacao, :show? @motorista = params[:motorista] - @classificacoes = @consolidacao.consolidacao_entregas - .where(motorista_nome: @motorista) - .order(:created_at) + todas = @consolidacao.consolidacao_entregas.where(motorista_nome: @motorista) - # reorder(nil): GROUP BY tipo + ORDER BY created_at é inválido no PostgreSQL - @resumo = @classificacoes.reorder(nil).group(:tipo).count - @total = @classificacoes.sum do |c| + # Agregados calculados sobre o conjunto COMPLETO (não só a página exibida) + @resumo = todas.group(:tipo).count + @total = todas.sum do |c| c.tipo == 'desconto' ? -c.valor_aplicado : c.valor_aplicado end + @total_pilares = todas.count + @total_classificadas = todas.distinct.count(:tracking_id) + + # Paginação só da tabela exibida — 20 padrão, com seletor 20/50/100 + @por_pagina = [20, 50, 100].include?(params[:por_pagina].to_i) ? params[:por_pagina].to_i : 20 + @pagy, @classificacoes = pagy(todas.order(:created_at), limit: @por_pagina) # Próximo motorista pendente (para botão "Próximo Motorista") nomes_completos = @consolidacao.consolidacao_motoristas.map(&:motorista_nome) diff --git a/app/controllers/consolidacoes_controller.rb b/app/controllers/consolidacoes_controller.rb index 5571c03..134822f 100644 --- a/app/controllers/consolidacoes_controller.rb +++ b/app/controllers/consolidacoes_controller.rb @@ -2,7 +2,9 @@ class ConsolidacoesController < ApplicationController include Auditavel - before_action :set_consolidacao, only: %i[show edit update destroy finalizar arquivar wizard] + before_action :set_consolidacao, + only: %i[show edit update destroy finalizar arquivar wizard + preview_holerite gerar_pdf_relatorio gerar_pdf_holerite] # GET /consolidacoes — lista com filtros def index @@ -65,6 +67,17 @@ class ConsolidacoesController < ApplicationController render :new, status: :unprocessable_entity end + # GET /consolidacoes/veiculos_disponiveis?motoristas[]=X&inicio=&fim= + # Lista (JSON) os veículos usados pelos motoristas selecionados no período — + # alimenta o filtro dinâmico de veículos no formulário de nova consolidação. + def veiculos_disponiveis + authorize Consolidacao, :new? + veiculos = Entrega.veiculos_de_motoristas( + params[:motoristas], inicio: params[:inicio], fim: params[:fim] + ) + render json: { veiculos: veiculos } + end + # GET /consolidacoes/:id — visão geral def show authorize @consolidacao diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 536e8e5..adf5054 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -72,8 +72,10 @@ class DashboardController < ApplicationController # Evolução diária no período (para Chart.js) @grafico_diario = build_grafico_diario(entregas, config[:entrega]) - # Consolidações criadas no período - @consolidacoes_mes = Consolidacao.ativas.where(created_at: @periodo_inicio.beginning_of_day..@periodo_fim.end_of_day) + # Consolidações cujo período (data_inicio..data_fim) cruza o período do dashboard + # — independe de quando foram criadas (created_at). + @consolidacoes_mes = Consolidacao.ativas + .where('data_inicio <= ? AND data_fim >= ?', @periodo_fim, @periodo_inicio) @consolidacoes_abertas = @consolidacoes_mes.where(status: :rascunho).count @consolidacoes_fechadas = @consolidacoes_mes.where(status: :finalizada).count diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f6a3f86..4eb3bd5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,12 @@ # app/helpers/application_helper.rb module ApplicationHelper + include Pagy::Frontend + + # Opções [label, valor] para o select de perfil de usuário (form de usuário) + def role_options_for_select + User::ROLES_LABEL.map { |value, label| [label, value] } + end + # Link de navegação com estado ativo def nav_link_to(label, path, **opts) active = current_page?(path) diff --git a/app/models/entrega.rb b/app/models/entrega.rb index ce86d8a..8b14b82 100644 --- a/app/models/entrega.rb +++ b/app/models/entrega.rb @@ -20,8 +20,11 @@ class Entrega < ApplicationRecord scope :pagas, -> { concluidas.com_checkout } scope :pendentes, -> { where.not(status: 'completed') } + # planned_date é timestamp: usamos o dia inteiro do limite superior para não + # descartar as entregas do último dia do período (causava dashboard zerado e + # subcontagem de elegíveis nas consolidações). scope :no_periodo, ->(inicio, fim) { - where(planned_date: inicio.to_date..fim.to_date) + where(planned_date: inicio.to_date.beginning_of_day..fim.to_date.end_of_day) } scope :do_motorista, ->(nome) { @@ -65,6 +68,17 @@ class Entrega < ApplicationRecord base.distinct.order(:vehicle).pluck(:vehicle).compact.reject(&:empty?) end + # Veículos usados pelo(s) motorista(s) selecionado(s) no período — alimenta o + # filtro dinâmico de veículos na criação de consolidação. + def self.veiculos_de_motoristas(motoristas, inicio: nil, fim: nil) + nomes = Array(motoristas).reject(&:blank?) + return [] if nomes.empty? + + base = da_conta_gade.where(driver: nomes) + base = base.no_periodo(inicio, fim) if inicio.present? && fim.present? + base.distinct.order(:vehicle).pluck(:vehicle).compact.reject(&:empty?) + end + # Contagem de entregas pagas para cálculo estimado def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil) base = pagas.da_conta_gade.no_periodo(inicio, fim) diff --git a/app/views/consolidacao_entregas/revisar.html.erb b/app/views/consolidacao_entregas/revisar.html.erb index 0d83c03..ac4ebf5 100644 --- a/app/views/consolidacao_entregas/revisar.html.erb +++ b/app/views/consolidacao_entregas/revisar.html.erb @@ -30,11 +30,24 @@

Total a pagar — <%= @motorista %>

<%= moeda(@total) %>

-

<%= @classificacoes.map(&:tracking_id).uniq.size %> entregas classificadas (<%= @classificacoes.size %> pilares)

+

<%= @total_classificadas %> entregas classificadas (<%= @total_pilares %> pilares)

+ <%# Seletor de itens por página %> +
+ + + +
+ <%# Detalhe das classificações %> -
+
@@ -61,6 +74,37 @@
+ <%# Navegação de páginas %> + <% if @pagy.pages > 1 %> + <% pag = ->(p) { revisar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista, por_pagina: @por_pagina, page: p) } %> + + <% end %> + <%# Ações finais %>
<% if @proximo %> diff --git a/app/views/consolidacoes/new.html.erb b/app/views/consolidacoes/new.html.erb index 461727d..b4383c9 100644 --- a/app/views/consolidacoes/new.html.erb +++ b/app/views/consolidacoes/new.html.erb @@ -63,21 +63,15 @@
- <%# Veículos — multi-select opcional %> + <%# Veículos — multi-select opcional (filtrado pelo motorista + período) %>
-
- <% if @veiculos.blank? %> -

Nenhum veículo encontrado no período.

- <% end %> - <% @veiculos.each do |v| %> - - <% end %> +
+

Selecione um motorista para listar os veículos.

@@ -90,3 +84,82 @@
<% end %> + + diff --git a/config/initializers/pagy.rb b/config/initializers/pagy.rb new file mode 100644 index 0000000..b98c3d3 --- /dev/null +++ b/config/initializers/pagy.rb @@ -0,0 +1,7 @@ +# config/initializers/pagy.rb +require 'pagy/extras/overflow' + +# Página fora do intervalo cai na última página (evita erro ao trocar itens/página). +Pagy::DEFAULT[:overflow] = :last_page +# Itens por página padrão. +Pagy::DEFAULT[:limit] = 20 diff --git a/config/routes.rb b/config/routes.rb index b39314b..f6dde4d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,6 +25,10 @@ Rails.application.routes.draw do # Consolidações resources :consolidacoes do + collection do + get :veiculos_disponiveis # JSON — veículos do(s) motorista(s) no período (form nova consolidação) + end + member do get :wizard # Passo 1 — selecionar motorista post :finalizar