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) %>