redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in user-support.php: ' . $e->getMessage()); if ($_SERVER['REQUEST_METHOD'] === 'POST') { jsonResponse(false, 'System error. Please try again later.'); } else { die('System error. Please try again later.'); } } // Handle POST request - Create new ticket if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_GET['ticket'])) { $subject = isset($_POST['subject']) ? sanitize($_POST['subject']) : ''; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $priority = isset($_POST['priority']) ? sanitize($_POST['priority']) : 'medium'; // Validation if (empty($subject) || empty($message)) { jsonResponse(false, 'Subject and message are required.'); } if (strlen($subject) > 255) { jsonResponse(false, 'Subject must be 255 characters or less.'); } if (strlen($message) > 5000) { jsonResponse(false, 'Message must be 5000 characters or less.'); } if (!in_array($priority, ['low', 'medium', 'high', 'urgent'])) { $priority = 'medium'; } try { $pdo->beginTransaction(); // Generate unique ticket number $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -4)); // Check if ticket number already exists (very unlikely but let's be safe) $stmt = $pdo->prepare("SELECT id FROM support_tickets WHERE ticket_number = ?"); $stmt->execute([$ticketNumber]); if ($stmt->fetch()) { // Generate a new one if it exists $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6)); } // Insert support ticket $stmt = $pdo->prepare(" INSERT INTO support_tickets (ticket_number, user_id, subject, status, priority) VALUES (?, ?, ?, 'open', ?) "); $stmt->execute([$ticketNumber, $user['id'], $subject, $priority]); $ticketId = $pdo->lastInsertId(); // Insert initial message $stmt = $pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message) VALUES (?, 'user', ?, ?) "); $stmt->execute([$ticketId, $user['id'], $message]); $pdo->commit(); logError('Support ticket created', [ 'ticket_number' => $ticketNumber, 'user_id' => $user['id'], 'subject' => $subject, 'priority' => $priority ]); jsonResponse(true, 'Support ticket created successfully.', ['ticket_number' => $ticketNumber]); } catch (Exception $e) { $pdo->rollBack(); logError('Error creating support ticket', ['user_id' => $user['id'], 'error' => $e->getMessage()]); jsonResponse(false, 'Failed to create support ticket. Please try again.'); } } // Handle GET request - View specific ticket if (isset($_GET['ticket'])) { $ticketNumber = sanitize($_GET['ticket']); try { // Get ticket details $stmt = $pdo->prepare(" SELECT st.*, au.full_name as assigned_to_name FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.ticket_number = ? AND st.user_id = ? "); $stmt->execute([$ticketNumber, $user['id']]); $ticket = $stmt->fetch(); if (!$ticket) { header('Location: dashboard.php#support'); exit; } // Get all messages for this ticket $stmt = $pdo->prepare(" SELECT sm.*, CASE WHEN sm.sender_type = 'user' THEN u.email WHEN sm.sender_type = 'admin' THEN au.full_name END as sender_name FROM support_messages sm LEFT JOIN users u ON sm.sender_type = 'user' AND sm.sender_id = u.id LEFT JOIN admin_users au ON sm.sender_type = 'admin' AND sm.sender_id = au.id WHERE sm.ticket_id = ? AND sm.is_internal = 0 ORDER BY sm.created_at ASC "); $stmt->execute([$ticket['id']]); $messages = $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching ticket details', ['ticket_number' => $ticketNumber, 'error' => $e->getMessage()]); header('Location: dashboard.php#support'); exit; } } // Handle POST request for adding reply to existing ticket if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_GET['ticket'])) { $ticketNumber = sanitize($_GET['ticket']); $message = isset($_POST['reply']) ? trim($_POST['reply']) : ''; if (empty($message)) { jsonResponse(false, 'Reply message is required.'); } if (strlen($message) > 5000) { jsonResponse(false, 'Reply must be 5000 characters or less.'); } try { // Verify ticket belongs to user and is not closed $stmt = $pdo->prepare("SELECT id, status FROM support_tickets WHERE ticket_number = ? AND user_id = ?"); $stmt->execute([$ticketNumber, $user['id']]); $ticket = $stmt->fetch(); if (!$ticket) { jsonResponse(false, 'Ticket not found.'); } if ($ticket['status'] === 'closed') { jsonResponse(false, 'Cannot reply to a closed ticket.'); } // Insert reply $stmt = $pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message) VALUES (?, 'user', ?, ?) "); $stmt->execute([$ticket['id'], $user['id'], $message]); // Update ticket status to 'open' if it was 'resolved' if ($ticket['status'] === 'resolved') { $stmt = $pdo->prepare("UPDATE support_tickets SET status = 'open' WHERE id = ?"); $stmt->execute([$ticket['id']]); } logError('Support ticket reply added', [ 'ticket_number' => $ticketNumber, 'user_id' => $user['id'] ]); jsonResponse(true, 'Reply added successfully.'); } catch (Exception $e) { logError('Error adding ticket reply', ['ticket_number' => $ticketNumber, 'error' => $e->getMessage()]); jsonResponse(false, 'Failed to add reply. Please try again.'); } } // If we're here, it means we're displaying a specific ticket ?>
We're here to help you with any questions or issues.
| Ticket Number: | |
| Status: | |
| Priority: | ● |
| Created: | |
| Last Updated: | |
| Assigned To: |
The requested ticket could not be found or you don't have permission to view it.
Back to Support Center