File "UsuarioModelo.php"

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

<?php
// Modelos/UsuarioModelo.php

class UsuarioModelo {
    private $db;
    private $db_externa;

    public function __construct($db, $db_externa = null) {
        $this->db = $db;
        $this->db_externa = $db_externa;
    }

    /** Listar todos los usuarios para la tabla administrativa */
    public function listarTodos() {
        $sql = "SELECT * FROM users ORDER BY created_at DESC";
        return $this->db->query($sql);
    }

    /** Guardar un nuevo usuario manualmente (desde el formulario admin) */
    public function guardarManual($datos) {
        $password = password_hash($datos['password'], PASSWORD_DEFAULT);
        
        // Incluir ccosto y cargo en el INSERT
        $stmt = $this->db->prepare(
            "INSERT INTO users (name, cedula, email, password_hash, role, ccosto, cargo, active, created_at) 
             VALUES (?, ?, ?, ?, ?, ?, ?, 1, NOW())"
        );
        
        $stmt->bind_param("sssssss", 
            $datos['name'],         // nombre completo concatenado
            $datos['cedula'], 
            $datos['email'], 
            $password, 
            $datos['role'],
            $datos['ccosto'],       // centro de costo
            $datos['cargo']         // cargo del empleado
        );
        
        return $stmt->execute();
    }

    /** Buscar en base de datos externa (Nómina/Almuerzo) */
    public function buscarEnNomina($cedula) {
        if (!$this->db_externa) return null;
        $stmt = $this->db_externa->prepare("SELECT cedula, nombre, apellido, ccosto, cargo FROM empleados WHERE cedula = ? LIMIT 1");
        $stmt->bind_param("s", $cedula);
        $stmt->execute();
        return $stmt->get_result()->fetch_assoc();
    }

    /** Buscar usuario local por cédula */
    public function buscarLocal($cedula) {
        $stmt = $this->db->prepare("SELECT * FROM users WHERE cedula = ? LIMIT 1");
        $stmt->bind_param("s", $cedula);
        $stmt->execute();
        return $stmt->get_result()->fetch_assoc();
    }

    /** Registrar usuario automáticamente al primer ingreso o asignación masiva */
    public function registrarLocal($datos) {
        // 1. Generamos un correo ficticio
        $email_ficticio = $datos['cedula'] . "@sistema.local";
        
        // 2. Generamos una contraseña por defecto (usamos la cédula como clave inicial)
        $password_defecto = password_hash($datos['cedula'], PASSWORD_DEFAULT);
        
        // 3. Preparamos la consulta incluyendo password_hash y cargo
        $stmt = $this->db->prepare("INSERT INTO users (name, cedula, email, password_hash, role, ccosto, cargo, active, created_at) VALUES (?, ?, ?, ?, 'student', ?, ?, 1, NOW())");
        
        // 4. Ajustamos los parámetros (ahora incluye cargo)
        $cargo = !empty($datos['cargo']) ? $datos['cargo'] : '';
        $stmt->bind_param("ssssss", 
            trim(($datos['nombre'] ?? '') . ' ' . ($datos['apellido'] ?? '')), 
            $datos['cedula'], 
            $email_ficticio, 
            $password_defecto,
            $datos['ccosto'],
            $cargo
        );
        
        return $stmt->execute();
    }
        
    /** Obtener un usuario por su ID */
        public function obtenerPorId($id) {
                $stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
                $stmt->bind_param("i", $id);
                $stmt->execute();
                return $stmt->get_result()->fetch_assoc();
        }

        /** Actualizar datos del usuario */
        public function actualizar($id, $datos) {
                // Si la contraseña viene vacía, no la actualizamos
                if (!empty($datos['password'])) {
                        $password = password_hash($datos['password'], PASSWORD_DEFAULT);
                        $stmt = $this->db->prepare("UPDATE users SET name = ?, email = ?, role = ?, password_hash = ? WHERE id = ?");
                        
                        if (!$stmt) {
                                error_log("Error en SQL: " . $this->db->error);
                                return false;
                        }

                        $stmt->bind_param("ssssi", $datos['name'], $datos['email'], $datos['role'], $password, $id);
                } else {
                        $stmt = $this->db->prepare("UPDATE users SET name = ?, email = ?, role = ? WHERE id = ?");
                        
                        if (!$stmt) {
                                error_log("Error en SQL: " . $this->db->error);
                                return false;
                        }

                        $stmt->bind_param("sssi", $datos['name'], $datos['email'], $datos['role'], $id);
                }
                return $stmt->execute();
        }

        /** Contar el total de registros para la paginación CON FILTRO DE BÚSQUEDA */
        public function contarTotal($busqueda = '') {
                $sql = "SELECT COUNT(*) as total FROM users WHERE 1=1";
                
                if (!empty($busqueda)) {
                        $sql .= " AND (name LIKE ? OR cedula LIKE ?)";
                        $stmt = $this->db->prepare($sql);
                        $term = "%$busqueda%";
                        $stmt->bind_param("ss", $term, $term);
                } else {
                        $stmt = $this->db->prepare($sql);
                }
                
                $stmt->execute();
                return $stmt->get_result()->fetch_assoc()['total'];
        }

        /** Listar usuarios con límite (Paginado) CON FILTRO DE BÚSQUEDA */
        public function listarPaginado($inicio, $cantidad, $busqueda = '') {
                $sql = "SELECT * FROM users WHERE 1=1";
                
                if (!empty($busqueda)) {
                        $sql .= " AND (name LIKE ? OR cedula LIKE ?)";
                }
                
                $sql .= " ORDER BY created_at DESC LIMIT ?, ?";
                
                $stmt = $this->db->prepare($sql);
                
                if (!empty($busqueda)) {
                        $term = "%$busqueda%";
                        $stmt->bind_param("ssii", $term, $term, $inicio, $cantidad);
                } else {
                        $stmt->bind_param("ii", $inicio, $cantidad);
                }
                
                $stmt->execute();
                return $stmt->get_result();
        }
}