diff --git a/Imagens para implantação /Imagem colada (15).png b/Imagens para implantação /Imagem colada (15).png new file mode 100644 index 0000000..50290a3 Binary files /dev/null and b/Imagens para implantação /Imagem colada (15).png differ diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index c2327ea..f32a5cc 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -34,8 +34,9 @@ class DashboardController < ApplicationController def carregar_dados_dashboard # Filtro de operação (multi-seleção) — aplicado a todo o dashboard. - @operacoes = Operacao.todas - @operacao_filtro = Operacao.sanitizar(params[:operacoes]) + @operacoes = Operacao.todas + @operacoes_agrupadas = Operacao.agrupadas_por_mes + @operacao_filtro = Operacao.sanitizar(params[:operacoes]) # Entregas do período (tabela read-only) — restritas à conta Gade entregas = Entrega.da_conta_gade.no_periodo(@periodo_inicio, @periodo_fim) diff --git a/app/models/operacao.rb b/app/models/operacao.rb index d4b99a8..29b8095 100644 --- a/app/models/operacao.rb +++ b/app/models/operacao.rb @@ -42,6 +42,31 @@ class Operacao tabela.to_s.delete_prefix(PREFIXO).tr('_', ' ').strip.titleize end + # Abreviações de mês usadas nos nomes das tabelas (gade_entregas_emad_fev_2026). + MESES = { + 'jan' => [1, 'Janeiro'], 'fev' => [2, 'Fevereiro'], 'mar' => [3, 'Março'], + 'abr' => [4, 'Abril'], 'mai' => [5, 'Maio'], 'jun' => [6, 'Junho'], + 'jul' => [7, 'Julho'], 'ago' => [8, 'Agosto'], 'set' => [9, 'Setembro'], + 'out' => [10, 'Outubro'], 'nov' => [11, 'Novembro'], 'dez' => [12, 'Dezembro'] + }.freeze + + # Agrupa as operações por mês/ano (extraído do nome da tabela), do mais recente + # para o mais antigo; as que não têm mês reconhecível caem em "Outras". + # Retorna um Array de [titulo_do_grupo, [{ tabela:, label: }, ...]]. + def agrupadas_por_mes + grupos = Hash.new { |h, k| h[k] = [] } + ordem = {} + + todas.each do |op| + g = grupo_de(op[:tabela]) + grupos[g[:titulo]] << { tabela: op[:tabela], label: g[:item] } + ordem[g[:titulo]] ||= g[:ordem] + end + + grupos.each_value { |itens| itens.sort_by! { |i| i[:label] } } + grupos.sort_by { |titulo, _| ordem[titulo] }.map { |titulo, itens| [titulo, itens] } + end + # Dados agregados das entregas das operações informadas, para pré-preencher o # formulário de nova consolidação. Une as NFs de todas as tabelas válidas. def dados(tabelas) @@ -59,6 +84,27 @@ class Operacao private + # Extrai { titulo:, item:, ordem: } do nome da tabela. + # Ex.: gade_entregas_emad_fev_2026 → titulo "Fevereiro 2026", item "Emad". + def grupo_de(tabela) + tokens = tabela.to_s.delete_prefix(PREFIXO).split('_') + idx = tokens.index { |t| MESES.key?(t.downcase) } + + if idx + num, nome = MESES[tokens[idx].downcase] + ano = tokens[idx + 1] =~ /\A\d{4}\z/ ? tokens[idx + 1].to_i : nil + resto = (tokens[0...idx] + tokens[(ano ? idx + 2 : idx + 1)..]).join(' ').strip + { + titulo: ano ? "#{nome} #{ano}" : nome, + item: resto.presence&.titleize || nome, + # mais recente primeiro; sem ano vai pro fim do bloco do mês + ordem: [-(ano || 0), -num] + } + else + { titulo: 'Outras', item: label(tabela), ordem: [1, 0] } + end + end + def vazio { motoristas: [], veiculos: [], inicio: nil, fim: nil } end diff --git a/app/views/dashboard/index.html.erb b/app/views/dashboard/index.html.erb index 931a553..07d525a 100644 --- a/app/views/dashboard/index.html.erb +++ b/app/views/dashboard/index.html.erb @@ -37,14 +37,26 @@ 🗂️ <%= @operacao_filtro.present? ? "#{@operacao_filtro.size} operação(ões)" : 'Todas as operações' %> -
- <% @operacoes.each do |op| %> - +
+ <%# Limpar seleção — recarrega o dashboard sem filtro de operação %> +
+ Operações + <% if @operacao_filtro.present? %> + <%= link_to '✕ Limpar', dashboard_path(inicio: @periodo_inicio.strftime('%Y-%m-%d'), fim: @periodo_fim.strftime('%Y-%m-%d')), + data: { turbo: false }, class: 'text-xs text-orange-400 hover:text-orange-300 font-semibold' %> + <% end %> +
+ + <% @operacoes_agrupadas.each do |titulo, ops| %> +

<%= titulo %>

+ <% ops.each do |op| %> + + <% end %> <% end %>