File "InduccionControlador-20260419171713.php"

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

<?php
// Controladores/InduccionControlador.php
require_once 'Modelos/InduccionModelo.php';

class InduccionControlador {
    private $modelo;

    public function __construct($db, $db_empleados = null) {
        $this->modelo = new InduccionModelo($db, $db_empleados);

        $usuario = usuario_actual();
        $roles_autorizados = ['admin', 'instructor'];

        if (!$usuario || !in_array($usuario['rol'], $roles_autorizados)) {
            header("Location: index.php?r=dashboard");
            exit;
        }
    }

    public function index() {
        $busqueda = $_GET['busqueda'] ?? '';

        $por_pagina    = 10;
        $pagina_actual = isset($_GET['p']) ? (int)$_GET['p'] : 1;
        if ($pagina_actual < 1) $pagina_actual = 1;
        $inicio = ($pagina_actual - 1) * $por_pagina;

        $total_registros = $this->modelo->contarTodas($busqueda);
        $total_paginas   = ceil($total_registros / $por_pagina);
        $inducciones     = $this->modelo->listarPaginadas($busqueda, $por_pagina, $inicio);
        $usuarios        = $this->modelo->obtenerUsuarios();

        require_once 'Vistas/admin/induccion.php';
    }

    public function guardar() {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            header("Location: index.php?r=admin/induccion");
            exit;
        }

        $nombre      = trim($_POST['nombre_induccion'] ?? '');
        $cedula      = trim($_POST['cedula_usuario']   ?? '');
        $capacitador = trim($_POST['capacitador']      ?? '');
        $fecha       = $_POST['fecha_induccion']       ?? '';

        if (empty($nombre) || empty($cedula) || empty($capacitador) || empty($fecha)) {
            $_SESSION['error'] = 'Todos los campos obligatorios deben ser completados';
            header("Location: index.php?r=admin/induccion");
            exit;
        }

        // Resolver el nombre completo desde la BD de empleados
        $nombre_usuario = $this->modelo->obtenerNombreEmpleado($cedula) ?? '';

        $archivo_datos = null;
        if (isset($_FILES['evidencia']) && $_FILES['evidencia']['error'] === UPLOAD_ERR_OK) {
            $resultado = $this->procesarArchivoBLOB($_FILES['evidencia']);
            if ($resultado['success']) {
                $archivo_datos = $resultado['datos'];
            } else {
                $_SESSION['error'] = $resultado['error'];
                header("Location: index.php?r=admin/induccion");
                exit;
            }
        }

        try {
            $ok = $this->modelo->crear($nombre, $cedula, $nombre_usuario, $capacitador, $fecha, $archivo_datos);
            $_SESSION[$ok ? 'exito' : 'error'] = $ok ? 'Induccion creada exitosamente' : 'Error al guardar la induccion';
        } catch (Exception $e) {
            $_SESSION['error'] = 'Error al guardar: ' . $e->getMessage();
        }

        header("Location: index.php?r=admin/induccion");
        exit;
    }

    public function eliminar() {
        $id = intval($_GET['id'] ?? 0);
        if ($id <= 0) {
            $_SESSION['error'] = 'ID invalido';
            header("Location: index.php?r=admin/induccion");
            exit;
        }
        try {
            $ok = $this->modelo->eliminar($id);
            $_SESSION[$ok ? 'exito' : 'error'] = $ok ? 'Induccion eliminada exitosamente' : 'Error al eliminar';
        } catch (Exception $e) {
            $_SESSION['error'] = 'Error al eliminar: ' . $e->getMessage();
        }
        header("Location: index.php?r=admin/induccion");
        exit;
    }

    // borrar es alias de eliminar
    public function borrar() {
        $this->eliminar();
    }

    // verPdf cubre tanto ver-pdf como verPDF
    public function verPdf() {
        $id = intval($_GET['id'] ?? 0);
        if ($id <= 0) {
            header("HTTP/1.0 404 Not Found");
            echo "Archivo no encontrado";
            exit;
        }
        try {
            $archivo = $this->modelo->obtenerArchivo($id);
            if (!$archivo || empty($archivo['evidencia'])) {
                header("HTTP/1.0 404 Not Found");
                echo "Archivo no encontrado en la base de datos";
                exit;
            }
            if (ob_get_level()) ob_end_clean();
            header('Content-Type: '        . ($archivo['evidencia_tipo']   ?? 'application/pdf'));
            header('Content-Length: '      . strlen($archivo['evidencia']));
            header('Content-Disposition: inline; filename="' . ($archivo['evidencia_nombre'] ?? 'documento.pdf') . '"');
            header('Cache-Control: public, must-revalidate, max-age=0');
            header('Pragma: public');
            header('X-Content-Type-Options: nosniff');
            echo $archivo['evidencia'];
            exit;
        } catch (Exception $e) {
            header("HTTP/1.0 500 Internal Server Error");
            echo "Error: " . htmlspecialchars($e->getMessage());
            exit;
        }
    }

    public function descargar() {
        $id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
        $archivo = $this->modelo->obtenerArchivo($id);
        if ($archivo && !empty($archivo['evidencia'])) {
            if (ob_get_length()) ob_clean();
            header("Content-Type: application/pdf");
            header("Content-Disposition: attachment; filename=\"" . $archivo['evidencia_nombre'] . "\"");
            header("Content-Length: " . strlen($archivo['evidencia']));
            echo $archivo['evidencia'];
            exit;
        }
        $_SESSION['error'] = "Archivo no encontrado.";
        header("Location: index.php?r=admin/induccion");
        exit;
    }

    private function procesarArchivoBLOB($archivo) {
        if ($archivo['error'] !== UPLOAD_ERR_OK) {
            return ['success' => false, 'error' => 'Error al cargar el archivo (Codigo: ' . $archivo['error'] . ')'];
        }
        $extension = strtolower(pathinfo($archivo['name'], PATHINFO_EXTENSION));
        if ($extension !== 'pdf') {
            return ['success' => false, 'error' => 'Solo se permiten archivos PDF.'];
        }
        $finfo     = finfo_open(FILEINFO_MIME_TYPE);
        $tipo_mime = finfo_file($finfo, $archivo['tmp_name']);
        finfo_close($finfo);
        if (!in_array($tipo_mime, ['application/pdf', 'application/x-pdf'])) {
            return ['success' => false, 'error' => 'El archivo no es un PDF valido. Tipo detectado: ' . $tipo_mime];
        }
        if ($archivo['size'] > 10 * 1024 * 1024) {
            return ['success' => false, 'error' => 'El archivo excede el tamano maximo de 10MB.'];
        }
        $contenido = file_get_contents($archivo['tmp_name']);
        if ($contenido === false) {
            return ['success' => false, 'error' => 'No se pudo leer el contenido del archivo'];
        }
        return [
            'success' => true,
            'datos'   => [
                'contenido' => $contenido,
                'nombre'    => $archivo['name'],
                'tipo'      => $tipo_mime,
                'tamano'    => $archivo['size']
            ]
        ];
    }
}