Correção da data do dash principal

This commit is contained in:
2026-06-17 18:29:13 -03:00
parent 4b728c0c4d
commit 076bd42973
7 changed files with 49 additions and 32 deletions

View File

@@ -38,14 +38,18 @@ class DashboardController < ApplicationController
@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)
entregas = entregas.da_operacoes(@operacao_filtro) if @operacao_filtro.present?
# PAGAS pela DATA REAL (checkout) — base de toda a análise financeira por data.
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 = Entrega.da_conta_gade.pendentes.no_periodo(@periodo_inicio, @periodo_fim)
pendentes = pendentes.da_operacoes(@operacao_filtro) if @operacao_filtro.present?
# Totais gerais
@total_entregas = entregas.count
@entregas_pagas = entregas.pagas.count
@entregas_pendentes = @total_entregas - @entregas_pagas
@entregas_pagas = pagas.count
@entregas_pendentes = pendentes.count
@total_entregas = @entregas_pagas + @entregas_pendentes
# Configurações de preço
config = Configuracao.mapa_de_precos
@@ -54,12 +58,11 @@ class DashboardController < ApplicationController
@valor_estimado = (@entregas_pagas * config[:entrega]).round(2)
# Por motorista (top 10)
@motoristas = entregas.pagas
.group(:driver)
.count
.sort_by { |_, v| -v }
.first(10)
.map do |driver, qtd|
@motoristas = pagas.group(:driver)
.count
.sort_by { |_, v| -v }
.first(10)
.map do |driver, qtd|
{
nome: driver,
entregas: qtd,
@@ -68,15 +71,14 @@ class DashboardController < ApplicationController
end
# Por local de entrega (contact_name)
@por_operacao = entregas.pagas
.group(:contact_name)
.count
.sort_by { |_, v| -v }
.first(6)
.to_h
@por_operacao = pagas.group(:contact_name)
.count
.sort_by { |_, v| -v }
.first(6)
.to_h
# Evolução diária no período (para Chart.js)
@grafico_diario = build_grafico_diario(entregas, config[:entrega])
# Evolução diária no período (para Chart.js) — por data real (checkout)
@grafico_diario = build_grafico_diario(pagas, config[:entrega])
# Consolidações cujo período (data_inicio..data_fim) cruza o período do dashboard
# — independe de quando foram criadas (created_at).
@@ -174,18 +176,20 @@ class DashboardController < ApplicationController
.sort_by { |_, v| -v }.first(10)
end
def build_grafico_diario(entregas, preco_entrega)
# `pagas` já vem filtrado por checkout no período. Agrupa pela DATA REAL
# (DATE(checkout)) — DATE() sobre timestamp não faz conversão de fuso.
def build_grafico_diario(pagas, preco_entrega)
dias = (@periodo_inicio..@periodo_fim).to_a
if dias.size <= MAX_DIAS_GRAFICO
# Granularidade diária (períodos curtos)
contagem = entregas.pagas.group("DATE(planned_date)").count.transform_keys(&:to_s)
contagem = pagas.group("DATE(checkout)").count.transform_keys(&:to_s)
labels = dias.map { |d| d.strftime('%d/%m') }
valores = dias.map { |d| ((contagem[d.to_s] || 0) * preco_entrega).round(2) }
qtds = dias.map { |d| contagem[d.to_s] || 0 }
else
# Período longo: agrega por mês para o gráfico não ficar vazio nem poluído.
contagem = entregas.pagas.group("TO_CHAR(planned_date, 'YYYY-MM')").count
contagem = pagas.group("TO_CHAR(checkout, 'YYYY-MM')").count
meses = meses_no_periodo
labels = meses.map { |m| Date.strptime(m, '%Y-%m').strftime('%m/%Y') }
valores = meses.map { |m| ((contagem[m] || 0) * preco_entrega).round(2) }