File: /var/www/html/obaasimaghana/app/models/Certificate.php
<?php
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
use chillerlan\QRCode\Data\QRMatrix;
class Certificate {
private $db;
public function __construct() {
$this->db = new Database();
}
/**
* Get certificate by ID
*/
public function getCertificateById($id) {
$query = "SELECT c.*, co.title as course_title, u.full_name as user_name
FROM certificates c
JOIN courses co ON c.course_id = co.id
JOIN users u ON c.user_id = u.id
WHERE c.id = ?";
$stmt = $this->db->prepare($query);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_assoc();
}
/**
* Get all certificates for a user
*/
public function getUserCertificates($userId) {
$query = "SELECT c.*, co.title as course_title
FROM certificates c
JOIN courses co ON c.course_id = co.id
WHERE c.user_id = ?
ORDER BY c.issued_at DESC";
$stmt = $this->db->prepare($query);
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
$certificates = [];
while ($row = $result->fetch_assoc()) {
$certificates[] = $row;
}
return $certificates;
}
/**
* Create a new certificate
*/
public function createCertificate($userId, $courseId) {
$query = "INSERT INTO certificates (user_id, course_id, issued_at)
VALUES (?, ?, NOW())";
$stmt = $this->db->prepare($query);
$stmt->bind_param("ii", $userId, $courseId);
return $stmt->execute();
}
/**
* Check if user has certificate for a course
*/
public function hasCertificate($userId, $courseId) {
$query = "SELECT id FROM certificates
WHERE user_id = ? AND course_id = ?";
$stmt = $this->db->prepare($query);
$stmt->bind_param("ii", $userId, $courseId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_assoc() ? true : false;
}
/**
* Generate certificate PDF using print-friendly approach
*/
public function generateCertificatePDF($certificateId) {
// Get certificate data
$certificate = $this->getCertificateById($certificateId);
if (!$certificate) {
return false;
}
// Generate QR code
$verificationUrl = SITE_URL . '/certificates/verify/' . $certificateId;
$qrCode = $this->generateQRCode($verificationUrl);
// Set headers for PDF download
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="certificate_' . $certificateId . '.pdf"');
// Start output buffering
ob_start();
// Include the print-friendly certificate template
include APP_PATH . '/views/certificates/print.php';
// Get the buffered content
$html = ob_get_clean();
// Convert HTML to PDF using browser's print functionality
echo '<script>
window.onload = function() {
window.print();
setTimeout(function() {
window.close();
}, 1000);
}
</script>';
return true;
}
/**
* Generate QR code for certificate verification
*/
private function generateQRCode($url) {
$options = new QROptions([
'outputType' => QRCode::OUTPUT_IMAGE_PNG,
'eccLevel' => QRCode::ECC_L,
'scale' => 5,
'imageBase64' => false,
'moduleValues' => [
// finder
QRMatrix::M_FINDER_DARK => '#000000',
QRMatrix::M_FINDER_DOT => '#000000',
QRMatrix::M_FINDER => '#ffffff',
QRMatrix::M_FINDER_DOT_LIGHT => '#ffffff',
// alignment
QRMatrix::M_ALIGNMENT_DARK => '#000000',
QRMatrix::M_ALIGNMENT => '#ffffff',
// timing
QRMatrix::M_TIMING_DARK => '#000000',
QRMatrix::M_TIMING => '#ffffff',
// format
QRMatrix::M_FORMAT_DARK => '#000000',
QRMatrix::M_FORMAT => '#ffffff',
// version
QRMatrix::M_VERSION_DARK => '#000000',
QRMatrix::M_VERSION => '#ffffff',
// data
QRMatrix::M_DATA_DARK => '#000000',
QRMatrix::M_DATA => '#ffffff',
// darkmodule
QRMatrix::M_DARKMODULE => '#000000',
// separator
QRMatrix::M_SEPARATOR => '#ffffff',
// quietzone
QRMatrix::M_QUIETZONE => '#ffffff',
],
]);
$qrcode = new QRCode($options);
$qrImage = $qrcode->render($url);
// Save QR code to a temporary file
$tempFile = tempnam(sys_get_temp_dir(), 'qr_');
file_put_contents($tempFile, $qrImage);
return $tempFile;
}
/**
* Verify certificate
*/
public function verifyCertificate($certificateId) {
$query = "SELECT c.*, co.title as course_title, u.full_name as user_name
FROM certificates c
JOIN courses co ON c.course_id = co.id
JOIN users u ON c.user_id = u.id
WHERE c.id = ?";
$stmt = $this->db->prepare($query);
$stmt->bind_param("i", $certificateId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_assoc();
}
}