- 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" |