Correções para funcionamento do login adm

This commit is contained in:
2026-06-15 21:17:14 -03:00
parent b59fedec5c
commit 146aa3e762
26 changed files with 262 additions and 36 deletions

View File

@@ -4,7 +4,7 @@ class Admin::UsuariosController < ApplicationController
def index
authorize User
@usuarios = policy_scope(User).order(:nome).page(params[:page]).per(20)
@usuarios = policy_scope(User).order(:nome).limit(200)
@roles = User.roles.keys
end

View File

@@ -47,14 +47,15 @@ class DashboardController < ApplicationController
.count
.sort_by { |_, v| -v }
.first(6)
.to_h
# Evolução diária do mês (para Chart.js)
@grafico_diario = build_grafico_diario(entregas_mes, config[:entrega])
# Consolidações do mês
@consolidacoes_mes = Consolidacao.do_mes(@data_referencia)
@consolidacoes_abertas = @consolidacoes_mes.where(status: :aberta).count
@consolidacoes_fechadas = @consolidacoes_mes.where(status: :fechada).count
@consolidacoes_mes = Consolidacao.ativas.where(created_at: @mes_inicio.beginning_of_day..@mes_fim.end_of_day)
@consolidacoes_abertas = @consolidacoes_mes.where(status: :rascunho).count
@consolidacoes_fechadas = @consolidacoes_mes.where(status: :finalizada).count
# Histórico estimado mais recente
@historico_recente = HistoricoEstimado.order(created_at: :desc).limit(5)

View File

@@ -23,7 +23,7 @@ class Users::SessionsController < Devise::SessionsController
def after_sign_in_path_for(resource)
case resource.role
when 'motorista'
motorista_path
motorista_dashboard_path
else
dashboard_path
end
@@ -40,13 +40,13 @@ class Users::SessionsController < Devise::SessionsController
private
def handle_pin_login
pin = params[:user][:pin].to_s.strip
pin = params[:pin].to_s.strip
user = User.find_by(pin_code: pin, role: 'motorista')
if user&.active?
if user&.ativo?
sign_in(user)
AuditoriaLog.registrar(user: user, acao: 'login_pin', entidade: 'User', dados_novos: { detalhes: "" }, request: request)
redirect_to motorista_path, notice: "Bem-vindo, #{user.nome_display}!"
redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome_display}!"
else
flash.now[:alert] = 'PIN inválido ou motorista inativo.'
@pin_login = true

View File

@@ -0,0 +1,3 @@
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class
end

View File

@@ -1,6 +1,6 @@
# app/models/entrega.rb
#
# Model de LEITURA para a tabela existente da Gade Hospitalar.
# Model de LEITURA para a tabela existente da Reem Transporte.
# NUNCA criar migration para esta tabela.
# NUNCA executar INSERT, UPDATE, DELETE ou DROP nesta tabela.
#

View File

@@ -1,7 +1,7 @@
# app/models/user.rb
class User < ApplicationRecord
devise :database_authenticatable,
:registerable,
:recoverable,
:rememberable,
:validatable

View File

@@ -30,7 +30,7 @@ module Pdf
@pdf.fill_rectangle [-40 + 0, @pdf.cursor + 40], 8, 70 # faixa laranja lateral
@pdf.fill_color 'FFFFFF'
@pdf.text_box 'GADE HOSPITALAR',
@pdf.text_box 'REEM TRANSPORTE',
at: [10, @pdf.cursor + 20], size: 20, style: :bold
@pdf.fill_color LARANJA
@pdf.text_box 'Sistema de Controle de Custos Logísticos',
@@ -44,7 +44,7 @@ module Pdf
@pdf.repeat(:all) do
@pdf.bounding_box [0, 20], width: @pdf.bounds.width do
@pdf.fill_color CINZA
@pdf.text "Gerado em #{Time.current.strftime('%d/%m/%Y %H:%M')} · Gade Hospitalar — documento interno",
@pdf.text "Gerado em #{Time.current.strftime('%d/%m/%Y %H:%M')} · Reem Transporte — documento interno",
size: 8, align: :center
@pdf.fill_color '000000'
end

View File

@@ -47,7 +47,7 @@
</div>
<div class="p-4 bg-[#0a0a0a] rounded-xl border border-white/5">
<p class="text-gray-400 text-xs mb-1">Account ID</p>
<p class="text-white font-mono text-sm">95907 (Gade Hospitalar)</p>
<p class="text-white font-mono text-sm">95907 (Reem Transporte)</p>
</div>
<div class="p-4 bg-[#0a0a0a] rounded-xl border border-white/5">
<p class="text-gray-400 text-xs mb-1">Atualização</p>

View File

