File "InduccionModelo.php"

Full Path: C:/wamp64/www/Formaciones/Modelos/InduccionModelo.php
File size: 7.37 KB
MIME-type: text/x-php
Charset: utf-8

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