prepare($sql); $stmt->execute($params); $tickets = $stmt->fetchAll(); $openTicketsCount = 0; if ($user['role'] === 'user') { foreach ($tickets as $t) { if ($t['status'] !== 'closed') $openTicketsCount++; } } // Stats for Curator $stats = []; if ($user['role'] === 'curator') { $stats['total'] = db()->query("SELECT COUNT(*) FROM tickets")->fetchColumn(); $stats['active'] = db()->query("SELECT COUNT(*) FROM tickets WHERE status != 'closed'")->fetchColumn(); // Avg response time (simplified: difference between ticket creation and first message from a helper/curator) $stats['avg_response'] = db()->query(" SELECT ROUND(AVG(TIMESTAMPDIFF(HOUR, t.created_at, m.created_at)), 1) FROM tickets t JOIN messages m ON t.id = m.ticket_id JOIN users u ON m.user_id = u.id WHERE u.role != 'user' AND m.id = ( SELECT MIN(m2.id) FROM messages m2 JOIN users u2 ON m2.user_id = u2.id WHERE m2.ticket_id = t.id AND u2.role != 'user' ) ")->fetchColumn() ?: '...'; } function getStatusLabel($status) { $labels = [ 'open' => 'Открыт', 'in_progress' => 'В работе', 'awaiting_response' => 'Ожидает ответа', 'closed' => 'Закрыт' ]; return $labels[$status] ?? $status; } function getPriorityLabel($priority) { $labels = [ 'low' => 'Низкий', 'medium' => 'Средний', 'high' => 'Высокий' ]; return $labels[$priority] ?? $priority; } ?> Панель управления - Система поддержки
Всего тикетов
Активных
ч
Ср. время ответа

Тикеты

Создать тикет Максимум 3 открытых тикета
Сбросить

Тикетов не найдено.

Приоритет:
От: