diff --git a/app/services/analytics/operacao_metricas.rb b/app/services/analytics/operacao_metricas.rb index aad45f3..97080aa 100644 --- a/app/services/analytics/operacao_metricas.rb +++ b/app/services/analytics/operacao_metricas.rb @@ -146,11 +146,11 @@ module Analytics } end - # Pontos [lat, lng] das entregas concluídas para o heatmap. + # Pontos [lat, lng] das entregas ATENDIDAS (sucesso + falhas) para o heatmap. # Prefere as coordenadas de CHECKOUT (saída); cai para as de CHECKIN. def pontos_mapa @pontos_mapa ||= linhas.filter_map do |r| - next unless r['status'] == 'completed' + next unless Entrega::STATUS_ATENDIDO.include?(r['status']) lat = num(r['checkout_latitude']) || num(r['latitude']) lng = num(r['checkout_longitude']) || num(r['longitude']) next if lat.nil? || lng.nil? || (lat.zero? && lng.zero?) @@ -165,12 +165,13 @@ module Analytics # Limite de marcadores no modo "Pontos" (Leaflet fica pesado com milhares). MAX_PONTOS = 2000 - # Pontos detalhados (modo "Pontos" do mapa) — um por entrega CONCLUÍDA com - # coordenada de CHECKOUT (onde a entrega foi registrada). Inclui dados para o - # popup (NF, destinatário, endereço, unidade, motorista, data). + # Pontos detalhados (modo "Pontos" do mapa) — um por entrega ATENDIDA + # (sucesso OU insucesso: óbito e demais pilares de falha), com coordenada de + # CHECKOUT (ou planejada como fallback). Inclui dados para o popup (NF, + # destinatário, endereço, unidade, motorista, veículo, data, status, motivo). def pontos_detalhados @pontos_detalhados ||= linhas.filter_map do |r| - next unless r['status'] == 'completed' + next unless Entrega::STATUS_ATENDIDO.include?(r['status']) lat = num(r['checkout_latitude']) || num(r['latitude']) lng = num(r['checkout_longitude']) || num(r['longitude']) next if lat.nil? || lng.nil? || (lat.zero? && lng.zero?) @@ -183,6 +184,8 @@ module Analytics motorista: r['driver'], veiculo: r['vehicle'], checkout: data_de(r['checkout'])&.strftime('%d/%m/%Y'), + sucesso: r['status'] == 'completed', + motivo: r['observation'].presence, foto: foto_url(r['foto_da_fachada']) } end.first(MAX_PONTOS) diff --git a/app/views/operacoes_dashboard/_painel.html.erb b/app/views/operacoes_dashboard/_painel.html.erb index 8b966c8..273c41f 100644 --- a/app/views/operacoes_dashboard/_painel.html.erb +++ b/app/views/operacoes_dashboard/_painel.html.erb @@ -16,22 +16,35 @@ <% end %> <%# ── KPIs ─────────────────────────────────────────────── %> + <% pct_total = ->(parte) { metricas.total.zero? ? 0 : (parte * 100.0 / metricas.total).round(1) } %>
📦 Total de Entregas
-<%= metricas.total %>
+<%= metricas.total %>
++ ✅ <%= metricas.sucesso %> · ● <%= metricas.recusas %> · ⏳ <%= metricas.pendentes %> +
✅ Total de Sucesso
-<%= metricas.sucesso %>
+<%= metricas.sucesso %>
++ <%= pct_total.(metricas.sucesso) %>% do total +
❌ Total de Recusas
-<%= metricas.recusas %>
+<%= metricas.recusas %>
++ <%= pct_total.(metricas.recusas) %>% do total +
⏳ Entregas Pendentes
-<%= metricas.pendentes %>
+<%= metricas.pendentes %>
++ <%= pct_total.(metricas.pendentes) %>% do total +