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