🚨 CRITICAL: Fixed deployment blockers by adding missing core directories: **Community System (CRITICAL)** - includes/community/ - Login_Handler and all community classes - templates/community/ - Community login forms **Certificate System (CRITICAL)** - includes/certificates/ - 8+ certificate classes and handlers - templates/certificates/ - Certificate reports and generation templates **Core Individual Classes (CRITICAL)** - includes/class-hvac-event-summary.php - includes/class-hvac-trainer-profile-manager.php - includes/class-hvac-master-dashboard-data.php - Plus 40+ other individual HVAC classes **Major Feature Systems (HIGH)** - includes/database/ - Training leads database tables - includes/find-trainer/ - Find trainer directory and MapGeo integration - includes/google-sheets/ - Google Sheets integration system - includes/zoho/ - Complete Zoho CRM integration - includes/communication/ - Communication templates system **Template Infrastructure** - templates/attendee/, templates/email-attendees/ - templates/event-summary/, templates/status/ - templates/template-parts/ - Shared template components **Impact:** - 70+ files added covering 10+ missing directories - Resolves ALL deployment blockers and feature breakdowns - Plugin activation should now work correctly - Multi-machine deployment fully supported 🔧 Generated with Claude Code Co-Authored-By: Ben Reed <ben@tealmaker.com>
		
			
				
	
	
		
			230 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Certificate Reports Content Template (without page wrapper)
 | |
|  * Used by shortcode to output just the content
 | |
|  *
 | |
|  * @package HVAC_Community_Events
 | |
|  * @subpackage Templates/Certificates
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly
 | |
| if (!defined('ABSPATH')) {
 | |
|     exit;
 | |
| }
 | |
| 
 | |
| // Ensure proper CSS classes for styling
 | |
| echo '<div class="hvac-certificate-reports-content">';
 | |
| 
 | |
| // Get current user ID
 | |
| $current_user_id = get_current_user_id();
 | |
| 
 | |
| // Initialize variables with defaults
 | |
| $certificates = array();
 | |
