diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index d530fe9..8cba40d 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -227,6 +227,22 @@ class DashboardController < ApplicationController # Custo por motorista (todos) @fin_por_motorista = cms.group(:motorista_nome).sum(:valor_total) .sort_by { |_, v| -v } + + # Ranking CONSOLIDADO (aba "Consolidado" do card Motoristas): o valor REAL + # fechado por motorista + quantas entregas entraram nesse fechamento. + # + # ⚠️ A quantidade é DISTINCT tracking_id, NÃO a contagem de linhas: a mesma + # entrega pode ter vários pilares (Normal + Bônus + Retirada = 3 linhas em + # consolidacao_entregas), e contar linhas inflaria o número de entregas. + # + # Partimos de @fin_por_motorista (que vem de `cms`, já .ativos) e só buscamos + # a quantidade: assim a aba lista exatamente os motoristas do fechamento — + # arquivado não aparece — e a soma bate com o KPI "Custo total" do topo. + qtd_por_motorista = ces.group(:motorista_nome).distinct.count(:tracking_id) + + @ranking_consolidado = @fin_por_motorista.map do |nome, valor| + { nome: nome, valor: valor, entregas: qtd_por_motorista[nome].to_i } + end end # `atendidas` já vem filtrado por checkout no período (concluídas + falhadas). diff --git a/app/controllers/motorista/dashboard_controller.rb b/app/controllers/motorista/dashboard_controller.rb index 85f42ff..6a1e903 100644 --- a/app/controllers/motorista/dashboard_controller.rb +++ b/app/controllers/motorista/dashboard_controller.rb @@ -7,15 +7,27 @@ module Motorista def index nome = current_user.nome - # Card 1 — Valor ESTIMADO (mês atual): entregas pagas × preco_entrega + # Card 1 — Valor ESTIMADO (mês atual): entregas ATENDIDAS × preco_entrega. + # + # Atendida = o motorista FOI ao local e fechou a visita, com sucesso + # ('completed') OU insucesso ('failed') — no insucesso o deslocamento + # aconteceu e teve custo, então a empresa paga os dois. É o MESMO recorte do + # dashboard administrativo e da consolidação (ver Entrega::STATUS_ATENDIDO e + # Entrega.contar_atendidas): usava `pagas` (só concluídas) e o motorista via + # um valor MENOR que o do fechamento, sem entender de onde vinha a diferença. + # + # ⚠️ O eixo é o CHECKOUT (data real da visita), não planned_date: falhada TEM + # checkout, e uma entrega planejada em 31/07 mas fechada em 01/08 pertence a + # agosto — igual ao que a consolidação considera elegível. @estimado_inicio = Date.current.beginning_of_month @estimado_fim = Date.current - entregas_mes = Entrega.pagas.da_conta_gade - .do_motorista(nome) - .no_periodo(@estimado_inicio, @estimado_fim) - .count - @valor_estimado = entregas_mes * Configuracao.preco_entrega - @entregas_mes = entregas_mes + atendidas = Entrega.atendidas.da_conta_gade + .do_motorista(nome) + .no_periodo_checkout(@estimado_inicio, @estimado_fim) + @entregas_concluidas = atendidas.concluidas.count + @entregas_falhadas = atendidas.falhadas.count + @entregas_mes = @entregas_concluidas + @entregas_falhadas + @valor_estimado = @entregas_mes * Configuracao.preco_entrega # Card 2 — Valor CONSOLIDADO: soma das consolidações finalizadas @minhas_consolidacoes = Consolidacao.ativas diff --git a/app/views/dashboard/_ranking_motoristas.html.erb b/app/views/dashboard/_ranking_motoristas.html.erb new file mode 100644 index 0000000..f673ab0 --- /dev/null +++ b/app/views/dashboard/_ranking_motoristas.html.erb @@ -0,0 +1,42 @@ +<%# Lista do ranking de motoristas — markup COMPARTILHADO pelas abas "Estimado" e + "Consolidado" do dashboard. Os dois conjuntos têm a mesma forma + (:nome, :valor, :entregas); só muda a origem dos números, então duplicar o + markup faria as duas abas divergirem visualmente na primeira alteração. + + Locais: itens (array de hashes), vazio (texto do estado sem dados). %> +<% if itens.any? %> +
+ <%# Base da barra: o MAIOR nº de entregas da aba, não o primeiro item — a aba + consolidada é ordenada por VALOR, então o primeiro pode não ser o maior em + quantidade e a barra passaria de 100%. Sem entregas (só bônus/desconto, + por exemplo) a barra fica vazia em vez de dividir por zero. %> + <% max = itens.map { |x| x[:entregas].to_i }.max.to_f %> + <% itens.each_with_index do |m, i| %> +
+ + <%= i + 1 %> + +
+
+ <%= m[:nome] %> + + <%= moeda(m[:valor]) %> + +
+ <%# Barra de progresso %> +
+
+
+ <%= m[:entregas] %> entregas +
+
+ <% end %> +
+<% else %> +
+
<%= icone :caminhao, tamanho: 'w-8 h-8', cor: 'text-gray-600', espaco: false %>
+

<%= vazio %>

+
+<% end %> diff --git a/app/views/dashboard/index.html.erb b/app/views/dashboard/index.html.erb index 84dc3cd..5256fb3 100644 --- a/app/views/dashboard/index.html.erb +++ b/app/views/dashboard/index.html.erb @@ -262,42 +262,48 @@ <% end %> - <%# Top motoristas %> + <%# Top motoristas — DUAS ABAS sobre o mesmo ranking: + • Estimado = entregas atendidas × preço da entrega (mesma base do card + laranja do topo). + • Consolidado = o que foi REALMENTE fechado nas consolidações do período, + já com bônus/desconto/retirada aplicados, e a quantidade + exata de entregas que entrou no fechamento. + Os dois números divergem DE PROPÓSITO: o estimado cobre tudo que foi + atendido no período; o consolidado, só o que já entrou em consolidação + finalizada. Por isso cada aba diz de onde vem o seu número. %>
-

<%= icone :ranking, espaco: false %> Motoristas

+
+

<%= icone :ranking, espaco: false %> Motoristas

- <% if @motoristas.any? %> -
- <% @motoristas.each_with_index do |m, i| %> -
- - <%= i + 1 %> - -
-
- <%= m[:nome] %> - - <%= moeda(m[:valor]) %> - -
- <%# Barra de progresso %> -
- <% max = @motoristas.first[:entregas].to_f %> -
-
- <%= m[:entregas] %> entregas -
-
- <% end %> + <%# Mesmas pílulas da paginação de pagamentos (as classes estão duplicadas + no JS que troca a aba — mexeu aqui, mexa lá). %> +
+ +
- <% else %> -
-
<%= icone :caminhao, tamanho: 'w-8 h-8', cor: 'text-gray-600', espaco: false %>
-

Nenhuma entrega concluída neste período

-
- <% end %> +
+ +
+

Entregas atendidas × preço da entrega

+ <%= render 'ranking_motoristas', + itens: @motoristas, + vazio: 'Nenhuma entrega atendida neste período' %> +
+ + <%# Sem JS a aba fica escondida — aceitável: o mesmo dado consolidado + também aparece no gráfico "Custo por motorista" logo abaixo. %> +
@@ -577,6 +583,38 @@ })(); +<%# Abas do ranking de motoristas (Estimado × Consolidado) %> + + <%# Filtro de operação — submete o form ao marcar/desmarcar %>