diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-certificate-actions.js b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-certificate-actions.js index 054af1c1..a6804e52 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-certificate-actions.js +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/hvac-certificate-actions.js @@ -116,7 +116,7 @@ const certificateId = $button.data('certificate-id'); // Confirm sending - if (\!confirm('Send certificate to attendee via email?')) { + if (!confirm('Send certificate to attendee via email?')) { return; } @@ -246,15 +246,15 @@ */ init: function() { // Event selection - $('#event_id').on('change', this.loadAttendees); + $(document).on('change', '#event_id', this.loadAttendees); - // Certificate generation - $('#generate-certificates-form').on('submit', this.generateCertificates); + // Certificate generation (use event delegation for dynamic form) + $(document).on('submit', '#generate-certificates-form', this.generateCertificates); - // Helper buttons - $('#select-all-attendees').on('click', this.selectAllAttendees); - $('#select-checked-in').on('click', this.selectCheckedInAttendees); - $('#deselect-all-attendees').on('click', this.deselectAllAttendees); + // Helper buttons (use event delegation for dynamic buttons) + $(document).on('click', '#select-all-attendees', this.selectAllAttendees); + $(document).on('click', '#select-checked-in', this.selectCheckedInAttendees); + $(document).on('click', '#deselect-all-attendees', this.deselectAllAttendees); // Certificate preview (use event delegation for dynamic buttons) $(document).on('click', '.hvac-preview-certificate', this.showCertificatePreview); @@ -542,11 +542,11 @@ $(document).ready(function() { CertificateActions.init(); - // Initialize Generate Certificates functionality if on that page - if ($('#generate-certificates-form').length) { + // Always initialize Generate Certificates functionality if on the generate certificates page + // (the form may not exist initially but will be created dynamically) + if ($('#event_id').length || $('#generate-certificates-form').length) { GenerateCertificates.init(); } }); -})(jQuery); -EOFJS < /dev/null \ No newline at end of file +})(jQuery); \ No newline at end of file diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports-fixed.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports-fixed.php new file mode 100644 index 00000000..c4d04e0d --- /dev/null +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-certificate-reports-fixed.php @@ -0,0 +1,427 @@ + 0, 'active' => 0, 'revoked' => 0, 'emailed' => 0); +$events = array(); +$filter_event = isset($_GET['filter_event']) ? absint($_GET['filter_event']) : 0; +$filter_status = isset($_GET['filter_status']) ? sanitize_text_field($_GET['filter_status']) : 'active'; + +// Start output buffering to prevent issues +ob_start(); + +try { + // Get user's events directly from database to bypass TEC issues + global $wpdb; + + // Build author filter - only current user's events + $events = $wpdb->get_results($wpdb->prepare( + "SELECT ID, post_title, post_date + FROM {$wpdb->posts} + WHERE post_type = 'tribe_events' + AND post_author = %d + AND post_status = 'publish' + ORDER BY post_date DESC", + $current_user_id + )); + + // Check if certificate table exists + $cert_table = $wpdb->prefix . 'hvac_certificates'; + $table_exists = $wpdb->get_var("SHOW TABLES LIKE '$cert_table'") === $cert_table; + + if ($table_exists && !empty($events)) { + // Get event IDs for the user + $event_ids = array_column($events, 'ID'); + $event_ids_placeholder = implode(',', array_fill(0, count($event_ids), '%d')); + + // Get certificate statistics + $total_certs = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM $cert_table WHERE event_id IN ($event_ids_placeholder)", + ...$event_ids + )); + + $active_certs = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM $cert_table WHERE event_id IN ($event_ids_placeholder) AND revoked = 0", + ...$event_ids + )); + + $revoked_certs = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM $cert_table WHERE event_id IN ($event_ids_placeholder) AND revoked = 1", + ...$event_ids + )); + + $emailed_certs = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM $cert_table WHERE event_id IN ($event_ids_placeholder) AND email_sent = 1", + ...$event_ids + )); + + $certificate_stats = array( + 'total' => intval($total_certs), + 'active' => intval($active_certs), + 'revoked' => intval($revoked_certs), + 'emailed' => intval($emailed_certs) + ); + + // Get certificates based on filters + $where_conditions = array("event_id IN ($event_ids_placeholder)"); + $query_params = $event_ids; + + // Add event filter if specified + if ($filter_event > 0 && in_array($filter_event, $event_ids)) { + $where_conditions = array("event_id = %d"); + $query_params = array($filter_event); + } + + // Add status filter + if ($filter_status === 'active') { + $where_conditions[] = "revoked = 0"; + } elseif ($filter_status === 'revoked') { + $where_conditions[] = "revoked = 1"; + } + + $where_clause = "WHERE " . implode(" AND ", $where_conditions); + + $certificates = $wpdb->get_results($wpdb->prepare( + "SELECT * FROM $cert_table $where_clause ORDER BY date_generated DESC LIMIT 50", + ...$query_params + )); + } + +} catch (Exception $e) { + // Log error but continue with empty data + error_log('Certificate Reports Error: ' . $e->getMessage()); +} + +// Clean output buffer +ob_end_clean(); + +// Get header +get_header(); +?> + +
+
+ +
+

