<?php
$pageTitle = "View Support Ticket";
include_once('includes/header.php');
// Check if user is logged in
if (!isset($_SESSION['user_id']) || $_SESSION['role'] !== 'student') {
header("Location: ../login.php");
exit();
}
// Get student ID
$student_id = $_SESSION['user_id'];
// Get ticket ID
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
header("Location: support.php");
exit();
}
$ticket_id = (int)$_GET['id'];
// Fetch ticket details
$query = "
SELECT t.*, c.title as course_name
FROM support_tickets t
LEFT JOIN courses c ON t.course_id = c.id
WHERE t.id = ? AND t.student_id = ?
";
$stmt = $conn->prepare($query);
$stmt->bind_param("ii", $ticket_id, $student_id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
// Ticket not found or doesn't belong to this student
header("Location: support.php");
exit();
}
$ticket = $result->fetch_assoc();
// Handle new reply submission
$success_message = "";
$error_message = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit_reply'])) {
$reply_message = trim($_POST['reply_message'] ?? '');
// Validation
if (empty($reply_message)) {
$error_message = "Please enter a message.";
} else {
// Insert the reply
$stmt = $conn->prepare("
INSERT INTO support_ticket_replies
(ticket_id, user_type, user_id, message)
VALUES (?, 'student', ?, ?)
");
$stmt->bind_param("iis", $ticket_id, $student_id, $reply_message);
if ($stmt->execute()) {
// Update ticket status if it was closed or resolved
if ($ticket['status'] === 'closed' || $ticket['status'] === 'resolved') {
$stmt = $conn->prepare("UPDATE support_tickets SET status = 'open', updated_at = NOW() WHERE id = ?");
$stmt->bind_param("i", $ticket_id);
$stmt->execute();
$ticket['status'] = 'open';
} else {
// Just update the updated_at timestamp
$stmt = $conn->prepare("UPDATE support_tickets SET updated_at = NOW() WHERE id = ?");
$stmt->bind_param("i", $ticket_id);
$stmt->execute();
}
$success_message = "Your reply has been sent successfully.";
$reply_message = "";
} else {
$error_message = "Failed to send your reply. Please try again.";
}
}
}
// Handle ticket actions
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['close_ticket']) && $ticket['status'] !== 'closed') {
$stmt = $conn->prepare("UPDATE support_tickets SET status = 'closed', updated_at = NOW() WHERE id = ? AND student_id = ?");
$stmt->bind_param("ii", $ticket_id, $student_id);
if ($stmt->execute()) {
$ticket['status'] = 'closed';
$success_message = "Ticket has been closed successfully.";
} else {
$error_message = "Failed to close the ticket. Please try again.";
}
} elseif (isset($_POST['reopen_ticket']) && ($ticket['status'] === 'closed' || $ticket['status'] === 'resolved')) {
$stmt = $conn->prepare("UPDATE support_tickets SET status = 'open', updated_at = NOW() WHERE id = ? AND student_id = ?");
$stmt->bind_param("ii", $ticket_id, $student_id);
if ($stmt->execute()) {
$ticket['status'] = 'open';
$success_message = "Ticket has been reopened successfully.";
} else {
$error_message = "Failed to reopen the ticket. Please try again.";
}
}
}
// Fetch all replies for this ticket
$query = "
SELECT r.*,
CASE WHEN r.user_type = 'admin' THEN CONCAT(a.first_name, ' ', a.last_name) ELSE CONCAT(s.first_name, ' ', s.last_name) END as user_name,
CASE WHEN r.user_type = 'admin' THEN a.email ELSE s.email END as user_email
FROM support_ticket_replies r
LEFT JOIN users s ON (r.user_id = s.id AND r.user_type = 'student')
LEFT JOIN users a ON (r.user_id = a.id AND r.user_type = 'admin')
WHERE r.ticket_id = ?
ORDER BY r.created_at ASC
";
$stmt = $conn->prepare($query);
$stmt->bind_param("i", $ticket_id);
$stmt->execute();
$replies_result = $stmt->get_result();
$replies = [];
while ($row = $replies_result->fetch_assoc()) {
$replies[] = $row;
}
// Define categories
$categories = [
'account' => 'Account Access',
'payment' => 'Payment Issues',
'enrollment' => 'Course Enrollment',
'certificate' => 'Certificate Issues',
'exam' => 'Exam Related',
'technical' => 'Technical Support',
'general' => 'General Information',
'other' => 'Other'
];
// Define priorities
$priorities = [
'low' => 'Low',
'medium' => 'Medium',
'high' => 'High'
];
// Define status labels and colors
$status_labels = [
'open' => ['label' => 'Open', 'class' => 'bg-danger'],
'in_progress' => ['label' => 'In Progress', 'class' => 'bg-warning'],
'resolved' => ['label' => 'Resolved', 'class' => 'bg-success'],
'closed' => ['label' => 'Closed', 'class' => 'bg-secondary']
];
?>
<div class="container py-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<a href="support.php" class="btn btn-sm btn-outline-secondary me-2">
<i class="fas fa-arrow-left me-1"></i> Back to Tickets
</a>
<h2 class="h3 d-inline-block mb-0"><?php echo htmlspecialchars($ticket['subject']); ?></h2>
<span class="badge <?php echo $status_labels[$ticket['status']]['class']; ?> ms-2">
<?php echo $status_labels[$ticket['status']]['label']; ?>
</span>
</div>
<div>
<?php if ($ticket['status'] !== 'closed'): ?>
<form method="post" action="" class="d-inline-block">
<button type="submit" name="close_ticket" class="btn btn-outline-secondary" onclick="return confirm('Are you sure you want to close this ticket?')">
<i class="fas fa-times-circle me-1"></i> Close Ticket
</button>
</form>
<?php elseif ($ticket['status'] === 'closed' || $ticket['status'] === 'resolved'): ?>
<form method="post" action="" class="d-inline-block">
<button type="submit" name="reopen_ticket" class="btn btn-outline-primary">
<i class="fas fa-sync me-1"></i> Reopen Ticket
</button>
</form>
<?php endif; ?>
</div>
</div>
<?php if (!empty($success_message)): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo $success_message; ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if (!empty($error_message)): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php echo $error_message; ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<div class="row">
<!-- Ticket Details Column -->
<div class="col-md-4">
<!-- Ticket Information -->
<div class="card mb-4">
<div class="card-header bg-light">
<h5 class="mb-0">Ticket Information</h5>
</div>
<div class="card-body">
<div class="mb-3">
<h6 class="fw-bold">Ticket #</h6>
<p class="mb-0"><?php echo htmlspecialchars($ticket['ticket_id']); ?></p>
</div>
<div class="mb-3">
<h6 class="fw-bold">Category</h6>
<p class="mb-0">
<?php echo isset($categories[$ticket['category']]) ?
htmlspecialchars($categories[$ticket['category']]) :
htmlspecialchars($ticket['category']); ?>
</p>
</div>
<?php if (!empty($ticket['course_name'])): ?>
<div class="mb-3">
<h6 class="fw-bold">Related Course</h6>
<p class="mb-0"><?php echo htmlspecialchars($ticket['course_name']); ?></p>
</div>
<?php endif; ?>
<div class="mb-3">
<h6 class="fw-bold">Priority</h6>
<p class="mb-0"><?php echo ucfirst(htmlspecialchars($ticket['priority'])); ?></p>
</div>
<div class="mb-3">
<h6 class="fw-bold">Status</h6>
<p class="mb-0">
<span class="badge <?php echo $status_labels[$ticket['status']]['class']; ?>">
<?php echo $status_labels[$ticket['status']]['label']; ?>
</span>
</p>
</div>
<div class="mb-3">
<h6 class="fw-bold">Created On</h6>
<p class="mb-0"><?php echo date('M d, Y h:i A', strtotime($ticket['created_at'])); ?></p>
</div>
<?php if (!empty($ticket['updated_at']) && $ticket['updated_at'] != $ticket['created_at']): ?>
<div class="mb-0">
<h6 class="fw-bold">Last Updated</h6>
<p class="mb-0"><?php echo date('M d, Y h:i A', strtotime($ticket['updated_at'])); ?></p>
</div>
<?php endif; ?>
</div>
</div>
<!-- Support Information -->
<div class="card">
<div class="card-header bg-light">
<h5 class="mb-0">Support Information</h5>
</div>
<div class="card-body">
<p><i class="fas fa-info-circle me-2 text-primary"></i> Our support team typically responds within 24 hours during business days.</p>
<div class="d-flex align-items-center mb-3">
<i class="fas fa-phone me-3 text-primary"></i>
<div>
<strong>Support Hotline</strong><br>
<span>(123) 456-7890</span>
</div>
</div>
<div class="d-flex align-items-center">
<i class="fas fa-clock me-3 text-primary"></i>
<div>
<strong>Business Hours</strong><br>
<span>Monday-Friday, 9:00 AM - 6:00 PM</span>
</div>
</div>
</div>
</div>
</div>
<!-- Conversation Column -->
<div class="col-md-8">
<!-- Conversation Thread -->
<div class="card mb-4">
<div class="card-header bg-light">
<h5 class="mb-0">Conversation</h5>
</div>
<div class="card-body">
<?php foreach ($replies as $index => $reply):
$is_admin = $reply['user_type'] === 'admin';
$name = $is_admin
? (!empty($reply['user_name']) ? $reply['user_name'] : 'Support Staff')
: (!empty($reply['user_name']) ? $reply['user_name'] : 'You');
?>
<div class="mb-4 <?php echo $index === 0 ? '' : 'mt-4 pt-4 border-top'; ?>">
<div class="d-flex justify-content-between align-items-center mb-2">
<div>
<span class="fw-bold"><?php echo htmlspecialchars($name); ?></span>
<?php if ($is_admin): ?>
<span class="badge bg-primary ms-2">Support Staff</span>
<?php endif; ?>
</div>
<small class="text-muted">
<?php echo date('M d, Y h:i A', strtotime($reply['created_at'])); ?>
</small>
</div>
<div class="message-content p-3 rounded <?php echo $is_admin ? 'bg-light' : 'bg-primary bg-opacity-10'; ?>">
<?php echo nl2br(htmlspecialchars($reply['message'])); ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<!-- Reply Form -->
<?php if ($ticket['status'] !== 'closed' && $ticket['status'] !== 'resolved'): ?>
<div class="card">
<div class="card-header bg-light">
<h5 class="mb-0">Add Reply</h5>
</div>
<div class="card-body">
<form method="post" action="">
<div class="mb-3">
<textarea class="form-control" id="reply_message" name="reply_message" rows="4" required><?php echo isset($reply_message) ? htmlspecialchars($reply_message) : ''; ?></textarea>
</div>
<div class="text-end">
<button type="submit" name="submit_reply" class="btn btn-primary">
<i class="fas fa-paper-plane me-2"></i> Send Reply
</button>
</div>
</form>
</div>
</div>
<?php else: ?>
<div class="alert alert-secondary">
<div class="d-flex align-items-center">
<i class="fas fa-info-circle me-3 fs-4"></i>
<div>
<?php if ($ticket['status'] === 'closed'): ?>
<p class="mb-2">This ticket is closed. If you need further assistance, please reopen the ticket or create a new one.</p>
<?php else: ?>
<p class="mb-2">This ticket has been marked as resolved. If you're still experiencing issues, please reopen the ticket.</p>
<?php endif; ?>
<form method="post" action="">
<button type="submit" name="reopen_ticket" class="btn btn-sm btn-outline-primary">
<i class="fas fa-sync me-1"></i> Reopen Ticket
</button>
</form>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
<?php include_once('includes/footer.php'); ?>