File "CapacitacionController.php"

Full Path: C:/wamp64/www/Actas_Usuarios/controllers/CapacitacionController.php
File size: 7.6 KB
MIME-type: text/x-php
Charset: utf-8

<?php
// controllers/CapacitacionController.php

require_once __DIR__ . '/../models/CapacitacionModel.php';

class CapacitacionController
{
    private $model;

    public function __construct()
    {
        if (!isset($_SESSION['DIGITA'])) {
            header('Location: index.php?page=login');
            exit;
        }
        $this->model = new CapacitacionModel();
    }

    // GET ?page=capacitacion  →  listado + formulario
    public function index()
    {
        $busqueda      = trim($_GET['busqueda'] ?? '');
        $por_pagina    = 10;
        $pagina_actual = max(1, (int)($_GET['p'] ?? 1));
        $offset        = ($pagina_actual - 1) * $por_pagina;

        $total_registros = $this->model->contarTodas($busqueda);
        $total_paginas   = (int) ceil($total_registros / $por_pagina);
        $capacitaciones  = $this->model->listarPaginadas($busqueda, $por_pagina, $offset);

        require __DIR__ . '/../views/Capacitacion/capacitacion.php';
    }

    // GET ?page=capacitacion_buscar_empleado&cedula=X  →  JSON AJAX
    public function buscarEmpleado()
    {
        header('Content-Type: application/json; charset=utf-8');
        $cedula = trim($_GET['cedula'] ?? '');
        if (empty($cedula)) { echo json_encode(['encontrado' => false]); exit; }

        $emp = $this->model->buscarEmpleadoPorCedula($cedula);
        echo $emp
            ? json_encode(['encontrado' => true, 'nombre' => $emp['nombre_completo'], 'cargo' => $emp['cargo']])
            : json_encode(['encontrado' => false]);
        exit;
    }

    // POST ?page=capacitacion_guardar
    public function guardar()
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            header('Location: index.php?page=capacitacion');
            exit;
        }

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

        if (empty($nombre) || empty($cedula) || empty($capacitador) || empty($fecha)) {
            $msg = urlencode('❌ Todos los campos obligatorios deben completarse.');
            header("Location: index.php?page=capacitacion&error=$msg");
            exit;
        }

        // Nombre del empleado desde BD (ya validado por AJAX, pero lo confirmamos)
        $emp            = $this->model->buscarEmpleadoPorCedula($cedula);
        $nombre_usuario = $emp['nombre_completo'] ?? trim($_POST['nombre_usuario'] ?? '');

        // Procesar archivo PDF
        $archivo_datos = null;
        if (isset($_FILES['evidencia']) && $_FILES['evidencia']['error'] === UPLOAD_ERR_OK) {
            $res = $this->_procesarPDF($_FILES['evidencia']);
            if ($res['success']) {
                $archivo_datos = $res['datos'];
            } else {
                $msg = urlencode('❌ ' . $res['error']);
                header("Location: index.php?page=capacitacion&error=$msg");
                exit;
            }
        }

        try {
            $ok  = $this->model->crear($nombre, $cedula, $nombre_usuario, $capacitador, $fecha, $archivo_datos);
            $msg = $ok
                ? urlencode('✅ Capacitación registrada exitosamente.')
                : urlencode('❌ Error al guardar la capacitación.');
            header("Location: index.php?page=capacitacion&msg=$msg");
        } catch (RuntimeException $e) {
            $msg = urlencode('❌ Error: ' . $e->getMessage());
            header("Location: index.php?page=capacitacion&error=$msg");
        }
        exit;
    }

    // GET ?page=capacitacion_ver_pdf&id=N  →  muestra PDF inline
    public function verPdf()
    {
        $id = isset($_GET['id']) && ctype_digit($_GET['id']) ? (int)$_GET['id'] : 0;
        if ($id <= 0) { http_response_code(400); die("ID no válido."); }

        $archivo = $this->model->obtenerArchivo($id);
        if (!$archivo || empty($archivo['evidencia'])) {
            http_response_code(404); die("Archivo no encontrado.");
        }

        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');
        echo $archivo['evidencia'];
        exit;
    }

    // GET ?page=capacitacion_descargar&id=N  →  descarga PDF
    public function descargar()
    {
        $id = isset($_GET['id']) && ctype_digit($_GET['id']) ? (int)$_GET['id'] : 0;
        if ($id <= 0) { http_response_code(400); die("ID no válido."); }

        $archivo = $this->model->obtenerArchivo($id);
        if (!$archivo || empty($archivo['evidencia'])) {
            http_response_code(404); die("Archivo no encontrado.");
        }

        if (ob_get_level()) ob_end_clean();
        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment; filename="' . ($archivo['evidencia_nombre'] ?? 'documento.pdf') . '"');
        header('Content-Length: ' . strlen($archivo['evidencia']));
        echo $archivo['evidencia'];
        exit;
    }

    // GET ?page=capacitacion_eliminar&id=N
    public function eliminar()
    {
        $id = isset($_GET['id']) && ctype_digit($_GET['id']) ? (int)$_GET['id'] : 0;
        if ($id <= 0) {
            header('Location: index.php?page=capacitacion&error=' . urlencode('❌ ID no válido.'));
            exit;
        }
        try {
            $ok  = $this->model->eliminar($id);
            $msg = $ok ? urlencode('✅ Registro eliminado.') : urlencode('❌ Error al eliminar.');
            header("Location: index.php?page=capacitacion&msg=$msg");
        } catch (RuntimeException $e) {
            header("Location: index.php?page=capacitacion&error=" . urlencode('❌ ' . $e->getMessage()));
        }
        exit;
    }

    // ── Valida y lee el PDF subido ────────────────────────────────────
    private function _procesarPDF($archivo)
    {
        if ($archivo['error'] !== UPLOAD_ERR_OK) {
            return ['success' => false, 'error' => 'Error al cargar el archivo (código: ' . $archivo['error'] . ').'];
        }
        $ext = strtolower(pathinfo($archivo['name'], PATHINFO_EXTENSION));
        if ($ext !== 'pdf') {
            return ['success' => false, 'error' => 'Solo se permiten archivos PDF.'];
        }
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime  = finfo_file($finfo, $archivo['tmp_name']);
        finfo_close($finfo);
        if (!in_array($mime, ['application/pdf', 'application/x-pdf'])) {
            return ['success' => false, 'error' => 'El archivo no es un PDF válido.'];
        }
        if ($archivo['size'] > 10 * 1024 * 1024) {
            return ['success' => false, 'error' => 'El archivo excede el máximo de 10 MB.'];
        }
        $contenido = file_get_contents($archivo['tmp_name']);
        if ($contenido === false) {
            return ['success' => false, 'error' => 'No se pudo leer el archivo.'];
        }
        return [
            'success' => true,
            'datos'   => [
                'contenido' => $contenido,
                'nombre'    => $archivo['name'],
                'tipo'      => $mime,
                'tamano'    => $archivo['size']
            ]
        ];
    }
}