File "AsignacionControlador.php"

Full Path: C:/wamp64/www/Formaciones/Controladores/AsignacionControlador.php
File size: 6.35 KB
MIME-type: text/x-php
Charset: utf-8

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