Atualização Automatica dos numeros e correção de erro e falha de segurança

This commit is contained in:
2026-07-06 17:31:58 -03:00
parent 89b12fc91b
commit 96b7b03f57
16 changed files with 352 additions and 15 deletions

View File

@@ -72,6 +72,44 @@ module ApplicationHelper
tag.span label, class: "inline-flex items-center px-2.5 py-1 rounded-full text-xs font-bold #{cor}"
end
# Horário da última sincronização dos dados de operação.
#
# O backend atualiza os dados a cada 30 min, das 08h às 18h (horário de
# Brasília). Como as tabelas externas de rastreio não têm um carimbo de
# sincronização confiável, derivamos o último "slot" concluído a partir dessa
# grade fixa. Usa Time.current (fuso do app), NUNCA Time.now — que pega o fuso
# do container (UTC) e por isso mostrava o horário adiantado/errado.
DADOS_SYNC_INICIO = 8 # abre às 08h
DADOS_SYNC_FIM = 18 # fecha às 18h
DADOS_SYNC_PASSO = 30 # minutos entre atualizações
def ultima_atualizacao_dados(agora = Time.current)
agora = agora.in_time_zone
abre = agora.change(hour: DADOS_SYNC_INICIO, min: 0)
fecha = agora.change(hour: DADOS_SYNC_FIM, min: 0)
if agora < abre
# Antes de abrir: a última atualização foi o fechamento do dia anterior.
(abre - 1.day).change(hour: DADOS_SYNC_FIM, min: 0)
elsif agora >= fecha
fecha
else
# Arredonda para baixo ao múltiplo de 30 min dentro da janela.
minuto = (agora.min / DADOS_SYNC_PASSO) * DADOS_SYNC_PASSO
agora.change(min: minuto, sec: 0)
end
end
# Rótulo amigável: "às 14:30" (hoje) ou "em 05/07 às 18:00" (outro dia).
def ultima_atualizacao_label(agora = Time.current)
t = ultima_atualizacao_dados(agora)
if t.to_date == agora.in_time_zone.to_date
"às #{t.strftime('%H:%M')}"
else
"em #{t.strftime('%d/%m')} às #{t.strftime('%H:%M')}"
end
end
# Barra de progresso laranja
def progress_bar(percentual, label: nil)
pct = percentual.to_i.clamp(0, 100)