<?php // Controladores/AsignacionControlador.php require_once 'Modelos/AsignacionModelo.php'; require_once 'Modelos/UsuarioModelo.php'; require_once 'Modelos/CursoModelo.php'; class AsignacionControlador { private $modeloAsignacion; private $modeloUsuario; private $modeloCurso; public function __construct($db, $db_externa) { $this->modeloAsignacion = new AsignacionModelo($db, $db_externa); $this->modeloUsuario = new UsuarioModelo($db, $db_externa); $this->modeloCurso = new CursoModelo($db); if (!esta_autenticado() || usuario_actual()['rol'] !== 'admin') { header("Location: index.php?r=auth/login"); exit; } } public function index() { // 1. Configuración de paginación $por_pagina = 20; // Número de registros por página $pagina_actual = isset($_GET['p']) ? (int)$_GET['p'] : 1; if ($pagina_actual < 1) $pagina_actual = 1; $inicio = ($pagina_actual - 1) * $por_pagina; // 2. Obtener datos con límites y conteo total $total_registros = $this->modeloAsignacion->contarTotal(); $total_paginas = ceil($total_registros / $por_pagina); // Reemplazamos el (50, 0) fijo por las variables calculadas $asignaciones = $this->modeloAsignacion->obtenerHistorial($por_pagina, $inicio); $centros = $this->modeloAsignacion->obtenerCentrosDeCosto(); $cursos = $this->modeloCurso->listarTodos(); // 3. Cargar vistas require_once 'Vistas/plantilla/encabezado.php'; require_once 'Vistas/admin/asignaciones.php'; require_once 'Vistas/plantilla/pie.php'; } /** ASIGNACIÓN UNO A UNO */ public function asignarIndividual() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $cedula = trim($_POST['cedula']); $curso_id = $_POST['course_id']; $res = $this->garantizarYAsignar($cedula, $curso_id); if ($res['status']) $_SESSION['mensaje'] = $res['msg']; else $_SESSION['error'] = $res['msg']; } header("Location: index.php?r=admin/asignaciones"); exit; } /** ASIGNACIÓN POR CENTRO DE COSTO */ public function asignarPorCCosto() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $ccosto = $_POST['ccosto']; $curso_id = $_POST['course_id']; $empleados = $this->modeloAsignacion->obtenerEmpleadosPorCCosto($ccosto); $exitos = 0; while ($emp = $empleados->fetch_assoc()) { $res = $this->garantizarYAsignar($emp['cedula'], $curso_id); if ($res['status']) $exitos++; } $_SESSION['mensaje'] = "Se procesaron $exitos empleados del centro $ccosto."; } header("Location: index.php?r=admin/asignaciones"); exit; } /** Lógica compartida para asegurar que el usuario existe y asignarlo */ private function garantizarYAsignar($cedula, $curso_id) { // 1. Buscar local $user = $this->modeloUsuario->buscarLocal($cedula); // 2. Si no existe, traer de nómina y crear if (!$user) { $emp = $this->modeloUsuario->buscarEnNomina($cedula); if (!$emp) return ['status' => false, 'msg' => "La cédula $cedula no existe en nómina."]; $this->modeloUsuario->registrarLocal([ 'nombre' => $emp['nombre'], 'apellido' => $emp['apellido'], 'cedula' => $cedula, 'ccosto' => $emp['ccosto'], 'cargo' => $emp['cargo'] ]); $user = $this->modeloUsuario->buscarLocal($cedula); } // 3. Asignar curso if ($this->modeloAsignacion->yaEstaAsignado($user['id'], $curso_id)) { return ['status' => false, 'msg' => "El usuario ya tiene este curso asignado."]; } $this->modeloAsignacion->registrarAsignacion($user['id'], $curso_id); return ['status' => true, 'msg' => "Curso asignado a {$user['name']}"]; } public function borrar() { $id = intval($_GET['id'] ?? 0); if ($id > 0) { $resultado = $this->modeloAsignacion->borrar($id); if ($resultado) { $_SESSION['mensaje'] = "Asignación eliminada correctamente."; } else { $_SESSION['error'] = "Error al eliminar la asignación."; } } else { $_SESSION['error'] = "ID de asignación no válido."; } header("Location: index.php?r=admin/asignaciones"); exit; } /** AJAX: Buscar centros de costo para Select2 */ public function buscarCCosto() { header('Content-Type: application/json'); $term = trim($_GET['q'] ?? ''); if (strlen($term) < 1) { echo json_encode(['results' => []]); exit; } $resultados = $this->modeloAsignacion->buscarCentrosDeCosto($term); $data = []; while ($cc = $resultados->fetch_assoc()) { $data[] = [ 'id' => $cc['ccosto'], 'text' => $cc['ccosto'] . ' — ' . $cc['descripcion'] ]; } echo json_encode(['results' => $data]); exit; } /** AJAX: Buscar empleados en nómina para Select2 */ public function buscarEmpleados() { header('Content-Type: application/json'); $term = trim($_GET['q'] ?? ''); if (strlen($term) < 2) { echo json_encode(['results' => []]); exit; } $resultados = $this->modeloAsignacion->buscarEmpleadosNomina($term); $data = []; while ($emp = $resultados->fetch_assoc()) { $data[] = [ 'id' => $emp['cedula'], 'text' => $emp['cedula'] . ' — ' . $emp['nombre'] . ' ' . $emp['apellido'] ]; } echo json_encode(['results' => $data]); exit; } }