- Updated comprehensive test data script to use proper deployment configuration - Fixed test data script file paths and deployment process - Enhanced login form with better error/success messaging - Improved Zoho admin interface with detailed OAuth flow - Fixed login page styling to prevent theme constraints - Added proper error handling for expired/invalid Zoho tokens 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			716 lines
		
	
	
		
			No EOL
		
	
	
		
			28 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			716 lines
		
	
	
		
			No EOL
		
	
	
		
			28 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Create extensive test data for test_trainer with realistic patterns and variety
 | |
| 
 | |
| # Load configuration
 | |
| source bin/deploy-config.sh
 | |
| 
 | |
| echo "=== Creating Extensive Test Data for test_trainer ==="
 | |
| echo "Remote host: $REMOTE_HOST"
 | |
| echo "Remote user: $REMOTE_USER"
 | |
| echo "WordPress path: $REMOTE_PATH_BASE"
 | |
| echo "==============================="
 | |
| 
 | |
| # Create comprehensive PHP script to run on server
 | |
| cat << 'EOF' > /tmp/extensive-test-data.php
 | |
| <?php
 | |
| /**
 | |
|  * Extensive Test Data Generator for HVAC Community Events
 | |
|  * 
 | |
|  * Creates realistic training event data including:
 | |
|  * - Past events (6 months back) with full attendee and certificate data
 | |
|  * - Current/upcoming events with various states
 | |
|  * - Varied pricing, attendance patterns, and venues
 | |
|  * - Complete certificate lifecycle (active, revoked, emailed)
 | |
|  */
 | |
| 
 | |
| // Load WordPress
 | |
| require_once('wp-load.php');
 | |
| 
 | |
| // Ensure required plugins are active
 | |
| if (!class_exists('Tribe__Events__Main') || !class_exists('Tribe__Tickets__Main')) {
 | |
|     die("Required plugins (The Events Calendar or Event Tickets) are not active\n");
 | |
| }
 | |
| 
 | |
| echo "=== Creating Extensive Test Data for test_trainer ===\n\n";
 | |
| 
 | |
| // Get the test trainer user
 | |
| $test_trainer = get_user_by('login', 'test_trainer');
 | |
| if (!$test_trainer) {
 | |
|     die("test_trainer user not found. Please create this user first.\n");
 | |
| }
 | |
| 
 | |
| $trainer_id = $test_trainer->ID;
 | |
| echo "Found test_trainer user ID: {$trainer_id}\n\n";
 | |
| 
 | |
| // Initialize certificate manager if available
 | |
| $certificate_manager = null;
 | |
| if (class_exists('HVAC_Certificate_Manager')) {
 | |
|     $certificate_manager = HVAC_Certificate_Manager::instance();
 | |
|     echo "Certificate manager initialized\n";
 | |
| } else {
 | |
|     echo "Certificate manager not available - certificates will not be generated\n";
 | |
| }
 | |
| 
 | |
| // Ensure certificate table exists
 | |
