<%# app/views/operacoes_dashboard/index.html.erb %> <%# Dashboard de análise de entregas por operação (KPIs, insucessos, STS, mapa). %> <% content_for :head do %> <%# Flatpickr (date range) — CSS no %> <%# Leaflet (mapa de calor) %> <% end %> <% hoje = Date.current %> <% atalhos = { 'Hoje' => [hoje, hoje], '7 dias' => [hoje - 6, hoje], 'Este mês' => [hoje.beginning_of_month, hoje], '30 dias' => [hoje - 29, hoje] } %> <% ini_iso = @periodo_inicio.strftime('%Y-%m-%d') %> <% fim_iso = @periodo_fim.strftime('%Y-%m-%d') %> <%# Parâmetros de operação a preservar ao trocar de modo/período %> <% ctx_ops = { operacao: @operacao, op_a: @op_a, op_b: @op_b }.compact %>
<%# ── Cabeçalho ─────────────────────────────────────────── %>

Dashboard de Operações

<% if @modo == 'global' %> 🌐 Global · <%= @periodo_inicio.strftime('%d/%m/%Y') %> – <%= @periodo_fim.strftime('%d/%m/%Y') %> <% elsif @modo == 'comparar' %> ⚖️ Comparação entre operações (cada uma no seu próprio período) <% elsif @metricas&.data_inicio %> <%= @metricas.operacoes_label %> · <%= @metricas.data_inicio.strftime('%d/%m/%Y') %> – <%= @metricas.data_fim.strftime('%d/%m/%Y') %> <% elsif @operacao %> <%= Operacao.label(@operacao) %> <% end %> · Atualizado às <%= Time.now.strftime('%H:%M') %>

<%# Filtro de período — só na visão Global (a faixa de data não se aplica a operação única, que usa o período natural dos próprios dados). %> <% if @modo == 'global' %>
📅
<% atalhos.each do |label, (ini, fim)| %> <% ativo = @periodo_inicio == ini && @periodo_fim == fim %> <%= link_to label, operacoes_dashboard_path(modo: 'global', inicio: ini.strftime('%Y-%m-%d'), fim: fim.strftime('%Y-%m-%d')), 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'}" %> <% end %>
<% end %>
<%# ── Abas de modo ──────────────────────────────────────── %> <% modos = { 'operacao' => '🏥 Operação', 'global' => '🌐 Global', 'comparar' => '⚖️ Comparar' } %>
<% modos.each do |m, label| %> <% ativo = @modo == m %> <%= link_to label, operacoes_dashboard_path(ctx_ops.merge(modo: m, inicio: ini_iso, fim: fim_iso)), data: { turbo: false }, class: "px-4 py-2 rounded-xl text-sm font-semibold whitespace-nowrap #{ativo ? 'bg-orange-500 text-black' : 'bg-[#1a1a1a] text-gray-300 border border-white/10 hover:border-orange-500'}" %> <% end %>
<% if @tabelas_validas.blank? %>
Nenhuma operação encontrada no banco (tabelas gade_entregas_*).
<% else %> <%# ── Filtros ativos (cross-filter por clique nas tabelas) ── %> <% if @chips.any? && %w[operacao global].include?(@modo) %>
Filtros ativos: <% @chips.each do |chip| %> <%= chip[:rotulo] %>: <%= chip[:valor] %> <%= link_to '✕', operacoes_dashboard_path(request.query_parameters.except(chip[:param])), data: { turbo: false }, class: 'hover:text-white font-bold', title: 'Remover filtro' %> <% end %> <%= link_to 'Limpar tudo', operacoes_dashboard_path(request.query_parameters.except(*@chips.map { |c| c[:param] })), data: { turbo: false }, class: 'text-xs text-gray-400 hover:text-orange-400 underline' %>
<% end %> <%# ── Seletor de operação por modo ───────────────────── %> <% if @modo == 'operacao' %>
<% if @metricas %> <%= render 'painel', metricas: @metricas, filtravel: true %> <%= render 'mapa', metricas: @metricas %> <% end %> <% elsif @modo == 'global' %>
🌐 Visão Global — todas as <%= @tabelas_validas.size %> operações agregadas no período.
<% if @metricas %> <%= render 'painel', metricas: @metricas, filtravel: true %> <%= render 'mapa', metricas: @metricas %> <% end %> <% else # comparar %>
<%# Comparativo direto A x B (tabela + barras agrupadas) %> <% if @metricas_a && @metricas_b %> <%= render 'comparativo', a: @metricas_a, b: @metricas_b, label_a: @metricas_a.operacoes_label, label_b: @metricas_b.operacoes_label %> <% end %> <%# Detalhe completo de cada operação (recolhível) %>
🔎 Ver detalhe completo de cada operação
<% if @metricas_a %> <%= render 'painel', metricas: @metricas_a, titulo: "A · #{@metricas_a.operacoes_label}" %> <% else %>

Selecione a operação A.

<% end %>
<% if @metricas_b %> <%= render 'painel', metricas: @metricas_b, titulo: "B · #{@metricas_b.operacoes_label}" %> <% else %>

Selecione a operação B.

<% end %>
<% end %> <% end %>
<%# ── Scripts: flatpickr, Chart.js, Leaflet ───────────────── %>