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']
]
];
}
}