386 lines
14 KiB
PHP
386 lines
14 KiB
PHP
<?php
|
|
|
|
// Validacion de token
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
|
|
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { // Recorre todos los caracteres (siempre) y retorna true or false
|
|
$_SESSION['flash_error'] = 'Acción inválida.';
|
|
header('Location: index.php?opt=inicio_operador');
|
|
exit;
|
|
}
|
|
}
|
|
|
|
// Requiere modelo de usuario
|
|
|
|
require_once __DIR__ . '/../models/usuarioModel.php';
|
|
$usuariomodel = new usuarioModel();
|
|
|
|
// Validar sesión
|
|
|
|
if (!isset($_SESSION['user'])) {
|
|
header("Location: index.php?opt=login_operador");
|
|
exit;
|
|
}
|
|
|
|
$user = $_SESSION['user']; // Defino el array del usuario dentro de una variable
|
|
$rol = $user['rol']; // Defino el rol dentro de la variable
|
|
$esAdmin = ($rol === 'admin'); // Variable booleana, true = admin
|
|
|
|
$opt = $_GET['opt'] ?? null;
|
|
|
|
// Manejo de opciones enviadas por URL
|
|
|
|
switch ($opt) {
|
|
|
|
// USUARIO REQUIERE SUS DATOS, O ADMIN BUSCA EDITAR UNO
|
|
|
|
case 'datos_usuario':
|
|
|
|
$idEditar = null;
|
|
|
|
$idEditar = (int) ($_GET['id'] ?? $user['id']);
|
|
|
|
if ($idEditar <= 0) {
|
|
header("Location: index.php?opt=usuarios");
|
|
exit;
|
|
}
|
|
|
|
// Buscamos el usuario en la base mediante el ID
|
|
|
|
$usuario = $usuariomodel->obtenerPorId($idEditar);
|
|
|
|
if (!$usuario) {
|
|
$_SESSION['flash_error'] = "No se encontró el usuario.";
|
|
header("Location: index.php?opt=usuarios"); // Si no se encontró al usuario se redirige a la lista de usuarios
|
|
exit;
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
|
|
if ($esAdmin) {
|
|
$return = 'inicio_admin';
|
|
} else {
|
|
$return = 'inicio_operador';
|
|
}
|
|
|
|
$_SESSION['return_opt'] = $_GET['from'] ?? "$return";
|
|
$return = $_SESSION['return_opt'];
|
|
|
|
ob_start();
|
|
require __DIR__ . '/../views/usuarios/datosUsuarioView.php';
|
|
return ob_get_clean();
|
|
}
|
|
|
|
// En caso de modificar datos de un usuario
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
|
|
// Si no es admin no puede editar usuarios
|
|
|
|
if (!$esAdmin) {
|
|
header("Location: index.php?opt=home_operador");
|
|
exit;
|
|
}
|
|
|
|
$nombre = trim($_POST['nombre'] ?? '');
|
|
$apellido = trim($_POST['apellido'] ?? '');
|
|
$email = trim($_POST['email'] ?? '');
|
|
$telefono = trim($_POST['telefono'] ?? '');
|
|
$password = trim($_POST['password'] ?? '');
|
|
$usuarioInput = $usuario['usuario'] ?? '';
|
|
$rol = trim($_POST['rol']) ?? 'operador';
|
|
|
|
$errores = [];
|
|
|
|
// Validaciones
|
|
|
|
if ($nombre === '') {
|
|
$errores[] = "El nombre no puede estar vacío.";
|
|
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $nombre)) {
|
|
$errores[] = "El nombre debe comenzar con mayúscula y solo contener letras y espacios.";
|
|
} elseif (strlen($nombre) < 2) {
|
|
$errores[] = "El nombre debe tener al menos 2 caracteres.";
|
|
} elseif (strlen($nombre) > 50) {
|
|
$errores[] = "El nombre no puede superar los 50 caracteres.";
|
|
}
|
|
|
|
if ($apellido === '') {
|
|
$errores[] = "El apellido no puede estar vacío.";
|
|
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $apellido)) {
|
|
$errores[] = "El apellido debe comenzar con mayúscula y solo contener letras y espacios.";
|
|
} elseif (strlen($apellido) < 2) {
|
|
$errores[] = "El apellido debe tener al menos 2 caracteres.";
|
|
} elseif (strlen($apellido) > 50) {
|
|
$errores[] = "El apellido no puede superar los 50 caracteres.";
|
|
}
|
|
|
|
if ($email === '') {
|
|
$errores[] = "El email no puede estar vacío.";
|
|
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
$errores[] = "Formato de email inválido.";
|
|
} elseif (strlen($email) > 100) {
|
|
$errores[] = "El email no puede superar los 100 caracteres.";
|
|
}
|
|
|
|
if ($telefono === '') {
|
|
$errores[] = "El teléfono no puede estar vacío.";
|
|
} else if (!preg_match('/^[0-9]{10}$/', $telefono)) {
|
|
$errores[] = "El teléfono debe tener 10 dígitos.";
|
|
}
|
|
|
|
// Password (si se ingresa)
|
|
|
|
if (!empty($password)) {
|
|
if ($password === '') {
|
|
$errores[] = "La contraseña no puede estar vacía.";
|
|
} elseif (strpos($password, ' ') !== false) {
|
|
$errores[] = "La contraseña no puede contener espacios.";
|
|
} elseif (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/', $password)) {
|
|
$errores[] = "La contraseña debe tener al menos una mayúscula, una minúscula y un número, y mínimo 6 caracteres.";
|
|
}
|
|
}
|
|
|
|
if (!in_array($rol, ['admin', 'operador'], true)) {
|
|
$errores[] = "El rol es incorrecto.";
|
|
}
|
|
|
|
// Un admin no puede modificar su rol
|
|
|
|
if (($idEditar === $user['id']) && ($rol === 'operador')) {
|
|
$_SESSION['flash_error'] = 'No puede modificar su propio rol';
|
|
header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
|
|
exit;
|
|
}
|
|
|
|
if (!empty($errores)) {
|
|
$_SESSION['flash_error'] = implode('<br>', $errores); // Se guarda en $_SESSION el error
|
|
header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
|
|
exit;
|
|
}
|
|
|
|
// Verificación de existencia de usuario
|
|
|
|
if ($usuariomodel->verificarExistencia([
|
|
'nombre' => $nombre,
|
|
'apellido' => $apellido,
|
|
'email' => $email,
|
|
'usuario' => $usuarioInput
|
|
], $idEditar)) {
|
|
$_SESSION['flash_error'] = "El usuario ya existe o el mail ya está registrado.";
|
|
|
|
header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
|
|
exit;
|
|
}
|
|
|
|
$guardarData = [
|
|
'nombre' => $nombre,
|
|
'apellido' => $apellido,
|
|
'email' => $email,
|
|
'telefono' => $telefono,
|
|
'usuario' => $usuarioInput,
|
|
'rol' => $rol
|
|
];
|
|
|
|
if (!empty($password)) {
|
|
$guardarData['password'] = password_hash($password, PASSWORD_DEFAULT); // Hasheo de contraseña
|
|
}
|
|
|
|
// Actualiza los datos del usuario
|
|
|
|
if ($usuariomodel->actualizarUsuario($idEditar, $guardarData)) {
|
|
$_SESSION['flash_success'] = 'Datos actualizados correctamente.'; // Se guarda en $_SESSION el success
|
|
} else {
|
|
$_SESSION['flash_error'] = 'No se pudo actualizar los datos.';
|
|
}
|
|
|
|
if ($idEditar === $user['id']) {
|
|
$_SESSION['user'] = $usuariomodel->obtenerPorId($idEditar);
|
|
}
|
|
|
|
header("Location: index.php?opt=usuarios");
|
|
exit;
|
|
}
|
|
|
|
// LISTAR USUARIOS
|
|
|
|
case 'usuarios':
|
|
|
|
if (!$esAdmin) {
|
|
header("Location: index.php?opt=home_operador");
|
|
exit;
|
|
}
|
|
|
|
// Utilizamos el modelo para obtener la lista completa de usuarios
|
|
|
|
$usuarios = $usuariomodel->listarUsuarios();
|
|
|
|
ob_start();
|
|
require __DIR__ . '/../views/usuarios/listaUsuariosView.php';
|
|
return ob_get_clean();
|
|
|
|
// CREACIÓN DE NUEVO USUARIO
|
|
|
|
case 'crear_usuario':
|
|
|
|
if (!$esAdmin) {
|
|
header("Location: index.php?opt=home_operador");
|
|
exit;
|
|
}
|
|
|
|
// Se requiere la view del form
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
ob_start();
|
|
require __DIR__ . '/../views/usuarios/crearUsuarioView.php';
|
|
return ob_get_clean();
|
|
}
|
|
|
|
// Datos recibidos del POST del formulario
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
|
|
$nombre = trim($_POST['nombre'] ?? '');
|
|
$apellido = trim($_POST['apellido'] ?? '');
|
|
$email = trim($_POST['email'] ?? '');
|
|
$telefono = trim($_POST['telefono'] ?? '');
|
|
$usuarioInput = trim($_POST['usuario'] ?? '');
|
|
$password = trim($_POST['password'] ?? '');
|
|
$rol = trim($_POST['rol']) ?? 'operador';
|
|
|
|
$errores = [];
|
|
|
|
// Validaciones
|
|
|
|
if ($nombre === '') {
|
|
$errores[] = "El nombre no puede estar vacío.";
|
|
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $nombre)) {
|
|
$errores[] = "El nombre debe comenzar con mayúscula y solo contener letras y espacios.";
|
|
} elseif (strlen($nombre) < 2) {
|
|
$errores[] = "El nombre debe tener al menos 2 caracteres.";
|
|
} elseif (strlen($nombre) > 50) {
|
|
$errores[] = "El nombre no puede superar los 50 caracteres.";
|
|
}
|
|
|
|
if ($apellido === '') {
|
|
$errores[] = "El apellido no puede estar vacío.";
|
|
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $apellido)) {
|
|
$errores[] = "El apellido debe comenzar con mayúscula y solo contener letras y espacios.";
|
|
} elseif (strlen($apellido) < 2) {
|
|
$errores[] = "El apellido debe tener al menos 2 caracteres.";
|
|
} elseif (strlen($apellido) > 50) {
|
|
$errores[] = "El apellido no puede superar los 50 caracteres.";
|
|
}
|
|
|
|
if ($email === '') {
|
|
$errores[] = "El email no puede estar vacío.";
|
|
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
$errores[] = "Formato de email inválido.";
|
|
} elseif (strlen($email) > 100) {
|
|
$errores[] = "El email no puede superar los 100 caracteres.";
|
|
}
|
|
|
|
if ($telefono === '') {
|
|
$errores[] = "El teléfono no puede estar vacío.";
|
|
} else if (!preg_match('/^[0-9]{10}$/', $telefono)) {
|
|
$errores[] = "El teléfono debe tener 10 dígitos.";
|
|
}
|
|
|
|
if ($usuarioInput === '') {
|
|
$errores[] = "El usuario no puede estar vacío.";
|
|
} elseif (!preg_match('/^[a-zA-Z0-9._]+$/', $usuarioInput)) {
|
|
$errores[] = "El usuario solo puede contener letras, números, puntos y guiones bajos.";
|
|
} elseif (strlen($usuarioInput) < 5) {
|
|
$errores[] = "El usuario debe tener al menos 5 caracteres.";
|
|
} elseif (strlen($usuarioInput) > 30) {
|
|
$errores[] = "El usuario no puede superar los 30 caracteres.";
|
|
}
|
|
|
|
if ($password === '') {
|
|
$errores[] = "La contraseña no puede estar vacía.";
|
|
} elseif (strpos($password, ' ') !== false) {
|
|
$errores[] = "La contraseña no puede contener espacios.";
|
|
} elseif (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/', $password)) {
|
|
$errores[] = "La contraseña debe tener al menos una mayúscula, una minúscula y un número, y mínimo 6 caracteres.";
|
|
}
|
|
|
|
if (!in_array($rol, ['admin', 'operador'], true)) {
|
|
$rol = 'operador';
|
|
}
|
|
|
|
if (!empty($errores)) {
|
|
$_SESSION['flash_error'] = implode('<br>', $errores);
|
|
header("Location: index.php?opt=crear_usuario");
|
|
exit;
|
|
}
|
|
|
|
// Verificación de existencia de usuario
|
|
|
|
if ($usuariomodel->verificarExistencia([
|
|
'nombre' => $nombre,
|
|
'apellido' => $apellido,
|
|
'email' => $email,
|
|
'usuario' => $usuarioInput
|
|
])) {
|
|
$_SESSION['flash_error'] = "El usuario ya existe o el mail ya está registrado.";
|
|
|
|
header("Location: index.php?opt=crear_usuario");
|
|
exit;
|
|
}
|
|
|
|
// Se llama a la función para crear el usuario
|
|
|
|
if ($usuariomodel->crearUsuario([
|
|
'nombre' => $nombre,
|
|
'apellido' => $apellido,
|
|
'email' => $email,
|
|
'telefono' => $telefono,
|
|
'usuario' => $usuarioInput,
|
|
'password' => password_hash($password, PASSWORD_DEFAULT),
|
|
'rol' => $rol
|
|
])) {
|
|
$_SESSION['flash_success'] = 'Usuario creado correctamente';
|
|
} else {
|
|
$_SESSION['flash_error'] = 'Ocurrió un error al crear el usuario.';
|
|
}
|
|
|
|
header("Location: index.php?opt=usuarios");
|
|
exit;
|
|
}
|
|
|
|
// ELIMINAR USUARIO (BAJA LÓGICA)
|
|
|
|
case 'eliminar_usuario':
|
|
|
|
$idEliminar = $_POST['id'] ?? 0;
|
|
|
|
if ($idEliminar <= 0) {
|
|
header("Location: index.php?opt=usuarios");
|
|
exit;
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
|
|
if ($idEliminar == $user['id']) {
|
|
$_SESSION['flash_error'] = "No puede eliminar su usuario.";
|
|
header("Location:index.php?opt=usuarios");
|
|
exit;
|
|
}
|
|
|
|
if ($usuariomodel->eliminarUsuario($idEliminar)) {
|
|
$_SESSION['flash_success'] = "Usuario eliminado correctamente.";
|
|
} else {
|
|
$_SESSION['flash_error'] = "Ocurrió un error al eliminar el usuario.";
|
|
}
|
|
|
|
header("Location:index.php?opt=usuarios");
|
|
exit;
|
|
}
|
|
|
|
// DEFAULT (404)
|
|
|
|
default:
|
|
ob_start();
|
|
require __DIR__ . '/../views/404View.php';
|
|
return ob_get_clean();
|
|
} |