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