From 56b3e146bf7ae975aca030a2608c9d54cf4bde029849c06d65041cd994654b11 Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 22 Jun 2026 17:47:05 -0300 Subject: [PATCH] =?UTF-8?q?Corre=C3=A7=C3=A3o=20Dash=20Pendentes=20e=20fal?= =?UTF-8?q?has?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/dashboard_controller.rb | 9 +- app/models/entrega.rb | 10 ++- app/views/dashboard/index.html.erb | 106 ++++++++++++++++++------ 3 files changed, 96 insertions(+), 29 deletions(-) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 677c16c..369e4d9 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -80,14 +80,19 @@ class DashboardController < ApplicationController pagas = Entrega.da_conta_gade.pagas.no_periodo_checkout(@periodo_inicio, @periodo_fim) pagas = pagas.da_operacoes(@operacao_filtro) if @operacao_filtro.present? - # PENDENTES (não concluídas) pela data planejada — não têm checkout. + # PENDENTES (em aberto, nem concluídas nem falhadas) pela data planejada. pendentes = Entrega.da_conta_gade.pendentes.no_periodo(@periodo_inicio, @periodo_fim) pendentes = pendentes.da_operacoes(@operacao_filtro) if @operacao_filtro.present? + # FALHADAS (insucesso) pela data planejada — também não têm checkout. + falhadas = Entrega.da_conta_gade.falhadas.no_periodo(@periodo_inicio, @periodo_fim) + falhadas = falhadas.da_operacoes(@operacao_filtro) if @operacao_filtro.present? + # Totais gerais @entregas_pagas = pagas.count @entregas_pendentes = pendentes.count - @total_entregas = @entregas_pagas + @entregas_pendentes + @entregas_falhadas = falhadas.count + @total_entregas = @entregas_pagas + @entregas_pendentes + @entregas_falhadas # Configurações de preço config = Configuracao.mapa_de_precos diff --git a/app/models/entrega.rb b/app/models/entrega.rb index 69e898c..5c6f000 100644 --- a/app/models/entrega.rb +++ b/app/models/entrega.rb @@ -13,12 +13,20 @@ class Entrega < ApplicationRecord true end + # Status que o SimpleRoute grava para entregas SEM SUCESSO (falha/insucesso). + # AJUSTE aqui se o valor real for diferente (ex.: 'cancelled', 'not_delivered'). + STATUS_FALHA = %w[failed].freeze + # ── Scopes ────────────────────────────────────────────────── scope :concluidas, -> { where(status: 'completed') } scope :com_checkout, -> { where.not(checkout: nil) } # Pagamento = entrega concluída com checkout registrado scope :pagas, -> { concluidas.com_checkout } - scope :pendentes, -> { where.not(status: 'completed') } + # Falhadas = entregas que não tiveram sucesso (status de falha) + scope :falhadas, -> { where(status: STATUS_FALHA) } + # Pendentes = nem concluídas nem falhadas (ainda em aberto). Exclui as falhadas + # para que entregues/pendentes/falhadas não se sobreponham no dashboard. + scope :pendentes, -> { where.not(status: ['completed'] + STATUS_FALHA) } # planned_date é timestamp: usamos o dia inteiro do limite superior para não # descartar as entregas do último dia do período (causava dashboard zerado e diff --git a/app/views/dashboard/index.html.erb b/app/views/dashboard/index.html.erb index 4b4bf4c..a11eb21 100644 --- a/app/views/dashboard/index.html.erb +++ b/app/views/dashboard/index.html.erb @@ -5,8 +5,41 @@ <%# alterado pelo JS, sem reexecutar scripts) e só voltava com F5. %> <% content_for :head do %> + + <%# Flatpickr — CSS no (evita flash sem estilo) + tema escuro oficial %> + + + <% end %> +<%# Quick-ranges no formato YYYY-MM-DD para os atalhos do filtro %> +<% 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] + } %> +
<%# Header + filtro por faixa de datas %> @@ -20,17 +53,28 @@
<%# Filtro de calendário — seleciona uma faixa de datas %> -
+
📅 + text-white text-sm w-full sm:w-[240px] focus:outline-none focus:border-orange-500 placeholder-gray-500">
+ <%# Atalhos rápidos de período %> +
+ <% atalhos.each do |label, (ini, fim)| %> + <% ativo = @periodo_inicio == ini && @periodo_fim == fim %> + <%= link_to label, + dashboard_path(inicio: ini.strftime('%Y-%m-%d'), fim: fim.strftime('%Y-%m-%d'), operacoes: @operacao_filtro), + 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 %> +
+ <%# Filtro de operação — multi-seleção; submete o form ao mudar %> <% if @operacoes.any? %>
@@ -105,10 +149,12 @@

📦 Total Entregas

<%= @total_entregas %>

-
+
<%= @entregas_pagas %> entregues · <%= @entregas_pendentes %> pendentes + · + <%= @entregas_falhadas %> falhadas
@@ -376,38 +422,46 @@
-<%# Flatpickr — date range picker (CDN, mesmo padrão do Chart.js) %> - +<%# Flatpickr — date range picker (JS via CDN; CSS já carregado no ) %>