@@ -2,7 +2,7 @@
<div style="font-family: Arial, sans-serif; max-width: 520px; margin: 0 auto; background: #0a0a0a; border-radius: 12px; overflow: hidden;">
<div style="background: #0a0a0a; padding: 24px; border-left: 6px solid #f97316;">
<h1 style="color: #ffffff; margin: 0; font-size: 20px;">GADE HOSPITALAR</h1>
<h1 style="color: #ffffff; margin: 0; font-size: 20px;">REEM TRANSPORTE</h1>
<p style="color: #f97316; margin: 4px 0 0; font-size: 13px;">Sistema de Logística</p>
</div>

View File

@@ -5,7 +5,7 @@
<div class="bg-[#0a0a0a] rounded-lg p-4 mb-5 flex items-center gap-3">
<div class="w-2 h-12 bg-orange-500 rounded"></div>
<div>
<p class="text-white font-black text-lg leading-tight">GADE HOSPITALAR</p>
<p class="text-white font-black text-lg leading-tight">REEM TRANSPORTE</p>
<p class="text-orange-500 text-xs">Holerite de Pagamento — Entregas</p>
</div>
</div>

View File

@@ -0,0 +1,44 @@
<%# app/views/devise/passwords/edit.html.erb — Redefinir senha (link do e-mail) %>
<% content_for :title, 'Nova senha' %>
<div class="min-h-screen flex items-center justify-center p-4">
<div class="w-full max-w-sm">
<div class="text-center mb-8">
<div class="w-16 h-16 bg-[#f97316] rounded-2xl flex items-center justify-center mx-auto mb-3">
<span class="text-3xl">🔒</span>
</div>
<h1 class="text-white font-bold text-2xl">Definir nova senha</h1>
</div>
<div class="bg-[#111111] border border-white/10 rounded-2xl p-8">
<%= form_with(url: user_password_path, scope: :user, method: :put, data: { turbo: false }) do |f| %>
<%= f.hidden_field :reset_password_token, value: params[:reset_password_token] %>
<div class="space-y-5">
<div>
<%= f.label :password, 'Nova senha', class: 'block text-sm font-medium text-gray-300 mb-1.5' %>
<%= f.password_field :password, autofocus: true, autocomplete: 'new-password',
class: 'w-full px-4 py-3 bg-[#0a0a0a] border border-white/10 rounded-xl text-white
focus:outline-none focus:border-[#f97316] focus:ring-1 focus:ring-[#f97316] text-base' %>
<p class="text-gray-600 text-xs mt-1">Mínimo de 6 caracteres</p>
</div>
<div>
<%= f.label :password_confirmation, 'Confirmar nova senha', class: 'block text-sm font-medium text-gray-300 mb-1.5' %>
<%= f.password_field :password_confirmation, autocomplete: 'new-password',
class: 'w-full px-4 py-3 bg-[#0a0a0a] border border-white/10 rounded-xl text-white
focus:outline-none focus:border-[#f97316] focus:ring-1 focus:ring-[#f97316] text-base' %>
</div>
<%= f.submit 'Salvar nova senha',
class: 'w-full py-3.5 bg-[#f97316] hover:bg-orange-500 text-white font-semibold
rounded-xl transition-colors cursor-pointer text-base min-h-[48px]' %>
</div>
<% end %>
<p class="text-center mt-6">
<%= link_to '← Voltar para o login', new_user_session_path,
class: 'text-sm text-[#f97316] hover:text-orange-400 transition-colors' %>
</p>
</div>
</div>
</div>

View File

@@ -0,0 +1,47 @@
<%# app/views/devise/passwords/new.html.erb — Esqueci a senha (estilizada) %>
<% content_for :title, 'Recuperar senha' %>
<div class="min-h-screen flex items-center justify-center p-4">
<div class="w-full max-w-sm">
<div class="text-center mb-8">
<div class="w-16 h-16 bg-[#f97316] rounded-2xl flex items-center justify-center mx-auto mb-3">
<span class="text-3xl">🔑</span>
</div>
<h1 class="text-white font-bold text-2xl">Recuperar senha</h1>
<p class="text-gray-400 text-sm mt-1">Informe seu e-mail para receber as instruções</p>
</div>
<div class="bg-[#111111] border border-white/10 rounded-2xl p-8">
<%= form_with(url: user_password_path, scope: :user, method: :post, data: { turbo: false }) do |f| %>
<div class="space-y-5">
<div>
<%= f.label :email, 'E-mail', class: 'block text-sm font-medium text-gray-300 mb-1.5' %>
<%= f.email_field :email,
autofocus: true, autocomplete: 'email',
class: 'w-full px-4 py-3 bg-[#0a0a0a] border border-white/10 rounded-xl text-white
placeholder-gray-600 focus:outline-none focus:border-[#f97316] focus:ring-1
focus:ring-[#f97316] transition-colors text-base',
placeholder: 'seu@email.com' %>
</div>
<%= f.submit 'Enviar instruções',
class: 'w-full py-3.5 bg-[#f97316] hover:bg-orange-500 text-white font-semibold
rounded-xl transition-colors cursor-pointer text-base min-h-[48px]' %>
</div>
<% end %>
<p class="text-center mt-6">
<%= link_to '← Voltar para o login', new_user_session_path,
class: 'text-sm text-[#f97316] hover:text-orange-400 transition-colors' %>
</p>
</div>
<p class="text-gray-600 text-xs text-center mt-6">
⚠️ O envio de e-mail depende da configuração SMTP no servidor.<br>
Sem SMTP, peça ao administrador para redefinir sua senha.
</p>
<p class="text-gray-500 text-xs text-center mt-4">Reem Transporte © <%= Date.today.year %></p>
</div>
</div>

View File

@@ -10,7 +10,7 @@
d="M13 16V6a1 1 0 00-1-1H4a1 1 0 00-1 1v10a1 1 0 001 1h1m8-1a1 1 0 01-1 1H9m4-1V8a1 1 0 011-1h2.586a1 1 0 01.707.293l3.414 3.414a1 1 0 01.293.707V16a1 1 0 01-1 1h-1m-6-1a1 1 0 001 1h1M5 17a2 2 0 104 0m-4 0a2 2 0 114 0m6 0a2 2 0 104 0m-4 0a2 2 0 114 0"/>
</svg>
</div>
<h1 class="text-3xl font-bold text-white">Gade Logística</h1>
<h1 class="text-3xl font-bold text-white">Reem Logística</h1>
<p class="text-gray-400 mt-1 text-sm">Sistema de Controle de Custos</p>
</div>
@@ -40,7 +40,7 @@
<%# Login por e-mail %>
<div id="form-email" class="p-8">
<%= form_with(url: user_session_path, method: :post) do |f| %>
<%= form_with(url: user_session_path, scope: :user, method: :post, data: { turbo: false }) do |f| %>
<div class="space-y-5">
<div>
<%= f.label :email, 'E-mail', class: 'block text-sm font-medium text-gray-300 mb-1.5' %>
@@ -82,7 +82,7 @@
<%# Login por PIN %>
<div id="form-pin" class="p-8 hidden">
<%= form_with(url: user_session_path, method: :post) do |f| %>
<%= form_with(url: user_session_path, method: :post, data: { turbo: false }) do |f| %>
<%= f.hidden_field :pin_login, value: '1' %>
<div class="space-y-6">
@@ -148,7 +148,7 @@
</div>
<p class="text-center text-gray-600 text-xs mt-6">
Gade Hospitalar © <%= Date.today.year %>
Reem Transporte © <%= Date.today.year %>
</p>
</div>
</div>

View File

@@ -15,7 +15,7 @@
<div class="flex items-center gap-3 px-6 py-5 border-b border-[#2a2a2a]">
<div class="w-9 h-9 bg-orange-500 rounded-lg flex items-center justify-center font-black text-black text-lg">G</div>
<div>
<p class="font-bold text-white text-sm leading-tight">Gade Hospitalar</p>
<p class="font-bold text-white text-sm leading-tight">Reem Transporte</p>
<p class="text-orange-500 text-xs">Logística</p>
</div>
</div>
@@ -75,7 +75,7 @@
</button>
<div class="flex items-center gap-2">
<div class="w-7 h-7 bg-orange-500 rounded flex items-center justify-center font-black text-black text-sm">G</div>
<span class="font-bold text-white text-sm">Gade Logística</span>
<span class="font-bold text-white text-sm">Reem Logística</span>
</div>
<div class="w-12"></div>
</header>

View File

@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-param" content="<%= request_forgery_protection_token %>">
<meta name="csrf-token" content="<%= form_authenticity_token %>">
<title><%= content_for?(:title) ? "#{yield(:title)} | Gade Logística" : "Gade Logística" %></title>
<title><%= content_for?(:title) ? "#{yield(:title)} | Reem Logística" : "Reem Logística" %></title>
<%# Tailwind via CDN em desenvolvimento — compilar em produção %>
<script src="https://cdn.tailwindcss.com"></script>

View File

@@ -7,7 +7,7 @@
<%# Logo %>
<div class="text-center mb-8">
<div class="w-16 h-16 bg-orange-500 rounded-2xl flex items-center justify-center font-black text-black text-3xl mx-auto mb-3">G</div>
<h1 class="text-white font-bold text-2xl">Gade Logística</h1>
<h1 class="text-white font-bold text-2xl">Reem Logística</h1>
<p class="text-gray-400 text-base mt-1">Digite seu PIN de 4 números</p>
</div>