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('
', $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('
', $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(); }