diff --git a/wordpress-dev/bin/fix-test-trainer-login.sh b/wordpress-dev/bin/fix-test-trainer-login.sh new file mode 100755 index 00000000..52b0154b --- /dev/null +++ b/wordpress-dev/bin/fix-test-trainer-login.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# Fix test_trainer login issues +echo "=== Fixing test_trainer Login Issues ===" + +cat > fix-login.php << 'EOF' +ID . "\n"; +echo "Current status: " . $user->user_status . "\n"; + +// Reset password to ensure it's correct +$new_password = 'Test123!'; +wp_set_password($new_password, $user->ID); +echo "Password reset to: $new_password\n"; + +// Ensure user has correct role +$user->set_role('hvac_trainer'); +echo "Role set to: hvac_trainer\n"; + +// Clear any user meta that might be blocking login +delete_user_meta($user->ID, 'failed_login_count'); +delete_user_meta($user->ID, 'last_failed_login'); +delete_user_meta($user->ID, 'account_locked'); +echo "Cleared login failure meta\n"; + +// Ensure user is active +wp_update_user(array( + 'ID' => $user->ID, + 'user_status' => 0 +)); +echo "User status set to active\n"; + +// Clear all sessions for this user +$sessions = WP_Session_Tokens::get_instance($user->ID); +$sessions->destroy_all(); +echo "All sessions cleared\n"; + +// Test authentication +$auth_result = wp_authenticate($user->user_login, $new_password); +if (is_wp_error($auth_result)) { + echo "Authentication failed: " . $auth_result->get_error_message() . "\n"; +} else { + echo "Authentication successful!\n"; +} + +// Check user capabilities +$capabilities = $user->get_role_caps(); +$has_hvac_caps = isset($capabilities['hvac_manage_events']) && $capabilities['hvac_manage_events']; +echo "Has HVAC capabilities: " . ($has_hvac_caps ? 'Yes' : 'No') . "\n"; + +if (!$has_hvac_caps) { + echo "Adding HVAC capabilities...\n"; + $user->add_cap('hvac_manage_events'); + $user->add_cap('hvac_view_dashboard'); + $user->add_cap('read'); + echo "HVAC capabilities added\n"; +} + +echo "test_trainer login fix complete!\n"; +EOF + +# Upload and run +scp -o StrictHostKeyChecking=no fix-login.php hvaccommunity@193.203.168.198:/home/hvaccommunity/public_html/ +ssh -o StrictHostKeyChecking=no hvaccommunity@193.203.168.198 "cd /home/hvaccommunity/public_html && php fix-login.php" + +# Clean up +rm fix-login.php +ssh -o StrictHostKeyChecking=no hvaccommunity@193.203.168.198 "rm -f /home/hvaccommunity/public_html/fix-login.php" + +echo "Login fix complete!" \ No newline at end of file diff --git a/wordpress-dev/tests/e2e/critical-error-investigation.test.ts b/wordpress-dev/tests/e2e/critical-error-investigation.test.ts new file mode 100644 index 00000000..5771271f --- /dev/null +++ b/wordpress-dev/tests/e2e/critical-error-investigation.test.ts @@ -0,0 +1,73 @@ +import { test, expect } from '@playwright/test'; + +test('Critical Error Investigation', async ({ page }) => { + console.log('=== Investigating Critical Error ==='); + + // Test main pages + const pagesToTest = [ + 'https://upskill-staging.measurequick.com/', + 'https://upskill-staging.measurequick.com/community-login/', + 'https://upskill-staging.measurequick.com/hvac-dashboard/', + 'https://upskill-staging.measurequick.com/certificate-reports/', + 'https://upskill-staging.measurequick.com/wp-admin/' + ]; + + for (const url of pagesToTest) { + console.log(`\nTesting: ${url}`); + + try { + await page.goto(url, { waitUntil: 'load', timeout: 10000 }); + await page.waitForLoadState('networkidle', { timeout: 5000 }); + + const title = await page.title(); + console.log(` Title: ${title}`); + console.log(` Final URL: ${page.url()}`); + + // Check for critical error + const hasCriticalError = await page.locator('text=critical error').count() > 0; + const hasWordPressFatalError = await page.locator('text=There has been a critical error').count() > 0; + const hasPhpError = await page.locator('text=Fatal error').count() > 0; + const hasParseError = await page.locator('text=Parse error').count() > 0; + + if (hasCriticalError || hasWordPressFatalError || hasPhpError || hasParseError) { + console.log(' ❌ CRITICAL ERROR DETECTED'); + + // Get error details + const errorText = await page.locator('body').textContent(); + const lines = errorText?.split('\n').slice(0, 10) || []; + console.log(' Error content (first 10 lines):'); + lines.forEach((line, i) => { + if (line.trim()) console.log(` ${i + 1}: ${line.trim()}`); + }); + + // Take screenshot + await page.screenshot({ + path: `critical-error-${url.replace(/[^a-zA-Z0-9]/g, '-')}.png`, + fullPage: true + }); + } else { + console.log(' ✅ No critical error detected'); + } + + // Check for other indicators + const bodyText = await page.locator('body').textContent() || ''; + if (bodyText.includes('500')) { + console.log(' ⚠️ 500 error detected'); + } + if (bodyText.includes('syntax error')) { + console.log(' ⚠️ Syntax error detected'); + } + if (bodyText.includes('class not found')) { + console.log(' ⚠️ Class not found error detected'); + } + + } catch (error) { + console.log(` ❌ Failed to load: ${error}`); + await page.screenshot({ + path: `failed-load-${url.replace(/[^a-zA-Z0-9]/g, '-')}.png` + }); + } + } + + console.log('\n=== Investigation Complete ==='); +}); \ No newline at end of file diff --git a/wordpress-dev/tests/e2e/debug-authenticated-dashboard.test.ts b/wordpress-dev/tests/e2e/debug-authenticated-dashboard.test.ts new file mode 100644 index 00000000..bfe8406c --- /dev/null +++ b/wordpress-dev/tests/e2e/debug-authenticated-dashboard.test.ts @@ -0,0 +1,162 @@ +import { test, expect } from '@playwright/test'; + +test('Debug Authenticated Dashboard 500 Error', async ({ page }) => { + console.log('=== Testing Dashboard 500 Error After Login ==='); + + try { + // Go to community login + console.log('1. Navigating to community login...'); + await page.goto('https://upskill-staging.measurequick.com/community-login/', { + waitUntil: 'load', + timeout: 10000 + }); + + console.log('2. Filling login form with provided credentials...'); + await page.fill('#user_login', 'test_trainer'); + await page.fill('#user_pass', 'test_password'); + + console.log('3. Submitting login form...'); + await page.click('#wp-submit'); + + // Wait for response and check result + await page.waitForLoadState('networkidle', { timeout: 10000 }); + + const currentUrl = page.url(); + console.log(`4. URL after login attempt: ${currentUrl}`); + + // Check if login was successful + if (currentUrl.includes('login=failed')) { + console.log('❌ Login failed - checking error message...'); + const errorMessage = await page.locator('.login-error').textContent().catch(() => 'No error message found'); + console.log(`Error message: ${errorMessage}`); + + await page.screenshot({ path: 'login-failed-test-trainer.png' }); + return; + } + + // If we're redirected to dashboard or another page, login was successful + if (currentUrl.includes('hvac-dashboard') || !currentUrl.includes('login')) { + console.log('✅ Login appears successful, checking dashboard...'); + } else { + console.log('⚠️ Login status unclear, trying to access dashboard directly...'); + } + + console.log('5. Attempting to access dashboard...'); + + // Set up response handler to catch 500 errors + let responseStatus = 0; + let responseError = ''; + + page.on('response', response => { + if (response.url().includes('hvac-dashboard')) { + responseStatus = response.status(); + console.log(`Dashboard response status: ${responseStatus}`); + } + }); + + // Navigate to dashboard + const dashboardResponse = await page.goto('https://upskill-staging.measurequick.com/hvac-dashboard/', { + waitUntil: 'load', + timeout: 10000 + }).catch(error => { + console.log(`Dashboard navigation error: ${error}`); + return null; + }); + + if (dashboardResponse) { + console.log(`Dashboard HTTP status: ${dashboardResponse.status()}`); + + if (dashboardResponse.status() === 500) { + console.log('❌ 500 ERROR DETECTED ON DASHBOARD'); + + // Get page content to see error details + const pageContent = await page.content(); + const bodyText = await page.locator('body').textContent() || ''; + + console.log('Error page content analysis:'); + + // Check for WordPress error patterns + if (bodyText.includes('There has been a critical error')) { + console.log(' - WordPress critical error detected'); + } + if (bodyText.includes('Fatal error')) { + console.log(' - PHP Fatal error detected'); + } + if (bodyText.includes('Parse error')) { + console.log(' - PHP Parse error detected'); + } + if (bodyText.includes('Call Stack')) { + console.log(' - Call stack detected'); + } + + // Look for plugin-specific errors + if (bodyText.includes('HVAC') || bodyText.includes('hvac')) { + console.log(' - HVAC plugin related error detected'); + } + + // Extract error details if visible + const errorLines = bodyText.split('\n') + .filter(line => line.includes('error') || line.includes('Error') || line.includes('Fatal') || line.includes('.php')) + .slice(0, 15); + + if (errorLines.length > 0) { + console.log(' Error details found:'); + errorLines.forEach((line, i) => { + if (line.trim()) console.log(` ${i + 1}: ${line.trim()}`); + }); + } + + await page.screenshot({ + path: 'dashboard-500-error.png', + fullPage: true + }); + + // Check if we can access other pages while logged in + console.log('6. Testing other authenticated pages...'); + + const testPages = [ + 'certificate-reports', + 'generate-certificates', + 'trainer-profile' + ]; + + for (const testPage of testPages) { + try { + console.log(` Testing: ${testPage}...`); + const testResponse = await page.goto(`https://upskill-staging.measurequick.com/${testPage}/`, { + waitUntil: 'load', + timeout: 5000 + }); + + console.log(` Status: ${testResponse?.status()}`); + + if (testResponse?.status() === 500) { + console.log(` ❌ ${testPage} also has 500 error`); + await page.screenshot({ + path: `${testPage}-500-error.png`, + fullPage: true + }); + } else { + console.log(` ✅ ${testPage} loads successfully`); + } + + } catch (error) { + console.log(` ❌ Error accessing ${testPage}: ${error}`); + } + } + + } else { + console.log('✅ Dashboard loads successfully'); + await page.screenshot({ path: 'dashboard-success.png' }); + } + } else { + console.log('❌ Failed to get dashboard response'); + } + + } catch (error) { + console.log(`❌ Test exception: ${error}`); + await page.screenshot({ path: 'test-exception.png' }); + } + + console.log('\n=== Dashboard Debug Test Complete ==='); +}); \ No newline at end of file diff --git a/wordpress-dev/tests/e2e/login-and-dashboard-test.test.ts b/wordpress-dev/tests/e2e/login-and-dashboard-test.test.ts new file mode 100644 index 00000000..99c6f1c1 --- /dev/null +++ b/wordpress-dev/tests/e2e/login-and-dashboard-test.test.ts @@ -0,0 +1,146 @@ +import { test, expect } from '@playwright/test'; + +test('Login and Dashboard Deep Test', async ({ page }) => { + console.log('=== Testing Login and Dashboard for Critical Errors ==='); + + // Test multiple login scenarios to trigger potential errors + const loginAttempts = [ + { username: 'test_trainer', password: 'Test123!', name: 'test_trainer' }, + { username: 'devadmin', password: 'zc3CQlCOr9ZZBZDakecTqcOt', name: 'devadmin' }, + { username: 'invalid_user', password: 'wrong_pass', name: 'invalid' } + ]; + + for (const attempt of loginAttempts) { + console.log(`\n--- Testing login with ${attempt.name} ---`); + + try { + // Clear cookies and storage + await page.context().clearCookies(); + await page.evaluate(() => localStorage.clear()); + await page.evaluate(() => sessionStorage.clear()); + + // Go to community login + await page.goto('https://upskill-staging.measurequick.com/community-login/', { waitUntil: 'networkidle' }); + + // Fill login form + await page.fill('#user_login', attempt.username); + await page.fill('#user_pass', attempt.password); + await page.click('#wp-submit'); + + await page.waitForLoadState('networkidle'); + + console.log(` URL after login: ${page.url()}`); + + // Check for any critical errors + const hasCriticalError = await page.locator('text=critical error').count() > 0; + const hasWordPressFatalError = await page.locator('text=There has been a critical error').count() > 0; + const hasPhpError = await page.locator('text=Fatal error').count() > 0; + const hasParseError = await page.locator('text=Parse error').count() > 0; + const hasCallStackError = await page.locator('text=Call Stack').count() > 0; + + if (hasCriticalError || hasWordPressFatalError || hasPhpError || hasParseError || hasCallStackError) { + console.log(` ❌ CRITICAL ERROR DETECTED for ${attempt.name}`); + + // Get full page text for analysis + const bodyText = await page.locator('body').textContent(); + const errorLines = bodyText?.split('\n').filter(line => + line.includes('Fatal') || + line.includes('critical') || + line.includes('Error') || + line.includes('Call Stack') || + line.includes('.php') + ).slice(0, 15) || []; + + console.log(' Error details:'); + errorLines.forEach((line, i) => { + if (line.trim()) console.log(` ${i + 1}: ${line.trim()}`); + }); + + await page.screenshot({ + path: `critical-error-login-${attempt.name}.png`, + fullPage: true + }); + } else { + console.log(` ✅ No critical error for ${attempt.name}`); + } + + // If login successful, try to access dashboard + if (page.url().includes('hvac-dashboard') || !page.url().includes('login')) { + console.log(` Successful login for ${attempt.name}, testing dashboard...`); + + // Navigate to dashboard directly + await page.goto('https://upskill-staging.measurequick.com/hvac-dashboard/', { waitUntil: 'networkidle' }); + + const dashboardHasError = await page.locator('text=critical error').count() > 0 || + await page.locator('text=There has been a critical error').count() > 0; + + if (dashboardHasError) { + console.log(` ❌ DASHBOARD ERROR for ${attempt.name}`); + await page.screenshot({ + path: `dashboard-error-${attempt.name}.png`, + fullPage: true + }); + } else { + console.log(` ✅ Dashboard loads without error for ${attempt.name}`); + } + + // Test certificate reports + await page.goto('https://upskill-staging.measurequick.com/certificate-reports/', { waitUntil: 'networkidle' }); + + const certHasError = await page.locator('text=critical error').count() > 0 || + await page.locator('text=There has been a critical error').count() > 0; + + if (certHasError) { + console.log(` ❌ CERTIFICATE REPORTS ERROR for ${attempt.name}`); + await page.screenshot({ + path: `cert-reports-error-${attempt.name}.png`, + fullPage: true + }); + } else { + console.log(` ✅ Certificate reports loads without error for ${attempt.name}`); + } + } + + } catch (error) { + console.log(` ❌ Exception during ${attempt.name} test: ${error}`); + await page.screenshot({ + path: `exception-${attempt.name}.png` + }); + } + } + + // Test admin area with different credentials + console.log(`\n--- Testing WP Admin Access ---`); + + try { + await page.context().clearCookies(); + await page.goto('https://upskill-staging.measurequick.com/wp-admin/', { waitUntil: 'networkidle' }); + + // Try admin login with the API credentials + await page.fill('#user_login', 'devadmin'); + await page.fill('#user_pass', 'zc3CQlCOr9ZZBZDakecTqcOt'); + await page.click('#wp-submit'); + + await page.waitForLoadState('networkidle'); + + console.log(` Admin area URL: ${page.url()}`); + + const adminHasError = await page.locator('text=critical error').count() > 0 || + await page.locator('text=There has been a critical error').count() > 0; + + if (adminHasError) { + console.log(` ❌ ADMIN AREA ERROR`); + await page.screenshot({ + path: `admin-area-error.png`, + fullPage: true + }); + } else { + console.log(` ✅ Admin area loads without error`); + } + + } catch (error) { + console.log(` ❌ Exception during admin test: ${error}`); + } + + console.log('\n=== Login and Dashboard Test Complete ==='); +}); \ No newline at end of file diff --git a/wordpress-dev/tests/e2e/simple-error-check.test.ts b/wordpress-dev/tests/e2e/simple-error-check.test.ts new file mode 100644 index 00000000..82b54ae7 --- /dev/null +++ b/wordpress-dev/tests/e2e/simple-error-check.test.ts @@ -0,0 +1,89 @@ +import { test, expect } from '@playwright/test'; + +test('Simple Error Check - All Pages', async ({ page }) => { + console.log('=== Simple Error Check ==='); + + const pages = [ + { url: 'https://upskill-staging.measurequick.com/', name: 'Homepage' }, + { url: 'https://upskill-staging.measurequick.com/community-login/', name: 'Community Login' }, + { url: 'https://upskill-staging.measurequick.com/hvac-dashboard/', name: 'HVAC Dashboard' }, + { url: 'https://upskill-staging.measurequick.com/certificate-reports/', name: 'Certificate Reports' }, + { url: 'https://upskill-staging.measurequick.com/generate-certificates/', name: 'Generate Certificates' }, + { url: 'https://upskill-staging.measurequick.com/trainer-profile/', name: 'Trainer Profile' }, + { url: 'https://upskill-staging.measurequick.com/wp-admin/', name: 'WP Admin' } + ]; + + for (const pageInfo of pages) { + console.log(`\nChecking: ${pageInfo.name}`); + + try { + await page.goto(pageInfo.url, { waitUntil: 'load', timeout: 15000 }); + await page.waitForLoadState('domcontentloaded'); + + // Get the page content + const content = await page.content(); + const bodyText = await page.locator('body').textContent() || ''; + + console.log(` URL: ${page.url()}`); + console.log(` Title: ${await page.title()}`); + + // Check for various error indicators + const errorChecks = { + 'Critical Error': bodyText.includes('There has been a critical error'), + 'Fatal Error': bodyText.includes('Fatal error'), + 'Parse Error': bodyText.includes('Parse error'), + 'Call Stack': bodyText.includes('Call Stack'), + 'PHP Error': content.includes('PHP Fatal error') || content.includes('PHP Parse error'), + 'WordPress Error': content.includes('wp-die') || content.includes('WordPress has experienced an error'), + 'Plugin Error': bodyText.includes('Plugin could not be activated') || bodyText.includes('Plugin file does not exist'), + 'Database Error': bodyText.includes('Error establishing a database connection'), + 'Memory Error': bodyText.includes('Fatal error: Allowed memory size'), + 'Syntax Error': bodyText.includes('syntax error') || bodyText.includes('unexpected') + }; + + let hasAnyError = false; + for (const [errorType, hasError] of Object.entries(errorChecks)) { + if (hasError) { + console.log(` ❌ ${errorType} detected`); + hasAnyError = true; + } + } + + if (!hasAnyError) { + console.log(` ✅ No errors detected`); + } else { + // Get error details + const errorLines = bodyText.split('\n') + .filter(line => line.includes('error') || line.includes('Error') || line.includes('Fatal') || line.includes('.php')) + .slice(0, 10); + + if (errorLines.length > 0) { + console.log(' Error details:'); + errorLines.forEach((line, i) => { + if (line.trim()) console.log(` ${i + 1}: ${line.trim()}`); + }); + } + + await page.screenshot({ + path: `error-${pageInfo.name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}.png`, + fullPage: true + }); + } + + // Check response status + const response = await page.goto(pageInfo.url, { waitUntil: 'load' }); + if (response?.status() !== 200) { + console.log(` ⚠️ HTTP Status: ${response?.status()}`); + } + + } catch (error) { + console.log(` ❌ Exception: ${error}`); + await page.screenshot({ + path: `exception-${pageInfo.name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}.png` + }); + } + } + + console.log('\n=== Error Check Complete ==='); + console.log('If critical errors exist, screenshots have been saved to the test directory.'); +}); \ No newline at end of file diff --git a/wordpress-dev/tests/e2e/test-admin-dashboard.test.ts b/wordpress-dev/tests/e2e/test-admin-dashboard.test.ts new file mode 100644 index 00000000..1e4ab2c0 --- /dev/null +++ b/wordpress-dev/tests/e2e/test-admin-dashboard.test.ts @@ -0,0 +1,75 @@ +import { test, expect } from '@playwright/test'; + +test('Test Dashboard with Admin User', async ({ page }) => { + console.log('Testing with admin credentials...'); + + // Go to WordPress admin login + await page.goto('https://upskill-staging.measurequick.com/wp-admin/'); + await page.waitForLoadState('networkidle'); + + // Try admin login + await page.fill('#user_login', 'devadmin'); + await page.fill('#user_pass', 'zc3CQlCOr9ZZBZDakecTqcOt'); + await page.click('#wp-submit'); + + await page.waitForLoadState('networkidle'); + console.log('Admin login URL:', page.url()); + + if (page.url().includes('wp-admin')) { + console.log('✓ Admin login successful'); + + // Navigate to HVAC dashboard + await page.goto('https://upskill-staging.measurequick.com/hvac-dashboard/'); + await page.waitForLoadState('networkidle'); + + console.log('Dashboard URL:', page.url()); + console.log('Dashboard Title:', await page.title()); + + // Take screenshot + await page.screenshot({ path: 'admin-dashboard-test.png' }); + + // Check for dashboard elements + const statsCards = await page.locator('.hvac-stat-card').count(); + console.log('Stats cards found:', statsCards); + + if (statsCards > 0) { + console.log('✓ Dashboard stats are visible'); + + // Get stat values + const totalEventsElement = page.locator('.hvac-stat-card:has-text("Total Events") .hvac-stat-value'); + const upcomingEventsElement = page.locator('.hvac-stat-card:has-text("Upcoming Events") .hvac-stat-value'); + const ticketsSoldElement = page.locator('.hvac-stat-card:has-text("Tickets Sold") .hvac-stat-value'); + const totalRevenueElement = page.locator('.hvac-stat-card:has-text("Total Revenue") .hvac-stat-value'); + + const totalEvents = await totalEventsElement.textContent().catch(() => 'N/A'); + const upcomingEvents = await upcomingEventsElement.textContent().catch(() => 'N/A'); + const ticketsSold = await ticketsSoldElement.textContent().catch(() => 'N/A'); + const totalRevenue = await totalRevenueElement.textContent().catch(() => 'N/A'); + + console.log('Dashboard Stats:'); + console.log('- Total Events:', totalEvents); + console.log('- Upcoming Events:', upcomingEvents); + console.log('- Tickets Sold:', ticketsSold); + console.log('- Total Revenue:', totalRevenue); + } + + // Check certificate reports + await page.goto('https://upskill-staging.measurequick.com/certificate-reports/'); + await page.waitForLoadState('networkidle'); + + console.log('Certificate Reports URL:', page.url()); + + const hasError = await page.locator('text=critical error').count() > 0; + if (hasError) { + console.log('✗ Certificate Reports still has critical error'); + } else { + console.log('✓ Certificate Reports loads without critical error'); + } + + await page.screenshot({ path: 'certificate-reports-test.png' }); + + } else { + console.log('✗ Admin login failed'); + await page.screenshot({ path: 'admin-login-failed.png' }); + } +}); \ No newline at end of file diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php index f4600fc3..4ee5da11 100644 --- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php +++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php @@ -27,15 +27,15 @@ class HVAC_Dashboard_Data { * * @var int */ - private int $user_id; + private $user_id; /** * Constructor. * * @param int $user_id The ID of the trainer user. */ - public function __construct( int $user_id ) { - $this->user_id = $user_id; + public function __construct( $user_id ) { + $this->user_id = (int) $user_id; } /** @@ -43,7 +43,7 @@ class HVAC_Dashboard_Data { * * @return int */ - public function get_total_events_count() : int { + public function get_total_events_count() { global $wpdb; // Use direct database query to avoid TEC query hijacking @@ -64,7 +64,7 @@ class HVAC_Dashboard_Data { * * @return int */ - public function get_upcoming_events_count() : int { + public function get_upcoming_events_count() { global $wpdb; $today = date( 'Y-m-d H:i:s' ); @@ -89,7 +89,7 @@ class HVAC_Dashboard_Data { * * @return int */ - public function get_past_events_count() : int { + public function get_past_events_count() { global $wpdb; $today = date( 'Y-m-d H:i:s' ); @@ -114,7 +114,7 @@ class HVAC_Dashboard_Data { * * @return int */ - public function get_total_tickets_sold() : int { + public function get_total_tickets_sold() { $total_tickets = 0; $args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, @@ -156,7 +156,7 @@ class HVAC_Dashboard_Data { * * @return float */ - public function get_total_revenue() : float { + public function get_total_revenue() { $total_revenue = 0.0; $args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, @@ -193,7 +193,7 @@ class HVAC_Dashboard_Data { * * @return float|null Returns the target as a float, or null if not set. */ - public function get_annual_revenue_target() : ?float { + public function get_annual_revenue_target() { $target = get_user_meta( $this->user_id, 'annual_revenue_target', true ); return ! empty( $target ) && is_numeric( $target ) ? (float) $target : null; } @@ -204,7 +204,7 @@ class HVAC_Dashboard_Data { * @param string $filter_status The status to filter events by ('all', 'publish', 'future', 'draft', 'pending', 'private'). Defaults to 'all'. * @return array An array of event data arrays/objects, each containing keys like: id, status, name, link, date, organizer, capacity, sold, revenue. */ - public function get_events_table_data( string $filter_status = 'all' ) : array { + public function get_events_table_data( $filter_status = 'all' ) { $events_data = []; $valid_statuses = array( 'publish', 'future', 'draft', 'pending', 'private' ); $post_status = ( 'all' === $filter_status || ! in_array( $filter_status, $valid_statuses, true ) ) @@ -294,7 +294,7 @@ class HVAC_Dashboard_Data { * @param int $event_id Event ID to count attendees for * @return int Number of attendees found */ - private function count_event_attendees(int $event_id) : int { + private function count_event_attendees( $event_id ) { $attendee_count = 0; // Check if Event Tickets is active @@ -329,7 +329,7 @@ class HVAC_Dashboard_Data { * @param int $event_id Event ID to calculate revenue for * @return float Total revenue calculated */ - private function calculate_event_revenue(int $event_id) : float { + private function calculate_event_revenue( $event_id ) { $total_revenue = 0.0; // Check if Event Tickets is active