64 lines
2.6 KiB
Ruby
64 lines
2.6 KiB
Ruby
# 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
|