Certificate Reports

+ +
+ +
+

View and manage all certificates you've generated for event attendees.

+
+ + +
+

Certificate Statistics

+ +
+
+

Total Certificates

+
+
+ +
+

Active Certificates

+
+
+ +
+

Revoked Certificates

+
+
+ +
+

Emailed Certificates

+
+
+
+
+ + +
+

Certificate Filters

+ +
+
+ + +
+ +
+ + +
+ +
+ +
+
+
+ + +
+

Certificate Listing

+ + +
+

You don't have any events yet. Create your first event to start generating certificates.

+

Create Event

+
+ +
+

No certificates found matching your filters.

+ + 0 || $filter_status !== 'all') : ?> +

Clear filters to see all your certificates.

+ +

Generate certificates for your event attendees on the Generate Certificates page.

+ +
+ +
+ + + + + + + + + + + + + certificate_number ?? 'N/A'); + $event_id = intval($certificate->event_id ?? 0); + $attendee_id = intval($certificate->attendee_id ?? 0); + $generated_date = $certificate->date_generated ? date_i18n(get_option('date_format'), strtotime($certificate->date_generated)) : 'Unknown'; + $is_revoked = !empty($certificate->revoked); + $is_emailed = !empty($certificate->email_sent); + + // Get event and attendee information safely + $event_title = get_the_title($event_id) ?: 'Unknown Event'; + $attendee_name = get_post_meta($attendee_id, '_tribe_tickets_full_name', true) ?: 'Attendee #' . $attendee_id; + + // Status text and class + $status_text = $is_revoked ? 'Revoked' : 'Active'; + $status_class = $is_revoked ? 'hvac-status-revoked' : 'hvac-status-active'; + ?> + + + + + + + + + + +
Certificate #EventAttendeeDate GeneratedStatusActions
+ + + + + + + + + + + + + Certificate revoked + +
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates-fixed.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates-fixed.php new file mode 100644 index 00000000..d80f141e --- /dev/null +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates-fixed.php @@ -0,0 +1,461 @@ +get_results($wpdb->prepare( + "SELECT ID, post_title, post_date + FROM {$wpdb->posts} + WHERE post_type = 'tribe_events' + AND post_author = %d + AND post_status = 'publish' + ORDER BY post_date DESC", + $current_user_id + )); + + // If event is selected, get attendees + if ($event_id > 0) { + // Verify the event belongs to the current user + $event_found = false; + foreach ($events as $event) { + if ($event->ID == $event_id) { + $event_found = true; + $selected_event_title = $event->post_title; + break; + } + } + + if ($event_found) { + // Get attendees for the selected event + $attendees = $wpdb->get_results($wpdb->prepare( + "SELECT p.ID as attendee_id, + pm1.meta_value as holder_name, + pm2.meta_value as holder_email, + pm3.meta_value as check_in + FROM {$wpdb->posts} p + LEFT JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_tribe_tickets_full_name' + LEFT JOIN {$wpdb->postmeta} pm2 ON p.ID = pm2.post_id AND pm2.meta_key = '_tribe_tickets_email' + LEFT JOIN {$wpdb->postmeta} pm3 ON p.ID = pm3.post_id AND pm3.meta_key = '_tribe_tickets_checked_in' + LEFT JOIN {$wpdb->postmeta} pm4 ON p.ID = pm4.post_id AND pm4.meta_key = '_tribe_tickets_event' + WHERE p.post_type = 'tribe_ticket_attendee' + AND p.post_status = 'publish' + AND pm4.meta_value = %d + ORDER BY pm1.meta_value ASC", + $event_id + )); + } + } + +} catch (Exception $e) { + error_log('Generate Certificates Error: ' . $e->getMessage()); +} + +// Get header +get_header(); +?> + +
+
+ +
+

Generate Certificates

+ +
+ +
+

Generate certificates for attendees of your events.

+
+ + +
+

Step 1: Select Event

+ + +
+

