# app/controllers/motorista/sessoes_controller.rb # # Login do motorista por PIN de 4 dígitos ou por QR Code (token do holerite). # Não usa Devise password — fluxo simplificado para público de baixo nível técnico. # module Motorista class SessoesController < ApplicationController skip_before_action :authenticate_user! layout 'application' # GET /motorista/login — tela com teclado de PIN # Se veio de um QR Code, o motorista já está pré-identificado (só falta o PIN). def new @motorista_pre = User.motorista.ativos.find_by(id: session[:motorista_qr_id]) end # POST /motorista/login — valida PIN def create pin = params[:pin].to_s.strip user = User.motorista.ativos.find_by(pin_code: pin) unless pin.length == 4 && user @motorista_pre = User.motorista.ativos.find_by(id: session[:motorista_qr_id]) flash.now[:alert] = 'PIN não encontrado. Confira os 4 números e tente de novo.' return render :new, status: :unprocessable_entity end # Segurança: se o login partiu de um QR Code, o PIN precisa ser do MESMO # motorista do QR — impede usar o QR Code de outra pessoa. qr_id = session[:motorista_qr_id] if qr_id.present? && qr_id != user.id @motorista_pre = User.motorista.ativos.find_by(id: qr_id) flash.now[:alert] = 'Este PIN não corresponde ao QR Code lido. Use o seu PIN.' return render :new, status: :unprocessable_entity end session.delete(:motorista_qr_id) sign_in(user) session[:mostrar_splash] = true AuditoriaLog.registrar(user: user, acao: :login, entidade: 'User', entidade_id: user.id, dados_novos: (qr_id.present? ? { via: 'qr_code+pin' } : nil), request: request) redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome.split.first}!" end # GET /motorista/acesso/:token — abre o login a partir do QR Code do holerite. # SEGURANÇA: o QR apenas identifica o motorista; ele ainda precisa digitar o # PIN de 4 dígitos para entrar (antes o QR logava direto, sem PIN). def acesso_qr user = User.motorista.ativos.find_by(login_token: params[:token]) if user session[:motorista_qr_id] = user.id redirect_to motorista_login_path, notice: "Olá, #{user.nome.split.first}! Digite seu PIN de 4 dígitos para entrar." else session.delete(:motorista_qr_id) redirect_to motorista_login_path, alert: 'QR Code inválido ou expirado. Entre com seu PIN.' end end end end