#!/bin/bash # Exit on error set -e # Source environment variables source .env echo "Deploying dashboard fix to staging..." # Create backup and upload fix directly via SSH echo "Creating fix on staging server..." sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && cat > wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data-fixed.php << 'EOF' user_id = \$user_id; } /** * Get the total number of events created by the trainer. * * @return int */ public function get_total_events_count() : int { \$args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, 'author' => \$this->user_id, 'post_status' => array( 'publish', 'future', 'draft', 'pending', 'private' ), 'posts_per_page' => -1, 'fields' => 'ids', ); \$query = new WP_Query( \$args ); return (int) \$query->found_posts; } /** * Get the number of upcoming events for the trainer. * * @return int */ public function get_upcoming_events_count() : int { \$today = current_time( 'mysql' ); \$args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, 'author' => \$this->user_id, // Use author consistently 'post_status' => array( 'publish', 'future' ), 'posts_per_page' => -1, 'fields' => 'ids', 'meta_query' => array( array( 'key' => '_EventStartDate', 'value' => \$today, 'compare' => '>=', 'type' => 'DATETIME', ), ), 'orderby' => 'meta_value', 'meta_key' => '_EventStartDate', 'order' => 'ASC', ); \$query = new WP_Query( \$args ); return (int) \$query->found_posts; } /** * Get the number of past events for the trainer. * * @return int */ public function get_past_events_count() : int { \$today = current_time( 'mysql' ); \$args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, 'author' => \$this->user_id, // Use author consistently 'post_status' => array( 'publish', 'private' ), 'posts_per_page' => -1, 'fields' => 'ids', 'meta_query' => array( array( 'key' => '_EventEndDate', 'value' => \$today, 'compare' => '<', 'type' => 'DATETIME', ), ), ); \$query = new WP_Query( \$args ); return (int) \$query->found_posts; } /** * Get the total number of tickets sold across all the trainer's events. * * @return int */ public function get_total_tickets_sold() : int { \$total_tickets = 0; \$args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, 'author' => \$this->user_id, // Use author consistently 'post_status' => array( 'publish', 'future', 'draft', 'pending', 'private' ), 'posts_per_page' => -1, 'fields' => 'ids', ); \$event_ids = get_posts( \$args ); if ( ! empty( \$event_ids ) ) { foreach ( \$event_ids as \$event_id ) { \$sold = get_post_meta( \$event_id, '_tribe_tickets_sold', true ); if ( is_numeric( \$sold ) ) { \$total_tickets += (int) \$sold; } } } return \$total_tickets; } /** * Get the total revenue generated across all the trainer's events. * * @return float */ public function get_total_revenue() : float { \$total_revenue = 0.0; \$args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, 'author' => \$this->user_id, // Use author consistently 'post_status' => array( 'publish', 'future', 'draft', 'pending', 'private' ), 'posts_per_page' => -1, 'fields' => 'ids', ); \$event_ids = get_posts( \$args ); if ( ! empty( \$event_ids ) ) { foreach ( \$event_ids as \$event_id ) { \$revenue = get_post_meta( \$event_id, '_tribe_revenue_total', true ); if ( is_numeric( \$revenue ) ) { \$total_revenue += (float) \$revenue; } } } return \$total_revenue; } /** * Get the annual revenue target set by the trainer. * * @return float|null Returns the target as a float, or null if not set. */ public function get_annual_revenue_target() : ?float { \$target = get_user_meta( \$this->user_id, 'annual_revenue_target', true ); return ! empty( \$target ) && is_numeric( \$target ) ? (float) \$target : null; } /** * Get the data needed for the events table on the dashboard. * * @param string \$filter_status The status to filter events by. * @return array An array of event data arrays. */ public function get_events_table_data( string \$filter_status = 'all' ) : array { \$events_data = []; \$valid_statuses = array( 'publish', 'future', 'draft', 'pending', 'private' ); \$post_status = ( 'all' === \$filter_status || ! in_array( \$filter_status, \$valid_statuses, true ) ) ? \$valid_statuses : array( \$filter_status ); \$args = array( 'post_type' => Tribe__Events__Main::POSTTYPE, 'author' => \$this->user_id, // Use author consistently 'post_status' => \$post_status, 'posts_per_page' => -1, 'orderby' => 'meta_value', 'meta_key' => '_EventStartDate', 'order' => 'DESC', ); \$query = new WP_Query( \$args ); if ( \$query->have_posts() ) { while ( \$query->have_posts() ) { \$query->the_post(); \$event_id = get_the_ID(); // Get Capacity \$total_capacity = 0; if ( function_exists( 'tribe_get_tickets' ) ) { \$tickets = tribe_get_tickets( \$event_id ); if ( \$tickets ) { foreach ( \$tickets as \$ticket ) { \$capacity = \$ticket->capacity(); if ( \$capacity === -1 ) { \$total_capacity = -1; break; } if ( is_numeric( \$capacity ) ) { \$total_capacity += \$capacity; } } } } \$sold = get_post_meta( \$event_id, '_tribe_tickets_sold', true ); \$revenue = get_post_meta( \$event_id, '_tribe_revenue_total', true ); \$events_data[] = array( 'id' => \$event_id, 'status' => get_post_status( \$event_id ), 'name' => get_the_title(), 'link' => get_permalink( \$event_id ), 'start_date_ts' => strtotime( get_post_meta( \$event_id, '_EventStartDate', true ) ), 'organizer_id' => (int) get_post_meta( \$event_id, '_EventOrganizerID', true ), 'capacity' => ( \$total_capacity === -1 ) ? 'Unlimited' : (int) \$total_capacity, 'sold' => is_numeric( \$sold ) ? (int) \$sold : 0, 'revenue' => is_numeric( \$revenue ) ? (float) \$revenue : 0.0, ); } wp_reset_postdata(); } return \$events_data; } } EOF" # Backup original echo "Backing up original file..." sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && cp wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php.bak" # Replace with fixed version echo "Replacing with fixed version..." sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && cp wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data-fixed.php wp-content/plugins/hvac-community-events/includes/class-hvac-dashboard-data.php" # Clear cache echo "Clearing cache..." sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && wp cache flush" # Test the fix echo -e "\nTesting the fix..." sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && cat > test-dashboard-fix.php << 'EOF' ID; echo \"User ID: \$user_id\\n\"; \$dashboard_data = new HVAC_Dashboard_Data(\$user_id); echo \"Total Events: \" . \$dashboard_data->get_total_events_count() . \"\\n\"; echo \"Upcoming Events: \" . \$dashboard_data->get_upcoming_events_count() . \"\\n\"; echo \"Past Events: \" . \$dashboard_data->get_past_events_count() . \"\\n\"; echo \"Total Tickets: \" . \$dashboard_data->get_total_tickets_sold() . \"\\n\"; echo \"Total Revenue: \" . \$dashboard_data->get_total_revenue() . \"\\n\"; // Check event table data \$events = \$dashboard_data->get_events_table_data(); echo \"\\nEvents in table: \" . count(\$events) . \"\\n\"; foreach (\$events as \$event) { echo \" - \" . \$event['name'] . \" (\" . \$event['status'] . \")\\n\"; } EOF" sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && php test-dashboard-fix.php" # Clean up test file sshpass -p "$UPSKILL_STAGING_PASS" ssh -o StrictHostKeyChecking=no "$UPSKILL_STAGING_SSH_USER@$UPSKILL_STAGING_IP" "cd $UPSKILL_STAGING_PATH && rm test-dashboard-fix.php" echo -e "\nDashboard fix deployed. You should now see the correct stats at: https://wordpress-974670-5399585.cloudwaysapps.com/hvac-dashboard/"