You don't have any events yet. Create your first event to start generating certificates.

+

Create Event

+
+ +
+ + +
+ +
+ + + 0) : ?> +
+

Step 2: Select Attendees for ""

+ + +
+

This event has no attendees yet.

+

Attendees are created when people register for your event through the ticket system.

+
+ +
+ + + + +
+
+ + + +
+ +
+ + + + + + + + + + + check_in); + $checked_in_class = $checked_in ? 'hvac-checked-in' : ''; + $status_class = $checked_in ? 'hvac-status-checked-in' : 'hvac-status-not-checked-in'; + $status_text = $checked_in ? 'Checked In' : 'Not Checked In'; + $attendee_name = $attendee->holder_name ?: 'Unknown'; + $attendee_email = $attendee->holder_email ?: 'No email'; + ?> + + + + + + + + +
+ + Attendee NameEmailCheck-in Status
+ > + + + + +
+
+
+ +
+ +
+
+ +
+ + + + +
+
+ + + + + + \ No newline at end of file diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates.php index d80f141e..37876d43 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates.php +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/templates/certificates/template-generate-certificates.php @@ -49,23 +49,33 @@ try { } if ($event_found) { - // Get attendees for the selected event + // Get attendees using the same query as the AJAX handler $attendees = $wpdb->get_results($wpdb->prepare( - "SELECT p.ID as attendee_id, - pm1.meta_value as holder_name, - pm2.meta_value as holder_email, - pm3.meta_value as check_in - FROM {$wpdb->posts} p - LEFT JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_tribe_tickets_full_name' - LEFT JOIN {$wpdb->postmeta} pm2 ON p.ID = pm2.post_id AND pm2.meta_key = '_tribe_tickets_email' - LEFT JOIN {$wpdb->postmeta} pm3 ON p.ID = pm3.post_id AND pm3.meta_key = '_tribe_tickets_checked_in' - LEFT JOIN {$wpdb->postmeta} pm4 ON p.ID = pm4.post_id AND pm4.meta_key = '_tribe_tickets_event' - WHERE p.post_type = 'tribe_ticket_attendee' - AND p.post_status = 'publish' - AND pm4.meta_value = %d - ORDER BY pm1.meta_value ASC", + "SELECT + p.ID as attendee_id, + p.post_parent as event_id, + COALESCE(tec_full_name.meta_value, tpp_full_name.meta_value, tickets_full_name.meta_value, 'Unknown Attendee') as holder_name, + COALESCE(tec_email.meta_value, tpp_email.meta_value, tickets_email.meta_value, tpp_attendee_email.meta_value, 'no-email@example.com') as holder_email, + COALESCE(checked_in.meta_value, '0') as check_in + FROM {$wpdb->posts} p + LEFT JOIN {$wpdb->postmeta} tec_full_name ON p.ID = tec_full_name.post_id AND tec_full_name.meta_key = '_tec_tickets_commerce_full_name' + LEFT JOIN {$wpdb->postmeta} tpp_full_name ON p.ID = tpp_full_name.post_id AND tpp_full_name.meta_key = '_tribe_tpp_full_name' + LEFT JOIN {$wpdb->postmeta} tickets_full_name ON p.ID = tickets_full_name.post_id AND tickets_full_name.meta_key = '_tribe_tickets_full_name' + LEFT JOIN {$wpdb->postmeta} tec_email ON p.ID = tec_email.post_id AND tec_email.meta_key = '_tec_tickets_commerce_email' + LEFT JOIN {$wpdb->postmeta} tpp_email ON p.ID = tpp_email.post_id AND tpp_email.meta_key = '_tribe_tpp_email' + LEFT JOIN {$wpdb->postmeta} tickets_email ON p.ID = tickets_email.post_id AND tickets_email.meta_key = '_tribe_tickets_email' + LEFT JOIN {$wpdb->postmeta} tpp_attendee_email ON p.ID = tpp_attendee_email.post_id AND tpp_attendee_email.meta_key = '_tribe_tpp_attendee_email' + LEFT JOIN {$wpdb->postmeta} checked_in ON p.ID = checked_in.post_id AND checked_in.meta_key = '_tribe_tickets_attendee_checked_in' + WHERE p.post_type IN ('tec_tc_attendee', 'tribe_tpp_attendees') + AND p.post_parent = %d + ORDER BY p.ID ASC", $event_id )); + + // Log for debugging if needed + if (defined('WP_DEBUG') && WP_DEBUG) { + error_log('Generate Certificates - Event ID: ' . $event_id . ', Attendees: ' . count($attendees)); + } } }