<?php
// Start output buffering to prevent headers already sent error
ob_start();
$pageTitle = "My Certificates";
include_once('includes/header.php');
require_once('../includes/certificate_lib.php');
// Check if session is already started before starting a new one
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Check if student is logged in
if (!isset($_SESSION['user_id']) || $_SESSION['role'] !== 'student') {
header("Location: ../login.php");
exit();
}
$userId = $_SESSION['user_id'];
$success_message = '';
$error_message = '';
// Initialize the certificate generator
$certificateGenerator = new CertificateGenerator();
// Handle flash messages
if (isset($_SESSION['success_message'])) {
$success_message = $_SESSION['success_message'];
unset($_SESSION['success_message']);
}
if (isset($_SESSION['error_message'])) {
$error_message = $_SESSION['error_message'];
unset($_SESSION['error_message']);
}
// Function to get institute settings
function getInstituteSettings($conn) {
$settings = [
'institute_name' => "Popular Computer Institute",
'institute_logo' => "../assets/img/logo.png",
'institute_address' => "Bhimpura No.1,Ballia,UP",
'institute_website' => "www.example.com",
'director_name' => "John Smith",
];
$query = "SELECT setting_key, setting_value FROM site_settings
WHERE setting_key IN ('site_name', 'site_logo', 'site_address',
'site_url', 'director_name')";
$result = $conn->query($query);
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$settings[$row['setting_key']] = $row['setting_value'];
}
}
return $settings;
}
// Function to get certificates
function getStudentCertificates($conn, $userId) {
$certificates = [];
$query = "SELECT e.id as enrollment_id, e.completion_date, e.certificate_number,
e.certificate_issue_date, e.status as enrollment_status, e.verification_code,
e.certificate_data, e.certificate_meta,
c.id as course_id, c.title as course_title, c.image as course_image,
c.duration, c.level, c.status as course_status,
CASE
WHEN e.status = 'completed' THEN 1
WHEN c.status = 'completed' THEN 1
ELSE 0
END as is_completed
FROM enrollments e
INNER JOIN courses c ON e.course_id = c.id
WHERE e.user_id = ? AND (e.status = 'completed' OR c.status = 'completed')
ORDER BY e.completion_date DESC";
$stmt = $conn->prepare($query);
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$certificates[] = $row;
}
return $certificates;
}
// Function to get student details
function getStudentDetails($conn, $userId) {
$student = null;
$query = "SELECT first_name, last_name, email FROM users WHERE id = ?";
$stmt = $conn->prepare($query);
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
if ($result && $result->num_rows > 0) {
$student = $result->fetch_assoc();
}
return $student;
}
// Generate a verification code
function generateVerificationCode() {
global $certificateGenerator;
// Use the certificate generator if available
if (isset($certificateGenerator) && $certificateGenerator !== null) {
return $certificateGenerator->generateVerificationCode();
}
// Fallback to a simple verification code generator
return strtoupper(substr(md5(uniqid(rand(), true)), 0, 8));
}
// Update the getStudentCertificates function to check for completed courses without certificates
function getCompletedCoursesWithoutCertificates($conn, $userId) {
$courses = [];
$query = "SELECT e.id as enrollment_id, e.completion_date, e.status as enrollment_status,
c.id as course_id, c.title as course_title, c.image as course_image,
c.duration, c.level, c.status as course_status,
CASE
WHEN e.status = 'completed' THEN 1
WHEN c.status = 'completed' THEN 1
ELSE 0
END as is_completed
FROM enrollments e
INNER JOIN courses c ON e.course_id = c.id
WHERE e.user_id = ?
AND (e.status = 'completed' OR c.status = 'completed')
AND e.certificate_number IS NULL
ORDER BY e.completion_date DESC";
$stmt = $conn->prepare($query);
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$courses[] = $row;
}
return $courses;
}
// Get institute settings
$institute_settings = getInstituteSettings($conn);
$institute_name = $institute_settings['site_name'] ?? 'Popular Computer Institute';
$institute_logo = '../'. $institute_settings['site_logo'] ?? '/assets/img/logo.png';
$institute_address = $institute_settings['site_address'] ?? 'Institute Address';
$director_name = $institute_settings['director_name'] ?? 'Institute Director';
// Get certificates data
$certificates = getStudentCertificates($conn, $userId);
$student = getStudentDetails($conn, $userId);
// Get completed courses without certificates
$pending_certificates = getCompletedCoursesWithoutCertificates($conn, $userId);
// Calculate statistics
$total_certificates = count($certificates);
$certified_count = 0;
$pending_count = count($pending_certificates);
$recent_count = 0;
foreach ($certificates as $cert) {
if (!empty($cert['certificate_number'])) {
$certified_count++;
// Count certificates issued in the last 30 days
if (!empty($cert['certificate_issue_date']) && (strtotime($cert['certificate_issue_date']) > strtotime('-30 days'))) {
$recent_count++;
}
}
}
// Request certificate generation
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['generate_certificate'])) {
$enrollment_id = $_POST['enrollment_id'] ?? 0;
if ($enrollment_id > 0) {
// Validate the enrollment ID belongs to the current user
$validate_query = "SELECT e.id, e.status, e.course_id, c.title AS course_title,
CONCAT(u.first_name, ' ', u.last_name) AS student_name,
u.email AS student_email
FROM enrollments e
INNER JOIN courses c ON e.course_id = c.id
INNER JOIN users u ON e.user_id = u.id
WHERE e.id = ? AND e.user_id = ? AND (e.status = 'completed' OR c.status = 'completed')";
$stmt = $conn->prepare($validate_query);
$stmt->bind_param("ii", $enrollment_id, $userId);
$stmt->execute();
$result = $stmt->get_result();
if ($result && $result->num_rows > 0) {
$enrollment = $result->fetch_assoc();
// Generate a unique certificate number
$certificate_number = 'PCIB-' . date('Ymd') . '-' . sprintf('%04d', $enrollment_id);
// Generate a verification code
$verification_code = generateVerificationCode();
// Generate certificate meta data (JSON)
$certificate_meta = json_encode([
'student_name' => $enrollment['student_name'],
'student_email' => $enrollment['student_email'],
'course_title' => $enrollment['course_title'],
'certificate_number' => $certificate_number,
'verification_code' => $verification_code,
'issue_date' => date('Y-m-d H:i:s'),
'institute_name' => $institute_name,
'director_name' => $director_name
]);
// Generate certificate HTML
$certificate_html = '<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Certificate of Achievement - ' . htmlspecialchars($enrollment['student_name']) . '</title>
<style>
@import url(\'https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=Montserrat:wght@300;400;600;700&display=swap\');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: \'Montserrat\', sans-serif;
background-color: #f8f9fa;
color: #212529;
line-height: 1.6;
}
.certificate-container {
width: 210mm;
height: 297mm;
position: relative;
margin: 0 auto;
background: #fff;
box-shadow: 0 0 25px rgba(0,0,0,0.1);
overflow: hidden;
}
.background-pattern {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
radial-gradient(#f0f4f8 20%, transparent 20%),
radial-gradient(#f0f4f8 20%, transparent 20%);
background-position: 0 0, 10px 10px;
background-size: 20px 20px;
opacity: 0.4;
z-index: 0;
}
.border-frame {
position: absolute;
top: 20px;
left: 20px;
right: 20px;
bottom: 20px;
border: 2px solid #1a5276;
z-index: 1;
}
.inner-frame {
position: absolute;
top: 25px;
left: 25px;
right: 25px;
bottom: 25px;
border: 1px solid #d4af37;
z-index: 1;
}
.content {
position: relative;
z-index: 2;
height: 100%;
padding: 40px;
display: flex;
flex-direction: column;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20px;
border-bottom: 1px solid #d4af37;
margin-bottom: 40px;
}
.institution-logo {
max-width: 120px;
}
.govt-logos {
display: flex;
justify-content: flex-end;
gap: 15px;
}
.govt-logo {
height: 40px;
width: auto;
}
.certificate-title {
text-align: center;
margin-bottom: 30px;
}
.certificate-title h1 {
font-family: \'Playfair Display\', serif;
font-size: 48px;
color: #1a5276;
margin-bottom: 10px;
letter-spacing: 2px;
}
.certificate-title p {
font-size: 18px;
color: #7d6608;
text-transform: uppercase;
letter-spacing: 3px;
}
.recipient-section {
text-align: center;
margin-bottom: 40px;
}
.recipient-intro {
font-size: 16px;
font-style: italic;
margin-bottom: 15px;
}
.recipient-name {
font-family: \'Playfair Display\', serif;
font-size: 42px;
color: #d4af37;
margin-bottom: 20px;
}
.achievement-text {
font-size: 18px;
margin-bottom: 10px;
}
.course-name {
font-family: \'Playfair Display\', serif;
font-size: 28px;
color: #1a5276;
font-weight: bold;
max-width: 80%;
margin: 0 auto 40px;
line-height: 1.3;
}
.certificate-footer {
margin-top: auto;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
}
.left-footer {
display: flex;
flex-direction: column;
}
.right-footer {
display: flex;
flex-direction: column;
align-items: flex-end;
}
.signature-area {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 30px;
}
.signature-line {
width: 200px;
border-bottom: 1px solid #000;
margin-bottom: 10px;
}
.signatory-name {
font-weight: bold;
font-size: 16px;
}
.signatory-title {
font-size: 14px;
color: #555;
}
.certificate-date {
font-size: 16px;
margin-top: 10px;
}
.certificate-details {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.detail-item {
font-size: 14px;
color: #555;
margin-bottom: 5px;
}
.qr-verification {
display: flex;
flex-direction: column;
align-items: center;
}
.qr-code {
width: 80px;
height: 80px;
margin-bottom: 5px;
}
.verification-text {
font-size: 12px;
color: #555;
text-align: center;
}
.decorative-corner {
position: absolute;
width: 70px;
height: 70px;
z-index: 2;
}
.top-left {
top: 30px;
left: 30px;
border-top: 3px solid #d4af37;
border-left: 3px solid #d4af37;
}
.top-right {
top: 30px;
right: 30px;
border-top: 3px solid #d4af37;
border-right: 3px solid #d4af37;
}
.bottom-left {
bottom: 30px;
left: 30px;
border-bottom: 3px solid #d4af37;
border-left: 3px solid #d4af37;
}
.bottom-right {
bottom: 30px;
right: 30px;
border-bottom: 3px solid #d4af37;
border-right: 3px solid #d4af37;
}
.watermark {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
opacity: 0.03;
z-index: 1;
width: 80%;
}
@media print {
body {
background-color: #fff;
}
.certificate-container {
box-shadow: none;
margin: 0;
width: 100%;
height: 100%;
page-break-inside: avoid;
}
.print-actions {
display: none;
}
}
@media screen {
.print-actions {
display: flex;
justify-content: center;
gap: 10px;
margin: 20px 0;
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
z-index: 100;
}
.print-btn {
background-color: #1a5276;
color: white;
border: none;
padding: 12px 24px;
border-radius: 4px;
cursor: pointer;
font-family: \'Montserrat\', sans-serif;
font-weight: 600;
transition: background-color 0.3s;
display: flex;
align-items: center;
gap: 8px;
}
.print-btn:hover {
background-color: #154360;
}
.download-btn {
background-color: #d4af37;
color: white;
border: none;
padding: 12px 24px;
border-radius: 4px;
cursor: pointer;
font-family: \'Montserrat\', sans-serif;
font-weight: 600;
transition: background-color 0.3s;
display: flex;
align-items: center;
gap: 8px;
}
.download-btn:hover {
background-color: #b7950b;
}
}
</style>
</head>
<body>
<div class="certificate-container">
<div class="background-pattern"></div>
<div class="border-frame"></div>
<div class="inner-frame"></div>
<div class="decorative-corner top-left"></div>
<div class="decorative-corner top-right"></div>
<div class="decorative-corner bottom-left"></div>
<div class="decorative-corner bottom-right"></div>
<img src="' . $institute_logo . '" alt="Watermark" class="watermark">
<div class="content">
<div class="header">
<img src="' . $institute_logo . '" alt="' . htmlspecialchars($institute_name) . '" class="institution-logo">
<div class="govt-logos">
<img src="../assets/img/nielit-logo.png" alt="NIELIT" class="govt-logo">
<img src="../assets/img/skill-india-logo.png" alt="Skill India" class="govt-logo">
<img src="../assets/img/digital-india-logo.png" alt="Digital India" class="govt-logo">
</div>
</div>
<div class="certificate-title">
<h1>Certificate of Achievement</h1>
<p>Recognition of Excellence</p>
</div>
<div class="recipient-section">
<div class="recipient-intro">This is to certify that</div>
<div class="recipient-name">' . htmlspecialchars($enrollment['student_name']) . '</div>
<div class="achievement-text">has successfully completed the course</div>
<div class="course-name">' . htmlspecialchars($enrollment['course_title']) . '</div>
</div>
<div class="certificate-footer">
<div class="left-footer">
<div class="signature-area">
<div class="signature-line"></div>
<div class="signatory-name">' . htmlspecialchars($director_name) . '</div>
<div class="signatory-title">Director, ' . htmlspecialchars($institute_name) . '</div>
</div>
<div class="certificate-date">Issued on: ' . date('F d, Y') . '</div>
</div>
<div class="right-footer">
<div class="certificate-details">
<div class="detail-item"><strong>Certificate ID:</strong> ' . $certificate_number . '</div>
<div class="detail-item"><strong>Verification Code:</strong> ' . $verification_code . '</div>
<div class="detail-item"><strong>Valid Until:</strong> Lifetime</div>
</div>
<div class="qr-verification">
<img src="https://api.qrserver.com/v1/create-qr-code/?size=80x80&data=' . urlencode('https://' . $_SERVER['HTTP_HOST'] . '/verify.php?code=' . $verification_code) . '" alt="Verify" class="qr-code">
<div class="verification-text">Scan to verify authenticity</div>
</div>
</div>
</div>
</div>
</div>
<div class="print-actions">
<button class="print-btn" onclick="window.print()">
<svg width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M5 1a2 2 0 0 0-2 2v1h10V3a2 2 0 0 0-2-2H5zm6 8H5a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1z"/>
<path d="M0 7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2h-1v-2a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v2H2a2 2 0 0 1-2-2V7zm2.5 1a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1z"/>
</svg>
Print Certificate
</button>
<button class="download-btn" onclick="downloadPDF()">
<svg width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/>
<path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/>
</svg>
Download PDF
</button>
</div>
<script>
function downloadPDF() {
// Create a form and submit it to the PDF generation endpoint
var form = document.createElement("form");
form.method = "POST";
form.action = "ajax/download_certificate_pdf.php";
form.target = "_blank";
var input = document.createElement("input");
input.type = "hidden";
input.name = "certificate_number";
input.value = "' . $certificate_number . '";
form.appendChild(input);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
}
</script>
</body>
</html>';
// Update the enrollment record
$update_query = "UPDATE enrollments SET
certificate_number = ?,
certificate_data = ?,
certificate_meta = ?,
certificate_issue_date = NOW(),
verification_code = ?
WHERE id = ?";
$stmt = $conn->prepare($update_query);
$stmt->bind_param("ssssi", $certificate_number, $certificate_html, $certificate_meta, $verification_code, $enrollment_id);
if ($stmt->execute()) {
$success_message = "Certificate generated successfully!";
// Set a session variable to track the certificate
$_SESSION['last_certificate'] = $certificate_number;
// Redirect to view certificate
header("Location: view_certificate.php?number=" . $certificate_number);
exit();
} else {
$error_message = "Error updating certificate information: " . $conn->error;
}
} else {
$error_message = "Invalid enrollment or course not completed.";
}
} else {
$error_message = "Invalid enrollment ID.";
}
}
// Handle exam certificate generation if exam_id is passed in URL
if (isset($_GET['exam_id']) && is_numeric($_GET['exam_id'])) {
$exam_id = intval($_GET['exam_id']);
// Check if the exam exists and the student has passed it
$exam_query = "SELECT se.*, e.title AS exam_title, c.title AS course_title, c.id AS course_id
FROM student_exams se
JOIN exam_schedules e ON se.exam_id = e.id
JOIN courses c ON e.course_id = c.id
WHERE se.exam_id = ? AND se.user_id = ? AND se.status = 'passed'";
$stmt = $conn->prepare($exam_query);
$stmt->bind_param("ii", $exam_id, $userId);
$stmt->execute();
$exam_result = $stmt->get_result();
if ($exam_result->num_rows > 0) {
$exam_data = $exam_result->fetch_assoc();
// Check if a certificate already exists for this exam
$cert_check_query = "SELECT * FROM exam_certificates WHERE student_exam_id = ?";
$cert_stmt = $conn->prepare($cert_check_query);
$cert_stmt->bind_param("i", $exam_data['id']);
$cert_stmt->execute();
$cert_result = $cert_stmt->get_result();
if ($cert_result->num_rows == 0) {
// No certificate exists, create one
// Get student details
$student = getStudentDetails($conn, $userId);
$student_name = $student['first_name'] . ' ' . $student['last_name'];
// Generate a unique certificate number
$certificate_number = 'EXAM-' . date('Ymd') . '-' . sprintf('%04d', $exam_data['id']);
// Generate a verification code
$verification_code = generateVerificationCode();
// Create certificate data
$certificate_data = json_encode([
'exam_title' => $exam_data['exam_title'],
'course_title' => $exam_data['course_title'],
'student_name' => $student_name,
'score' => $exam_data['score'],
'issue_date' => date('Y-m-d'),
'institute_name' => $institute_name
]);
// Insert certificate record
$insert_query = "INSERT INTO exam_certificates
(student_exam_id, certificate_number, issue_date, verification_code, certificate_data)
VALUES (?, ?, NOW(), ?, ?)";
$insert_stmt = $conn->prepare($insert_query);
$insert_stmt->bind_param("isss", $exam_data['id'], $certificate_number, $verification_code, $certificate_data);
if ($insert_stmt->execute()) {
$certificate_id = $conn->insert_id;
$_SESSION['success_message'] = "Certificate generated successfully!";
// Redirect to view the certificate
header("Location: view_certificate.php?id=" . $certificate_id);
exit();
} else {
$_SESSION['error_message'] = "Failed to generate certificate. Please try again.";
}
} else {
// Certificate already exists
$certificate = $cert_result->fetch_assoc();
$_SESSION['success_message'] = "You already have a certificate for this exam.";
// Redirect to view the certificate
header("Location: view_certificate.php?id=" . $certificate['id']);
exit();
}
} else {
$_SESSION['error_message'] = "You have not passed this exam or it does not exist.";
}
}
?>
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="h3 mb-0 text-gray-800">My Certificates</h1>
</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="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</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="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php endif; ?>
<!-- Content Row - Statistics -->
<div class="row">
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-primary shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
Total Certificates</div>
<div class="h5 mb-0 font-weight-bold text-gray-800"><?php echo $total_certificates; ?></div>
</div>
<div class="col-auto">
<i class="fas fa-certificate fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-success shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">
Issued Certificates</div>
<div class="h5 mb-0 font-weight-bold text-gray-800"><?php echo $certified_count; ?></div>
</div>
<div class="col-auto">
<i class="fas fa-check-circle fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-info shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">
Pending Certificates</div>
<div class="h5 mb-0 font-weight-bold text-gray-800"><?php echo $pending_count; ?></div>
</div>
<div class="col-auto">
<i class="fas fa-hourglass-half fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-warning shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
Recent (30 days)</div>
<div class="h5 mb-0 font-weight-bold text-gray-800"><?php echo $recent_count; ?></div>
</div>
<div class="col-auto">
<i class="fas fa-calendar-alt fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<?php if (!empty($pending_certificates)): ?>
<!-- Available Courses for Certificate Card -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Available Courses for Certificate</h6>
<span class="badge bg-info text-white"><?php echo count($pending_certificates); ?> course(s)</span>
</div>
<div class="card-body">
<div class="row">
<?php foreach ($pending_certificates as $course): ?>
<div class="col-md-6 col-lg-4 mb-4">
<div class="card h-100 shadow-sm border-warning">
<div class="card-header bg-light p-3">
<div class="d-flex justify-content-between align-items-center">
<h6 class="mb-0 text-primary"><?php echo htmlspecialchars($course['course_title']); ?></h6>
<span class="badge bg-success">Completed</span>
</div>
</div>
<div class="card-body">
<p class="text-muted mb-3">
<i class="fas fa-calendar-check me-2"></i> Completed:
<?php echo !empty($course['completion_date']) ?
date('M d, Y', strtotime($course['completion_date'])) :
'Date not recorded'; ?>
</p>
<div class="text-center mb-3">
<img src="../assets/img/certificate-icon.png" class="img-fluid" alt="Certificate" style="max-height: 100px;">
</div>
<form method="post" action="">
<input type="hidden" name="enrollment_id" value="<?php echo $course['enrollment_id']; ?>">
<button type="submit" name="generate_certificate" class="btn btn-warning w-100">
<i class="fas fa-certificate me-2"></i> Generate Certificate
</button>
</form>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<?php endif; ?>
<!-- Certificate List -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">My Certificates</h6>
<?php if (!empty($certificates)): ?>
<span class="badge bg-primary text-white"><?php echo count($certificates); ?> certificate(s)</span>
<?php endif; ?>
</div>
<div class="card-body">
<?php if (empty($certificates)): ?>
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i> You don't have any certificates yet. Complete a course to get your certificate.
</div>
<?php else: ?>
<div class="table-responsive">
<table class="table table-bordered" id="certificatesTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>Course</th>
<th>Certificate No</th>
<th>Issue Date</th>
<th>Verification Code</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($certificates as $certificate): ?>
<tr>
<td>
<div class="d-flex align-items-center">
<img src="<?php echo !empty($certificate['course_image']) ? '../' . $certificate['course_image'] : '../assets/img/certificate-bg.jpg'; ?>"
class="img-thumbnail mr-2" alt="Certificate" style="width: 50px; height: 50px; object-fit: cover;">
<div>
<?php echo htmlspecialchars($certificate['course_title']); ?>
</div>
</div>
</td>
<td><?php echo !empty($certificate['certificate_number']) ? $certificate['certificate_number'] : 'Not issued'; ?></td>
<td><?php echo !empty($certificate['certificate_issue_date']) ? date('M d, Y', strtotime($certificate['certificate_issue_date'])) : 'Not available'; ?></td>
<td><?php echo !empty($certificate['verification_code']) ? $certificate['verification_code'] : '-'; ?></td>
<td>
<?php if (!empty($certificate['certificate_number'])): ?>
<a href="view_certificate.php?number=<?php echo $certificate['certificate_number']; ?>" target="_blank" class="btn btn-sm btn-primary">
<i class="fas fa-eye"></i> View
</a>
<a href="download_certificate.php?number=<?php echo $certificate['certificate_number']; ?>&format=pdf" class="btn btn-sm btn-info">
<i class="fas fa-download"></i> Download PDF
</a>
<?php else: ?>
<form method="post" action="">
<input type="hidden" name="enrollment_id" value="<?php echo $certificate['enrollment_id']; ?>">
<button type="submit" name="generate_certificate" class="btn btn-sm btn-warning">
<i class="fas fa-certificate"></i> Generate
</button>
</form>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$('#certificatesTable').DataTable({
"order": [[ 2, "desc" ]],
"pageLength": 10
});
});
</script>
<?php include_once 'includes/footer.php'; ?>