<?php // Modelos/InduccionModelo.php class InduccionModelo { private $db; private $db_empleados; public function __construct($db, $db_empleados = null) { $this->db = $db; $this->db_empleados = $db_empleados; } public function obtenerNombreEmpleado($cedula) { if (!$this->db_empleados) return null; $stmt = $this->db_empleados->prepare( "SELECT CONCAT(nombre, ' ', apellido) AS name FROM empleados WHERE cedula = ? LIMIT 1" ); $stmt->bind_param("s", $cedula); $stmt->execute(); $row = $stmt->get_result()->fetch_assoc(); return $row['name'] ?? null; } public function listarTodas($busqueda = '') { $sql = "SELECT i.id, i.nombre_induccion, i.cedula_usuario, i.capacitador, i.fecha_induccion, i.evidencia_nombre, i.evidencia_tamano, i.created_at, COALESCE(i.nombre_usuario, u.name) as nombre_usuario FROM induccion i LEFT JOIN users u ON i.cedula_usuario = u.cedula WHERE 1=1"; if (!empty($busqueda)) { $sql .= " AND (i.nombre_induccion LIKE ? OR i.cedula_usuario LIKE ? OR i.nombre_usuario LIKE ? OR i.capacitador LIKE ?) ORDER BY i.created_at DESC"; $stmt = $this->db->prepare($sql); $p = "%{$busqueda}%"; $stmt->bind_param("ssss", $p, $p, $p, $p); } else { $sql .= " ORDER BY i.created_at DESC"; $stmt = $this->db->prepare($sql); } $stmt->execute(); return $stmt->get_result(); } public function obtenerUsuarios() { if (!$this->db_empleados) return null; return $this->db_empleados->query( "SELECT cedula, CONCAT(nombre, ' ', apellido) AS name FROM empleados ORDER BY nombre ASC" ); } public function crear($nombre, $cedula, $nombre_usuario, $capacitador, $fecha, $archivo_datos) { /* * Columnas: nombre_induccion, cedula_usuario, nombre_usuario, capacitador, * fecha_induccion, evidencia, evidencia_nombre, evidencia_tipo, evidencia_tamano * * Tipos bind_param (9 parámetros): * s nombre_induccion * s cedula_usuario * s nombre_usuario * s capacitador * s fecha_induccion * b evidencia (BLOB) * s evidencia_nombre * s evidencia_tipo * i evidencia_tamano * = "sssssbssi" (9 caracteres = 9 variables) */ $stmt = $this->db->prepare( "INSERT INTO induccion (nombre_induccion, cedula_usuario, nombre_usuario, capacitador, fecha_induccion, evidencia, evidencia_nombre, evidencia_tipo, evidencia_tamano, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())" ); if ($archivo_datos) { $blob = $archivo_datos['contenido']; $nom = $archivo_datos['nombre']; $tipo = $archivo_datos['tipo']; $tam = (int)$archivo_datos['tamano']; } else { $blob = $nom = $tipo = null; $tam = 0; } $stmt->bind_param("sssssbssi", $nombre, // s $cedula, // s $nombre_usuario, // s $capacitador, // s $fecha, // s $blob, // b ← BLOB, índice 5 $nom, // s $tipo, // s $tam // i ); if ($blob) { $stmt->send_long_data(5, $blob); } return $stmt->execute(); } public function obtenerPorId($id) { $stmt = $this->db->prepare( "SELECT id, nombre_induccion, cedula_usuario, nombre_usuario, capacitador, fecha_induccion, evidencia_nombre, evidencia_tipo, evidencia_tamano, created_at FROM induccion WHERE id = ?" ); $stmt->bind_param("i", $id); $stmt->execute(); return $stmt->get_result()->fetch_assoc(); } public function obtenerArchivo($id) { $stmt = $this->db->prepare( "SELECT evidencia, evidencia_nombre, evidencia_tipo, evidencia_tamano FROM induccion WHERE id = ?" ); $stmt->bind_param("i", $id); $stmt->execute(); return $stmt->get_result()->fetch_assoc(); } public function eliminar($id) { $stmt = $this->db->prepare("DELETE FROM induccion WHERE id = ?"); $stmt->bind_param("i", $id); return $stmt->execute(); } public function buscar($termino) { $stmt = $this->db->prepare( "SELECT i.id, i.nombre_induccion, i.cedula_usuario, i.capacitador, i.fecha_induccion, i.evidencia_nombre, i.evidencia_tamano, i.created_at, COALESCE(i.nombre_usuario, u.name) as nombre_usuario FROM induccion i LEFT JOIN users u ON i.cedula_usuario = u.cedula WHERE i.nombre_induccion LIKE ? OR i.cedula_usuario LIKE ? OR i.nombre_usuario LIKE ? OR i.capacitador LIKE ? ORDER BY i.created_at DESC" ); $p = "%{$termino}%"; $stmt->bind_param("ssss", $p, $p, $p, $p); $stmt->execute(); return $stmt->get_result(); } public function obtenerEstadisticas() { return $this->db->query( "SELECT COUNT(*) as total_inducciones, COUNT(evidencia) as con_archivo, SUM(evidencia_tamano) as tamano_total FROM induccion" )->fetch_assoc(); } public function contarTodas($busqueda = '') { $sql = "SELECT COUNT(*) as total FROM induccion i LEFT JOIN users u ON i.cedula_usuario = u.cedula WHERE 1=1"; if (!empty($busqueda)) { $sql .= " AND (i.nombre_induccion LIKE ? OR i.cedula_usuario LIKE ? OR i.nombre_usuario LIKE ? OR i.capacitador LIKE ?)"; $stmt = $this->db->prepare($sql); $p = "%$busqueda%"; $stmt->bind_param("ssss", $p, $p, $p, $p); } else { $stmt = $this->db->prepare($sql); } $stmt->execute(); return $stmt->get_result()->fetch_assoc()['total']; } public function listarPaginadas($busqueda = '', $limit = 10, $offset = 0) { $sql = "SELECT i.id, i.nombre_induccion, i.cedula_usuario, i.capacitador, i.fecha_induccion, i.evidencia_nombre, i.evidencia_tamano, i.created_at, COALESCE(i.nombre_usuario, u.name) as nombre_usuario FROM induccion i LEFT JOIN users u ON i.cedula_usuario = u.cedula WHERE 1=1"; if (!empty($busqueda)) { $sql .= " AND (i.nombre_induccion LIKE ? OR i.cedula_usuario LIKE ? OR i.nombre_usuario LIKE ? OR i.capacitador LIKE ?)"; } $sql .= " ORDER BY i.created_at DESC LIMIT ? OFFSET ?"; $stmt = $this->db->prepare($sql); if (!empty($busqueda)) { $p = "%$busqueda%"; $stmt->bind_param("ssssii", $p, $p, $p, $p, $limit, $offset); } else { $stmt->bind_param("ii", $limit, $offset); } $stmt->execute(); return $stmt->get_result(); } }