File: /home/onlyfibr/public_html/assinar/admin/gerenciar_usuarios.php
<?php
// HABILITAR ERROS PARA DEBUG - REMOVER/COMENTAR EM PRODUÇÃO!
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// ---------------------------------------------------------
// 1. Verifica se o admin está logado
require_once 'includes/auth_check.php';
// Define o título desta página ANTES de incluir o header
$pageTitle = 'Gerenciar Usuários';
require_once '../includes/config/config.php';
require_once '../includes/functions/functions.php';
// Verifica se o usuário atual tem permissão de administrador
if (!usuarioEhAdmin()) {
$_SESSION['erro_dashboard'] = "Você não tem permissão para acessar esta página.";
header("Location: index.php");
exit;
}
// --- Processamento de mensagens flash ---
$mensagem_erro = $_SESSION['erro_dashboard'] ?? null;
$mensagem_sucesso = $_SESSION['sucesso_dashboard'] ?? null;
unset($_SESSION['erro_dashboard'], $_SESSION['sucesso_dashboard']);
// --- Função para gerar token CSRF ---
function gerarCsrfToken()
{
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
// Gera um novo token CSRF para os formulários
$csrf_token = gerarCsrfToken();
// --- Ação: Adicionar Usuário ---
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add') {
// Verifica token CSRF
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
$_SESSION['erro_dashboard'] = "Erro de validação do formulário. Por favor, tente novamente.";
} else {
// Pega os dados do formulário
$nome_usuario = filter_input(INPUT_POST, 'nome_usuario', FILTER_SANITIZE_STRING);
$nome_completo = filter_input(INPUT_POST, 'nome_completo', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$senha = $_POST['senha_hash'] ?? '';
$confirmar_senha = $_POST['confirmar_senha'] ?? '';
$tipo = filter_input(INPUT_POST, 'tipo', FILTER_SANITIZE_STRING);
$permissoes_selecionadas = $_POST['permissoes'] ?? [];
// Validações
$erros = [];
if (empty($nome_usuario)) $erros[] = "Nome de usuário é obrigatório.";
if (empty($nome_completo)) $erros[] = "Nome Completo é obrigatório.";
if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) $erros[] = "Email inválido.";
if (empty($senha)) $erros[] = "Senha é obrigatória.";
if ($senha !== $confirmar_senha) $erros[] = "As senhas não conferem.";
if (strlen($senha) < 8) $erros[] = "A senha deve ter pelo menos 8 caracteres.";
if (!preg_match('/[A-Z]/', $senha)) $erros[] = "A senha deve ter pelo menos uma letra maiúscula.";
if (!preg_match('/[a-z]/', $senha)) $erros[] = "A senha deve ter pelo menos uma letra minúscula.";
if (!preg_match('/[0-9]/', $senha)) $erros[] = "A senha deve ter pelo menos um número.";
if (empty($tipo)) $erros[] = "Tipo de usuário é obrigatório.";
// Tipos de usuário válidos
$tipos_validos = ['admin', 'suporte', 'financeiro'];
if (!in_array($tipo, $tipos_validos)) $erros[] = "Tipo de usuário inválido.";
// Validação das permissões selecionadas
$todas_permissoes = ['admin', 'suporte', 'financeiro', 'usuario'];
foreach ($permissoes_selecionadas as $perm) {
if (!in_array($perm, $todas_permissoes)) {
$erros[] = "Permissão inválida: " . htmlspecialchars($perm);
}
}
// Se não houver erros, adiciona o usuário
if (empty($erros) && $pdo) {
try {
// Verificar se o email já existe
$stmt_check = $pdo->prepare("SELECT id FROM admin_usuarios WHERE email = :email");
$stmt_check->bindParam(':email', $email, PDO::PARAM_STR);
$stmt_check->execute();
if ($stmt_check->rowCount() > 0) {
$_SESSION['erro_dashboard'] = "Este email já está em uso.";
} else {
// Hash da senha
$hash_senha = password_hash($senha, PASSWORD_DEFAULT, ['cost' => 12]);
// JSON das permissões
$permissoes_json = json_encode($permissoes_selecionadas);
// Preparar a query
$sql = "INSERT INTO admin_usuarios (nome_usuario, nome_completo, email, senha_hash, nivel_acesso, permissoes, ativo, data_criacao)
VALUES (:nome_usuario, :nome_completo, :email, :senha_hash, :tipo, :permissoes, TRUE, NOW())";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':nome_usuario', $nome_usuario, PDO::PARAM_STR);
$stmt->bindParam(':nome_completo', $nome_completo, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':senha_hash', $hash_senha, PDO::PARAM_STR);
$stmt->bindParam(':tipo', $tipo, PDO::PARAM_STR);
$stmt->bindParam(':permissoes', $permissoes_json, PDO::PARAM_STR);
if ($stmt->execute()) {
$_SESSION['sucesso_dashboard'] = "Usuário adicionado com sucesso!";
header('Location: ' . htmlspecialchars($_SERVER['PHP_SELF']));
exit;
} else {
$_SESSION['erro_dashboard'] = "Erro ao adicionar usuário.";
}
}
} catch (PDOException $e) {
$_SESSION['erro_dashboard'] = "Erro ao adicionar usuário: " . $e->getMessage();
error_log("Erro ao adicionar usuário: " . $e->getMessage());
}
} else if (!empty($erros)) {
$_SESSION['erro_dashboard'] = "Erros encontrados: " . implode(" ", $erros);
}
}
header('Location: ' . htmlspecialchars($_SERVER['PHP_SELF']));
exit;
}
// --- Ação: Editar Usuário ---
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'edit') {
// Verifica token CSRF
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
$_SESSION['erro_dashboard'] = "Erro de validação do formulário. Por favor, tente novamente.";
} else {
// Pega os dados do formulário
$id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
$nome_usuario = filter_input(INPUT_POST, 'nome_usuario', FILTER_SANITIZE_STRING);
$nome_completo = filter_input(INPUT_POST, 'nome_completo', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$tipo = filter_input(INPUT_POST, 'tipo', FILTER_SANITIZE_STRING);
$permissoes_selecionadas = $_POST['permissoes'] ?? [];
$ativo = isset($_POST['ativo']) && $_POST['ativo'] === '1';
$senha_nova = $_POST['senha_nova'] ?? '';
$confirmar_senha_nova = $_POST['confirmar_senha_nova'] ?? '';
// Validações
$erros = [];
if (empty($id)) $erros[] = "ID do usuário inválido.";
if (empty($nome_usuario)) $erros[] = "Nome de usuário é obrigatório.";
if (empty($nome_completo)) $erros[] = "Nome completo é obrigatório.";
if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) $erros[] = "Email inválido.";
if (empty($tipo)) $erros[] = "Tipo de usuário é obrigatório.";
// Validação da senha (somente se estiver sendo alterada)
if (!empty($senha_nova)) {
if ($senha_nova !== $confirmar_senha_nova) $erros[] = "As senhas não conferem.";
if (strlen($senha_nova) < 8) $erros[] = "A senha deve ter pelo menos 8 caracteres.";
if (!preg_match('/[A-Z]/', $senha_nova)) $erros[] = "A senha deve ter pelo menos uma letra maiúscula.";
if (!preg_match('/[a-z]/', $senha_nova)) $erros[] = "A senha deve ter pelo menos uma letra minúscula.";
if (!preg_match('/[0-9]/', $senha_nova)) $erros[] = "A senha deve ter pelo menos um número.";
}
// Tipos de usuário válidos
$tipos_validos = ['admin', 'suporte', 'financeiro', 'usuario'];
if (!in_array($tipo, $tipos_validos)) $erros[] = "Tipo de usuário inválido.";
// Validação das permissões selecionadas
$todas_permissoes = ['admin', 'suporte', 'financeiro', 'usuario'];
foreach ($permissoes_selecionadas as $perm) {
if (!in_array($perm, $todas_permissoes)) {
$erros[] = "Permissão inválida: " . htmlspecialchars($perm);
}
}
// Se não houver erros, atualiza o usuário
if (empty($erros) && $pdo) {
try {
// Verificar se o email já existe para outro usuário
$stmt_check = $pdo->prepare("SELECT id FROM admin_usuarios WHERE email = :email AND id != :id");
$stmt_check->bindParam(':email', $email, PDO::PARAM_STR);
$stmt_check->bindParam(':id', $id, PDO::PARAM_INT);
$stmt_check->execute();
if ($stmt_check->rowCount() > 0) {
$_SESSION['erro_dashboard'] = "Este email já está em uso por outro usuário.";
} else {
// JSON das permissões
$permissoes_json = json_encode($permissoes_selecionadas);
// Preparar a query base
$sql = "UPDATE admin_usuarios SET nome_usuario = :nome_usuario, nome_completo = :nome_completo, email = :email, nivel_acesso = :tipo,
permissoes = :permissoes, ativo = :ativo, data_atualizacao = NOW()";
// Adicionar atualização de senha se fornecida
$params = [
':nome_usuario' => $nome_usuario,
':nome_completo' => $nome_completo,
':email' => $email,
':tipo' => $tipo,
':permissoes' => $permissoes_json,
':ativo' => $ativo,
':id' => $id
];
if (!empty($senha_nova)) {
$hash_senha = password_hash($senha_nova, PASSWORD_DEFAULT, ['cost' => 12]);
$sql .= ", senha_hash = :senha_hash";
$params[':senha_hash'] = $hash_senha;
}
// Finalizar a query
$sql .= " WHERE id = :id";
$stmt = $pdo->prepare($sql);
// Bind params
foreach ($params as $param => $value) {
$type = is_bool($value) ? PDO::PARAM_BOOL : (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR);
$stmt->bindValue($param, $value, $type);
}
if ($stmt->execute()) {
$_SESSION['sucesso_dashboard'] = "Usuário atualizado com sucesso!";
// Se o usuário editado for o usuário logado atualmente, atualize a sessão
if ($_SESSION['usuario_id'] == $id) {
$_SESSION['usuario_nome_usuario'] = $nome_usuario;
$_SESSION['usuario_nome_completo'] = $nome_completo;
$_SESSION['usuario_email'] = $email;
$_SESSION['usuario_tipo'] = $tipo;
$_SESSION['usuario_permissoes'] = $permissoes_selecionadas;
}
} else {
$_SESSION['erro_dashboard'] = "Erro ao atualizar usuário.";
}
}
} catch (PDOException $e) {
$_SESSION['erro_dashboard'] = "Erro ao atualizar usuário: " . $e->getMessage();
error_log("Erro ao atualizar usuário: " . $e->getMessage());
}
} else if (!empty($erros)) {
$_SESSION['erro_dashboard'] = "Erros encontrados: " . implode(" ", $erros);
}
}
header('Location: ' . htmlspecialchars($_SERVER['PHP_SELF']));
exit;
}
// --- Buscar lista de usuários ---
$usuarios = [];
if ($pdo) {
try {
// Ordenar por mais recentes primeiro
$sql = "SELECT id, nome_usuario, nome_completo, email, nivel_acesso, permissoes, ativo, bloqueado, data_criacao, ultimo_login
FROM admin_usuarios
ORDER BY data_criacao DESC";
$stmt = $pdo->query($sql);
$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Converte as permissões de JSON para array
foreach ($usuarios as &$usuario) {
$usuario['permissoes_array'] = json_decode($usuario['permissoes'], true) ?? [];
}
} catch (PDOException $e) {
$mensagem_erro = "Erro ao buscar usuários: " . $e->getMessage();
error_log("Erro ao buscar usuários: " . $e->getMessage());
}
}
// Obter os menus dinamicamente do banco de dados
$menus = carregarMenus($pdo, $usuario_permissoes ?? ['admin']);
// Incluir o header
include_once 'includes/header.php';
?>
<div class="container">
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h1>Gerenciar Usuários</h1>
<p class="text-muted">Gerencie as contas de usuários do sistema</p>
</div>
<div>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addUserModal">
<i class="fas fa-user-plus me-2"></i>Adicionar Usuário
</button>
</div>
</div>
<?php if ($mensagem_erro): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php echo htmlspecialchars($mensagem_erro); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if ($mensagem_sucesso): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo htmlspecialchars($mensagem_sucesso); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<!-- Tabela de Usuários -->
<div class="card">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-users me-2"></i>Lista de Usuários</h5>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Usuário</th>
<th>Nome</th>
<th>Email</th>
<th>Tipo</th>
<th>Status</th>
<th>Último Login</th>
<th>Data Criação</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
<?php if (empty($usuarios)): ?>
<tr>
<td colspan="7" class="text-center">Nenhum usuário encontrado.</td>
</tr>
<?php else: ?>
<?php foreach ($usuarios as $user): ?>
<tr>
<td><?php echo htmlspecialchars($user['nome_usuario']); ?></td>
<td><?php echo htmlspecialchars($user['nome_completo']); ?></td>
<td><?php echo htmlspecialchars($user['email']); ?></td>
<td>
<span class="badge <?php
switch ($user['nivel_acesso']) {
case 'admin':
echo 'bg-danger';
break;
case 'gerente':
echo 'bg-warning text-dark';
break;
case 'atendente':
echo 'bg-primary';
break;
default:
echo 'bg-secondary';
break;
}
?>">
<?php echo ucfirst(htmlspecialchars($user['nivel_acesso'])); ?>
</span>
</td>
<td>
<?php if ($user['bloqueado']): ?>
<span class="badge bg-danger">Bloqueado</span>
<?php elseif (!$user['ativo']): ?>
<span class="badge bg-secondary">Inativo</span>
<?php else: ?>
<span class="badge bg-success">Ativo</span>
<?php endif; ?>
</td>
<td><?php echo $user['ultimo_login'] ? date('d/m/Y H:i', strtotime($user['ultimo_login'])) : 'Nunca'; ?></td>
<td><?php echo date('d/m/Y', strtotime($user['data_criacao'])); ?></td>
<td>
<div class="btn-group" role="group" aria-label="Ações do usuário">
<button type="button" class="btn btn-sm btn-warning edit-user"
data-bs-toggle="modal" data-bs-target="#editUserModal"
data-id="<?php echo $user['id']; ?>"
data-nome-usuario="<?php echo htmlspecialchars($user['nome_usuario']); ?>"
data-nome-completo="<?php echo htmlspecialchars($user['nome_completo']); ?>"
data-email="<?php echo htmlspecialchars($user['email']); ?>"
data-tipo="<?php echo htmlspecialchars($user['nivel_acesso']); ?>"
data-ativo="<?php echo $user['ativo'] ? '1' : '0'; ?>"
data-permissoes='<?php echo htmlspecialchars(json_encode($user['permissoes_array'])); ?>'>
<i class="fas fa-edit"></i>
</button>
<?php if ($user['id'] != $_SESSION['usuario_id']): // Não mostrar botão de exclusão para o próprio usuário
?>
<button type="button" class="btn btn-sm btn-danger delete-user"
data-bs-toggle="modal" data-bs-target="#deleteUserModal"
data-id="<?php echo $user['id']; ?>"
data-nome-usuario="<?php echo htmlspecialchars($user['nome_usuario']); ?>">
<i class="fas fa-trash-alt"></i>
</button>
<?php endif; ?>
</div>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Modal para Adicionar Usuário -->
<div class="modal fade" id="addUserModal" tabindex="-1" aria-labelledby="addUserModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" id="addUserForm" class="needs-validation" novalidate>
<input type="hidden" name="action" value="add">
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
<div class="modal-header">
<h5 class="modal-title" id="addUserModalLabel">Adicionar Novo Usuário</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row mb-3">
<div class="col-md-6">
<label for="add_nome_completo" class="form-label">Nome Completo</label>
<input type="text" class="form-control" id="add_nome_completo" name="nome_completo" required>
<div class="invalid-feedback">Por favor, informe o nome completo.</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="nome_usuario" class="form-label">Usuário</label>
<input type="text" class="form-control" id="nome_usuario" name="nome_usuario" required>
<div class="invalid-feedback">Por favor, informe o nomedo usuário.</div>
</div>
<div class="col-md-6">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" name="email" required>
<div class="invalid-feedback">Por favor, informe um email válido.</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="senha_hash" class="form-label">Senha</label>
<div class="input-group">
<input type="password" class="form-control" id="senha_hash" name="senha_hash" required>
<button class="btn btn-outline-secondary toggle-password" type="button">
<i class="fas fa-eye"></i>
</button>
</div>
<div class="invalid-feedback">Por favor, informe uma senha.</div>
<div class="form-text">Mínimo de 8 caracteres, incluindo maiúsculas, minúsculas e números.</div>
</div>
<div class="col-md-6">
<label for="confirmar_senha" class="form-label">Confirmar Senha</label>
<div class="input-group">
<input type="password" class="form-control" id="confirmar_senha" name="confirmar_senha" required>
<button class="btn btn-outline-secondary toggle-password" type="button">
<i class="fas fa-eye"></i>
</button>
</div>
<div class="invalid-feedback">As senhas não conferem.</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="tipo" class="form-label">Tipo de Usuário</label>
<select class="form-select" id="tipo" name="tipo" required>
<option value="">Selecione o tipo</option>
<option value="admin">Administrador</option>
<option value="suporte">Suporte</option>
<option value="financeiro">Financeiro</option>
</select>
<div class="invalid-feedback">Por favor, selecione um tipo.</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Permissões</label>
<div class="row">
<div class="col-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="perm_admin" name="permissoes[]" value="admin">
<label class="form-check-label" for="perm_admin">Administrador</label>
</div>
</div>
<div class="col-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="perm_suporte" name="permissoes[]" value="suporte">
<label class="form-check-label" for="perm_suporte">Suporte</label>
</div>
</div>
<div class="col-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="perm_financeiro" name="permissoes[]" value="financeiro">
<label class="form-check-label" for="perm_financeiro">Financeiro</label>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
<button type="submit" class="btn btn-primary">Adicionar Usuário</button>
</div>
</form>
</div>
</div>
</div>
<!-- Modal para Editar Usuário -->
<div class="modal fade" id="editUserModal" tabindex="-1" aria-labelledby="editUserModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" id="editUserForm" class="needs-validation" novalidate>
<input type="hidden" name="action" value="edit">
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
<input type="hidden" name="id" id="edit_id">
<div class="modal-header">
<h5 class="modal-title" id="editUserModalLabel">Editar Usuário</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row mb-3">
<div class="col-md-6">
<label for="edit_nome_usuario" class="form-label">Usuário</label>
<input type="text" class="form-control" id="edit_nome_usuario" name="nome_usuario" required>
<div class="invalid-feedback">Por favor, informe o nome de usuário.</div>
</div>
<div class="modal-body">
<div class="row mb-3">
<div class="col-md-6">
<label for="edit_nome_completo" class="form-label">Nome Completo</label>
<input type="text" class="form-control" id="edit_nome_completo" name="nome_completo" required>
<div class="invalid-feedback">Por favor, informe o nome completo.</div>
</div>
<div class="col-md-6">
<label for="edit_email" class="form-label">Email</label>
<input type="email" class="form-control" id="edit_email" name="email" required>
<div class="invalid-feedback">Por favor, informe um email válido.</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="edit_senha_nova" class="form-label">Nova Senha (deixe em branco para manter)</label>
<div class="input-group">
<input type="password" class="form-control" id="edit_senha_nova" name="senha_nova">
<button class="btn btn-outline-secondary toggle-password" type="button">
<i class="fas fa-eye"></i>
</button>
</div>
<div class="form-text">Mínimo de 8 caracteres, incluindo maiúsculas, minúsculas e números.</div>
</div>
<div class="col-md-6">
<label for="edit_confirmar_senha_nova" class="form-label">Confirmar Nova Senha</label>
<div class="input-group">
<input type="password" class="form-control" id="edit_confirmar_senha_nova" name="confirmar_senha_nova">
<button class="btn btn-outline-secondary toggle-password" type="button">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="edit_tipo" class="form-label">Tipo de Usuário</label>
<select class="form-select" id="edit_tipo" name="tipo" required>
<option value="">Selecione o tipo</option>
<option value="admin">Administrador</option>
<option value="suporte">Suporte</option>
<option value="financeiro">Financeiro</option>
</select>
<div class="invalid-feedback">Por favor, selecione um tipo.</div>
</div>
<div class="col-md-6">
<label for="edit_ativo" class="form-label">Status</label>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="edit_ativo" name="ativo" value="1">
<label class="form-check-label" for="edit_ativo">Ativo</label>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Permissões</label>
<div class="row">
<div class="col-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="edit_perm_admin" name="permissoes[]" value="admin">
<label class="form-check-label" for="edit_perm_admin">Administrador</label>
</div>
</div>
<div class="col-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="edit_perm_suporte" name="permissoes[]" value="suporte">
<label class="form-check-label" for="edit_perm_suporte">Suporte</label>
</div>
</div>
<div class="col-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="edit_perm_financeiro" name="permissoes[]" value="financeiro">
<label class="form-check-label" for="edit_perm_financeiro">Financeiro</label>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
<button type="submit" class="btn btn-primary">Salvar Alterações</button>
</div>
</form>
</div>
</div>
</div>
<!-- Modal para Excluir Usuário -->
<div class="modal fade" id="deleteUserModal" tabindex="-1" aria-labelledby="deleteUserModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteUserModalLabel">Confirmar Exclusão</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Tem certeza que deseja excluir o usuário <strong id="delete_user_name"></strong>?</p>
<p class="text-danger">Esta ação não poderá ser desfeita.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
<input type="hidden" name="id" id="delete_user_id">
<button type="submit" class="btn btn-danger">Excluir</button>
</form>
</div>
</div>
</div>
</div>
<script>
// Validação de formulário
(function() {
'use strict';
// Fetch all forms we want to apply validation to
var forms = document.querySelectorAll('.needs-validation');
// Loop and prevent submission if invalid
Array.prototype.slice.call(forms).forEach(function(form) {
form.addEventListener('submit', function(event) {
if (!form.checkValidity()) {
event.preventDefault();
event.stopPropagation();
}
// Verifica se as senhas conferem no formulário de adição
if (form.id === 'addUserForm') {
var senha = document.getElementById('senha_hash').value;
var confirmarSenha = document.getElementById('confirmar_senha').value;
if (senha !== confirmarSenha) {
event.preventDefault();
document.getElementById('confirmar_senha').setCustomValidity('As senhas não conferem');
} else {
document.getElementById('confirmar_senha').setCustomValidity('');
}
}
// Verifica se as senhas conferem no formulário de edição (só se uma nova senha foi informada)
if (form.id === 'editUserForm') {
var novaSenha = document.getElementById('edit_senha_nova').value;
var confirmarNovaSenha = document.getElementById('edit_confirmar_senha_nova').value;
if (novaSenha && novaSenha !== confirmarNovaSenha) {
event.preventDefault();
document.getElementById('edit_confirmar_senha_nova').setCustomValidity('As senhas não conferem');
} else {
document.getElementById('edit_confirmar_senha_nova').setCustomValidity('');
}
}
form.classList.add('was-validated');
}, false);
});
})();
// Toggle password visibility
document.querySelectorAll('.toggle-password').forEach(function(button) {
button.addEventListener('click', function() {
const passwordInput = this.previousElementSibling;
const icon = this.querySelector('i');
if (passwordInput.type === 'password') {
passwordInput.type = 'text';
icon.classList.remove('fa-eye');
icon.classList.add('fa-eye-slash');
} else {
passwordInput.type = 'password';
icon.classList.remove('fa-eye-slash');
icon.classList.add('fa-eye');
}
});
});
// Carrega dados no modal de edição
document.querySelectorAll('.edit-user').forEach(function(button) {
button.addEventListener('click', function() {
const id = this.getAttribute('data-id');
const nome_usuario = this.getAttribute('data-nome-usuario');
const nome_completo = this.getAttribute('data-nome-completo');
const email = this.getAttribute('data-email');
const tipo = this.getAttribute('data-tipo');
const ativo = this.getAttribute('data-ativo') === '1';
const permissoes = JSON.parse(this.getAttribute('data-permissoes'));
// Preenche os campos no modal
document.getElementById('edit_id').value = id;
document.getElementById('edit_nome_usuario').value = nome_usuario;
document.getElementById('edit_nome_completo').value = nome_completo;
document.getElementById('edit_email').value = email;
document.getElementById('edit_tipo').value = tipo;
document.getElementById('edit_ativo').checked = ativo;
// Limpa os checkboxes de permissões
document.querySelectorAll('#editUserModal input[name="permissoes[]"]').forEach(function(checkbox) {
checkbox.checked = false;
});
// Marca os checkboxes correspondentes às permissões do usuário
permissoes.forEach(function(perm) {
const checkbox = document.getElementById('edit_perm_' + perm);
if (checkbox) {
checkbox.checked = true;
}
});
});
});
// Carrega dados no modal de exclusão
document.querySelectorAll('.delete-user').forEach(function(button) {
button.addEventListener('click', function() {
const id = this.getAttribute('data-id');
const nome_usuario = this.getAttribute('data-nome-usuario');
document.getElementById('delete_user_id').value = id;
document.getElementById('delete_user_name').textContent = nome_usuario;
});
});
// Atualiza permissões com base no tipo selecionado
document.getElementById('tipo').addEventListener('change', function() {
const tipo = this.value;
// Limpa todos os checkboxes
document.querySelectorAll('#addUserForm input[name="permissoes[]"]').forEach(function(checkbox) {
checkbox.checked = false;
});
// Marca checkboxes baseado no tipo selecionado
if (tipo === 'admin') {
document.getElementById('perm_admin').checked = true;
document.getElementById('perm_view_relatorios').checked = true;
document.getElementById('perm_edit_precadastros').checked = true;
document.getElementById('perm_process_api').checked = true;
} else if (tipo === 'suporte') {
document.getElementById('perm_suporte').checked = true;
document.getElementById('perm_view_relatorios').checked = true;
document.getElementById('perm_edit_precadastros').checked = true;
document.getElementById('perm_process_api').checked = true;
} else if (tipo === 'financeiro') {
document.getElementById('perm_financeiro').checked = true;
document.getElementById('perm_edit_precadastros').checked = true;
}
});
// Faz o mesmo para o formulário de edição
document.getElementById('edit_tipo').addEventListener('change', function() {
const tipo = this.value;
// Limpa todos os checkboxes
document.querySelectorAll('#editUserForm input[name="permissoes[]"]').forEach(function(checkbox) {
checkbox.checked = false;
});
// Marca checkboxes baseado no tipo selecionado
if (tipo === 'admin') {
document.getElementById('edit_perm_admin').checked = true;
document.getElementById('edit_perm_view_relatorios').checked = true;
document.getElementById('edit_perm_edit_precadastros').checked = true;
document.getElementById('edit_perm_process_api').checked = true;
} else if (tipo === 'gerente') {
document.getElementById('edit_perm_suporte').checked = true;
document.getElementById('edit_perm_view_relatorios').checked = true;
document.getElementById('edit_perm_edit_precadastros').checked = true;
document.getElementById('edit_perm_process_api').checked = true;
} else if (tipo === 'financeiro') {
document.getElementById('edit_perm_financeiro').checked = true;
document.getElementById('edit_perm_edit_precadastros').checked = true;
}
});
</script>
<?php
// Incluir o footer
include_once 'includes/footer.php';
?>