db = Database::getInstance()->getConnection(); } public function getAll($includeInactive = false) { $sql = "SELECT * FROM users"; if (!$includeInactive) { $sql .= " WHERE activo = 1"; } $sql .= " ORDER BY nombre"; $stmt = $this->db->query($sql); return $stmt->fetchAll(); } public function getById($id) { $stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetch(); } public function getByEmail($email) { $stmt = $this->db->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]); return $stmt->fetch(); } public function findByLogin($login) { $login = trim($login); $stmt = $this->db->prepare("SELECT * FROM users WHERE (email = ? OR username = ?) AND activo = 1"); $stmt->execute([$login, $login]); return $stmt->fetch(); } public function getByUsername($username) { $stmt = $this->db->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); return $stmt->fetch(); } public function usernameExists($username, $excludeId = null) { $sql = "SELECT COUNT(*) as total FROM users WHERE username = ?"; $params = [$username]; if ($excludeId) { $sql .= " AND id != ?"; $params[] = $excludeId; } $stmt = $this->db->prepare($sql); $stmt->execute($params); return $stmt->fetch()['total'] > 0; } public function create($data) { $username = !empty($data['username']) ? $data['username'] : strtolower(preg_replace('/[^a-zA-Z0-9]/', '', $data['nombre'])); $stmt = $this->db->prepare(" INSERT INTO users (username, nombre, email, password, rol) VALUES (?, ?, ?, ?, ?) "); $password = password_hash($data['password'], PASSWORD_DEFAULT); $stmt->execute([ $username, $data['nombre'], $data['email'], $password, $data['rol'] ?? 'ayudante' ]); $userId = $this->db->lastInsertId(); // Si es un ayudante, agregar automáticamente a rotacion_orden if (isset($data['rol']) && $data['rol'] === 'ayudante') { $this->agregarARotacion($userId); } return $userId; } private function agregarARotacion($userId) { // Obtener el siguiente orden disponible $stmt = $this->db->query("SELECT MAX(orden) as max_orden FROM rotacion_orden WHERE activo = 1"); $result = $stmt->fetch(); $nuevoOrden = ($result['max_orden'] ?? 0) + 1; // Insertar en rotacion_orden $stmt = $this->db->prepare(" INSERT INTO rotacion_orden (user_id, orden, activo) VALUES (?, ?, 1) "); $stmt->execute([$userId, $nuevoOrden]); } public function update($id, $data) { $sql = "UPDATE users SET username = ?, nombre = ?, email = ?, rol = ?"; $params = [$data['username'] ?? '', $data['nombre'], $data['email'], $data['rol']]; if (!empty($data['password'])) { $sql .= ", password = ?"; $params[] = password_hash($data['password'], PASSWORD_DEFAULT); } $sql .= " WHERE id = ?"; $params[] = $id; $stmt = $this->db->prepare($sql); return $stmt->execute($params); } public function deactivate($id) { $stmt = $this->db->prepare("UPDATE users SET activo = 0 WHERE id = ?"); return $stmt->execute([$id]); } public function activate($id) { $stmt = $this->db->prepare("UPDATE users SET activo = 1 WHERE id = ?"); return $stmt->execute([$id]); } public function getAyudantesActivos() { $stmt = $this->db->query("SELECT * FROM users WHERE rol = 'ayudante' AND activo = 1 ORDER BY nombre"); return $stmt->fetchAll(); } }