| $certificate_stats = array('total' => 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';
 | |
| 
 | |
| // Removed problematic output buffering that interferes with WordPress header rendering
 | |
|     // Get user's events directly from database to bypass TEC issues
 | |
|     global $wpdb;
 | |
|     
 | |
|     $events_query = $wpdb->prepare("
 | |
|         SELECT DISTINCT p.ID, p.post_title 
 | |
|         FROM {$wpdb->posts} p
 | |
|         LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
 | |
|         WHERE p.post_type = 'tribe_events' 
 | |
|         AND p.post_status = 'publish'
 | |
|         AND p.post_author = %d
 | |
|         ORDER BY p.post_date DESC
 | |
|     ", $current_user_id);
 | |
|     
 | |
|     $events_results = $wpdb->get_results($events_query);
 | |
|     
 | |
|     if ($events_results) {
 | |
|         foreach ($events_results as $event) {
 | |
|             $events[$event->ID] = $event->post_title;
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     // Get certificate stats
 | |
|     $stats_query = $wpdb->prepare("
 | |
|         SELECT 
 | |
|             COUNT(DISTINCT c.id) as total,
 | |
|             COUNT(DISTINCT CASE WHEN c.status = 'active' THEN c.id END) as active,
 | |
|             COUNT(DISTINCT CASE WHEN c.status = 'revoked' THEN c.id END) as revoked,
 | |
|             COUNT(DISTINCT e.certificate_id) as emailed
 | |
|         FROM {$wpdb->prefix}hvac_certificates c
 | |
|         LEFT JOIN {$wpdb->prefix}hvac_certificate_emails e ON c.id = e.certificate_id
 | |
|         WHERE c.trainer_id = %d
 | |
|     ", $current_user_id);
 | |
|     
 | |
|     $stats = $wpdb->get_row($stats_query);
 | |
|     if ($stats) {
 | |
|         $certificate_stats = array(
 | |
|             'total' => (int)$stats->total,
 | |
|             'active' => (int)$stats->active,
 | |
|             'revoked' => (int)$stats->revoked,
 | |
|             'emailed' => (int)$stats->emailed
 | |
|         );
 | |
|     }
 | |
|     
 | |
|     // Build certificate query
 | |
|     $cert_query = "
 | |
|         SELECT DISTINCT c.*, a.name as attendee_name, a.email as attendee_email, 
 | |
|                e.post_title as event_name, pm.meta_value as event_date
 | |
|         FROM {$wpdb->prefix}hvac_certificates c
 | |
|         LEFT JOIN {$wpdb->prefix}hvac_attendees a ON c.attendee_id = a.id
 | |
|         LEFT JOIN {$wpdb->posts} e ON c.event_id = e.ID
 | |
|         LEFT JOIN {$wpdb->postmeta} pm ON e.ID = pm.post_id AND pm.meta_key = '_EventStartDate'
 | |
|         WHERE c.trainer_id = %d
 | |
|     ";
 | |
|     
 | |
|     $query_params = array($current_user_id);
 | |
|     
 | |
|     // Apply filters
 | |
|     if ($filter_event > 0) {
 | |
|         $cert_query .= " AND c.event_id = %d";
 | |
|         $query_params[] = $filter_event;
 | |
|     }
 | |
|     
 | |
|     if ($filter_status && $filter_status !== 'all') {
 | |
|         $cert_query .= " AND c.status = %s";
 | |
|         $query_params[] = $filter_status;
 | |
|     }
 | |
|     
 | |
|     $cert_query .= " ORDER BY c.date_generated DESC LIMIT 100";
 | |
|     
 | |
|     $certificates = $wpdb->get_results($wpdb->prepare($cert_query, $query_params));
 | |
| ?>
 | |
| 
 | |
| <div class="hvac-certificate-reports-content">
 | |
|     <div class="hvac-page-header">
 | |
|         <h1><?php _e('Certificate Reports', 'hvac-community-events'); ?></h1>
 | |
|         <p><?php _e('View and manage all certificates you\'ve generated for event attendees.', 'hvac-community-events'); ?></p>
 | |
|     </div>
 | |
|     
 | |
|     <!-- Certificate Statistics -->
 | |
|     <div class="hvac-certificate-stats">
 | |
|         <h2><?php _e('Certificate Statistics', 'hvac-community-events'); ?></h2>
 | |
|         <div class="hvac-stats-grid">
 | |
|             <div class="hvac-stat-card">
 | |
|                 <div class="hvac-stat-label"><?php _e('Total Certificates', 'hvac-community-events'); ?></div>
 | |
|                 <div class="hvac-stat-value"><?php echo esc_html($certificate_stats['total']); ?></div>
 | |
|             </div>
 | |
|             <div class="hvac-stat-card">
 | |
|                 <div class="hvac-stat-label"><?php _e('Active Certificates', 'hvac-community-events'); ?></div>
 | |
|                 <div class="hvac-stat-value"><?php echo esc_html($certificate_stats['active']); ?></div>
 | |
|             </div>
 | |
|             <div class="hvac-stat-card">
 | |
|                 <div class="hvac-stat-label"><?php _e('Revoked Certificates', 'hvac-community-events'); ?></div>
 | |
|                 <div class="hvac-stat-value"><?php echo esc_html($certificate_stats['revoked']); ?></div>
 | |
|             </div>
 | |
|             <div class="hvac-stat-card">
 | |
|                 <div class="hvac-stat-label"><?php _e('Emailed Certificates', 'hvac-community-events'); ?></div>
 | |
|                 <div class="hvac-stat-value"><?php echo esc_html($certificate_stats['emailed']); ?></div>
 | |
|             </div>
 | |
|         </div>
 | |
|     </div>
 | |
|     
 | |
|     <!-- Certificate Filters -->
 | |
|     <div class="hvac-certificate-filters">
 | |
|         <h2><?php _e('Certificate Filters', 'hvac-community-events'); ?></h2>
 | |
|         <form method="get" action="" class="hvac-filter-form">
 | |
|             <div class="hvac-filter-row">
 | |
|                 <div class="hvac-filter-group">
 | |
|                     <label for="filter_event"><?php _e('Event:', 'hvac-community-events'); ?></label>
 | |
|                     <select name="filter_event" id="filter_event">
 | |
|                         <option value="0"><?php _e('All Events', 'hvac-community-events'); ?></option>
 | |
|                         <?php foreach ($events as $event_id => $event_name): ?>
 | |
|                             <option value="<?php echo esc_attr($event_id); ?>" <?php selected($filter_event, $event_id); ?>>
 | |
|                                 <?php echo esc_html($event_name); ?>
 | |
|                             </option>
 | |
|                         <?php endforeach; ?>
 | |
|                     </select>
 | |
|                 </div>
 | |
|                 
 | |
|                 <div class="hvac-filter-group">
 | |
|                     <label for="filter_status"><?php _e('Status:', 'hvac-community-events'); ?></label>
 | |
|                     <select name="filter_status" id="filter_status">
 | |
|                         <option value="active" <?php selected($filter_status, 'active'); ?>><?php _e('Active Only', 'hvac-community-events'); ?></option>
 | |
|                         <option value="all" <?php selected($filter_status, 'all'); ?>><?php _e('All Certificates', 'hvac-community-events'); ?></option>
 | |
|                         <option value="revoked" <?php selected($filter_status, 'revoked'); ?>><?php _e('Revoked Only', 'hvac-community-events'); ?></option>
 | |
|                     </select>
 | |
|                 </div>
 | |
|                 
 | |
|                 <div class="hvac-filter-group">
 | |
|                     <button type="submit" class="hvac-button hvac-button-primary"><?php _e('Apply Filters', 'hvac-community-events'); ?></button>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </form>
 | |
|     </div>
 | |
|     
 | |
|     <!-- Certificate Listing -->
 | |
|     <div class="hvac-certificate-listing">
 | |
|         <h2><?php _e('Certificate Listing', 'hvac-community-events'); ?></h2>
 | |
|         
 | |
|         <?php if (empty($events)): ?>
 | |
|             <div class="hvac-notice hvac-notice-info">
 | |
|                 <p><?php _e('You don\'t have any events yet. Create your first event to start generating certificates.', 'hvac-community-events'); ?></p>
 | |
|                 <a href="/trainer/event/manage/" class="hvac-button hvac-button-primary"><?php _e('Create Event', 'hvac-community-events'); ?></a>
 | |
|             </div>
 | |
|         <?php elseif (empty($certificates)): ?>
 | |
|             <div class="hvac-notice hvac-notice-info">
 | |
|                 <p><?php _e('No certificates found matching your criteria.', 'hvac-community-events'); ?></p>
 | |
|                 <a href="/trainer/generate-certificates/" class="hvac-button hvac-button-primary"><?php _e('Generate Certificates', 'hvac-community-events'); ?></a>
 | |
|             </div>
 | |
|         <?php else: ?>
 | |
|             <div class="hvac-table-wrapper">
 | |
|                 <table class="hvac-certificates-table">
 | |
|                     <thead>
 | |
|                         <tr>
 | |
|                             <th><?php _e('Certificate ID', 'hvac-community-events'); ?></th>
 | |
|                             <th><?php _e('Attendee', 'hvac-community-events'); ?></th>
 | |
|                             <th><?php _e('Event', 'hvac-community-events'); ?></th>
 | |
|                             <th><?php _e('Date Generated', 'hvac-community-events'); ?></th>
 | |
|                             <th><?php _e('Status', 'hvac-community-events'); ?></th>
 | |
|                             <th><?php _e('Actions', 'hvac-community-events'); ?></th>
 | |
|                         </tr>
 | |
|                     </thead>
 | |
|                     <tbody>
 | |
|                         <?php foreach ($certificates as $certificate): ?>
 | |
|                             <tr>
 | |
|                                 <td><?php echo esc_html($certificate->certificate_number); ?></td>
 | |
|                                 <td>
 | |
|                                     <?php echo esc_html($certificate->attendee_name); ?><br>
 | |
|                                     <small><?php echo esc_html($certificate->attendee_email); ?></small>
 | |
|                                 </td>
 | |
|                                 <td><?php echo esc_html($certificate->event_name); ?></td>
 | |
|                                 <td><?php echo esc_html(date('M j, Y', strtotime($certificate->date_generated))); ?></td>
 | |
|                                 <td>
 | |
|                                     <span class="hvac-status hvac-status-<?php echo esc_attr($certificate->status); ?>">
 | |
|                                         <?php echo esc_html(ucfirst($certificate->status)); ?>
 | |
|                                     </span>
 | |
|                                 </td>
 | |
|                                 <td>
 | |
|                                     <div class="hvac-actions">
 | |
|                                         <a href="#" class="hvac-action-link hvac-view-certificate" 
 | |
|                                            data-certificate-id="<?php echo esc_attr($certificate->id); ?>">
 | |
|                                             <?php _e('View', 'hvac-community-events'); ?>
 | |
|                                         </a>
 | |
|                                         <?php if ($certificate->status === 'active'): ?>
 | |
|                                             <a href="#" class="hvac-action-link hvac-email-certificate" 
 | |
|                                                data-certificate-id="<?php echo esc_attr($certificate->id); ?>">
 | |
|                                                 <?php _e('Email', 'hvac-community-events'); ?>
 | |
|                                             </a>
 | |
|                                             <a href="#" class="hvac-action-link hvac-revoke-certificate" 
 | |
|                                                data-certificate-id="<?php echo esc_attr($certificate->id); ?>">
 | |
|                                                 <?php _e('Revoke', 'hvac-community-events'); ?>
 | |
|                                             </a>
 | |
|                                         <?php endif; ?>
 | |
|                                     </div>
 | |
|                                 </td>
 | |
|                             </tr>
 | |
|                         <?php endforeach; ?>
 | |
|                     </tbody>
 | |
|                 </table>
 | |
|             </div>
 | |
|         <?php endif; ?>
 | |
|     </div>
 | |
| </div>
 |