# app/controllers/users/sessions_controller.rb class Users::SessionsController < Devise::SessionsController before_action :configure_sign_in_params, only: [:create] # GET /users/sign_in def new @pin_login = params[:pin].present? # "Para continuar, faça login." NÃO é erro: é o que o Devise sempre grava # quando alguém abre o sistema deslogado (raiz -> authenticate_user! -> aqui). # Como `flash[:alert]` ele saía em vermelho DUAS vezes — o toast do layout e # a caixa desta tela — e a primeira entrada do dia parecia falha do sistema # (foi relatado como bug: "a primeira vez que entra dá a tela de erro"). # # A mensagem é descartada: a tela já é o formulário de login, ela não # acrescenta nada. NÃO troque isso por apagar todo `flash[:alert]` no `new`: # senha errada, conta inativa e `timeout` ("Sua sessão expirou") chegam por # aqui pelo mesmo caminho, e essas a pessoa PRECISA ver em vermelho. flash.delete(:alert) if flash[:alert] == I18n.t('devise.failure.unauthenticated', default: nil) super end # POST /users/sign_in def create # PIN login para motoristas if params[:pin_login].present? handle_pin_login else super end end protected # Para onde a pessoa vai depois de entrar. NÃO é mais "motorista → painel, # resto → dashboard": com perfis de acesso, alguém pode não ter o dashboard e # cairia direto numa tela negada. `home_rota` devolve a primeira tela permitida. def after_sign_in_path_for(resource) session[:mostrar_splash] = true # dispara a animação de abertura uma vez rota = resource.home_rota rota ? public_send(rota) : sem_acesso_path end def after_sign_out_path_for(resource_or_scope) new_user_session_path end def configure_sign_in_params devise_parameter_sanitizer.permit(:sign_in, keys: [:email, :password, :pin]) end private def handle_pin_login pin = params[:pin].to_s.strip user = User.find_by(pin_code: pin, role: 'motorista') if user&.ativo? sign_in(user) session[:mostrar_splash] = true AuditoriaLog.registrar(user: user, acao: 'login_pin', entidade: 'User', dados_novos: { detalhes: "" }, request: request) redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome_display}!" else flash.now[:alert] = 'PIN inválido ou motorista inativo.' @pin_login = true render :new, status: :unprocessable_entity end end end