<?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;
}
}