Atualização do Para correção do valor do dash da operação
This commit is contained in:
@@ -35,13 +35,19 @@ class OperacoesDashboardController < ApplicationController
|
|||||||
@metricas_a = montar([@op_a]) if @op_a
|
@metricas_a = montar([@op_a]) if @op_a
|
||||||
@metricas_b = montar([@op_b]) if @op_b
|
@metricas_b = montar([@op_b]) if @op_b
|
||||||
else
|
else
|
||||||
# Operação única. Sem datas na URL o recorte é a operação inteira (o
|
# Operação única: o recorte é SEMPRE a operação inteira, mesmo com
|
||||||
# período vem dos próprios dados) — é o que mantém utilizável abrir uma
|
# inicio/fim na URL. É o que confere com os documentos físicos e com a
|
||||||
# operação de meses atrás. Quando o operador ESCOLHE um período, ele passa
|
# planilha entregue ao cliente (Analytics::PlanilhaEntregas também não
|
||||||
# a valer aqui também: sem isso, comparar esta tela com o dashboard
|
# filtra data). Recortar pelo período derrubava as entregas que a operação
|
||||||
# financeiro "no mesmo período" era impossível, porque a data era ignorada.
|
# executou fora do mês do nome dela — EMAD AGO 2026 rodou de 30/07 a
|
||||||
|
# 12/08, e "01/08 → hoje" mostrava 1146 das 2021 NFs.
|
||||||
|
#
|
||||||
|
# O período escolhido continua tendo função aqui: alimenta as "Notas fora
|
||||||
|
# da operação" e aparece no cabeçalho como REFERÊNCIA (quantas NFs da
|
||||||
|
# operação caíram na faixa), para comparar com o dashboard financeiro sem
|
||||||
|
# mexer no número que o cliente confere.
|
||||||
@operacao = Operacao.sanitizar([params[:operacao]]).first || @tabelas_validas.first
|
@operacao = Operacao.sanitizar([params[:operacao]]).first || @tabelas_validas.first
|
||||||
@metricas = montar([@operacao], filtros: @filtros, data: @data_filtro, **faixa_ativa) if @operacao
|
@metricas = montar([@operacao], filtros: @filtros, data: @data_filtro) if @operacao
|
||||||
@fora_operacao = Analytics::NotasForaOperacao.new(inicio: @periodo_inicio, fim: @periodo_fim) if @periodo_explicito
|
@fora_operacao = Analytics::NotasForaOperacao.new(inicio: @periodo_inicio, fim: @periodo_fim) if @periodo_explicito
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -63,8 +69,10 @@ class OperacoesDashboardController < ApplicationController
|
|||||||
if @modo == 'global'
|
if @modo == 'global'
|
||||||
@metricas = montar(@tabelas_validas, inicio: @periodo_inicio, fim: @periodo_fim, filtros: @filtros, data: @data_filtro)
|
@metricas = montar(@tabelas_validas, inicio: @periodo_inicio, fim: @periodo_fim, filtros: @filtros, data: @data_filtro)
|
||||||
else
|
else
|
||||||
|
# Mesma regra do #index: operação = operação inteira (a planilha espelho
|
||||||
|
# tem que bater com a que é entregue ao cliente).
|
||||||
@operacao = Operacao.sanitizar([params[:operacao]]).first || @tabelas_validas.first
|
@operacao = Operacao.sanitizar([params[:operacao]]).first || @tabelas_validas.first
|
||||||
@metricas = montar([@operacao], filtros: @filtros, data: @data_filtro, **faixa_ativa) if @operacao
|
@metricas = montar([@operacao], filtros: @filtros, data: @data_filtro) if @operacao
|
||||||
end
|
end
|
||||||
|
|
||||||
montar_tabela_espelho if @metricas
|
montar_tabela_espelho if @metricas
|
||||||
@@ -108,20 +116,12 @@ class OperacoesDashboardController < ApplicationController
|
|||||||
@espelho_linhas = linhas[(@espelho_pagina - 1) * ESPELHO_POR_PAGINA, ESPELHO_POR_PAGINA] || []
|
@espelho_linhas = linhas[(@espelho_pagina - 1) * ESPELHO_POR_PAGINA, ESPELHO_POR_PAGINA] || []
|
||||||
end
|
end
|
||||||
|
|
||||||
# Período escolhido pelo operador (veio na URL) x default da tela. Só o
|
# Período escolhido pelo operador (veio na URL) x default da tela. No modo
|
||||||
# explícito é aplicado no modo Operação — ver o comentário no #index.
|
# Operação ele não recorta os KPIs — ver o comentário no #index.
|
||||||
def periodo_explicito?
|
def periodo_explicito?
|
||||||
params[:inicio].present? || params[:fim].present?
|
params[:inicio].present? || params[:fim].present?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Faixa a repassar para as métricas no modo Operação: vazia quando o operador
|
|
||||||
# não escolheu período (aí o recorte é a operação inteira).
|
|
||||||
def faixa_ativa
|
|
||||||
return {} unless @periodo_explicito
|
|
||||||
|
|
||||||
{ inicio: @periodo_inicio, fim: @periodo_fim }
|
|
||||||
end
|
|
||||||
|
|
||||||
def montar(tabelas, inicio: nil, fim: nil, filtros: {}, data: nil)
|
def montar(tabelas, inicio: nil, fim: nil, filtros: {}, data: nil)
|
||||||
Analytics::OperacaoMetricas.new(tabelas: tabelas, inicio: inicio, fim: fim, filtros: filtros, data: data)
|
Analytics::OperacaoMetricas.new(tabelas: tabelas, inicio: inicio, fim: fim, filtros: filtros, data: data)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -126,6 +126,22 @@ module Analytics
|
|||||||
total - sucesso - recusas
|
total - sucesso - recusas
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# NFs da operação cujo resultado caiu dentro de uma faixa de datas —
|
||||||
|
# REFERÊNCIA para o cabeçalho da tela de operação única, onde o total
|
||||||
|
# continua sendo a operação inteira (é o que confere com a planilha do
|
||||||
|
# cliente). Mesma regra do filtro SQL: concluídas/falhas pela data real
|
||||||
|
# (checkout), pendentes pela data planejada.
|
||||||
|
def total_no_periodo(inicio, fim)
|
||||||
|
return total unless inicio && fim
|
||||||
|
|
||||||
|
ini = inicio.to_date
|
||||||
|
fim = fim.to_date
|
||||||
|
linhas.count do |r|
|
||||||
|
d = data_de(r['checkout']) || data_de(r['planned_date'])
|
||||||
|
d && d >= ini && d <= fim
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# ── Camada operacional (por VISITA, não por NF) ───────────────
|
# ── Camada operacional (por VISITA, não por NF) ───────────────
|
||||||
# Os KPIs acima contam NOTAS porque é o que o cliente paga e confere. Estes
|
# Os KPIs acima contam NOTAS porque é o que o cliente paga e confere. Estes
|
||||||
# contam IDAS AO LOCAL — é o que o motorista recebe e o que o dashboard
|
# contam IDAS AO LOCAL — é o que o motorista recebe e o que o dashboard
|
||||||
|
|||||||
@@ -57,7 +57,15 @@
|
|||||||
<%= icone :comparar %> Comparação entre operações (cada uma no seu próprio período)
|
<%= icone :comparar %> Comparação entre operações (cada uma no seu próprio período)
|
||||||
<% elsif @metricas&.data_inicio %>
|
<% elsif @metricas&.data_inicio %>
|
||||||
<%= @metricas.operacoes_label %> · <%= @metricas.data_inicio.strftime('%d/%m/%Y') %> – <%= @metricas.data_fim.strftime('%d/%m/%Y') %>
|
<%= @metricas.operacoes_label %> · <%= @metricas.data_inicio.strftime('%d/%m/%Y') %> – <%= @metricas.data_fim.strftime('%d/%m/%Y') %>
|
||||||
<%= @periodo_explicito ? '(período filtrado)' : '(operação inteira)' %>
|
(operação inteira)
|
||||||
|
<%# O período escolhido NÃO recorta os KPIs desta tela (eles têm que
|
||||||
|
bater com a planilha entregue ao cliente); ele aparece aqui como
|
||||||
|
referência para comparar com o dashboard financeiro. %>
|
||||||
|
<% if @periodo_explicito %>
|
||||||
|
<span class="text-gray-500">·</span>
|
||||||
|
<span class="text-gray-300">no período <%= @periodo_inicio.strftime('%d/%m') %>–<%= @periodo_fim.strftime('%d/%m/%Y') %>:
|
||||||
|
<%= @metricas.total_no_periodo(@periodo_inicio, @periodo_fim) %> NFs</span>
|
||||||
|
<% end %>
|
||||||
<% elsif @operacao %>
|
<% elsif @operacao %>
|
||||||
<%= Operacao.label(@operacao) %>
|
<%= Operacao.label(@operacao) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -75,6 +83,7 @@
|
|||||||
<span class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2"><%= icone :calendario, espaco: false %></span>
|
<span class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2"><%= icone :calendario, espaco: false %></span>
|
||||||
<input type="text" id="periodo-range" readonly placeholder="Selecione o período"
|
<input type="text" id="periodo-range" readonly placeholder="Selecione o período"
|
||||||
value="<%= @periodo_inicio.strftime('%d/%m/%Y') %> até <%= @periodo_fim.strftime('%d/%m/%Y') %>"
|
value="<%= @periodo_inicio.strftime('%d/%m/%Y') %> até <%= @periodo_fim.strftime('%d/%m/%Y') %>"
|
||||||
|
title="<%= @modo == 'operacao' ? 'No modo Operação o período não recorta os KPIs (eles seguem a operação inteira, como na planilha do cliente) — vale para as notas fora da operação e para comparar com o financeiro.' : 'Faixa de datas da visão Global.' %>"
|
||||||
class="cursor-pointer pl-4 pr-10 py-2.5 bg-[#1a1a1a] border border-white/10 rounded-xl
|
class="cursor-pointer pl-4 pr-10 py-2.5 bg-[#1a1a1a] border border-white/10 rounded-xl
|
||||||
text-white text-sm w-full sm:w-[240px] focus:outline-none focus:border-orange-500 placeholder-gray-500">
|
text-white text-sm w-full sm:w-[240px] focus:outline-none focus:border-orange-500 placeholder-gray-500">
|
||||||
</div>
|
</div>
|
||||||
@@ -89,9 +98,14 @@
|
|||||||
data: { turbo: false },
|
data: { turbo: false },
|
||||||
class: "px-3 py-2.5 rounded-xl text-sm whitespace-nowrap border #{ativo ? 'bg-orange-500 text-black border-orange-500 font-bold' : 'bg-[#1a1a1a] text-gray-300 border-white/10 hover:border-orange-500'}" %>
|
class: "px-3 py-2.5 rounded-xl text-sm whitespace-nowrap border #{ativo ? 'bg-orange-500 text-black border-orange-500 font-bold' : 'bg-[#1a1a1a] text-gray-300 border-white/10 hover:border-orange-500'}" %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%# Volta ao recorte natural da operação (sem faixa de datas na URL). %>
|
<%# Limpa a faixa de datas da URL (os KPIs já são sempre da operação
|
||||||
|
inteira; sem período a tela também some com o painel de notas
|
||||||
|
fora da operação). %>
|
||||||
<% if @modo == 'operacao' %>
|
<% if @modo == 'operacao' %>
|
||||||
<%= link_to 'Operação inteira',
|
<%# Rótulo é "Limpar período" e não "Operação inteira": o total já é
|
||||||
|
sempre o da operação inteira, o que este botão faz é tirar a
|
||||||
|
faixa de datas da URL. %>
|
||||||
|
<%= link_to 'Limpar período',
|
||||||
operacoes_dashboard_path(ctx_ops.merge(modo: 'operacao')),
|
operacoes_dashboard_path(ctx_ops.merge(modo: 'operacao')),
|
||||||
data: { turbo: false },
|
data: { turbo: false },
|
||||||
class: "px-3 py-2.5 rounded-xl text-sm whitespace-nowrap border #{@periodo_explicito ? 'bg-[#1a1a1a] text-gray-300 border-white/10 hover:border-orange-500' : 'bg-orange-500 text-black border-orange-500 font-bold'}" %>
|
class: "px-3 py-2.5 rounded-xl text-sm whitespace-nowrap border #{@periodo_explicito ? 'bg-[#1a1a1a] text-gray-300 border-white/10 hover:border-orange-500' : 'bg-orange-500 text-black border-orange-500 font-bold'}" %>
|
||||||
|
|||||||
Reference in New Issue
Block a user