HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ubuntu-8gb-hel1-1 6.8.0-55-generic #57-Ubuntu SMP PREEMPT_DYNAMIC Wed Feb 12 23:42:21 UTC 2025 x86_64
User: www-data (33)
PHP: 8.1.32
Disabled: NONE
Upload Files
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();
    }
}