feat: Add comprehensive data seeding scripts for testing infrastructure
- Add essential data seeding scripts to version control - Update .gitignore to whitelist bin/ directory for key testing scripts - Include comprehensive test data creation for trainers, events, attendees, and certificates - Scripts use environment variables for credentials (no hardcoded secrets) - Supports both regular trainers and master trainers with proper roles - Includes debugging and data enhancement utilities Scripts included: - create-comprehensive-test-data.sh: Full staging data setup with users/events/certificates - create-staging-test-data.sh: Staging environment test data creation - create-complete-test-data.sh: Complete test data with attendees and check-ins - create-test-attendees.sh: Attendee and ticket order generation - enhance-test-data-revenue.sh: Revenue data enhancement for testing - fix-and-create-test-data.sh: Data fixing and creation combined - debug-attendee-data.sh: Attendee data debugging utilities
This commit is contained in:
parent
37f4180e1c
commit
3e23a0884e
9 changed files with 2195 additions and 0 deletions
12
.gitignore
vendored
12
.gitignore
vendored
|
|
@ -12,6 +12,18 @@
|
||||||
/scripts/*
|
/scripts/*
|
||||||
!/scripts/*.sh
|
!/scripts/*.sh
|
||||||
|
|
||||||
|
# Bin directory - Data seeding and testing scripts
|
||||||
|
!/bin/
|
||||||
|
/bin/*
|
||||||
|
!/bin/create-comprehensive-test-data.sh
|
||||||
|
!/bin/create-staging-test-data.sh
|
||||||
|
!/bin/create-complete-test-data.sh
|
||||||
|
!/bin/create-test-attendees.sh
|
||||||
|
!/bin/create-test-attendees-simple.sh
|
||||||
|
!/bin/enhance-test-data-revenue.sh
|
||||||
|
!/bin/fix-and-create-test-data.sh
|
||||||
|
!/bin/debug-attendee-data.sh
|
||||||
|
|
||||||
# Plugin files
|
# Plugin files
|
||||||
!hvac-community-events.php
|
!hvac-community-events.php
|
||||||
!/includes/
|
!/includes/
|
||||||
|
|
|
||||||
313
bin/create-complete-test-data.sh
Executable file
313
bin/create-complete-test-data.sh
Executable file
|
|
@ -0,0 +1,313 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
source wordpress-dev/bin/hvac-plugin-deploy.conf
|
||||||
|
|
||||||
|
echo "=== Creating Complete Test Data on Staging Server ==="
|
||||||
|
|
||||||
|
# Execute PHP script directly on server
|
||||||
|
ssh $REMOTE_USER@$REMOTE_HOST << 'ENDSSH'
|
||||||
|
cd /home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
# Create and execute the PHP script
|
||||||
|
cat << 'EOF' > create-complete-test-data.php
|
||||||
|
<?php
|
||||||
|
// Load WordPress
|
||||||
|
require_once('wp-load.php');
|
||||||
|
|
||||||
|
echo "=== Creating complete test data ===\n\n";
|
||||||
|
|
||||||
|
// Get test trainer
|
||||||
|
$test_trainer = get_user_by('login', 'test_trainer');
|
||||||
|
if (!$test_trainer) {
|
||||||
|
die("test_trainer user not found.\n");
|
||||||
|
}
|
||||||
|
$trainer_id = $test_trainer->ID;
|
||||||
|
echo "Using test_trainer (ID: {$trainer_id})\n\n";
|
||||||
|
|
||||||
|
// Check if tribe_events post type exists
|
||||||
|
if (!post_type_exists('tribe_events')) {
|
||||||
|
die("The Events Calendar is not properly initialized. Post type 'tribe_events' not found.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create 3 test events with complete data
|
||||||
|
$events_data = [
|
||||||
|
[
|
||||||
|
'title' => 'HVAC System Diagnostics Workshop',
|
||||||
|
'description' => 'Learn advanced diagnostic techniques for modern HVAC systems.',
|
||||||
|
'venue_name' => 'Technical Training Center',
|
||||||
|
'venue_address' => '123 Tech Drive',
|
||||||
|
'venue_city' => 'New York',
|
||||||
|
'venue_state' => 'NY',
|
||||||
|
'venue_zip' => '10001',
|
||||||
|
'start_offset' => '+7 days',
|
||||||
|
'price' => 299
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Commercial Refrigeration Basics',
|
||||||
|
'description' => 'Comprehensive introduction to commercial refrigeration systems.',
|
||||||
|
'venue_name' => 'Industrial Learning Center',
|
||||||
|
'venue_address' => '456 Industry Blvd',
|
||||||
|
'venue_city' => 'Chicago',
|
||||||
|
'venue_state' => 'IL',
|
||||||
|
'venue_zip' => '60601',
|
||||||
|
'start_offset' => '+14 days',
|
||||||
|
'price' => 349
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Energy Efficient HVAC Design',
|
||||||
|
'description' => 'Master the latest in energy-efficient HVAC system design.',
|
||||||
|
'venue_name' => 'Green Tech Institute',
|
||||||
|
'venue_address' => '789 Eco Way',
|
||||||
|
'venue_city' => 'San Francisco',
|
||||||
|
'venue_state' => 'CA',
|
||||||
|
'venue_zip' => '94105',
|
||||||
|
'start_offset' => '+21 days',
|
||||||
|
'price' => 399
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$created_events = [];
|
||||||
|
|
||||||
|
foreach ($events_data as $data) {
|
||||||
|
echo "Creating event: {$data['title']}\n";
|
||||||
|
|
||||||
|
// Calculate dates
|
||||||
|
$start_date = date('Y-m-d 09:00:00', strtotime($data['start_offset']));
|
||||||
|
$end_date = date('Y-m-d 17:00:00', strtotime($data['start_offset']));
|
||||||
|
|
||||||
|
// Create the event
|
||||||
|
$event_args = [
|
||||||
|
'post_title' => $data['title'],
|
||||||
|
'post_content' => $data['description'],
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_events',
|
||||||
|
'post_author' => $trainer_id,
|
||||||
|
'meta_input' => [
|
||||||
|
'_EventStartDate' => $start_date,
|
||||||
|
'_EventEndDate' => $end_date,
|
||||||
|
'_EventStartDateUTC' => get_gmt_from_date($start_date),
|
||||||
|
'_EventEndDateUTC' => get_gmt_from_date($end_date),
|
||||||
|
'_EventCost' => $data['price'],
|
||||||
|
'_EventCurrencySymbol' => '$'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$event_id = wp_insert_post($event_args);
|
||||||
|
|
||||||
|
if (is_wp_error($event_id)) {
|
||||||
|
echo "Failed to create event: " . $event_id->get_error_message() . "\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created event ID: {$event_id}\n";
|
||||||
|
|
||||||
|
// Create venue
|
||||||
|
$venue_args = [
|
||||||
|
'post_title' => $data['venue_name'],
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_venue',
|
||||||
|
'post_author' => $trainer_id,
|
||||||
|
'meta_input' => [
|
||||||
|
'_VenueAddress' => $data['venue_address'],
|
||||||
|
'_VenueCity' => $data['venue_city'],
|
||||||
|
'_VenueState' => $data['venue_state'],
|
||||||
|
'_VenueZip' => $data['venue_zip'],
|
||||||
|
'_VenueCountry' => 'United States'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$venue_id = wp_insert_post($venue_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($venue_id)) {
|
||||||
|
update_post_meta($event_id, '_EventVenueID', $venue_id);
|
||||||
|
echo "Created venue ID: {$venue_id}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create ticket
|
||||||
|
$ticket_args = [
|
||||||
|
'post_title' => "General Admission",
|
||||||
|
'post_content' => '',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_tickets',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$ticket_id = wp_insert_post($ticket_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($ticket_id)) {
|
||||||
|
// Set ticket provider first
|
||||||
|
update_post_meta($event_id, '_tribe_default_ticket_provider', 'Tribe__Tickets_Plus__Commerce__PayPal__Main');
|
||||||
|
|
||||||
|
// Set ticket meta
|
||||||
|
update_post_meta($ticket_id, '_tribe_tpp_for_event', $event_id);
|
||||||
|
update_post_meta($ticket_id, '_price', $data['price']);
|
||||||
|
update_post_meta($ticket_id, '_tribe_ticket_capacity', 30);
|
||||||
|
update_post_meta($ticket_id, '_capacity', 30);
|
||||||
|
update_post_meta($ticket_id, '_stock', 20);
|
||||||
|
update_post_meta($ticket_id, '_manage_stock', 'yes');
|
||||||
|
update_post_meta($ticket_id, '_tribe_ticket_show_not_going', 'no');
|
||||||
|
update_post_meta($ticket_id, 'total_sales', 10);
|
||||||
|
|
||||||
|
echo "Created ticket ID: {$ticket_id}\n";
|
||||||
|
|
||||||
|
// Create 10 attendees
|
||||||
|
$names = [
|
||||||
|
['Ben', 'Reed', 'ben@tealmaker.com'],
|
||||||
|
['John', 'Smith', 'john.smith@example.com'],
|
||||||
|
['Sarah', 'Johnson', 'sarah.j@example.com'],
|
||||||
|
['Mike', 'Davis', 'mike.davis@example.com'],
|
||||||
|
['Emma', 'Wilson', 'emma.w@example.com'],
|
||||||
|
['David', 'Brown', 'david.brown@example.com'],
|
||||||
|
['Lisa', 'Garcia', 'lisa.g@example.com'],
|
||||||
|
['James', 'Miller', 'james.m@example.com'],
|
||||||
|
['Mary', 'Jones', 'mary.jones@example.com'],
|
||||||
|
['Robert', 'Taylor', 'robert.t@example.com']
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendees_created = 0;
|
||||||
|
$attendees_checked_in = 0;
|
||||||
|
|
||||||
|
foreach ($names as $i => $name_data) {
|
||||||
|
list($first_name, $last_name, $email) = $name_data;
|
||||||
|
$full_name = "{$first_name} {$last_name}";
|
||||||
|
|
||||||
|
// Create attendee
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => $full_name,
|
||||||
|
'post_content' => '',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendee_id = wp_insert_post($attendee_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($attendee_id)) {
|
||||||
|
// Order ID
|
||||||
|
$order_id = 'TEST-' . $event_id . '-' . ($i + 1) . '-' . time();
|
||||||
|
|
||||||
|
// Set all required attendee meta
|
||||||
|
$attendee_meta = [
|
||||||
|
'_tribe_tpp_event' => $event_id,
|
||||||
|
'_tribe_tpp_product' => $ticket_id,
|
||||||
|
'_tribe_tpp_order' => $order_id,
|
||||||
|
'_tribe_tickets_full_name' => $full_name,
|
||||||
|
'_tribe_tickets_email' => $email,
|
||||||
|
'_tribe_tpp_full_name' => $full_name,
|
||||||
|
'_tribe_tpp_email' => $email,
|
||||||
|
'_tribe_tpp_security_code' => substr(md5($order_id), 0, 10),
|
||||||
|
'_paid_price' => $data['price'],
|
||||||
|
'_tribe_tickets_order_status' => 'completed',
|
||||||
|
'_tribe_tpp_order_status' => 'completed'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($attendee_meta as $key => $value) {
|
||||||
|
update_post_meta($attendee_id, $key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check in first 8 attendees
|
||||||
|
if ($i < 8) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', 1);
|
||||||
|
update_post_meta($attendee_id, 'check_in', 1);
|
||||||
|
$attendees_checked_in++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$attendees_created++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update ticket sales
|
||||||
|
update_post_meta($ticket_id, '_tribe_tpp_sold', $attendees_created);
|
||||||
|
update_post_meta($ticket_id, '_stock', 30 - $attendees_created);
|
||||||
|
|
||||||
|
echo "Created {$attendees_created} attendees, checked in {$attendees_checked_in}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$created_events[] = [
|
||||||
|
'id' => $event_id,
|
||||||
|
'title' => $data['title']
|
||||||
|
];
|
||||||
|
|
||||||
|
echo "----------------------------\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary
|
||||||
|
echo "\n=== Test Data Creation Summary ===\n";
|
||||||
|
echo "Created " . count($created_events) . " events:\n";
|
||||||
|
foreach ($created_events as $event) {
|
||||||
|
echo "- {$event['title']} (ID: {$event['id']})\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create certificates for checked-in attendees if HVAC plugin is available
|
||||||
|
if (class_exists('HVAC_Certificate_Manager')) {
|
||||||
|
echo "\nGenerating certificates...\n";
|
||||||
|
|
||||||
|
$certificate_manager = HVAC_Certificate_Manager::instance();
|
||||||
|
$certs_created = 0;
|
||||||
|
|
||||||
|
foreach ($created_events as $event_data) {
|
||||||
|
$event_id = $event_data['id'];
|
||||||
|
|
||||||
|
// Get checked-in attendees
|
||||||
|
$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
|
||||||
|
]);
|
||||||
|
|
||||||
|
foreach ($attendees as $attendee) {
|
||||||
|
if (!$certificate_manager->certificate_exists($event_id, $attendee->ID)) {
|
||||||
|
$cert_path = 'hvac-certificates/' . date('Y/m/') . 'cert-' . $event_id . '-' . $attendee->ID . '.pdf';
|
||||||
|
$cert_id = $certificate_manager->create_certificate(
|
||||||
|
$event_id,
|
||||||
|
$attendee->ID,
|
||||||
|
0,
|
||||||
|
$cert_path,
|
||||||
|
$trainer_id
|
||||||
|
);
|
||||||
|
if ($cert_id) {
|
||||||
|
$certs_created++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created {$certs_created} certificates\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\nTest data creation completed!\n";
|
||||||
|
?>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Execute the PHP script
|
||||||
|
php create-complete-test-data.php
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm create-complete-test-data.php
|
||||||
|
ENDSSH
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "[0;32mComplete test data creation finished![0m"
|
||||||
|
echo ""
|
||||||
|
echo "Test the enhanced dashboard features at:"
|
||||||
|
echo "- Dashboard: https://upskill-staging.measurequick.com/hvac-dashboard/"
|
||||||
|
echo " - Use the search box to filter events"
|
||||||
|
echo " - Use date range filters"
|
||||||
|
echo " - Change items per page (10/25/50/100)"
|
||||||
|
echo " - Sort columns by clicking headers"
|
||||||
|
echo ""
|
||||||
|
echo "Other pages to test:"
|
||||||
|
echo "- Create Event: https://upskill-staging.measurequick.com/manage-event/"
|
||||||
|
echo "- Generate Certificates: https://upskill-staging.measurequick.com/generate-certificates/"
|
||||||
|
echo "- Certificate Reports: https://upskill-staging.measurequick.com/certificate-reports/"
|
||||||
202
bin/create-comprehensive-test-data.sh
Executable file
202
bin/create-comprehensive-test-data.sh
Executable file
|
|
@ -0,0 +1,202 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Comprehensive Test Data Creation Script
|
||||||
|
# Creates users, events, attendees, and certificates for staging environment
|
||||||
|
# Includes both regular trainers and master trainers
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
echo "=== Creating Comprehensive Test Data on Staging Server ==="
|
||||||
|
echo "Target: $UPSKILL_STAGING_IP"
|
||||||
|
echo "==============================="
|
||||||
|
|
||||||
|
# Upload and execute comprehensive PHP script
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" scp -o StrictHostKeyChecking=no /dev/stdin $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP:tmp/comprehensive-test-data.php << 'PHPEOF'
|
||||||
|
<?php
|
||||||
|
require_once('wp-load.php');
|
||||||
|
|
||||||
|
echo "=== Creating comprehensive test data ===\n";
|
||||||
|
|
||||||
|
// Create or update test_trainer user
|
||||||
|
$test_trainer = get_user_by('login', 'test_trainer');
|
||||||
|
if (!$test_trainer) {
|
||||||
|
echo "Creating test_trainer user...\n";
|
||||||
|
$user_id = wp_create_user('test_trainer', 'Test123!', 'test@example.com');
|
||||||
|
if (!is_wp_error($user_id)) {
|
||||||
|
$user = new WP_User($user_id);
|
||||||
|
$user->set_role('hvac_trainer');
|
||||||
|
update_user_meta($user_id, 'first_name', 'Test');
|
||||||
|
update_user_meta($user_id, 'last_name', 'Trainer');
|
||||||
|
$test_trainer = get_user_by('ID', $user_id);
|
||||||
|
echo "Created test_trainer user (ID: {$user_id})\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Found existing test_trainer user (ID: {$test_trainer->ID})\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create or update Joe Medosch as master trainer
|
||||||
|
$joe_user = get_user_by('email', 'JoeMedosch@gmail.com');
|
||||||
|
if (!$joe_user) {
|
||||||
|
echo "Creating JoeMedosch@gmail.com master trainer...\n";
|
||||||
|
$joe_id = wp_create_user('joemedosch', 'JoeTrainer2025@', 'JoeMedosch@gmail.com');
|
||||||
|
if (!is_wp_error($joe_id)) {
|
||||||
|
$user = new WP_User($joe_id);
|
||||||
|
$user->set_role('hvac_master_trainer');
|
||||||
|
update_user_meta($joe_id, 'first_name', 'Joe');
|
||||||
|
update_user_meta($joe_id, 'last_name', 'Medosch');
|
||||||
|
update_user_meta($joe_id, 'display_name', 'Joe Medosch');
|
||||||
|
$joe_user = get_user_by('ID', $joe_id);
|
||||||
|
echo "Created Joe Medosch master trainer (ID: {$joe_id})\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Found existing Joe Medosch user (ID: {$joe_user->ID})\n";
|
||||||
|
// Ensure they have master trainer role
|
||||||
|
$user = new WP_User($joe_user->ID);
|
||||||
|
$user->set_role('hvac_master_trainer');
|
||||||
|
echo "Updated Joe Medosch to master trainer role\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign roles to joe@measurequick.com if user exists
|
||||||
|
$joe_mq_user = get_user_by('email', 'joe@measurequick.com');
|
||||||
|
if ($joe_mq_user) {
|
||||||
|
echo "Found joe@measurequick.com user (ID: {$joe_mq_user->ID})\n";
|
||||||
|
echo "Assigning trainer and master trainer roles...\n";
|
||||||
|
|
||||||
|
// Add both HVAC roles (keeping existing roles)
|
||||||
|
$user = new WP_User($joe_mq_user->ID);
|
||||||
|
$user->add_role('hvac_trainer');
|
||||||
|
$user->add_role('hvac_master_trainer');
|
||||||
|
|
||||||
|
echo "Added hvac_trainer and hvac_master_trainer roles to joe@measurequick.com\n";
|
||||||
|
} else {
|
||||||
|
echo "joe@measurequick.com user not found (may not exist in staging)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$test_trainer) {
|
||||||
|
die("Failed to create/find test_trainer user\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
$trainer_id = $test_trainer->ID;
|
||||||
|
echo "Using trainer ID: {$trainer_id}\n";
|
||||||
|
|
||||||
|
// Create 3 test events
|
||||||
|
$events = [
|
||||||
|
[
|
||||||
|
'title' => 'HVAC System Diagnostics',
|
||||||
|
'description' => 'Advanced diagnostic techniques for HVAC systems',
|
||||||
|
'start_date' => date('Y-m-d 09:00:00', strtotime('+1 week')),
|
||||||
|
'end_date' => date('Y-m-d 17:00:00', strtotime('+1 week')),
|
||||||
|
'price' => 299
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Commercial Refrigeration',
|
||||||
|
'description' => 'Commercial refrigeration systems training',
|
||||||
|
'start_date' => date('Y-m-d 09:00:00', strtotime('+2 weeks')),
|
||||||
|
'end_date' => date('Y-m-d 17:00:00', strtotime('+2 weeks')),
|
||||||
|
'price' => 349
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Energy Efficient HVAC',
|
||||||
|
'description' => 'Energy efficiency in HVAC design',
|
||||||
|
'start_date' => date('Y-m-d 09:00:00', strtotime('+3 weeks')),
|
||||||
|
'end_date' => date('Y-m-d 17:00:00', strtotime('+3 weeks')),
|
||||||
|
'price' => 399
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$events_created = 0;
|
||||||
|
foreach ($events as $event_data) {
|
||||||
|
echo "Creating event: {$event_data['title']}\n";
|
||||||
|
|
||||||
|
$event_args = [
|
||||||
|
'post_title' => $event_data['title'],
|
||||||
|
'post_content' => $event_data['description'],
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_events',
|
||||||
|
'post_author' => $trainer_id,
|
||||||
|
'meta_input' => [
|
||||||
|
'_EventStartDate' => $event_data['start_date'],
|
||||||
|
'_EventEndDate' => $event_data['end_date'],
|
||||||
|
'_EventCost' => $event_data['price']
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$event_id = wp_insert_post($event_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($event_id)) {
|
||||||
|
echo "Created event ID: {$event_id}\n";
|
||||||
|
|
||||||
|
// Create ticket
|
||||||
|
$ticket_args = [
|
||||||
|
'post_title' => 'General Admission',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_tickets',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$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, '_price', $event_data['price']);
|
||||||
|
update_post_meta($ticket_id, '_capacity', 30);
|
||||||
|
update_post_meta($ticket_id, '_stock', 25);
|
||||||
|
|
||||||
|
// Create 5 attendees
|
||||||
|
for ($i = 1; $i <= 5; $i++) {
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => "Test Attendee {$i}",
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendee_id = wp_insert_post($attendee_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($attendee_id)) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_event', $event_id);
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_product', $ticket_id);
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_full_name', "Test Attendee {$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_email', "test{$i}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_order', "ORDER-{$event_id}-{$i}");
|
||||||
|
|
||||||
|
// Check in first 3 attendees
|
||||||
|
if ($i <= 3) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', 1);
|
||||||
|
update_post_meta($attendee_id, 'check_in', 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created 5 attendees (3 checked in)\n";
|
||||||
|
}
|
||||||
|
$events_created++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n=== Test Data Creation Complete ===\n";
|
||||||
|
echo "Created users:\n";
|
||||||
|
echo "- test_trainer (hvac_trainer role)\n";
|
||||||
|
echo "- JoeMedosch@gmail.com (hvac_master_trainer role)\n";
|
||||||
|
echo "Created {$events_created} events with attendees\n";
|
||||||
|
echo "\nLogin credentials:\n";
|
||||||
|
echo "test_trainer: Test123!\n";
|
||||||
|
echo "JoeMedosch@gmail.com: JoeTrainer2025@\n";
|
||||||
|
?>
|
||||||
|
PHPEOF
|
||||||
|
|
||||||
|
# Execute the script on the server
|
||||||
|
echo "Executing test data creation..."
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP "cd $UPSKILL_STAGING_PATH && php ../tmp/comprehensive-test-data.php && rm ../tmp/comprehensive-test-data.php"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Comprehensive test data creation completed!"
|
||||||
|
echo ""
|
||||||
|
echo "Users created:"
|
||||||
|
echo "- test_trainer (Trainer): Test123!"
|
||||||
|
echo "- JoeMedosch@gmail.com (Master Trainer): JoeTrainer2025@"
|
||||||
|
echo ""
|
||||||
|
echo "Test URLs:"
|
||||||
|
echo "- Login: https://upskill-staging.measurequick.com/training-login/"
|
||||||
|
echo "- Trainer Dashboard: https://upskill-staging.measurequick.com/trainer/dashboard/"
|
||||||
|
echo "- Master Dashboard: https://upskill-staging.measurequick.com/master-trainer/dashboard/"
|
||||||
529
bin/create-staging-test-data.sh
Executable file
529
bin/create-staging-test-data.sh
Executable file
|
|
@ -0,0 +1,529 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Create comprehensive test data including events, attendees, and certificates
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
source wordpress-dev/bin/hvac-plugin-deploy.conf
|
||||||
|
|
||||||
|
echo "=== Creating Comprehensive Test Data on Staging Server ==="
|
||||||
|
echo "Remote host: $REMOTE_HOST"
|
||||||
|
echo "Remote user: $REMOTE_USER"
|
||||||
|
echo "WordPress path: $REMOTE_PATH_BASE"
|
||||||
|
echo "==============================="
|
||||||
|
|
||||||
|
# Create the comprehensive PHP script
|
||||||
|
cat << 'EOF' > comprehensive-test-data.php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Comprehensive Test Data Generator
|
||||||
|
*
|
||||||
|
* Creates events, attendees, check-ins, and certificates for thorough testing
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Certificate manager is required for certificate generation
|
||||||
|
if (!class_exists('HVAC_Certificate_Manager')) {
|
||||||
|
die("HVAC Certificate Manager class not found. Please activate the HVAC Community Events plugin.");
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "=== Creating comprehensive test data ===\n\n";
|
||||||
|
|
||||||
|
// Initialize certificate manager
|
||||||
|
$certificate_manager = HVAC_Certificate_Manager::instance();
|
||||||
|
|
||||||
|
// Check for certificate table and create if needed
|
||||||
|
global $wpdb;
|
||||||
|
$table_name = $wpdb->prefix . 'hvac_certificates';
|
||||||
|
$table_exists = $wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name;
|
||||||
|
|
||||||
|
if (!$table_exists) {
|
||||||
|
echo "Certificate table does not exist. Creating it now...\n";
|
||||||
|
|
||||||
|
if (class_exists('HVAC_Certificate_Installer')) {
|
||||||
|
$installer = HVAC_Certificate_Installer::instance();
|
||||||
|
$installer->create_tables();
|
||||||
|
|
||||||
|
$table_exists = $wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name;
|
||||||
|
if (!$table_exists) {
|
||||||
|
die("Failed to create certificate table. Exiting.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Certificate table created successfully.\n";
|
||||||
|
} else {
|
||||||
|
die("Error: HVAC_Certificate_Installer class not found. Exiting.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create certificate storage directory if it doesn't exist
|
||||||
|
$upload_dir = wp_upload_dir();
|
||||||
|
$cert_dir = $upload_dir['basedir'] . '/' . get_option('hvac_certificate_storage_path', 'hvac-certificates');
|
||||||
|
|
||||||
|
if (!file_exists($cert_dir)) {
|
||||||
|
echo "Certificate directory does not exist. Creating it now...\n";
|
||||||
|
$result = wp_mkdir_p($cert_dir);
|
||||||
|
if (!$result) {
|
||||||
|
die("Failed to create certificate directory at: {$cert_dir}\n");
|
||||||
|
}
|
||||||
|
echo "Certificate directory created at: {$cert_dir}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get or create test trainer user
|
||||||
|
$test_trainer = get_user_by('login', 'test_trainer');
|
||||||
|
if (!$test_trainer) {
|
||||||
|
echo "test_trainer user not found, creating one...\n";
|
||||||
|
|
||||||
|
$user_id = wp_create_user('test_trainer', wp_generate_password(12, false), 'test_trainer@example.com');
|
||||||
|
|
||||||
|
if (is_wp_error($user_id)) {
|
||||||
|
die("Failed to create test_trainer user: " . $user_id->get_error_message() . "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set role and update user meta
|
||||||
|
$user = new WP_User($user_id);
|
||||||
|
$user->set_role('hvac_trainer');
|
||||||
|
|
||||||
|
update_user_meta($user_id, 'first_name', 'Test');
|
||||||
|
update_user_meta($user_id, 'last_name', 'Trainer');
|
||||||
|
|
||||||
|
$test_trainer = get_user_by('ID', $user_id);
|
||||||
|
echo "Created test_trainer user (ID: {$user_id})\n";
|
||||||
|
} else {
|
||||||
|
echo "Found existing test_trainer user (ID: {$test_trainer->ID})\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$trainer_id = $test_trainer->ID;
|
||||||
|
|
||||||
|
// Create or update Joe Medosch as master trainer
|
||||||
|
$joe_user = get_user_by('email', 'JoeMedosch@gmail.com');
|
||||||
|
if (!$joe_user) {
|
||||||
|
echo "JoeMedosch@gmail.com user not found, creating master trainer...\n";
|
||||||
|
|
||||||
|
$joe_id = wp_create_user('joemedosch', 'JoeTrainer2025@', 'JoeMedosch@gmail.com');
|
||||||
|
|
||||||
|
if (is_wp_error($joe_id)) {
|
||||||
|
echo "Failed to create JoeMedosch user: " . $joe_id->get_error_message() . "\n";
|
||||||
|
} else {
|
||||||
|
// Set role and update user meta
|
||||||
|
$user = new WP_User($joe_id);
|
||||||
|
$user->set_role('hvac_master_trainer');
|
||||||
|
|
||||||
|
update_user_meta($joe_id, 'first_name', 'Joe');
|
||||||
|
update_user_meta($joe_id, 'last_name', 'Medosch');
|
||||||
|
update_user_meta($joe_id, 'display_name', 'Joe Medosch');
|
||||||
|
|
||||||
|
$joe_user = get_user_by('ID', $joe_id);
|
||||||
|
echo "Created JoeMedosch master trainer user (ID: {$joe_id})\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Found existing JoeMedosch user (ID: {$joe_user->ID})\n";
|
||||||
|
// Ensure they have master trainer role
|
||||||
|
$user = new WP_User($joe_user->ID);
|
||||||
|
$user->set_role('hvac_master_trainer');
|
||||||
|
echo "Updated JoeMedosch to master trainer role\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign roles to joe@measurequick.com if user exists
|
||||||
|
$joe_mq_user = get_user_by('email', 'joe@measurequick.com');
|
||||||
|
if ($joe_mq_user) {
|
||||||
|
echo "Found joe@measurequick.com user (ID: {$joe_mq_user->ID})\n";
|
||||||
|
echo "Assigning trainer and master trainer roles...\n";
|
||||||
|
|
||||||
|
// Add both HVAC roles (keeping existing roles like administrator)
|
||||||
|
$user = new WP_User($joe_mq_user->ID);
|
||||||
|
$user->add_role('hvac_trainer');
|
||||||
|
$user->add_role('hvac_master_trainer');
|
||||||
|
|
||||||
|
echo "Added hvac_trainer and hvac_master_trainer roles to joe@measurequick.com\n";
|
||||||
|
} else {
|
||||||
|
echo "joe@measurequick.com user not found (may not exist in staging)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create events with a variety of data
|
||||||
|
$event_data = [
|
||||||
|
[
|
||||||
|
'title' => 'Advanced HVAC Troubleshooting',
|
||||||
|
'description' => 'Learn advanced techniques for diagnosing and fixing complex HVAC system issues.',
|
||||||
|
'start_date' => date('Y-m-d H:i:s', strtotime('+2 weeks')),
|
||||||
|
'end_date' => date('Y-m-d H:i:s', strtotime('+2 weeks +8 hours')),
|
||||||
|
'venue' => 'HVAC Training Center',
|
||||||
|
'address' => '123 Main St, New York, NY 10001',
|
||||||
|
'price' => 299,
|
||||||
|
'attendees' => 20,
|
||||||
|
'checkins' => 18,
|
||||||
|
'create_certificates' => true
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'HVAC Energy Efficiency Workshop',
|
||||||
|
'description' => 'Master the latest energy efficiency techniques and technologies in HVAC systems.',
|
||||||
|
'start_date' => date('Y-m-d H:i:s', strtotime('+1 month')),
|
||||||
|
'end_date' => date('Y-m-d H:i:s', strtotime('+1 month +6 hours')),
|
||||||
|
'venue' => 'Green Energy Training Facility',
|
||||||
|
'address' => '456 Eco Blvd, Chicago, IL 60601',
|
||||||
|
'price' => 349,
|
||||||
|
'attendees' => 15,
|
||||||
|
'checkins' => 12,
|
||||||
|
'create_certificates' => true
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Commercial Refrigeration Systems',
|
||||||
|
'description' => 'Comprehensive training on installation and maintenance of commercial refrigeration systems.',
|
||||||
|
'start_date' => date('Y-m-d H:i:s', strtotime('+6 weeks')),
|
||||||
|
'end_date' => date('Y-m-d H:i:s', strtotime('+6 weeks +16 hours')), // 2-day workshop
|
||||||
|
'venue' => 'Industrial Training Complex',
|
||||||
|
'address' => '789 Commerce Lane, Dallas, TX 75201',
|
||||||
|
'price' => 499,
|
||||||
|
'attendees' => 25,
|
||||||
|
'checkins' => 22,
|
||||||
|
'create_certificates' => true
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Residential HVAC Installation Best Practices',
|
||||||
|
'description' => 'Learn industry best practices for residential HVAC installation and customer service.',
|
||||||
|
'start_date' => date('Y-m-d H:i:s', strtotime('+2 months')),
|
||||||
|
'end_date' => date('Y-m-d H:i:s', strtotime('+2 months +8 hours')),
|
||||||
|
'venue' => 'Residential Skills Center',
|
||||||
|
'address' => '321 Homestead Road, Atlanta, GA 30301',
|
||||||
|
'price' => 249,
|
||||||
|
'attendees' => 30,
|
||||||
|
'checkins' => 26,
|
||||||
|
'create_certificates' => true
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'HVAC Controls and Automation',
|
||||||
|
'description' => 'Advanced training on modern HVAC control systems, automation, and smart building integration.',
|
||||||
|
'start_date' => date('Y-m-d H:i:s', strtotime('+3 months')),
|
||||||
|
'end_date' => date('Y-m-d H:i:s', strtotime('+3 months +12 hours')),
|
||||||
|
'venue' => 'Smart Technology Institute',
|
||||||
|
'address' => '555 Innovation Way, San Francisco, CA 94105',
|
||||||
|
'price' => 399,
|
||||||
|
'attendees' => 18,
|
||||||
|
'checkins' => 15,
|
||||||
|
'create_certificates' => true
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Track created events
|
||||||
|
$created_event_ids = [];
|
||||||
|
|
||||||
|
// Create test events
|
||||||
|
foreach ($event_data as $index => $data) {
|
||||||
|
echo "Creating event: {$data['title']}\n";
|
||||||
|
|
||||||
|
// Create the event post
|
||||||
|
$event_args = [
|
||||||
|
'post_title' => $data['title'],
|
||||||
|
'post_content' => $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 "Failed to create event: " . $event_id->get_error_message() . "\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add event meta
|
||||||
|
update_post_meta($event_id, '_EventStartDate', $data['start_date']);
|
||||||
|
update_post_meta($event_id, '_EventEndDate', $data['end_date']);
|
||||||
|
update_post_meta($event_id, '_EventVenueID', 0); // Default venue
|
||||||
|
update_post_meta($event_id, '_EventCost', $data['price']);
|
||||||
|
|
||||||
|
// Create or use existing venue
|
||||||
|
$venue_args = [
|
||||||
|
'post_title' => $data['venue'],
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => Tribe__Events__Venue::POSTTYPE,
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$venue_id = wp_insert_post($venue_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($venue_id)) {
|
||||||
|
// Add venue meta
|
||||||
|
update_post_meta($venue_id, '_VenueAddress', $data['address']);
|
||||||
|
update_post_meta($venue_id, '_VenueCity', explode(', ', $data['address'])[1]);
|
||||||
|
update_post_meta($venue_id, '_VenueState', explode(' ', explode(', ', $data['address'])[2])[0]);
|
||||||
|
update_post_meta($venue_id, '_VenueZip', explode(' ', explode(', ', $data['address'])[2])[1]);
|
||||||
|
|
||||||
|
// Link venue to event
|
||||||
|
update_post_meta($event_id, '_EventVenueID', $venue_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create PayPal ticket
|
||||||
|
if (class_exists('Tribe__Tickets_Plus__Commerce__PayPal__Main')) {
|
||||||
|
$ticket_args = [
|
||||||
|
'post_title' => "Admission - {$data['title']}",
|
||||||
|
'post_content' => "Ticket for {$data['title']}",
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_tickets',
|
||||||
|
];
|
||||||
|
|
||||||
|
$ticket_id = wp_insert_post($ticket_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($ticket_id)) {
|
||||||
|
// Add ticket meta
|
||||||
|
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', $data['price']);
|
||||||
|
update_post_meta($ticket_id, '_capacity', $data['attendees'] + 10);
|
||||||
|
update_post_meta($ticket_id, '_stock', $data['attendees'] + 10);
|
||||||
|
update_post_meta($ticket_id, '_manage_stock', 'yes');
|
||||||
|
|
||||||
|
// Associate ticket with event
|
||||||
|
update_post_meta($event_id, '_tribe_default_ticket_provider', 'Tribe__Tickets_Plus__Commerce__PayPal__Main');
|
||||||
|
|
||||||
|
echo "Created ticket for event: {$event_id}\n";
|
||||||
|
|
||||||
|
// Generate varied attendee names and emails
|
||||||
|
$first_names = ['John', 'Sarah', 'Michael', 'Emma', 'David', 'Olivia', 'James', 'Sophia',
|
||||||
|
'William', 'Ava', 'Robert', 'Isabella', 'Thomas', 'Mia', 'Daniel', 'Charlotte',
|
||||||
|
'Joseph', 'Amelia', 'Christopher', 'Harper', 'Samuel', 'Evelyn', 'Edward', 'Abigail',
|
||||||
|
'Anthony', 'Emily', 'Matthew', 'Elizabeth', 'Richard', 'Sofia'];
|
||||||
|
|
||||||
|
$last_names = ['Smith', 'Johnson', 'Williams', 'Jones', 'Brown', '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'];
|
||||||
|
|
||||||
|
$email_domains = ['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com', 'aol.com',
|
||||||
|
'icloud.com', 'protonmail.com', 'example.com', 'hvacpro.com', 'techjobs.com'];
|
||||||
|
|
||||||
|
// Create attendees
|
||||||
|
$attendee_ids = [];
|
||||||
|
|
||||||
|
for ($i = 1; $i <= $data['attendees']; $i++) {
|
||||||
|
$first_name_index = array_rand($first_names);
|
||||||
|
$last_name_index = array_rand($last_names);
|
||||||
|
$domain_index = array_rand($email_domains);
|
||||||
|
|
||||||
|
$attendee_first_name = $first_names[$first_name_index];
|
||||||
|
$attendee_last_name = $last_names[$last_name_index];
|
||||||
|
$email_domain = $email_domains[$domain_index];
|
||||||
|
|
||||||
|
// Generate unique email
|
||||||
|
$attendee_email = strtolower($attendee_first_name . '.' . $attendee_last_name . '.' . rand(100, 999) . '@' . $email_domain);
|
||||||
|
|
||||||
|
// Special email for the first attendee of each event
|
||||||
|
if ($i === 1) {
|
||||||
|
$attendee_email = "ben@tealmaker.com";
|
||||||
|
$attendee_first_name = "Ben";
|
||||||
|
$attendee_last_name = "Tester";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create attendee post
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => "{$attendee_first_name} {$attendee_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)) {
|
||||||
|
echo "Failed to create attendee for event {$event_id}: " . $attendee_id->get_error_message() . "\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$attendee_ids[] = $attendee_id;
|
||||||
|
|
||||||
|
// Generate a unique order ID
|
||||||
|
$order_id = 'ORDER-' . $event_id . '-' . $i . '-' . uniqid();
|
||||||
|
|
||||||
|
// Add attendee meta
|
||||||
|
$meta_fields = [
|
||||||
|
'_tribe_tickets_full_name' => "{$attendee_first_name} {$attendee_last_name}",
|
||||||
|
'_tribe_tickets_email' => $attendee_email,
|
||||||
|
'_tribe_tpp_full_name' => "{$attendee_first_name} {$attendee_last_name}",
|
||||||
|
'_tribe_tpp_email' => $attendee_email,
|
||||||
|
'_tribe_tpp_event' => $event_id,
|
||||||
|
'_tribe_tpp_product' => $ticket_id,
|
||||||
|
'_tribe_tpp_order' => $order_id,
|
||||||
|
'_tribe_tpp_security_code' => wp_generate_password(10, false),
|
||||||
|
'_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 some attendees
|
||||||
|
if ($i <= $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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created {$data['attendees']} attendees for event {$event_id}\n";
|
||||||
|
echo "Checked in {$data['checkins']} attendees for event {$event_id}\n";
|
||||||
|
|
||||||
|
// Update ticket stock and sales counts
|
||||||
|
update_post_meta($ticket_id, '_tribe_tpp_sold', $data['attendees']);
|
||||||
|
update_post_meta($ticket_id, '_stock', intval(get_post_meta($ticket_id, '_capacity', true)) - $data['attendees']);
|
||||||
|
update_post_meta($ticket_id, '_tribe_ticket_sold', $data['attendees']);
|
||||||
|
|
||||||
|
// Update event attendance meta
|
||||||
|
update_post_meta($event_id, '_tribe_ticket_sold_count', $data['attendees']);
|
||||||
|
|
||||||
|
// Store the created event ID
|
||||||
|
$created_event_ids[] = $event_id;
|
||||||
|
|
||||||
|
// Generate certificates if requested
|
||||||
|
if ($data['create_certificates'] && $data['checkins'] > 0) {
|
||||||
|
echo "Generating certificates for event {$event_id}\n";
|
||||||
|
|
||||||
|
// Get checked-in attendees for this event
|
||||||
|
$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;
|
||||||
|
$attendee_name = get_post_meta($attendee_id, '_tribe_tickets_full_name', true);
|
||||||
|
|
||||||
|
// Skip if a certificate already exists
|
||||||
|
if ($certificate_manager->certificate_exists($event_id, $attendee_id)) {
|
||||||
|
echo " - Certificate already exists for attendee {$attendee_name}. Skipping.\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create certificate file path
|
||||||
|
$year = date('Y');
|
||||||
|
$month = date('m');
|
||||||
|
$certificate_filename = "certificate-{$event_id}-{$attendee_id}-" . time() . ".pdf";
|
||||||
|
$certificate_relative_path = "hvac-certificates/{$year}/{$month}/{$certificate_filename}";
|
||||||
|
|
||||||
|
// Create year/month directory structure if needed
|
||||||
|
$year_month_dir = $cert_dir . "/{$year}/{$month}";
|
||||||
|
if (!file_exists($year_month_dir)) {
|
||||||
|
wp_mkdir_p($year_month_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the 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++;
|
||||||
|
|
||||||
|
// Create dummy certificate file
|
||||||
|
$certificate_full_path = $upload_dir['basedir'] . '/' . $certificate_relative_path;
|
||||||
|
file_put_contents($certificate_full_path, "Placeholder for certificate PDF (Generated for testing)");
|
||||||
|
|
||||||
|
// For testing, randomly mark some certificates as revoked or emailed
|
||||||
|
$random = mt_rand(1, 10);
|
||||||
|
|
||||||
|
// Revoke about 10% of certificates
|
||||||
|
if ($random == 1) {
|
||||||
|
$certificate_manager->revoke_certificate(
|
||||||
|
$certificate_id,
|
||||||
|
$trainer_id,
|
||||||
|
"Test revocation for certificate testing"
|
||||||
|
);
|
||||||
|
$certificates_revoked++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark about 70% as emailed
|
||||||
|
if ($random <= 7) {
|
||||||
|
$certificate_manager->mark_certificate_emailed($certificate_id);
|
||||||
|
$certificates_emailed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created {$certificates_created} certificates for event {$event_id}\n";
|
||||||
|
echo "Revoked {$certificates_revoked} certificates\n";
|
||||||
|
echo "Marked {$certificates_emailed} certificates as emailed\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Event Tickets Plus or PayPal provider not available\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "----------------------------\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary
|
||||||
|
echo "\n=== Test Data Creation Summary ===\n";
|
||||||
|
echo "Created " . count($created_event_ids) . " test events\n";
|
||||||
|
|
||||||
|
// Get certificate statistics
|
||||||
|
if (class_exists('HVAC_Certificate_Manager')) {
|
||||||
|
$stats = $certificate_manager->get_certificate_stats();
|
||||||
|
|
||||||
|
echo "\nCertificate Statistics:\n";
|
||||||
|
echo "Total certificates: {$stats['total_certificates']}\n";
|
||||||
|
echo "Total events with certificates: {$stats['total_events']}\n";
|
||||||
|
echo "Total trainees with certificates: {$stats['total_trainees']}\n";
|
||||||
|
echo "Total revoked certificates: {$stats['total_revoked']}\n";
|
||||||
|
echo "Total emailed certificates: {$stats['total_emailed']}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\nTest data creation completed!\n";
|
||||||
|
?>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Copy PHP script to server and execute
|
||||||
|
echo "[1;33mCopying script to server...[0m"
|
||||||
|
scp comprehensive-test-data.php $REMOTE_USER@$REMOTE_HOST:~/
|
||||||
|
|
||||||
|
echo "[1;33mMoving script to web directory and executing...[0m"
|
||||||
|
ssh $REMOTE_USER@$REMOTE_HOST "mv ~/comprehensive-test-data.php $REMOTE_PATH_BASE/ && cd $REMOTE_PATH_BASE && php comprehensive-test-data.php"
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm comprehensive-test-data.php
|
||||||
|
ssh $REMOTE_USER@$REMOTE_HOST "rm $REMOTE_PATH_BASE/comprehensive-test-data.php"
|
||||||
|
|
||||||
|
echo "[0;32mComprehensive test data creation completed![0m"
|
||||||
|
echo "The script has created:"
|
||||||
|
echo "1. Multiple test events with different dates, venues, and prices"
|
||||||
|
echo "2. Varied attendee data with realistic names and emails"
|
||||||
|
echo "3. Check-ins for most attendees"
|
||||||
|
echo "4. Certificates with varied states (active, revoked, emailed)"
|
||||||
|
echo ""
|
||||||
|
echo "You can test the system at:"
|
||||||
|
echo "- Event listing: https://upskill-staging.measurequick.com/events/"
|
||||||
|
echo "- Certificate reports: https://upskill-staging.measurequick.com/certificate-reports/"
|
||||||
|
echo ""
|
||||||
|
echo "Features to test with this data:"
|
||||||
|
echo "1. Event filtering and searching"
|
||||||
|
echo "2. Certificate filtering by event name"
|
||||||
|
echo "3. Certificate filtering by attendee name/email"
|
||||||
|
echo "4. Certificate filtering by status (active/revoked)"
|
||||||
|
echo "5. Certificate email functionality"
|
||||||
|
echo "6. Certificate download functionality"
|
||||||
126
bin/create-test-attendees-simple.sh
Executable file
126
bin/create-test-attendees-simple.sh
Executable file
|
|
@ -0,0 +1,126 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Simple Test Attendees Creation Script
|
||||||
|
# Creates attendees specifically for event ID 6042 to test certificate generation
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
echo "=== Creating Test Attendees for Event 6042 ==="
|
||||||
|
echo "Target: $UPSKILL_STAGING_IP"
|
||||||
|
echo "============================================="
|
||||||
|
|
||||||
|
# Upload and execute PHP script to create attendees for event 6042
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" scp -o StrictHostKeyChecking=no /dev/stdin $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP:tmp/create-attendees-6042.php << 'PHPEOF'
|
||||||
|
<?php
|
||||||
|
require_once('wp-load.php');
|
||||||
|
|
||||||
|
echo "=== Creating Test Attendees for Event 6042 ===\n";
|
||||||
|
|
||||||
|
// Target event ID from the dashboard
|
||||||
|
$event_id = 6042;
|
||||||
|
|
||||||
|
// Verify event exists
|
||||||
|
$event = get_post($event_id);
|
||||||
|
if (!$event || $event->post_type !== 'tribe_events') {
|
||||||
|
die("Event 6042 not found or not a tribe_events post\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Event found: {$event->post_title} (ID: {$event_id}, Author: {$event->post_author})\n";
|
||||||
|
|
||||||
|
// Create 5 test attendees for this event
|
||||||
|
echo "Creating 5 attendees...\n";
|
||||||
|
|
||||||
|
for ($i = 1; $i <= 5; $i++) {
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => "Test Attendee {$i} for Event {$event_id}",
|
||||||
|
'post_content' => '',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'post_author' => $event->post_author, // Same as event author
|
||||||
|
'post_parent' => $event_id // CRITICAL: Link to event
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendee_id = wp_insert_post($attendee_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($attendee_id)) {
|
||||||
|
echo "Created attendee ID: {$attendee_id}\n";
|
||||||
|
|
||||||
|
// Add all required meta fields for Event Tickets Plus compatibility
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_event', $event_id);
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_full_name', "Test Attendee {$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_full_name', "Test Attendee {$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_email', "test.attendee.{$i}.{$event_id}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_email', "test.attendee.{$i}.{$event_id}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_attendee_email', "test.attendee.{$i}.{$event_id}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_order', "ORDER-{$event_id}-{$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_product', 0); // No specific ticket product
|
||||||
|
|
||||||
|
// Check in first 3 attendees, leave 2 unchecked (as per user requirement)
|
||||||
|
if ($i <= 3) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_attendee_checked_in', '1');
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', '1');
|
||||||
|
update_post_meta($attendee_id, 'check_in', '1');
|
||||||
|
echo " ✓ Checked in attendee {$i}\n";
|
||||||
|
} else {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_attendee_checked_in', '0');
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', '0');
|
||||||
|
update_post_meta($attendee_id, 'check_in', '0');
|
||||||
|
echo " - Left attendee {$i} not checked in\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Failed to create attendee {$i}: " . $attendee_id->get_error_message() . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n=== Verification Query (Same as Certificate Template) ===\n";
|
||||||
|
|
||||||
|
// Run the exact same query that the certificate template uses
|
||||||
|
global $wpdb;
|
||||||
|
|
||||||
|
$attendees = $wpdb->get_results($wpdb->prepare(
|
||||||
|
"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
|
||||||
|
));
|
||||||
|
|
||||||
|
echo "Found " . count($attendees) . " attendees for event {$event_id}:\n";
|
||||||
|
foreach ($attendees as $attendee) {
|
||||||
|
$status = $attendee->check_in ? 'Checked In' : 'Not Checked In';
|
||||||
|
echo " - ID: {$attendee->attendee_id}, Name: {$attendee->holder_name}, Email: {$attendee->holder_email}, Status: {$status}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($attendees) > 0) {
|
||||||
|
echo "\n✅ SUCCESS: Certificate generation should now work for event 6042!\n";
|
||||||
|
} else {
|
||||||
|
echo "\n❌ FAILED: No attendees found - certificate generation will still show 'no attendees'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\nTest Instructions:\n";
|
||||||
|
echo "1. Go to: https://upskill-staging.measurequick.com/trainer/generate-certificates/?event_id=6042\n";
|
||||||
|
echo "2. Should see 5 attendees (3 checked in, 2 not checked in)\n";
|
||||||
|
echo "3. All trainers should be able to generate certificates regardless of check-in status\n";
|
||||||
|
?>
|
||||||
|
PHPEOF
|
||||||
|
|
||||||
|
# Execute the script on the server
|
||||||
|
echo "Executing attendee creation script..."
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP "cd $UPSKILL_STAGING_PATH && php ../tmp/create-attendees-6042.php && rm ../tmp/create-attendees-6042.php"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Test attendee creation for event 6042 completed!"
|
||||||
144
bin/create-test-attendees.sh
Executable file
144
bin/create-test-attendees.sh
Executable file
|
|
@ -0,0 +1,144 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Create Test Attendees Script
|
||||||
|
# Creates proper Event Tickets attendee records with correct post_parent relationships
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
echo "=== Creating Test Attendees for Certificate Testing ==="
|
||||||
|
echo "Target: $UPSKILL_STAGING_IP"
|
||||||
|
echo "======================================="
|
||||||
|
|
||||||
|
# Upload and execute PHP script to create attendees
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" scp -o StrictHostKeyChecking=no /dev/stdin $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP:tmp/create-attendees.php << 'PHPEOF'
|
||||||
|
<?php
|
||||||
|
require_once('wp-load.php');
|
||||||
|
|
||||||
|
echo "=== Creating Test Attendees for Events ===\n";
|
||||||
|
|
||||||
|
// Get recent test events created by test_trainer
|
||||||
|
$test_trainer = get_user_by('login', 'test_trainer');
|
||||||
|
if (!$test_trainer) {
|
||||||
|
die("test_trainer user not found. Run comprehensive test data script first.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
$trainer_id = $test_trainer->ID;
|
||||||
|
echo "Using trainer ID: {$trainer_id}\n";
|
||||||
|
|
||||||
|
// Get the trainer's events
|
||||||
|
$events = get_posts([
|
||||||
|
'post_type' => 'tribe_events',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'author' => $trainer_id,
|
||||||
|
'numberposts' => 5,
|
||||||
|
'orderby' => 'date',
|
||||||
|
'order' => 'DESC'
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (empty($events)) {
|
||||||
|
die("No events found for test_trainer. Run comprehensive test data script first.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Found " . count($events) . " events for test_trainer\n";
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
echo "\nCreating attendees for event: {$event->post_title} (ID: {$event->ID})\n";
|
||||||
|
|
||||||
|
// Create 5 attendees for each event
|
||||||
|
for ($i = 1; $i <= 5; $i++) {
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => "Test Attendee {$i} for {$event->post_title}",
|
||||||
|
'post_content' => '',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'post_author' => $trainer_id,
|
||||||
|
'post_parent' => $event->ID // CRITICAL: Link to event
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendee_id = wp_insert_post($attendee_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($attendee_id)) {
|
||||||
|
echo "Created attendee ID: {$attendee_id}\n";
|
||||||
|
|
||||||
|
// Add all required meta fields
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_event', $event->ID);
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_full_name', "Test Attendee {$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_full_name', "Test Attendee {$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_email', "test.attendee.{$i}.{$event->ID}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_email', "test.attendee.{$i}.{$event->ID}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_attendee_email', "test.attendee.{$i}.{$event->ID}@example.com");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_order', "ORDER-{$event->ID}-{$i}");
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_product', 0); // No specific ticket product
|
||||||
|
|
||||||
|
// Check in first 3 attendees, leave 2 unchecked
|
||||||
|
if ($i <= 3) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_attendee_checked_in', '1');
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', '1');
|
||||||
|
update_post_meta($attendee_id, 'check_in', '1');
|
||||||
|
echo " - Checked in attendee {$i}\n";
|
||||||
|
} else {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_attendee_checked_in', '0');
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', '0');
|
||||||
|
update_post_meta($attendee_id, 'check_in', '0');
|
||||||
|
echo " - Left attendee {$i} not checked in\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Failed to create attendee {$i}: " . $attendee_id->get_error_message() . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n=== Verification Query ===\n";
|
||||||
|
echo "Running same query as certificate template...\n";
|
||||||
|
|
||||||
|
// Run the exact same query that the certificate template uses
|
||||||
|
global $wpdb;
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
echo "\nEvent: {$event->post_title} (ID: {$event->ID})\n";
|
||||||
|
|
||||||
|
$attendees = $wpdb->get_results($wpdb->prepare(
|
||||||
|
"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
|
||||||
|
));
|
||||||
|
|
||||||
|
echo "Found " . count($attendees) . " attendees:\n";
|
||||||
|
foreach ($attendees as $attendee) {
|
||||||
|
$status = $attendee->check_in ? 'Checked In' : 'Not Checked In';
|
||||||
|
echo " - ID: {$attendee->attendee_id}, Name: {$attendee->holder_name}, Email: {$attendee->holder_email}, Status: {$status}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n✅ Test attendee creation completed!\n";
|
||||||
|
?>
|
||||||
|
PHPEOF
|
||||||
|
|
||||||
|
# Execute the script on the server
|
||||||
|
echo "Executing attendee creation script..."
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP "cd $UPSKILL_STAGING_PATH && php ../tmp/create-attendees.php && rm ../tmp/create-attendees.php"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Test attendee creation completed!"
|
||||||
|
echo ""
|
||||||
|
echo "Next steps:"
|
||||||
|
echo "1. Login to staging as test_trainer (Test123!)"
|
||||||
|
echo "2. Go to Generate Certificates page"
|
||||||
|
echo "3. Select any event - should now show 5 attendees"
|
||||||
|
echo "4. Verify certificate generation works"
|
||||||
35
bin/debug-attendee-data.sh
Executable file
35
bin/debug-attendee-data.sh
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Debug script to check event and attendee data on staging
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
echo "=== Debug Attendee Data ==="
|
||||||
|
echo "Target: $UPSKILL_STAGING_IP"
|
||||||
|
echo "==============================="
|
||||||
|
|
||||||
|
sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no $UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP << 'EOF'
|
||||||
|
|
||||||
|
echo "=== 1. Check test_trainer user ID ==="
|
||||||
|
wp user get test_trainer --field=ID --path=/home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 2. Check all events by test_trainer (ID 66) ==="
|
||||||
|
wp db query "SELECT ID, post_title, post_author, post_status, post_type, post_date FROM wp_posts WHERE post_type = 'tribe_events' AND post_author = 66 ORDER BY post_date DESC;" --path=/home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 3. Check all recent tribe_events ==="
|
||||||
|
wp db query "SELECT ID, post_title, post_author, post_status, post_type, post_date FROM wp_posts WHERE post_type = 'tribe_events' AND post_date > '2025-08-10' ORDER BY post_date DESC;" --path=/home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 4. Check existing attendees ==="
|
||||||
|
wp db query "SELECT p.ID, p.post_type, p.post_parent, p.post_status, p.post_title FROM wp_posts p WHERE p.post_type IN ('tribe_tpp_attendees', 'tec_tc_attendee') ORDER BY p.post_date DESC LIMIT 10;" --path=/home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 5. Check wp_posts table structure for recent events ==="
|
||||||
|
wp db query "SELECT ID, post_title, post_author, post_status, post_type, post_date FROM wp_posts WHERE post_date > '2025-08-10' ORDER BY post_date DESC LIMIT 20;" --path=/home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Debug complete!"
|
||||||
415
bin/enhance-test-data-revenue.sh
Executable file
415
bin/enhance-test-data-revenue.sh
Executable file
|
|
@ -0,0 +1,415 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
source wordpress-dev/bin/hvac-plugin-deploy.conf
|
||||||
|
|
||||||
|
echo "=== Enhancing Test Data with Revenue and Sales Information ==="
|
||||||
|
|
||||||
|
# Execute PHP script directly on server
|
||||||
|
ssh $REMOTE_USER@$REMOTE_HOST << 'ENDSSH'
|
||||||
|
cd /home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
# Create and execute the PHP script
|
||||||
|
cat << 'EOF' > enhance-revenue-data.php
|
||||||
|
<?php
|
||||||
|
// Load WordPress
|
||||||
|
require_once('wp-load.php');
|
||||||
|
|
||||||
|
echo "=== Enhancing test data with revenue information ===\n\n";
|
||||||
|
|
||||||
|
// Get test trainer
|
||||||
|
$test_trainer = get_user_by('login', 'test_trainer');
|
||||||
|
if (!$test_trainer) {
|
||||||
|
die("test_trainer user not found.\n");
|
||||||
|
}
|
||||||
|
$trainer_id = $test_trainer->ID;
|
||||||
|
|
||||||
|
// Get all events created by test_trainer
|
||||||
|
$events = get_posts([
|
||||||
|
'post_type' => 'tribe_events',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'author' => $trainer_id,
|
||||||
|
'posts_per_page' => -1,
|
||||||
|
'orderby' => 'date',
|
||||||
|
'order' => 'DESC'
|
||||||
|
]);
|
||||||
|
|
||||||
|
echo "Found " . count($events) . " events to enhance\n\n";
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
echo "Enhancing event: {$event->post_title} (ID: {$event->ID})\n";
|
||||||
|
|
||||||
|
// Get existing ticket for this event
|
||||||
|
$tickets = get_posts([
|
||||||
|
'post_type' => 'tribe_tpp_tickets',
|
||||||
|
'meta_query' => [
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_for_event',
|
||||||
|
'value' => $event->ID
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'posts_per_page' => 1
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!empty($tickets)) {
|
||||||
|
$ticket = $tickets[0];
|
||||||
|
$ticket_id = $ticket->ID;
|
||||||
|
echo "Found existing ticket ID: {$ticket_id}\n";
|
||||||
|
|
||||||
|
// Get ticket price
|
||||||
|
$price = get_post_meta($ticket_id, '_price', true) ?: 299;
|
||||||
|
|
||||||
|
// Count actual attendees
|
||||||
|
$attendees = get_posts([
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'meta_query' => [
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_event',
|
||||||
|
'value' => $event->ID
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'posts_per_page' => -1
|
||||||
|
]);
|
||||||
|
|
||||||
|
$attendee_count = count($attendees);
|
||||||
|
$checked_in_count = 0;
|
||||||
|
|
||||||
|
// Update attendee payment status and count check-ins
|
||||||
|
foreach ($attendees as $attendee) {
|
||||||
|
// Ensure payment status is set
|
||||||
|
update_post_meta($attendee->ID, '_paid_price', $price);
|
||||||
|
update_post_meta($attendee->ID, '_tribe_tickets_order_status', 'completed');
|
||||||
|
update_post_meta($attendee->ID, '_tribe_tpp_order_status', 'completed');
|
||||||
|
|
||||||
|
// Count checked in
|
||||||
|
$is_checked_in = get_post_meta($attendee->ID, '_tribe_tpp_checkin', true);
|
||||||
|
if ($is_checked_in) {
|
||||||
|
$checked_in_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate revenue
|
||||||
|
$total_revenue = $attendee_count * $price;
|
||||||
|
|
||||||
|
// Update ticket meta with accurate sales data
|
||||||
|
update_post_meta($ticket_id, '_tribe_tpp_sold', $attendee_count);
|
||||||
|
update_post_meta($ticket_id, '_tribe_ticket_sold', $attendee_count);
|
||||||
|
update_post_meta($ticket_id, 'total_sales', $attendee_count);
|
||||||
|
update_post_meta($ticket_id, '_stock', 50 - $attendee_count); // Assuming capacity of 50
|
||||||
|
|
||||||
|
// Update event meta for revenue tracking
|
||||||
|
update_post_meta($event->ID, '_tribe_ticket_sold_count', $attendee_count);
|
||||||
|
update_post_meta($event->ID, '_EventCost', $price);
|
||||||
|
update_post_meta($event->ID, '_tribe_event_revenue', $total_revenue);
|
||||||
|
|
||||||
|
// Add provider if not set
|
||||||
|
$provider = get_post_meta($event->ID, '_tribe_default_ticket_provider', true);
|
||||||
|
if (empty($provider)) {
|
||||||
|
update_post_meta($event->ID, '_tribe_default_ticket_provider', 'Tribe__Tickets_Plus__Commerce__PayPal__Main');
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "- Attendees: {$attendee_count}\n";
|
||||||
|
echo "- Checked in: {$checked_in_count}\n";
|
||||||
|
echo "- Ticket price: \${$price}\n";
|
||||||
|
echo "- Total revenue: \${$total_revenue}\n";
|
||||||
|
|
||||||
|
// Ensure we have PayPal order data for each attendee (needed for reports)
|
||||||
|
$order_num = 1;
|
||||||
|
foreach ($attendees as $attendee) {
|
||||||
|
$order_id = get_post_meta($attendee->ID, '_tribe_tpp_order', true);
|
||||||
|
if (empty($order_id) || strpos($order_id, 'TEST-') === 0) {
|
||||||
|
// Create a more realistic order ID
|
||||||
|
$new_order_id = 'PAY-' . strtoupper(substr(md5($event->ID . '-' . $attendee->ID . '-' . time()), 0, 8));
|
||||||
|
update_post_meta($attendee->ID, '_tribe_tpp_order', $new_order_id);
|
||||||
|
update_post_meta($attendee->ID, '_tribe_paypal_transaction_id', $new_order_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure attendee has all required meta for revenue calculation
|
||||||
|
update_post_meta($attendee->ID, '_tribe_tpp_price', $price);
|
||||||
|
update_post_meta($attendee->ID, '_paid_price', $price);
|
||||||
|
update_post_meta($attendee->ID, '_tribe_tickets_event_id', $event->ID);
|
||||||
|
update_post_meta($attendee->ID, '_tribe_tickets_product_id', $ticket_id);
|
||||||
|
|
||||||
|
$order_num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo "No ticket found for this event - skipping revenue enhancement\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "----------------------------\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now let's add some additional attendees to events that need more data
|
||||||
|
echo "\nAdding additional attendees to events with low attendance...\n\n";
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
// Get ticket
|
||||||
|
$tickets = get_posts([
|
||||||
|
'post_type' => 'tribe_tpp_tickets',
|
||||||
|
'meta_query' => [
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_for_event',
|
||||||
|
'value' => $event->ID
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'posts_per_page' => 1
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (empty($tickets)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ticket = $tickets[0];
|
||||||
|
$ticket_id = $ticket->ID;
|
||||||
|
$price = get_post_meta($ticket_id, '_price', true) ?: 299;
|
||||||
|
|
||||||
|
// Count current attendees
|
||||||
|
$current_attendees = get_posts([
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'meta_query' => [
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_event',
|
||||||
|
'value' => $event->ID
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'posts_per_page' => -1
|
||||||
|
]);
|
||||||
|
|
||||||
|
$current_count = count($current_attendees);
|
||||||
|
|
||||||
|
// If less than 15 attendees, add more
|
||||||
|
if ($current_count < 15) {
|
||||||
|
$to_add = 15 - $current_count;
|
||||||
|
echo "Event '{$event->post_title}' has {$current_count} attendees. Adding {$to_add} more...\n";
|
||||||
|
|
||||||
|
$names = [
|
||||||
|
['Alex', 'Thompson', 'alex.thompson'],
|
||||||
|
['Jessica', 'Martinez', 'jessica.martinez'],
|
||||||
|
['Ryan', 'Chen', 'ryan.chen'],
|
||||||
|
['Ashley', 'Kumar', 'ashley.kumar'],
|
||||||
|
['Brandon', 'White', 'brandon.white'],
|
||||||
|
['Nicole', 'Lee', 'nicole.lee'],
|
||||||
|
['Justin', 'Harris', 'justin.harris'],
|
||||||
|
['Amanda', 'Clark', 'amanda.clark'],
|
||||||
|
['Kevin', 'Lewis', 'kevin.lewis'],
|
||||||
|
['Rachel', 'Walker', 'rachel.walker'],
|
||||||
|
['Timothy', 'Hall', 'timothy.hall'],
|
||||||
|
['Laura', 'Allen', 'laura.allen'],
|
||||||
|
['Jason', 'Young', 'jason.young'],
|
||||||
|
['Michelle', 'King', 'michelle.king'],
|
||||||
|
['Eric', 'Wright', 'eric.wright']
|
||||||
|
];
|
||||||
|
|
||||||
|
for ($i = 0; $i < $to_add && $i < count($names); $i++) {
|
||||||
|
list($first_name, $last_name, $email_prefix) = $names[$i];
|
||||||
|
$full_name = "{$first_name} {$last_name}";
|
||||||
|
$email = $email_prefix . rand(100, 999) . '@hvacpro.com';
|
||||||
|
|
||||||
|
// Create attendee
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => $full_name,
|
||||||
|
'post_content' => '',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendee_id = wp_insert_post($attendee_args);
|
||||||
|
|
||||||
|
if (!is_wp_error($attendee_id)) {
|
||||||
|
// Create realistic order ID
|
||||||
|
$order_id = 'PAY-' . strtoupper(substr(md5($event->ID . '-' . $attendee_id . '-' . time()), 0, 8));
|
||||||
|
|
||||||
|
// Set all attendee meta
|
||||||
|
$attendee_meta = [
|
||||||
|
'_tribe_tpp_event' => $event->ID,
|
||||||
|
'_tribe_tpp_product' => $ticket_id,
|
||||||
|
'_tribe_tpp_order' => $order_id,
|
||||||
|
'_tribe_paypal_transaction_id' => $order_id,
|
||||||
|
'_tribe_tickets_full_name' => $full_name,
|
||||||
|
'_tribe_tickets_email' => $email,
|
||||||
|
'_tribe_tpp_full_name' => $full_name,
|
||||||
|
'_tribe_tpp_email' => $email,
|
||||||
|
'_tribe_tpp_security_code' => substr(md5($order_id), 0, 10),
|
||||||
|
'_paid_price' => $price,
|
||||||
|
'_tribe_tpp_price' => $price,
|
||||||
|
'_tribe_tickets_order_status' => 'completed',
|
||||||
|
'_tribe_tpp_order_status' => 'completed',
|
||||||
|
'_tribe_tickets_event_id' => $event->ID,
|
||||||
|
'_tribe_tickets_product_id' => $ticket_id
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($attendee_meta as $key => $value) {
|
||||||
|
update_post_meta($attendee_id, $key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check in 85% of new attendees
|
||||||
|
if ($i < ($to_add * 0.85)) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', 1);
|
||||||
|
update_post_meta($attendee_id, 'check_in', 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update ticket sales count
|
||||||
|
$new_total = $current_count + $to_add;
|
||||||
|
update_post_meta($ticket_id, '_tribe_tpp_sold', $new_total);
|
||||||
|
update_post_meta($ticket_id, '_tribe_ticket_sold', $new_total);
|
||||||
|
update_post_meta($ticket_id, 'total_sales', $new_total);
|
||||||
|
update_post_meta($ticket_id, '_stock', 50 - $new_total);
|
||||||
|
|
||||||
|
// Update event revenue
|
||||||
|
$new_revenue = $new_total * $price;
|
||||||
|
update_post_meta($event->ID, '_tribe_ticket_sold_count', $new_total);
|
||||||
|
update_post_meta($event->ID, '_tribe_event_revenue', $new_revenue);
|
||||||
|
|
||||||
|
echo "Added {$to_add} attendees. New total: {$new_total}, Revenue: \${$new_revenue}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate certificates for all checked-in attendees
|
||||||
|
if (class_exists('HVAC_Certificate_Manager')) {
|
||||||
|
echo "\n=== Generating certificates for checked-in attendees ===\n";
|
||||||
|
|
||||||
|
$certificate_manager = HVAC_Certificate_Manager::instance();
|
||||||
|
$total_certificates = 0;
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
echo "\nProcessing certificates for: {$event->post_title}\n";
|
||||||
|
|
||||||
|
// Get all checked-in attendees
|
||||||
|
$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
|
||||||
|
]);
|
||||||
|
|
||||||
|
$event_certificates = 0;
|
||||||
|
|
||||||
|
foreach ($checked_in_attendees as $attendee) {
|
||||||
|
// Check if certificate already exists
|
||||||
|
if (!$certificate_manager->certificate_exists($event->ID, $attendee->ID)) {
|
||||||
|
// Generate certificate
|
||||||
|
$cert_filename = 'certificate-' . $event->ID . '-' . $attendee->ID . '-' . time() . '.pdf';
|
||||||
|
$cert_path = 'hvac-certificates/' . date('Y/m/') . $cert_filename;
|
||||||
|
|
||||||
|
$cert_id = $certificate_manager->create_certificate(
|
||||||
|
$event->ID,
|
||||||
|
$attendee->ID,
|
||||||
|
0, // user_id
|
||||||
|
$cert_path,
|
||||||
|
$trainer_id
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($cert_id) {
|
||||||
|
$event_certificates++;
|
||||||
|
$total_certificates++;
|
||||||
|
|
||||||
|
// Create dummy PDF file
|
||||||
|
$upload_dir = wp_upload_dir();
|
||||||
|
$full_path = $upload_dir['basedir'] . '/' . $cert_path;
|
||||||
|
$dir = dirname($full_path);
|
||||||
|
if (!file_exists($dir)) {
|
||||||
|
wp_mkdir_p($dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a simple PDF-like content
|
||||||
|
$attendee_name = get_post_meta($attendee->ID, '_tribe_tickets_full_name', true);
|
||||||
|
$pdf_content = "%PDF-1.4\nTest Certificate for {$attendee_name}\nEvent: {$event->post_title}\nGenerated for testing purposes.";
|
||||||
|
file_put_contents($full_path, $pdf_content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($event_certificates > 0) {
|
||||||
|
echo "Generated {$event_certificates} certificates for this event\n";
|
||||||
|
} else {
|
||||||
|
echo "All attendees already have certificates\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\nTotal new certificates generated: {$total_certificates}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary of all events with revenue
|
||||||
|
echo "\n=== Final Event Summary ===\n";
|
||||||
|
$total_revenue = 0;
|
||||||
|
$total_attendees = 0;
|
||||||
|
$total_checked_in = 0;
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
$attendees = get_posts([
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'meta_query' => [
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_event',
|
||||||
|
'value' => $event->ID
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'posts_per_page' => -1
|
||||||
|
]);
|
||||||
|
|
||||||
|
$attendee_count = count($attendees);
|
||||||
|
$checked_in = 0;
|
||||||
|
$event_revenue = 0;
|
||||||
|
|
||||||
|
foreach ($attendees as $attendee) {
|
||||||
|
if (get_post_meta($attendee->ID, '_tribe_tpp_checkin', true)) {
|
||||||
|
$checked_in++;
|
||||||
|
}
|
||||||
|
$paid = get_post_meta($attendee->ID, '_paid_price', true) ?: 0;
|
||||||
|
$event_revenue += $paid;
|
||||||
|
}
|
||||||
|
|
||||||
|
$total_revenue += $event_revenue;
|
||||||
|
$total_attendees += $attendee_count;
|
||||||
|
$total_checked_in += $checked_in;
|
||||||
|
|
||||||
|
echo "\n{$event->post_title}:\n";
|
||||||
|
echo "- Attendees: {$attendee_count}\n";
|
||||||
|
echo "- Checked in: {$checked_in}\n";
|
||||||
|
echo "- Revenue: \${$event_revenue}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n=== TOTAL SUMMARY ===\n";
|
||||||
|
echo "Total Events: " . count($events) . "\n";
|
||||||
|
echo "Total Attendees: {$total_attendees}\n";
|
||||||
|
echo "Total Checked In: {$total_checked_in}\n";
|
||||||
|
echo "Total Revenue: \${$total_revenue}\n";
|
||||||
|
|
||||||
|
echo "\nRevenue data enhancement completed!\n";
|
||||||
|
?>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Execute the PHP script
|
||||||
|
php enhance-revenue-data.php
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm enhance-revenue-data.php
|
||||||
|
ENDSSH
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "[0;32mRevenue data enhancement completed![0m"
|
||||||
|
echo ""
|
||||||
|
echo "You can now test:"
|
||||||
|
echo "1. Dashboard with revenue numbers: https://upskill-staging.measurequick.com/hvac-dashboard/"
|
||||||
|
echo "2. Generate Certificates: https://upskill-staging.measurequick.com/generate-certificates/"
|
||||||
|
echo "3. Certificate Reports: https://upskill-staging.measurequick.com/certificate-reports/"
|
||||||
|
echo ""
|
||||||
|
echo "The dashboard should now show:"
|
||||||
|
echo "- Total revenue from ticket sales"
|
||||||
|
echo "- Number of tickets sold per event"
|
||||||
|
echo "- Attendee counts and check-in rates"
|
||||||
|
echo ""
|
||||||
|
echo "Certificates can be generated for all checked-in attendees."
|
||||||
419
bin/fix-and-create-test-data.sh
Executable file
419
bin/fix-and-create-test-data.sh
Executable file
|
|
@ -0,0 +1,419 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
source wordpress-dev/bin/hvac-plugin-deploy.conf
|
||||||
|
|
||||||
|
echo "=== Creating Complete Test Data with Revenue ==="
|
||||||
|
|
||||||
|
# Execute PHP script directly on server
|
||||||
|
ssh $REMOTE_USER@$REMOTE_HOST << 'ENDSSH'
|
||||||
|
cd /home/974670.cloudwaysapps.com/uberrxmprk/public_html
|
||||||
|
|
||||||
|
# Create and execute the PHP script
|
||||||
|
cat << 'EOF' > create-test-data-with-revenue.php
|
||||||
|
<?php
|
||||||
|
// Load WordPress
|
||||||
|
require_once('wp-load.php');
|
||||||
|
|
||||||
|
echo "=== Creating complete test data with revenue ===\n\n";
|
||||||
|
|
||||||
|
// First, let's check what's happening with events
|
||||||
|
global $wpdb;
|
||||||
|
$events_table = $wpdb->posts;
|
||||||
|
$event_count = $wpdb->get_var("SELECT COUNT(*) FROM {$events_table} WHERE post_type = 'tribe_events'");
|
||||||
|
echo "Total events in database: {$event_count}\n";
|
||||||
|
|
||||||
|
// Check if The Events Calendar is properly set up
|
||||||
|
if (!class_exists('Tribe__Events__Main')) {
|
||||||
|
die("The Events Calendar plugin is not active!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get test trainer
|
||||||
|
$test_trainer = get_user_by('login', 'test_trainer');
|
||||||
|
if (!$test_trainer) {
|
||||||
|
die("test_trainer user not found.\n");
|
||||||
|
}
|
||||||
|
$trainer_id = $test_trainer->ID;
|
||||||
|
echo "Using test_trainer (ID: {$trainer_id})\n\n";
|
||||||
|
|
||||||
|
// Delete any existing test events to start fresh
|
||||||
|
$existing_events = $wpdb->get_col("
|
||||||
|
SELECT ID FROM {$wpdb->posts}
|
||||||
|
WHERE post_type = 'tribe_events'
|
||||||
|
AND post_author = {$trainer_id}
|
||||||
|
");
|
||||||
|
|
||||||
|
if (!empty($existing_events)) {
|
||||||
|
echo "Cleaning up " . count($existing_events) . " existing test events...\n";
|
||||||
|
foreach ($existing_events as $event_id) {
|
||||||
|
wp_delete_post($event_id, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create comprehensive test events
|
||||||
|
$events_data = [
|
||||||
|
[
|
||||||
|
'title' => 'Advanced HVAC Diagnostics Workshop',
|
||||||
|
'description' => 'Master advanced diagnostic techniques for modern HVAC systems including digital controls and variable speed equipment.',
|
||||||
|
'venue_name' => 'HVAC Excellence Training Center',
|
||||||
|
'venue_address' => '1234 Technical Drive',
|
||||||
|
'venue_city' => 'Dallas',
|
||||||
|
'venue_state' => 'TX',
|
||||||
|
'venue_zip' => '75201',
|
||||||
|
'start_date' => date('Y-m-d 09:00:00', strtotime('+1 week')),
|
||||||
|
'end_date' => date('Y-m-d 17:00:00', strtotime('+1 week')),
|
||||||
|
'price' => 349,
|
||||||
|
'capacity' => 30,
|
||||||
|
'attendees' => 25,
|
||||||
|
'checked_in' => 22
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Commercial Refrigeration Certification',
|
||||||
|
'description' => 'Comprehensive certification course covering commercial refrigeration systems, EPA regulations, and best practices.',
|
||||||
|
'venue_name' => 'Industrial Training Institute',
|
||||||
|
'venue_address' => '5678 Commerce Park',
|
||||||
|
'venue_city' => 'Chicago',
|
||||||
|
'venue_state' => 'IL',
|
||||||
|
'venue_zip' => '60601',
|
||||||
|
'start_date' => date('Y-m-d 08:00:00', strtotime('+2 weeks')),
|
||||||
|
'end_date' => date('Y-m-d 18:00:00', strtotime('+2 weeks +1 day')),
|
||||||
|
'price' => 599,
|
||||||
|
'capacity' => 25,
|
||||||
|
'attendees' => 20,
|
||||||
|
'checked_in' => 18
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Heat Pump Installation & Service',
|
||||||
|
'description' => 'Learn proper installation, commissioning, and service procedures for modern heat pump systems.',
|
||||||
|
'venue_name' => 'Green Energy Training Lab',
|
||||||
|
'venue_address' => '9012 Sustainability Way',
|
||||||
|
'venue_city' => 'San Francisco',
|
||||||
|
'venue_state' => 'CA',
|
||||||
|
'venue_zip' => '94105',
|
||||||
|
'start_date' => date('Y-m-d 09:00:00', strtotime('+3 weeks')),
|
||||||
|
'end_date' => date('Y-m-d 16:00:00', strtotime('+3 weeks')),
|
||||||
|
'price' => 299,
|
||||||
|
'capacity' => 35,
|
||||||
|
'attendees' => 28,
|
||||||
|
'checked_in' => 25
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'title' => 'Building Automation Systems',
|
||||||
|
'description' => 'Introduction to BAS/BMS systems, programming, troubleshooting, and integration with HVAC equipment.',
|
||||||
|
'venue_name' => 'Smart Building Academy',
|
||||||
|
'venue_address' => '3456 Innovation Boulevard',
|
||||||
|
'venue_city' => 'New York',
|
||||||
|
'venue_state' => 'NY',
|
||||||
|
'venue_zip' => '10001',
|
||||||
|
'start_date' => date('Y-m-d 08:30:00', strtotime('+4 weeks')),
|
||||||
|
'end_date' => date('Y-m-d 17:30:00', strtotime('+4 weeks +2 days')),
|
||||||
|
'price' => 799,
|
||||||
|
'capacity' => 20,
|
||||||
|
'attendees' => 18,
|
||||||
|
'checked_in' => 16
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$created_events = [];
|
||||||
|
$total_revenue = 0;
|
||||||
|
|
||||||
|
// Names pool for attendees
|
||||||
|
$first_names = ['James', 'Mary', 'John', 'Patricia', 'Robert', 'Jennifer', 'Michael', 'Linda',
|
||||||
|
'William', 'Elizabeth', 'David', 'Barbara', 'Richard', 'Susan', 'Joseph', 'Jessica',
|
||||||
|
'Thomas', 'Sarah', 'Charles', 'Karen', 'Christopher', 'Nancy', 'Daniel', 'Betty',
|
||||||
|
'Matthew', 'Helen', 'Anthony', 'Sandra', 'Mark', 'Donna', 'Donald', 'Carol'];
|
||||||
|
|
||||||
|
$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'];
|
||||||
|
|
||||||
|
$companies = ['ABC Heating & Air', 'Comfort Systems Inc', 'CoolTech HVAC', 'Premier Climate Control',
|
||||||
|
'Elite Mechanical', 'ProAir Services', 'Quality Comfort Solutions', 'Advanced HVAC Systems'];
|
||||||
|
|
||||||
|
foreach ($events_data as $event_data) {
|
||||||
|
echo "\nCreating event: {$event_data['title']}\n";
|
||||||
|
|
||||||
|
// Create the event using Tribe__Events__API
|
||||||
|
$event_args = [
|
||||||
|
'post_title' => $event_data['title'],
|
||||||
|
'post_content' => $event_data['description'],
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_author' => $trainer_id,
|
||||||
|
'EventStartDate' => $event_data['start_date'],
|
||||||
|
'EventEndDate' => $event_data['end_date'],
|
||||||
|
'EventCost' => $event_data['price'],
|
||||||
|
'EventCurrencySymbol' => '$',
|
||||||
|
'Venue' => [
|
||||||
|
'Venue' => $event_data['venue_name'],
|
||||||
|
'Address' => $event_data['venue_address'],
|
||||||
|
'City' => $event_data['venue_city'],
|
||||||
|
'State' => $event_data['venue_state'],
|
||||||
|
'Zip' => $event_data['venue_zip'],
|
||||||
|
'Country' => 'United States'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Use The Events Calendar API to create event
|
||||||
|
$event_id = tribe_create_event($event_args);
|
||||||
|
|
||||||
|
if (is_wp_error($event_id) || !$event_id) {
|
||||||
|
echo "Failed to create event\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created event ID: {$event_id}\n";
|
||||||
|
|
||||||
|
// Ensure ticket provider is set
|
||||||
|
update_post_meta($event_id, '_tribe_default_ticket_provider', 'Tribe__Tickets_Plus__Commerce__PayPal__Main');
|
||||||
|
|
||||||
|
// Create ticket
|
||||||
|
$ticket_args = [
|
||||||
|
'post_title' => "General Admission - {$event_data['title']}",
|
||||||
|
'post_content' => "Access to {$event_data['title']}",
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_tickets',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$ticket_id = wp_insert_post($ticket_args);
|
||||||
|
|
||||||
|
if (is_wp_error($ticket_id)) {
|
||||||
|
echo "Failed to create ticket\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set comprehensive ticket meta
|
||||||
|
$ticket_meta = [
|
||||||
|
'_tribe_tpp_for_event' => $event_id,
|
||||||
|
'_price' => $event_data['price'],
|
||||||
|
'_tribe_ticket_capacity' => $event_data['capacity'],
|
||||||
|
'_capacity' => $event_data['capacity'],
|
||||||
|
'_stock' => $event_data['capacity'] - $event_data['attendees'],
|
||||||
|
'_manage_stock' => 'yes',
|
||||||
|
'_tribe_ticket_show_not_going' => 'no',
|
||||||
|
'_tribe_tpp_sold' => $event_data['attendees'],
|
||||||
|
'_tribe_ticket_sold' => $event_data['attendees'],
|
||||||
|
'total_sales' => $event_data['attendees']
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($ticket_meta as $key => $value) {
|
||||||
|
update_post_meta($ticket_id, $key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Created ticket ID: {$ticket_id} (Price: \${$event_data['price']})\n";
|
||||||
|
|
||||||
|
// Create attendees
|
||||||
|
echo "Creating {$event_data['attendees']} attendees...\n";
|
||||||
|
|
||||||
|
for ($i = 0; $i < $event_data['attendees']; $i++) {
|
||||||
|
// First attendee is always Ben
|
||||||
|
if ($i === 0) {
|
||||||
|
$first_name = 'Ben';
|
||||||
|
$last_name = 'Reed';
|
||||||
|
$email = 'ben@tealmaker.com';
|
||||||
|
$company = 'TealMaker';
|
||||||
|
} else {
|
||||||
|
$first_name = $first_names[array_rand($first_names)];
|
||||||
|
$last_name = $last_names[array_rand($last_names)];
|
||||||
|
$email = strtolower($first_name . '.' . $last_name . rand(100, 999) . '@example.com');
|
||||||
|
$company = $companies[array_rand($companies)];
|
||||||
|
}
|
||||||
|
|
||||||
|
$full_name = "{$first_name} {$last_name}";
|
||||||
|
|
||||||
|
// Create attendee post
|
||||||
|
$attendee_args = [
|
||||||
|
'post_title' => $full_name,
|
||||||
|
'post_content' => '',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'post_author' => $trainer_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$attendee_id = wp_insert_post($attendee_args);
|
||||||
|
|
||||||
|
if (is_wp_error($attendee_id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate realistic order data
|
||||||
|
$order_id = 'PAY-' . strtoupper(substr(md5($event_id . $attendee_id . microtime()), 0, 17));
|
||||||
|
$security_code = strtoupper(substr(md5($order_id), 0, 10));
|
||||||
|
|
||||||
|
// Set comprehensive attendee meta
|
||||||
|
$attendee_meta = [
|
||||||
|
// Event and ticket association
|
||||||
|
'_tribe_tpp_event' => $event_id,
|
||||||
|
'_tribe_tpp_product' => $ticket_id,
|
||||||
|
'_tribe_tickets_event_id' => $event_id,
|
||||||
|
'_tribe_tickets_product_id' => $ticket_id,
|
||||||
|
|
||||||
|
// Order information
|
||||||
|
'_tribe_tpp_order' => $order_id,
|
||||||
|
'_tribe_paypal_transaction_id' => $order_id,
|
||||||
|
'_tribe_tpp_order_status' => 'completed',
|
||||||
|
'_tribe_tickets_order_status' => 'completed',
|
||||||
|
|
||||||
|
// Personal information
|
||||||
|
'_tribe_tickets_full_name' => $full_name,
|
||||||
|
'_tribe_tickets_email' => $email,
|
||||||
|
'_tribe_tpp_full_name' => $full_name,
|
||||||
|
'_tribe_tpp_email' => $email,
|
||||||
|
|
||||||
|
// Payment information
|
||||||
|
'_paid_price' => $event_data['price'],
|
||||||
|
'_tribe_tpp_price' => $event_data['price'],
|
||||||
|
|
||||||
|
// Security
|
||||||
|
'_tribe_tpp_security_code' => $security_code,
|
||||||
|
|
||||||
|
// Additional fields
|
||||||
|
'company' => $company,
|
||||||
|
'_tribe_tpp_attendee_optout' => 'no'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($attendee_meta as $key => $value) {
|
||||||
|
update_post_meta($attendee_id, $key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check in attendees based on the specified count
|
||||||
|
if ($i < $event_data['checked_in']) {
|
||||||
|
update_post_meta($attendee_id, '_tribe_tpp_checkin', 1);
|
||||||
|
update_post_meta($attendee_id, 'check_in', 1);
|
||||||
|
update_post_meta($attendee_id, '_tribe_tickets_checkin_status', 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate and store event revenue
|
||||||
|
$event_revenue = $event_data['attendees'] * $event_data['price'];
|
||||||
|
$total_revenue += $event_revenue;
|
||||||
|
|
||||||
|
// Update event meta with sales data
|
||||||
|
update_post_meta($event_id, '_tribe_ticket_sold_count', $event_data['attendees']);
|
||||||
|
update_post_meta($event_id, '_tribe_event_revenue', $event_revenue);
|
||||||
|
|
||||||
|
$created_events[] = [
|
||||||
|
'id' => $event_id,
|
||||||
|
'title' => $event_data['title'],
|
||||||
|
'attendees' => $event_data['attendees'],
|
||||||
|
'checked_in' => $event_data['checked_in'],
|
||||||
|
'revenue' => $event_revenue
|
||||||
|
];
|
||||||
|
|
||||||
|
echo "Created {$event_data['attendees']} attendees, {$event_data['checked_in']} checked in\n";
|
||||||
|
echo "Event revenue: \${$event_revenue}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate certificates for checked-in attendees
|
||||||
|
if (class_exists('HVAC_Certificate_Manager')) {
|
||||||
|
echo "\n=== Generating certificates ===\n";
|
||||||
|
|
||||||
|
$certificate_manager = HVAC_Certificate_Manager::instance();
|
||||||
|
$total_certificates = 0;
|
||||||
|
|
||||||
|
foreach ($created_events as $event_info) {
|
||||||
|
echo "\nGenerating certificates for: {$event_info['title']}\n";
|
||||||
|
|
||||||
|
// Get checked-in attendees
|
||||||
|
$checked_in_attendees = get_posts([
|
||||||
|
'post_type' => 'tribe_tpp_attendees',
|
||||||
|
'meta_query' => [
|
||||||
|
'relation' => 'AND',
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_event',
|
||||||
|
'value' => $event_info['id']
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'key' => '_tribe_tpp_checkin',
|
||||||
|
'value' => 1
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'posts_per_page' => -1
|
||||||
|
]);
|
||||||
|
|
||||||
|
$event_certificates = 0;
|
||||||
|
|
||||||
|
foreach ($checked_in_attendees as $attendee) {
|
||||||
|
if (!$certificate_manager->certificate_exists($event_info['id'], $attendee->ID)) {
|
||||||
|
$cert_filename = 'certificate-' . $event_info['id'] . '-' . $attendee->ID . '-' . time() . rand(100, 999) . '.pdf';
|
||||||
|
$cert_path = 'hvac-certificates/' . date('Y/m/') . $cert_filename;
|
||||||
|
|
||||||
|
$cert_id = $certificate_manager->create_certificate(
|
||||||
|
$event_info['id'],
|
||||||
|
$attendee->ID,
|
||||||
|
0,
|
||||||
|
$cert_path,
|
||||||
|
$trainer_id
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($cert_id) {
|
||||||
|
$event_certificates++;
|
||||||
|
$total_certificates++;
|
||||||
|
|
||||||
|
// Create dummy PDF
|
||||||
|
$upload_dir = wp_upload_dir();
|
||||||
|
$full_path = $upload_dir['basedir'] . '/' . $cert_path;
|
||||||
|
$dir = dirname($full_path);
|
||||||
|
if (!file_exists($dir)) {
|
||||||
|
wp_mkdir_p($dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
$attendee_name = get_post_meta($attendee->ID, '_tribe_tickets_full_name', true);
|
||||||
|
$pdf_content = "%PDF-1.4\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj\n";
|
||||||
|
$pdf_content .= "2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj\n";
|
||||||
|
$pdf_content .= "3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj\n";
|
||||||
|
$pdf_content .= "%%EOF\n";
|
||||||
|
file_put_contents($full_path, $pdf_content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Generated {$event_certificates} certificates\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\nTotal certificates generated: {$total_certificates}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final summary
|
||||||
|
echo "\n=== TEST DATA CREATION COMPLETE ===\n";
|
||||||
|
echo "Created " . count($created_events) . " events:\n\n";
|
||||||
|
|
||||||
|
foreach ($created_events as $event) {
|
||||||
|
echo "- {$event['title']}\n";
|
||||||
|
echo " Attendees: {$event['attendees']} | Checked in: {$event['checked_in']} | Revenue: \${$event['revenue']}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\nTotal Revenue: \${$total_revenue}\n";
|
||||||
|
echo "\nAll test data has been created successfully!\n";
|
||||||
|
?>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Execute the PHP script
|
||||||
|
php create-test-data-with-revenue.php
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm create-test-data-with-revenue.php
|
||||||
|
ENDSSH
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "[0;32mComplete test data with revenue created![0m"
|
||||||
|
echo ""
|
||||||
|
echo "You can now test all features:"
|
||||||
|
echo ""
|
||||||
|
echo "1. Enhanced Dashboard: https://upskill-staging.measurequick.com/hvac-dashboard/"
|
||||||
|
echo " - Search for events (try 'Workshop' or 'Certification')"
|
||||||
|
echo " - Filter by date range"
|
||||||
|
echo " - Change items per page (10/25/50/100)"
|
||||||
|
echo " - Sort by clicking column headers"
|
||||||
|
echo " - View revenue numbers for each event"
|
||||||
|
echo ""
|
||||||
|
echo "2. Certificate Generation: https://upskill-staging.measurequick.com/generate-certificates/"
|
||||||
|
echo " - Select any event to see attendees"
|
||||||
|
echo " - Generate certificates for checked-in attendees"
|
||||||
|
echo ""
|
||||||
|
echo "3. Certificate Reports: https://upskill-staging.measurequick.com/certificate-reports/"
|
||||||
|
echo " - View all generated certificates"
|
||||||
|
echo " - Filter by event or attendee name"
|
||||||
|
echo " - Download certificates"
|
||||||
|
echo ""
|
||||||
|
echo "Login as: test_trainer"
|
||||||
Loading…
Reference in a new issue