Correções de integração Fases 2/3 ↔ 4-8 + Auditoria UI + README final

This commit is contained in:
2026-06-11 18:48:44 -03:00
parent 8b3d4bc87f
commit 3b07e72d6e
19 changed files with 879 additions and 37 deletions

View File

@@ -0,0 +1,13 @@
# app/controllers/admin/auditoria_logs_controller.rb
class Admin::AuditoriaLogsController < ApplicationController
def index
authorize AuditoriaLog, policy_class: ApplicationPolicy
@logs = AuditoriaLog.recentes.limit(200)
@logs = @logs.por_user(params[:user_id]) if params[:user_id].present?
@logs = @logs.where(acao: params[:acao]) if params[:acao].present?
@logs = @logs.por_entidade(params[:entidade]) if params[:entidade].present?
@usuarios = User.por_nome
end
end

View File

@@ -0,0 +1,43 @@
# app/controllers/configuracoes_controller.rb
class Admin::ConfiguracoesController < ApplicationController
before_action :set_configuracao, only: [:edit, :update]
def index
authorize Configuracao
@configuracoes = Configuracao.all.order(:chave)
end
def edit
authorize @configuracao
end
def update
authorize @configuracao
valor_anterior = @configuracao.valor
if @configuracao.update(configuracao_params)
AuditoriaLog.registrar(user: current_user, acao: 'editar_preco', entidade: 'Configuracao', entidade_id: @configuracao.id, dados_novos: { detalhes: "#{@configuracao.chave}: R$ #{valor_anterior} → R$ #{@configuracao.valor}" }, request: request)
redirect_to admin_configuracoes_path, notice: "Preço de #{@configuracao.tipo_label} atualizado."
else
render :edit, status: :unprocessable_entity
end
end
# POST /configuracoes/toggle_tema
def toggle_tema
skip_authorization
session[:tema] = session[:tema] == 'light' ? 'dark' : 'light'
redirect_back(fallback_location: dashboard_path)
end
private
def set_configuracao
@configuracao = Configuracao.find(params[:id])
end
def configuracao_params
params.require(:configuracao).permit(:valor, :descricao)
end
end

View File

@@ -0,0 +1,84 @@
# app/controllers/usuarios_controller.rb
class Admin::UsuariosController < ApplicationController
before_action :set_usuario, only: [:show, :edit, :update, :destroy, :toggle_ativo]
def index
authorize User
@usuarios = policy_scope(User).order(:nome).page(params[:page]).per(20)
@roles = User.roles.keys
end
def show
authorize @usuario
end
def new
@usuario = User.new
authorize @usuario
end
def create
@usuario = User.new(usuario_params)
authorize @usuario
if @usuario.save
AuditoriaLog.registrar(user: current_user, acao: 'criar_usuario', entidade: 'User', dados_novos: { detalhes: "Criou usuário #{@usuario.email} (#{@usuario.role})" }, request: request)
redirect_to admin_usuarios_path, notice: 'Usuário criado com sucesso.'
else
render :new, status: :unprocessable_entity
end
end
def edit
authorize @usuario
end
def update
authorize @usuario
if @usuario.update(usuario_params_update)
AuditoriaLog.registrar(user: current_user, acao: 'editar_usuario', entidade: 'User', dados_novos: { detalhes: "Editou usuário #{@usuario.email}" }, request: request)
redirect_to admin_usuarios_path, notice: 'Usuário atualizado.'
else
render :edit, status: :unprocessable_entity
end
end
def destroy
authorize @usuario
if @usuario == current_user
redirect_to admin_usuarios_path, alert: 'Você não pode excluir sua própria conta.'
return
end
@usuario.destroy
AuditoriaLog.registrar(user: current_user, acao: 'excluir_usuario', entidade: 'User', dados_novos: { detalhes: "Excluiu usuário #{@usuario.email}" }, request: request)
redirect_to admin_usuarios_path, notice: 'Usuário removido.'
end
def toggle_ativo
authorize @usuario, :update?
@usuario.update!(ativo: !@usuario.ativo)
status = @usuario.ativo? ? 'ativado' : 'desativado'
AuditoriaLog.registrar(user: current_user, acao: "usuario_#{status}", entidade: \'User\', dados_novos: { detalhes: "#{@usuario.email} foi #{status}" }, request: request)
redirect_to admin_usuarios_path, notice: "Usuário #{status} com sucesso."
end
private
def set_usuario
@usuario = User.find(params[:id])
end
def usuario_params
params.require(:user).permit(:nome, :email, :password, :password_confirmation,
:role, :pin_code, :ativo)
end
def usuario_params_update
permitted = [:nome, :email, :role, :pin_code, :ativo]
permitted += [:password, :password_confirmation] if params[:user][:password].present?
params.require(:user).permit(permitted)
end
end

View File

@@ -41,11 +41,11 @@ class Users::SessionsController < Devise::SessionsController
def handle_pin_login
pin = params[:user][:pin].to_s.strip
user = User.find_by(pin_acesso: pin, role: 'motorista')
user = User.find_by(pin_code: pin, role: 'motorista')
if user&.active?
sign_in(user)
AuditoriaLog.registrar(user, 'login_pin', request.remote_ip)
AuditoriaLog.registrar(user: user, acao: 'login_pin', entidade: 'User', dados_novos: { detalhes: "" }, request: request)
redirect_to motorista_path, notice: "Bem-vindo, #{user.nome_display}!"
else
flash.now[:alert] = 'PIN inválido ou motorista inativo.'