query("SELECT * FROM users ORDER BY created_at DESC"); return $stmt->fetchAll(PDO::FETCH_ASSOC); } /** * კონკრეტული მომხმარებლის მიღება ID-ით */ public static function getUserById($id) { $stmt = self::$db->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetch(PDO::FETCH_ASSOC); } /** * მომხმარებლის მიღება ელ.ფოსტით */ public static function getUserByEmail($email) { $stmt = self::$db->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]); return $stmt->fetch(PDO::FETCH_ASSOC); } /** * ახალი მომხმარებლის დამატება */ public static function createUser($data) { // ვამოწმებთ არსებობს თუ არა ასეთი ელ.ფოსტა if (self::getUserByEmail($data['email'])) { throw new Exception("მომხმარებელი ამ ელ.ფოსტით უკვე არსებობს"); } $hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT); $stmt = self::$db->prepare(" INSERT INTO users (first_name, last_name, email, password, role, is_active) VALUES (?, ?, ?, ?, ?, ?) "); return $stmt->execute([ $data['first_name'], $data['last_name'], $data['email'], $hashedPassword, $data['role'] ?? 'user', $data['is_active'] ?? 1 ]); } /** * მომხმარებლის განახლება */ public static function updateUser($id, $data) { // ვამოწმებთ ელ.ფოსტის უნიკალურობას (თუ შეიცვალა) $currentUser = self::getUserById($id); if (!$currentUser) { throw new Exception("მომხმარებელი ვერ მოიძებნა"); } if ($currentUser['email'] !== $data['email']) { $existingUser = self::getUserByEmail($data['email']); if ($existingUser && $existingUser['id'] != $id) { throw new Exception("მომხმარებელი ამ ელ.ფოსტით უკვე არსებობს"); } } $updateFields = [ 'first_name' => $data['first_name'], 'last_name' => $data['last_name'], 'email' => $data['email'], 'role' => $data['role'] ?? 'user', 'is_active' => $data['is_active'] ?? 1 ]; // თუ ახალი პაროლი არის მითითებული if (!empty($data['password'])) { $updateFields['password'] = password_hash($data['password'], PASSWORD_DEFAULT); $sql = "UPDATE users SET first_name = ?, last_name = ?, email = ?, password = ?, role = ?, is_active = ?, updated_at = NOW() WHERE id = ?"; $params = array_values($updateFields); $params[] = $id; } else { unset($updateFields['password']); $sql = "UPDATE users SET first_name = ?, last_name = ?, email = ?, role = ?, is_active = ?, updated_at = NOW() WHERE id = ?"; $params = array_values($updateFields); $params[] = $id; } $stmt = self::$db->prepare($sql); return $stmt->execute($params); } /** * მომხმარებლის წაშლა */ public static function deleteUser($id) { // ვამოწმებთ არ არის თუ არა ეს უკანასკნელი ადმინი $admins = self::getAdminUsers(); $userToDelete = self::getUserById($id); if ($userToDelete['role'] === 'admin' && count($admins) <= 1) { throw new Exception("ვერ შეიძლება უკანასკნელი ადმინისტრატორის წაშლა"); } $stmt = self::$db->prepare("DELETE FROM users WHERE id = ?"); return $stmt->execute([$id]); } /** * მომხმარებლის სტატუსის ცვლილება */ public static function toggleUserStatus($id) { $user = self::getUserById($id); if (!$user) { throw new Exception("მომხმარებელი ვერ მოიძებნა"); } $newStatus = $user['is_active'] ? 0 : 1; // ვამოწმებთ ადმინების რაოდენობას if ($user['role'] === 'admin' && $user['is_active'] && $newStatus === 0) { $activeAdmins = self::getActiveAdminUsers(); if (count($activeAdmins) <= 1) { throw new Exception("ვერ შეიძლება უკანასკნელი აქტიური ადმინისტრატორის გამორთვა"); } } $stmt = self::$db->prepare("UPDATE users SET is_active = ? WHERE id = ?"); return $stmt->execute([$newStatus, $id]); } /** * პაროლის შეცვლა */ public static function changePassword($id, $currentPassword, $newPassword) { $user = self::getUserById($id); if (!$user) { throw new Exception("მომხმარებელი ვერ მოიძებნა"); } if (!password_verify($currentPassword, $user['password'])) { throw new Exception("მიმდინარე პაროლი არასწორია"); } $hashedPassword = password_hash($newPassword, PASSWORD_DEFAULT); $stmt = self::$db->prepare("UPDATE users SET password = ?, updated_at = NOW() WHERE id = ?"); return $stmt->execute([$hashedPassword, $id]); } /** * ადმინისტრატორების მიღება */ public static function getAdminUsers() { $stmt = self::$db->prepare("SELECT * FROM users WHERE role = 'admin'"); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } /** * აქტიური ადმინისტრატორების მიღება */ public static function getActiveAdminUsers() { $stmt = self::$db->prepare("SELECT * FROM users WHERE role = 'admin' AND is_active = 1"); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } /** * მომხმარებლების სტატისტიკა */ public static function getUserStats() { $stats = []; // სულ მომხმარებლები $stmt = self::$db->query("SELECT COUNT(*) FROM users"); $stats['total'] = $stmt->fetchColumn(); // აქტიური მომხმარებლები $stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE is_active = 1"); $stats['active'] = $stmt->fetchColumn(); // ადმინისტრატორები $stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE role = 'admin'"); $stats['admins'] = $stmt->fetchColumn(); // ამ თვის ახალი მომხმარებლები $stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')"); $stats['this_month'] = $stmt->fetchColumn(); return $stats; } /** * ხელმისაწვდომი როლები */ public static function getAvailableRoles() { return [ 'admin' => 'ადმინისტრატორი', 'manager' => 'მენეჯერი', 'user' => 'მომხმარებელი', 'guest' => 'სტუმარი' ]; } /** * მომხმარებლის search და filter */ public static function searchUsers($search = '', $role = '', $status = '') { $sql = "SELECT * FROM users WHERE 1=1"; $params = []; if (!empty($search)) { $sql .= " AND (first_name LIKE ? OR last_name LIKE ? OR email LIKE ?)"; $searchTerm = "%$search%"; $params[] = $searchTerm; $params[] = $searchTerm; $params[] = $searchTerm; } if (!empty($role)) { $sql .= " AND role = ?"; $params[] = $role; } if ($status !== '') { $sql .= " AND is_active = ?"; $params[] = (int)$status; } $sql .= " ORDER BY created_at DESC"; $stmt = self::$db->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(PDO::FETCH_ASSOC); } } ?>