diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-generator.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-generator.php index 716d7044..50aa5821 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-generator.php +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-generator.php @@ -119,8 +119,14 @@ class HVAC_Certificate_Generator { return false; } - // Update certificate record with file path - $this->certificate_manager->update_certificate_file($certificate_id, $file_path); + // Generate PNG version for preview purposes + $png_path = $this->generate_png($certificate_id, $certificate_data); + if ($png_path) { + HVAC_Logger::info("Generated PNG version: $png_path", 'Certificates'); + } + + // Update certificate record with file paths + $this->certificate_manager->update_certificate_file($certificate_id, $file_path, $png_path); return $certificate_id; } @@ -200,6 +206,97 @@ class HVAC_Certificate_Generator { return false; } + /** + * Generate a PNG version of the certificate for preview purposes. + * + * @param int $certificate_id The certificate ID. + * @param array $certificate_data The certificate data. + * + * @return string|false The relative file path if successful, false otherwise. + */ + protected function generate_png($certificate_id, $certificate_data) { + // Get certificate and verify it exists + $certificate = $this->certificate_manager->get_certificate($certificate_id); + + if (!$certificate) { + return false; + } + + // Create PDF for conversion to PNG + $pdf = $this->create_certificate_pdf(); + $pdf->AddPage(); + + // Render certificate content + $this->render_certificate_content($pdf, $certificate, $certificate_data); + + // Get certificate storage path + $upload_dir = wp_upload_dir(); + $cert_dir = $upload_dir['basedir'] . '/' . get_option('hvac_certificate_storage_path', 'hvac-certificates'); + + // Create directory if it doesn't exist + if (!file_exists($cert_dir)) { + wp_mkdir_p($cert_dir); + } + + $attendee_name = isset($certificate_data['attendee_name']) ? $certificate_data['attendee_name'] : 'unknown'; + + // Define file name and path + $file_name = sanitize_file_name( + 'certificate-' . $certificate->certificate_number . '-' . + sanitize_title($attendee_name) . '.png' + ); + + $event_dir = $cert_dir . '/' . $certificate->event_id; + + // Create event directory if it doesn't exist + if (!file_exists($event_dir)) { + wp_mkdir_p($event_dir); + } + + $full_path = $event_dir . '/' . $file_name; + $relative_path = get_option('hvac_certificate_storage_path', 'hvac-certificates') . + '/' . $certificate->event_id . '/' . $file_name; + + // Convert PDF to PNG using TCPDF's image output + try { + // Set high DPI for better quality + $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); + + // Output as PNG (using TCPDF's built-in PNG output) + // Note: This requires TCPDF to be compiled with PNG support + $pdf->Output($full_path, 'F'); // Save PDF first + + // Convert PDF to PNG using ImageMagick if available + if (class_exists('Imagick')) { + $imagick = new Imagick(); + $imagick->setResolution(300, 300); // High resolution + $imagick->readImage($full_path); // Read the PDF + $imagick->setImageFormat('png'); + $imagick->setImageCompressionQuality(90); + + // Replace .pdf with .png in the path + $png_full_path = str_replace('.pdf', '.png', $full_path); + $png_relative_path = str_replace('.pdf', '.png', $relative_path); + + $imagick->writeImage($png_full_path); + $imagick->clear(); + + if (file_exists($png_full_path)) { + return $png_relative_path; + } + } else { + // Fallback: Log that ImageMagick is not available + HVAC_Logger::info("ImageMagick not available for PNG conversion. PNG generation skipped.", 'Certificates'); + return false; + } + + } catch (Exception $e) { + HVAC_Logger::error("Failed to generate PNG file: " . $e->getMessage(), 'Certificates'); + } + + return false; + } + /** * Create a TCPDF instance for certificate generation. * diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-installer.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-installer.php index 0a02aeba..090174b8 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-installer.php +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-installer.php @@ -71,6 +71,7 @@ class HVAC_Certificate_Installer { user_id BIGINT(20) UNSIGNED DEFAULT NULL, certificate_number VARCHAR(50) NOT NULL, file_path VARCHAR(255) NOT NULL, + png_path VARCHAR(255) DEFAULT NULL, date_generated DATETIME NOT NULL, generated_by BIGINT(20) UNSIGNED NOT NULL, revoked TINYINT(1) NOT NULL DEFAULT 0, diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-manager.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-manager.php index b0ed2191..2d86c54e 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-manager.php +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/certificates/class-certificate-manager.php @@ -133,25 +133,34 @@ class HVAC_Certificate_Manager { } /** - * Update the file path for a certificate. + * Update the file paths for a certificate. * * @param int $certificate_id The certificate ID. - * @param string $file_path The path to the certificate file. + * @param string $file_path The PDF file path. + * @param string $png_path The PNG file path (optional). * * @return bool True if successful, false otherwise. */ - public function update_certificate_file($certificate_id, $file_path) { + public function update_certificate_file($certificate_id, $file_path, $png_path = null) { global $wpdb; + $update_data = array( + 'file_path' => $file_path + ); + $format = array('%s'); + + if ($png_path !== null) { + $update_data['png_path'] = $png_path; + $format[] = '%s'; + } + $result = $wpdb->update( $wpdb->prefix . 'hvac_certificates', - array( - 'file_path' => $file_path - ), + $update_data, array( 'certificate_id' => $certificate_id ), - array('%s'), + $format, array('%d') ); @@ -491,18 +500,18 @@ class HVAC_Certificate_Manager { } try { - $events_query = new WP_Query(array( - 'post_type' => Tribe__Events__Main::POSTTYPE, - 'author' => $user_id, - 'posts_per_page' => -1, - 'fields' => 'ids', - 'post_status' => 'publish' + // Use direct database query to get user's event IDs (bypassing TEC interference) + $event_ids = $wpdb->get_col($wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} + WHERE post_type = %s + AND post_author = %d + AND post_status = 'publish'", + 'tribe_events', + $user_id )); - $event_ids = $events_query->posts; - if (function_exists('hvac_debug_log')) { - hvac_debug_log('WP_Query completed, event_ids count', count($event_ids)); + hvac_debug_log('Direct DB query completed, event_ids count', count($event_ids)); } if (empty($event_ids)) { @@ -694,19 +703,18 @@ class HVAC_Certificate_Manager { } try { - // Get event IDs authored by this user - $events_query = new WP_Query(array( - 'post_type' => Tribe__Events__Main::POSTTYPE, - 'author' => $user_id, - 'posts_per_page' => -1, - 'fields' => 'ids', - 'post_status' => 'publish' + // Use direct database query to get user's event IDs (bypassing TEC interference) + $event_ids = $wpdb->get_col($wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} + WHERE post_type = %s + AND post_author = %d + AND post_status = 'publish'", + 'tribe_events', + $user_id )); - $event_ids = $events_query->posts; - if (function_exists('hvac_debug_log')) { - hvac_debug_log('WP_Query for events completed, count', count($event_ids)); + hvac_debug_log('Direct DB query for events completed, count', count($event_ids)); } if (empty($event_ids)) { @@ -903,24 +911,23 @@ class HVAC_Certificate_Manager { return $empty_stats; } - // Get event IDs authored by this user - $events_query = new WP_Query(array( - 'post_type' => Tribe__Events__Main::POSTTYPE, - 'author' => $user_id, - 'posts_per_page' => -1, - 'fields' => 'ids', - 'post_status' => 'publish' + // Use direct database query to get user's event IDs (bypassing TEC interference) + $event_ids = $wpdb->get_col($wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} + WHERE post_type = %s + AND post_author = %d + AND post_status = 'publish'", + 'tribe_events', + $user_id )); - $event_ids = $events_query->posts; - if (function_exists('hvac_debug_log')) { - hvac_debug_log('WP_Query for event IDs completed, count', count($event_ids)); + hvac_debug_log('Direct DB query for events in stats, count', count($event_ids)); } if (empty($event_ids)) { if (function_exists('hvac_debug_log')) { - hvac_debug_log('No events found for user, returning empty stats'); + hvac_debug_log('No events found for user in stats, returning empty stats'); } return $empty_stats; } diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports.php index b01f51a6..2ed8b151 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports.php +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports.php @@ -68,23 +68,21 @@ try { } // Default 'all' doesn't add a filter - // Get user's events for filtering - $args = array( - 'post_type' => Tribe__Events__Main::POSTTYPE, - 'posts_per_page' => -1, - 'post_status' => 'publish', - 'author' => $current_user_id, - 'orderby' => 'meta_value', - 'meta_key' => '_EventStartDate', - 'order' => 'DESC', + // Get user's events for filtering using direct database query (bypassing TEC interference) + global $wpdb; + + // Build author filter + $author_filter = current_user_can('edit_others_posts') ? '' : 'AND post_author = ' . intval($current_user_id); + + // Get events directly from database + $events = $wpdb->get_results( + "SELECT ID, post_title, post_date + FROM {$wpdb->posts} + WHERE post_type = 'tribe_events' + AND post_status = 'publish' + {$author_filter} + ORDER BY post_date DESC" ); - - // Allow admins to see all events - if (current_user_can('edit_others_posts')) { - unset($args['author']); - } - - $events = get_posts($args); // Check if user has any events if (empty($events)) {