From 8e73bbe0ed17729329336bdeacce01d210232160b6a4bf1d08235dc20356e764 Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 13 Jul 2026 17:35:04 -0300 Subject: [PATCH] =?UTF-8?q?Arrumar=20a=20tela=20do=20dashboard=20e=20corre?= =?UTF-8?q?=C3=A7=C3=A3o=20dos=20graficos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/dashboard_controller.rb | 32 ++++++++++++++ app/views/dashboard/index.html.erb | 55 ++++++++++++++++--------- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 78bf621..d40c443 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -122,6 +122,9 @@ class DashboardController < ApplicationController # Evolução diária no período (para Chart.js) — por data real (checkout) @grafico_diario = build_grafico_diario(pagas, config[:entrega]) + # Resultado por dia (entregue/falhada/pendente) — barras empilhadas + @grafico_status = build_grafico_status(pagas, falhadas, pendentes) + # 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 @@ -241,6 +244,35 @@ class DashboardController < ApplicationController { labels: labels, valores: valores, qtds: qtds } end + # Entregas por dia separadas por resultado, para o gráfico empilhado. + # Concluídas pela data real (checkout); falhadas e pendentes não têm + # checkout, então usam a data planejada (planned_date). + def build_grafico_status(pagas, falhadas, pendentes) + dias = (@periodo_inicio..@periodo_fim).to_a + + if dias.size <= MAX_DIAS_GRAFICO + ok = pagas.group("DATE(checkout)").count.transform_keys(&:to_s) + falhas = falhadas.group("DATE(planned_date)").count.transform_keys(&:to_s) + pend = pendentes.group("DATE(planned_date)").count.transform_keys(&:to_s) + labels = dias.map { |d| d.strftime('%d/%m') } + chaves = dias.map(&:to_s) + else + ok = pagas.group("TO_CHAR(checkout, 'YYYY-MM')").count + falhas = falhadas.group("TO_CHAR(planned_date, 'YYYY-MM')").count + pend = pendentes.group("TO_CHAR(planned_date, 'YYYY-MM')").count + meses = meses_no_periodo + labels = meses.map { |m| Date.strptime(m, '%Y-%m').strftime('%m/%Y') } + chaves = meses + end + + { + labels: labels, + entregues: chaves.map { |k| ok[k] || 0 }, + falhadas: chaves.map { |k| falhas[k] || 0 }, + pendentes: chaves.map { |k| pend[k] || 0 } + } + end + # Meses ("YYYY-MM") do início ao fim do período selecionado, inclusive. def meses_no_periodo meses = [] diff --git a/app/views/dashboard/index.html.erb b/app/views/dashboard/index.html.erb index a980ba2..981d64a 100644 --- a/app/views/dashboard/index.html.erb +++ b/app/views/dashboard/index.html.erb @@ -219,14 +219,16 @@ - <%# Entregas por dia (volume) — complementa o valor acima %> + <%# Resultado por dia (entregue x falhada x pendente) — mostra a taxa de insucesso %>
-

Entregas por dia

-

Volume de entregas no período

+

Resultado por dia

+

Entregues, falhadas e pendentes no período

-
- Entregas +
+ Entregues + Falhadas + Pendentes
@@ -640,29 +642,36 @@ })(); -<%# Barras de entregas por dia (volume — complementa a evolução do custo) %> +<%# Barras empilhadas: resultado das entregas por dia (entregue/falhada/pendente) %>