# app/controllers/operacoes_dashboard_controller.rb # # Dashboard de análise de ENTREGAS por operação (separado do dashboard # financeiro). O operador escolhe uma operação (UBS Norte, EMAD, ...) e vê os # KPIs/insucessos/STS/mapa; também há os modos "global" (todas no período) e # "comparar" (uma operação vs outra). Os números vêm de Analytics::OperacaoMetricas. class OperacoesDashboardController < ApplicationController MODOS = %w[operacao global comparar].freeze def index authorize :dashboard, :operacoes? @periodo_inicio, @periodo_fim = periodo_selecionado @modo = MODOS.include?(params[:modo]) ? params[:modo] : 'operacao' @operacoes_agrupadas = Operacao.agrupadas_por_mes @tabelas_validas = Operacao.nomes_validos case @modo when 'global' @metricas = montar(@tabelas_validas) when 'comparar' @op_a = Operacao.sanitizar([params[:op_a]]).first || @tabelas_validas[0] @op_b = Operacao.sanitizar([params[:op_b]]).first || @tabelas_validas[1] @metricas_a = montar([@op_a]) if @op_a @metricas_b = montar([@op_b]) if @op_b else @operacao = Operacao.sanitizar([params[:operacao]]).first || @tabelas_validas.first @metricas = montar([@operacao]) if @operacao end end private def montar(tabelas) Analytics::OperacaoMetricas.new(tabelas: tabelas, inicio: @periodo_inicio, fim: @periodo_fim) end # Faixa de datas do filtro (params inicio/fim). Default: início do mês → hoje. # Espelha DashboardController#periodo_selecionado. def periodo_selecionado inicio = parse_data(params[:inicio]) || Date.current.beginning_of_month fim = parse_data(params[:fim]) || Date.current inicio, fim = fim, inicio if fim < inicio [inicio, fim] end def parse_data(str) return nil if str.blank? Date.parse(str) rescue ArgumentError, TypeError nil end end