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