| if ($certificate_manager) {
 | |
|     global $wpdb;
 | |
|     $table_name = $wpdb->prefix . 'hvac_certificates';
 | |
|     $table_exists = $wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name;
 | |
|     
 | |
|     if (!$table_exists && class_exists('HVAC_Certificate_Installer')) {
 | |
|         echo "Creating certificate table...\n";
 | |
|         $installer = HVAC_Certificate_Installer::instance();
 | |
|         $installer->create_tables();
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Create certificate storage directory
 | |
| $upload_dir = wp_upload_dir();
 | |
| $cert_dir = $upload_dir['basedir'] . '/' . get_option('hvac_certificate_storage_path', 'hvac-certificates');
 | |
| if (!file_exists($cert_dir)) {
 | |
|     wp_mkdir_p($cert_dir);
 | |
| }
 | |
| 
 | |
| // Define comprehensive event dataset
 | |
| $event_categories = [
 | |
|     'Basic' => [
 | |
|         'price_range' => [150, 300],
 | |
|         'duration_hours' => [6, 8],
 | |
|         'capacity_range' => [20, 35],
 | |
|         'attendance_rate' => 0.85
 | |
|     ],
 | |
|     'Intermediate' => [
 | |
|         'price_range' => [300, 500],
 | |
|         'duration_hours' => [8, 12],
 | |
|         'capacity_range' => [15, 25],
 | |
|         'attendance_rate' => 0.75
 | |
|     ],
 | |
|     'Advanced' => [
 | |
|         'price_range' => [500, 800],
 | |
|         'duration_hours' => [12, 16],
 | |
|         'capacity_range' => [10, 20],
 | |
|         'attendance_rate' => 0.65
 | |
|     ],
 | |
|     'Certification' => [
 | |
|         'price_range' => [800, 1200],
 | |
|         'duration_hours' => [16, 24],
 | |
|         'capacity_range' => [8, 15],
 | |
|         'attendance_rate' => 0.90
 | |
|     ]
 | |
| ];
 | |
| 
 | |
| // Event templates with variety
 | |
| $event_templates = [
 | |
|     // Basic Level Events
 | |
|     [
 | |
|         'title' => 'HVAC Fundamentals Workshop',
 | |
|         'description' => 'Essential HVAC principles for new technicians entering the field.',
 | |
|         'category' => 'Basic',
 | |
|         'venue_type' => 'Training Center'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Residential HVAC Basics',
 | |
|         'description' => 'Introduction to residential HVAC systems, components, and basic maintenance.',
 | |
|         'category' => 'Basic',
 | |
|         'venue_type' => 'Community College'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Safety in HVAC Work',
 | |
|         'description' => 'Comprehensive safety training for HVAC professionals.',
 | |
|         'category' => 'Basic',
 | |
|         'venue_type' => 'Safety Training Center'
 | |
|     ],
 | |
|     
 | |
|     // Intermediate Level Events
 | |
|     [
 | |
|         'title' => 'HVAC System Diagnostics',
 | |
|         'description' => 'Advanced troubleshooting techniques for complex HVAC issues.',
 | |
|         'category' => 'Intermediate',
 | |
|         'venue_type' => 'Technical Institute'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Commercial HVAC Systems',
 | |
|         'description' => 'Understanding large-scale commercial HVAC installations and maintenance.',
 | |
|         'category' => 'Intermediate',
 | |
|         'venue_type' => 'Industry Training Facility'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Heat Pump Technology Workshop',
 | |
|         'description' => 'Modern heat pump systems, installation, and troubleshooting.',
 | |
|         'category' => 'Intermediate',
 | |
|         'venue_type' => 'Manufacturer Training Center'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Ductwork Design and Installation',
 | |
|         'description' => 'Proper ductwork sizing, installation, and air balancing techniques.',
 | |
|         'category' => 'Intermediate',
 | |
|         'venue_type' => 'Construction Training Center'
 | |
|     ],
 | |
|     
 | |
|     // Advanced Level Events
 | |
|     [
 | |
|         'title' => 'Building Automation Systems',
 | |
|         'description' => 'Integration of HVAC with smart building control systems.',
 | |
|         'category' => 'Advanced',
 | |
|         'venue_type' => 'Technology Center'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Variable Refrigerant Flow (VRF) Systems',
 | |
|         'description' => 'Advanced VRF system design, installation, and maintenance.',
 | |
|         'category' => 'Advanced',
 | |
|         'venue_type' => 'Manufacturer Facility'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Geothermal HVAC Systems',
 | |
|         'description' => 'Ground-source heat pump systems and installation techniques.',
 | |
|         'category' => 'Advanced',
 | |
|         'venue_type' => 'Green Energy Institute'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Advanced Refrigeration Controls',
 | |
|         'description' => 'Complex refrigeration control systems and electronic diagnostics.',
 | |
|         'category' => 'Advanced',
 | |
|         'venue_type' => 'Refrigeration Lab'
 | |
|     ],
 | |
|     
 | |
|     // Certification Level Events
 | |
|     [
 | |
|         'title' => 'EPA 608 Certification Prep',
 | |
|         'description' => 'Comprehensive preparation for EPA Section 608 certification exam.',
 | |
|         'category' => 'Certification',
 | |
|         'venue_type' => 'Certification Center'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'NATE Certification Workshop',
 | |
|         'description' => 'Preparation for North American Technician Excellence certification.',
 | |
|         'category' => 'Certification',
 | |
|         'venue_type' => 'Testing Center'
 | |
|     ],
 | |
|     [
 | |
|         'title' => 'Commercial Refrigeration Certification',
 | |
|         'description' => 'Professional certification in commercial refrigeration systems.',
 | |
|         'category' => 'Certification',
 | |
|         'venue_type' => 'Industry Association'
 | |
|     ]
 | |
| ];
 | |
| 
 | |
| // Venue locations across different regions
 | |
| $venues = [
 | |
|     'Training Center' => [
 | |
|         'addresses' => [
 | |
|             '123 Industrial Blvd, Phoenix, AZ 85001',
 | |
|             '456 Tech Park Way, Denver, CO 80202',
 | |
|             '789 Training Ave, Atlanta, GA 30303'
 | |
|         ]
 | |
|     ],
 | |
|     'Community College' => [
 | |
|         'addresses' => [
 | |
|             '321 College Dr, Orlando, FL 32801',
 | |
|             '654 Education Rd, Austin, TX 78701',
 | |
|             '987 Campus Blvd, Sacramento, CA 95814'
 | |
|         ]
 | |
|     ],
 | |
|     'Technical Institute' => [
 | |
|         'addresses' => [
 | |
|             '111 Technical Way, Cleveland, OH 44101',
 | |
|             '222 Institute Dr, Milwaukee, WI 53201',
 | |
|             '333 Vocational St, Kansas City, MO 64101'
 | |
|         ]
 | |
|     ],
 | |
|     'Manufacturer Training Center' => [
 | |
|         'addresses' => [
 | |
|             '444 Industrial Park, Charlotte, NC 28201',
 | |
|             '555 Manufacturing Dr, Indianapolis, IN 46201',
 | |
|             '666 Factory Rd, Nashville, TN 37201'
 | |
|         ]
 | |
|     ],
 | |
|     'Technology Center' => [
 | |
|         'addresses' => [
 | |
|             '777 Innovation Blvd, Seattle, WA 98101',
 | |
|             '888 Tech Valley Dr, San Jose, CA 95101',
 | |
|             '999 Digital Way, Raleigh, NC 27601'
 | |
|         ]
 | |
|     ],
 | |
|     'Safety Training Center' => [
 | |
|         'addresses' => [
 | |
|             '147 Safety First St, Houston, TX 77001',
 | |
|             '258 Protection Ave, Detroit, MI 48201',
 | |
|             '369 Secure Blvd, Las Vegas, NV 89101'
 | |
|         ]
 | |
|     ],
 | |
|     'Industry Training Facility' => [
 | |
|         'addresses' => [
 | |
|             '159 Industry Dr, Pittsburgh, PA 15201',
 | |
|             '267 Commerce Way, Memphis, TN 38101',
 | |
|             '375 Trade Center Rd, Oklahoma City, OK 73101'
 | |
|         ]
 | |
|     ],
 | |
|     'Construction Training Center' => [
 | |
|         'addresses' => [
 | |
|             '483 Builder St, Louisville, KY 40201',
 | |
|             '591 Construction Ave, Richmond, VA 23220',
 | |
|             '627 Contractor Blvd, Salt Lake City, UT 84101'
 | |
|         ]
 | |
|     ],
 | |
|     'Green Energy Institute' => [
 | |
|         'addresses' => [
 | |
|             '735 Renewable Dr, Portland, OR 97201',
 | |
|             '841 Sustainable Way, Burlington, VT 05401',
 | |
|             '957 Eco-Friendly St, Madison, WI 53701'
 | |
|         ]
 | |
|     ],
 | |
|     'Refrigeration Lab' => [
 | |
|         'addresses' => [
 | |
|             '163 Cooling Blvd, Minneapolis, MN 55401',
 | |
|             '279 Freezer Ave, Buffalo, NY 14201',
 | |
|             '385 Chiller Dr, Des Moines, IA 50301'
 | |
|         ]
 | |
|     ],
 | |
|     'Certification Center' => [
 | |
|         'addresses' => [
 | |
|             '491 Testing Pkwy, Jacksonville, FL 32201',
 | |
|             '537 Exam Center Dr, Albuquerque, NM 87101',
 | |
|             '683 Credential Ave, Boise, ID 83701'
 | |
|         ]
 | |
|     ],
 | |
|     'Testing Center' => [
 | |
|         'addresses' => [
 | |
|             '729 Assessment St, Fresno, CA 93701',
 | |
|             '845 Evaluation Way, Tucson, AZ 85701',
 | |
|             '961 Certification Rd, Spokane, WA 99201'
 | |
|         ]
 | |
|     ],
 | |
|     'Industry Association' => [
 | |
|         'addresses' => [
 | |
|             '187 Professional Blvd, Omaha, NE 68101',
 | |
|             '293 Association Dr, Little Rock, AR 72201',
 | |
|             '349 Guild Way, Hartford, CT 06101'
 | |
|         ]
 | |
|     ]
 | |
| ];
 | |
| 
 | |
| // Diverse attendee names and demographics
 | |
| $first_names = [
 | |
|     'James', 'Robert', 'John', 'Michael', 'David', 'William', 'Richard', 'Joseph', 'Christopher', 'Matthew',
 | |
|     'Mary', 'Patricia', 'Jennifer', 'Linda', 'Elizabeth', 'Barbara', 'Susan', 'Jessica', 'Sarah', 'Karen',
 | |
|     'Anthony', 'Mark', 'Donald', 'Steven', 'Paul', 'Andrew', 'Joshua', 'Kenneth', 'Kevin', 'Brian',
 | |
|     'Nancy', 'Lisa', 'Betty', 'Helen', 'Sandra', 'Donna', 'Carol', 'Ruth', 'Sharon', 'Michelle',
 | |
|     'Daniel', 'Thomas', 'Jose', 'Charles', 'Benjamin', 'Jonathan', 'Frank', 'Gregory', 'Raymond', 'Alexander',
 | |
|     'Emily', 'Kimberly', 'Deborah', 'Dorothy', 'Amy', 'Angela', 'Ashley', 'Virginia', 'Kathleen', 'Pamela'
 | |
| ];
 | |
| 
 | |
| $last_names = [
 | |
|     'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez',
 | |
|     'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson', 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin',
 | |
|     'Lee', 'Perez', 'Thompson', 'White', 'Harris', 'Sanchez', 'Clark', 'Ramirez', 'Lewis', 'Robinson',
 | |
|     'Walker', 'Young', 'Allen', 'King', 'Wright', 'Scott', 'Torres', 'Nguyen', 'Hill', 'Flores',
 | |
|     'Green', 'Adams', 'Nelson', 'Baker', 'Hall', 'Rivera', 'Campbell', 'Mitchell', 'Carter', 'Roberts'
 | |
| ];
 | |
| 
 | |
| $email_domains = [
 | |
|     'gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com', 'aol.com', 'icloud.com',
 | |
|     'hvactech.com', 'contractormail.com', 'servicepro.net', 'fieldtech.org'
 | |
| ];
 | |
| 
 | |
| // Generate event schedule (6 months past to 6 months future)
 | |
| $events_to_create = [];
 | |
| $start_date = new DateTime('-6 months');
 | |
| $end_date = new DateTime('+6 months');
 | |
| 
 | |
| // Create events throughout the timeline
 | |
| for ($month = 0; $month < 12; $month++) {
 | |
|     $current_month = clone $start_date;
 | |
|     $current_month->add(new DateInterval('P' . $month . 'M'));
 | |
|     
 | |
|     // 2-4 events per month with seasonal variation
 | |
|     $events_this_month = rand(2, 4);
 | |
|     if ($current_month->format('n') >= 6 && $current_month->format('n') <= 8) {
 | |
|         $events_this_month = rand(3, 5); // Summer training season
 | |
|     }
 | |
|     
 | |
|     for ($event_num = 0; $event_num < $events_this_month; $event_num++) {
 | |
|         $template = $event_templates[array_rand($event_templates)];
 | |
|         $category = $event_categories[$template['category']];
 | |
|         
 | |
|         // Random day within the month (avoid weekends for most events)
 | |
|         $day = rand(1, 28);
 | |
|         $event_date = clone $current_month;
 | |
|         $event_date->setDate($current_month->format('Y'), $current_month->format('n'), $day);
 | |
|         
 | |
|         // Adjust to weekday
 | |
|         while ($event_date->format('N') >= 6) { // Weekend
 | |
|             $event_date->modify('+1 day');
 | |
|         }
 | |
|         
 | |
|         // Random start time (8 AM to 10 AM)
 | |
|         $start_hour = rand(8, 10);
 | |
|         $event_date->setTime($start_hour, 0, 0);
 | |
|         
 | |
|         // Calculate end date based on duration
 | |
|         $duration = rand($category['duration_hours'][0], $category['duration_hours'][1]);
 | |
|         $end_date_obj = clone $event_date;
 | |
|         $end_date_obj->add(new DateInterval('PT' . $duration . 'H'));
 | |
|         
 | |
|         // Generate pricing
 | |
|         $price = rand($category['price_range'][0], $category['price_range'][1]);
 | |
|         $capacity = rand($category['capacity_range'][0], $category['capacity_range'][1]);
 | |
|         
 | |
|         // Calculate realistic attendance
 | |
|         $attendance_rate = $category['attendance_rate'] + (rand(-10, 10) / 100); // ±10% variation
 | |
|         $attendees = max(1, min($capacity, round($capacity * $attendance_rate)));
 | |
|         
 | |
|         // Check-in rate varies by event type and timing
 | |
|         $checkin_rate = 0.85; // Base rate
 | |
|         if ($template['category'] === 'Certification') {
 | |
|             $checkin_rate = 0.95; // Higher for certification events
 | |
|         }
 | |
|         if ($event_date < new DateTime('-1 month')) {
 | |
|             $checkin_rate += 0.05; // Slightly higher for past events
 | |
|         }
 | |
|         
 | |
|         $checkins = round($attendees * ($checkin_rate + (rand(-5, 5) / 100)));
 | |
|         $checkins = max(0, min($attendees, $checkins));
 | |
|         
 | |
|         // Select venue
 | |
|         $venue_addresses = $venues[$template['venue_type']]['addresses'];
 | |
|         $venue_address = $venue_addresses[array_rand($venue_addresses)];
 | |
|         
 | |
|         $events_to_create[] = [
 | |
|             'title' => $template['title'],
 | |
|             'description' => $template['description'],
 | |
|             'category' => $template['category'],
 | |
|             'venue_type' => $template['venue_type'],
 | |
|             'venue_address' => $venue_address,
 | |
|             'start_date' => $event_date->format('Y-m-d H:i:s'),
 | |
|             'end_date' => $end_date_obj->format('Y-m-d H:i:s'),
 | |
|             'price' => $price,
 | |
|             'capacity' => $capacity,
 | |
|             'attendees' => $attendees,
 | |
|             'checkins' => $checkins,
 | |
|             'is_past' => $event_date < new DateTime()
 | |
|         ];
 | |
|     }
 | |
| }
 | |
| 
 | |
| echo "Planning to create " . count($events_to_create) . " events\n\n";
 | |
| 
 | |
| // Create events
 | |
| $created_events = 0;
 | |
| $total_attendees = 0;
 | |
| $total_checkins = 0;
 | |
| $total_certificates = 0;
 | |
| 
 | |
| foreach ($events_to_create as $event_data) {
 | |
|     echo "Creating: {$event_data['title']} ({$event_data['start_date']})\n";
 | |
|     
 | |
|     // Create event post
 | |
|     $event_args = [
 | |
|         'post_title' => $event_data['title'],
 | |
|         'post_content' => $event_data['description'],
 | |
|         'post_status' => 'publish',
 | |
|         'post_type' => Tribe__Events__Main::POSTTYPE,
 | |
|         'post_author' => $trainer_id
 | |
|     ];
 | |
|     
 | |
|     $event_id = wp_insert_post($event_args);
 | |
|     
 | |
|     if (is_wp_error($event_id)) {
 | |
|         echo "  ERROR: Failed to create event: " . $event_id->get_error_message() . "\n";
 | |
|         continue;
 | |
|     }
 | |
|     
 | |
|     // Add event meta
 | |
|     update_post_meta($event_id, '_EventStartDate', $event_data['start_date']);
 | |
|     update_post_meta($event_id, '_EventEndDate', $event_data['end_date']);
 | |
|     update_post_meta($event_id, '_EventStartDateUTC', $event_data['start_date']);
 | |
|     update_post_meta($event_id, '_EventEndDateUTC', $event_data['end_date']);
 | |
|     update_post_meta($event_id, '_EventTimezone', 'America/New_York');
 | |
|     update_post_meta($event_id, '_EventCost', $event_data['price']);
 | |
|     
 | |
|     // Create venue
 | |
|     $venue_name = $event_data['venue_type'] . " - " . explode(',', $event_data['venue_address'])[1];
 | |
|     $venue_args = [
 | |
|         'post_title' => trim($venue_name),
 | |
|         'post_status' => 'publish',
 | |
|         'post_type' => Tribe__Events__Main::VENUE_POST_TYPE,
 | |
|         'post_author' => $trainer_id
 | |
|     ];
 | |
|     
 | |
|     $venue_id = wp_insert_post($venue_args);
 | |
|     
 | |
|     if (!is_wp_error($venue_id)) {
 | |
|         $address_parts = explode(', ', $event_data['venue_address']);
 | |
|         $city_state = explode(', ', $address_parts[1] ?? '');
 | |
|         $state_zip = explode(' ', $city_state[1] ?? '');
 | |
|         
 | |
|         update_post_meta($venue_id, '_VenueAddress', $address_parts[0] ?? '');
 | |
|         update_post_meta($venue_id, '_VenueCity', $city_state[0] ?? '');
 | |
|         update_post_meta($venue_id, '_VenueState', $state_zip[0] ?? '');
 | |
|         update_post_meta($venue_id, '_VenueZip', $state_zip[1] ?? '');
 | |
|         update_post_meta($venue_id, '_VenueCountry', 'USA');
 | |
|         update_post_meta($event_id, '_EventVenueID', $venue_id);
 | |
|     }
 | |
|     
 | |
|     // Create organizer
 | |
|     $organizer_args = [
 | |
|         'post_title' => "HVAC Training Professional",
 | |
|         'post_status' => 'publish',
 | |
|         'post_type' => Tribe__Events__Main::ORGANIZER_POST_TYPE,
 | |
|         'post_author' => $trainer_id
 | |
|     ];
 | |
|     
 | |
|     $organizer_id = wp_insert_post($organizer_args);
 | |
|     
 | |
|     if (!is_wp_error($organizer_id)) {
 | |
|         update_post_meta($organizer_id, '_OrganizerEmail', 'trainer@hvactraining.com');
 | |
|         update_post_meta($organizer_id, '_OrganizerPhone', '555-HVAC-PRO');
 | |
|         update_post_meta($organizer_id, '_OrganizerWebsite', 'https://hvactraining.com');
 | |
|         update_post_meta($event_id, '_EventOrganizerID', $organizer_id);
 | |
|     }
 | |
|     
 | |
|     // Create ticket (using PayPal provider from Event Tickets Plus)
 | |
|     $ticket_id = null;
 | |
|     if (class_exists('Tribe__Tickets_Plus__Commerce__PayPal__Main')) {
 | |
|         $ticket_args = [
 | |
|             'post_title' => "Registration - {$event_data['title']}",
 | |
|             'post_content' => "Ticket for {$event_data['title']}",
 | |
|             'post_status' => 'publish',
 | |
|             'post_type' => 'tribe_tpp_tickets',
 | |
|         ];
 | |
|         
 | |
|         $ticket_id = wp_insert_post($ticket_args);
 | |
|         
 | |
|         if (!is_wp_error($ticket_id)) {
 | |
|             update_post_meta($ticket_id, '_tribe_tpp_for_event', $event_id);
 | |
|             update_post_meta($ticket_id, '_tribe_tpp_enabled', 'yes');
 | |
|             update_post_meta($ticket_id, '_price', $event_data['price']);
 | |
|             update_post_meta($ticket_id, '_capacity', $event_data['capacity']);
 | |
|             update_post_meta($ticket_id, '_stock', max(0, $event_data['capacity'] - $event_data['attendees']));
 | |
|             update_post_meta($ticket_id, '_manage_stock', 'yes');
 | |
|             update_post_meta($event_id, '_tribe_default_ticket_provider', 'Tribe__Tickets_Plus__Commerce__PayPal__Main');
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     // Create attendees
 | |
|     if ($ticket_id && $event_data['attendees'] > 0) {
 | |
|         $attendee_ids = [];
 | |
|         
 | |
|         for ($i = 1; $i <= $event_data['attendees']; $i++) {
 | |
|             // Generate realistic attendee data
 | |
|             $first_name = $first_names[array_rand($first_names)];
 | |
|             $last_name = $last_names[array_rand($last_names)];
 | |
|             $domain = $email_domains[array_rand($email_domains)];
 | |
|             $email = strtolower($first_name . '.' . $last_name . '.' . rand(100, 999) . '@' . $domain);
 | |
|             
 | |
|             // Special case for first attendee
 | |
|             if ($i === 1) {
 | |
|                 $first_name = "Ben";
 | |
|                 $last_name = "Tester";
 | |
|                 $email = "ben@tealmaker.com";
 | |
|             }
 | |
|             
 | |
|             // Create attendee post
 | |
|             $attendee_args = [
 | |
|                 'post_title' => "{$first_name} {$last_name}",
 | |
|                 'post_content' => '',
 | |
|                 'post_status' => 'publish',
 | |
|                 'post_type' => 'tribe_tpp_attendees',
 | |
|             ];
 | |
|             
 | |
|             $attendee_id = wp_insert_post($attendee_args);
 | |
|             
 | |
|             if (is_wp_error($attendee_id)) {
 | |
|                 continue;
 | |
|             }
 | |
|             
 | |
|             $attendee_ids[] = $attendee_id;
 | |
|             
 | |
|             // Add attendee meta
 | |
|             $order_id = 'ORDER-' . $event_id . '-' . str_pad($i, 3, '0', STR_PAD_LEFT) . '-' . uniqid();
 | |
|             $security_code = wp_generate_password(10, false);
 | |
|             
 | |
|             $meta_fields = [
 | |
|                 '_tribe_tickets_full_name' => "{$first_name} {$last_name}",
 | |
|                 '_tribe_tickets_email' => $email,
 | |
|                 '_tribe_tpp_full_name' => "{$first_name} {$last_name}",
 | |
|                 '_tribe_tpp_email' => $email,
 | |
|                 '_tribe_tpp_event' => $event_id,
 | |
|                 '_tribe_tpp_product' => $ticket_id,
 | |
|                 '_tribe_tpp_order' => $order_id,
 | |
|                 '_tribe_tpp_security_code' => $security_code,
 | |
|                 '_tribe_tickets_order_status' => 'complete',
 | |
|                 '_tribe_tpp_attendee_optout' => 'no',
 | |
|                 '_tribe_tickets_attendee_user_id' => 0,
 | |
|             ];
 | |
|             
 | |
|             foreach ($meta_fields as $key => $value) {
 | |
|                 update_post_meta($attendee_id, $key, $value);
 | |
|             }
 | |
|             
 | |
|             // Check in attendees based on calculated rate
 | |
|             if ($i <= $event_data['checkins']) {
 | |
|                 update_post_meta($attendee_id, '_tribe_tpp_checkin', 1);
 | |
|                 update_post_meta($attendee_id, '_tribe_tpp_checked_in', 1);
 | |
|                 update_post_meta($attendee_id, '_tribe_tickets_checkin_status', 1);
 | |
|                 update_post_meta($attendee_id, 'check_in', 1);
 | |
|                 update_post_meta($attendee_id, '_tribe_tpp_checkin_status', 1);
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         // Update ticket and event counts
 | |
|         update_post_meta($ticket_id, '_tribe_tpp_sold', $event_data['attendees']);
 | |
|         update_post_meta($ticket_id, '_tribe_ticket_sold', $event_data['attendees']);
 | |
|         update_post_meta($event_id, '_tribe_ticket_sold_count', $event_data['attendees']);
 | |
|         
 | |
|         $total_attendees += $event_data['attendees'];
 | |
|         $total_checkins += $event_data['checkins'];
 | |
|     }
 | |
|     
 | |
|     // Generate certificates for past events with check-ins
 | |
|     if ($certificate_manager && $event_data['is_past'] && $event_data['checkins'] > 0) {
 | |
|         $checked_in_attendees = get_posts([
 | |
|             'post_type' => 'tribe_tpp_attendees',
 | |
|             'meta_query' => [
 | |
|                 'relation' => 'AND',
 | |
|                 [
 | |
|                     'key' => '_tribe_tpp_event',
 | |
|                     'value' => $event_id,
 | |
|                 ],
 | |
|                 [
 | |
|                     'key' => '_tribe_tpp_checkin',
 | |
|                     'value' => 1,
 | |
|                 ]
 | |
|             ],
 | |
|             'posts_per_page' => -1
 | |
|         ]);
 | |
|         
 | |
|         $certificates_created = 0;
 | |
|         $certificates_revoked = 0;
 | |
|         $certificates_emailed = 0;
 | |
|         
 | |
|         foreach ($checked_in_attendees as $attendee) {
 | |
|             $attendee_id = $attendee->ID;
 | |
|             
 | |
|             // Skip if certificate already exists
 | |
|             if ($certificate_manager->certificate_exists($event_id, $attendee_id)) {
 | |
|                 continue;
 | |
|             }
 | |
|             
 | |
|             // Create certificate file path
 | |
|             $year = date('Y', strtotime($event_data['start_date']));
 | |
|             $month = date('m', strtotime($event_data['start_date']));
 | |
|             $certificate_filename = "certificate-{$event_id}-{$attendee_id}-" . time() . ".pdf";
 | |
|             $certificate_relative_path = "hvac-certificates/{$year}/{$month}/{$certificate_filename}";
 | |
|             
 | |
|             // Create directory structure
 | |
|             $year_month_dir = $cert_dir . "/{$year}/{$month}";
 | |
|             if (!file_exists($year_month_dir)) {
 | |
|                 wp_mkdir_p($year_month_dir);
 | |
|             }
 | |
|             
 | |
|             // Create certificate record
 | |
|             $certificate_id = $certificate_manager->create_certificate(
 | |
|                 $event_id,
 | |
|                 $attendee_id,
 | |
|                 0, // user_id
 | |
|                 $certificate_relative_path,
 | |
|                 $trainer_id
 | |
|             );
 | |
|             
 | |
|             if ($certificate_id) {
 | |
|                 $certificates_created++;
 | |
|                 $total_certificates++;
 | |
|                 
 | |
|                 // Create placeholder certificate file
 | |
|                 $certificate_full_path = $upload_dir['basedir'] . '/' . $certificate_relative_path;
 | |
|                 file_put_contents($certificate_full_path, "Placeholder for certificate PDF (Generated for testing)");
 | |
|                 
 | |
|                 // Randomly vary certificate states for testing
 | |
|                 $random = mt_rand(1, 100);
 | |
|                 
 | |
|                 // Revoke ~5% of certificates
 | |
|                 if ($random <= 5) {
 | |
|                     $certificate_manager->revoke_certificate(
 | |
|                         $certificate_id,
 | |
|                         $trainer_id,
 | |
|                         "Test revocation for data variety"
 | |
|                     );
 | |
|                     $certificates_revoked++;
 | |
|                 }
 | |
|                 
 | |
|                 // Mark ~80% as emailed
 | |
|                 if ($random <= 80) {
 | |
|                     $certificate_manager->mark_certificate_emailed($certificate_id);
 | |
|                     $certificates_emailed++;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         if ($certificates_created > 0) {
 | |
|             echo "  Generated {$certificates_created} certificates ({$certificates_revoked} revoked, {$certificates_emailed} emailed)\n";
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     $created_events++;
 | |
|     echo "  Event created successfully (ID: {$event_id})\n";
 | |
| }
 | |
| 
 | |
| echo "\n=== Test Data Creation Summary ===\n";
 | |
| echo "Events created: {$created_events}\n";
 | |
| echo "Total attendees: {$total_attendees}\n";
 | |
| echo "Total check-ins: {$total_checkins}\n";
 | |
| echo "Total certificates: {$total_certificates}\n";
 | |
| 
 | |
| // Get certificate statistics if available
 | |
| if ($certificate_manager && class_exists('HVAC_Certificate_Manager')) {
 | |
|     try {
 | |
|         $stats = $certificate_manager->get_certificate_stats();
 | |
|         echo "\nFinal Certificate Statistics:\n";
 | |
|         echo "Total certificates in system: {$stats['total_certificates']}\n";
 | |
|         echo "Events with certificates: {$stats['total_events']}\n";
 | |
|         echo "Trainees with certificates: {$stats['total_trainees']}\n";
 | |
|         echo "Revoked certificates: {$stats['total_revoked']}\n";
 | |
|         echo "Emailed certificates: {$stats['total_emailed']}\n";
 | |
|     } catch (Exception $e) {
 | |
|         echo "Could not retrieve certificate statistics: " . $e->getMessage() . "\n";
 | |
|     }
 | |
| }
 | |
| 
 | |
| echo "\nExtensive test data creation completed!\n";
 | |
| echo "The system now contains realistic training data spanning 12 months\n";
 | |
| echo "with varied events, pricing, attendance patterns, and certificate states.\n";
 | |
| ?>
 | |
| EOF
 | |
| 
 | |
| # Copy PHP script to server and execute
 | |
| echo "[1;33mCopying extensive test data script to server...[0m"
 | |
| scp /tmp/extensive-test-data.php $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH_BASE/
 | |
| 
 | |
| echo "[1;33mExecuting extensive test data creation on server...[0m"
 | |
| ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_PATH_BASE && php extensive-test-data.php"
 | |
| 
 | |
| # Clean up
 | |
| rm /tmp/extensive-test-data.php
 | |
| ssh $REMOTE_USER@$REMOTE_HOST "rm $REMOTE_PATH_BASE/extensive-test-data.php"
 | |
| 
 | |
| echo "[0;32mExtensive test data creation completed![0m"
 | |
| echo ""
 | |
| echo "=== Created Comprehensive Test Data ==="
 | |
| echo "✓ 25-40 events spanning 12 months (past and future)"
 | |
| echo "✓ Varied event types: Basic, Intermediate, Advanced, Certification"
 | |
| echo "✓ Realistic pricing: \$150-\$1200 based on event complexity"
 | |
| echo "✓ Diverse venues across multiple states"
 | |
| echo "✓ Realistic attendance patterns (65-95% capacity)"
 | |
| echo "✓ Variable check-in rates (80-95%)"
 | |
| echo "✓ Complete certificate lifecycle for past events"
 | |
| echo "✓ Varied attendee demographics and email domains"
 | |
| echo "✓ Comprehensive ticket sales data"
 | |
| echo ""
 | |
| echo "Test Features Available:"
 | |
| echo "• Dashboard analytics with real data trends"
 | |
| echo "• Event filtering across multiple time periods"
 | |
| echo "• Certificate reports with various states"
 | |
| echo "• Revenue tracking across different price points"
 | |
| echo "• Attendance pattern analysis"
 | |
| echo "• Geographic distribution of training venues" |