fix: Update Admin Dashboard metrics for attendees and revenue

- Fix attendee count to properly query Event Tickets data
- Add support for counting attendees across all ticket providers (RSVP, PayPal, Tickets Commerce)
- Implement detailed revenue metrics from multiple sources
- Support Event Tickets Plus with WooCommerce ticket sales
- Add support for Tickets Commerce revenue statistics
- Add support for legacy PayPal ticket sales
- Improve dashboard accuracy with proper database queries

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
bengizmo 2025-05-19 17:37:04 -03:00
parent 54312badba
commit 6974385990

View file

@ -396,13 +396,51 @@ class HVAC_Admin_Dashboard {
AND pm.meta_value = '1' AND pm.meta_value = '1'
", 'tribe_events')); ", 'tribe_events'));
// Total attendees (would require integration with Event Tickets Plus) // Total attendees using Event Tickets data
$total_attendees = 0; $total_attendees = 0;
if (class_exists('Tribe__Tickets_Plus__Main')) {
$total_attendees = $wpdb->get_var(" // Check if Event Tickets is active
SELECT COUNT(DISTINCT attendee_id) if (class_exists('Tribe__Tickets__Main')) {
FROM {$wpdb->prefix}tickets_attendees // Get all attendee post types from Event Tickets
"); $attendee_types = [
'tribe_rsvp_attendees', // RSVP attendees
'tribe_tpp_attendees', // PayPal attendees
'tec_tc_attendee' // Tickets Commerce attendees
];
// Preparing for the SQL query
$types_placeholder = implode(', ', array_fill(0, count($attendee_types), '%s'));
$query_args = $attendee_types;
// Add status condition - Public order statuses
// (based on Tribe__Tickets__Attendee_Repository class)
$public_order_statuses = [
'yes', // RSVP
'completed', // PayPal Legacy
'wc-completed', // WooCommerce
'publish', // Easy Digital Downloads, Legacy
'complete', // Easy Digital Downloads
];
// Count attendees with proper status
foreach ($attendee_types as $post_type) {
$count = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(*) FROM {$wpdb->posts}
WHERE post_type = %s
AND post_status = 'publish'
", $post_type));
$total_attendees += (int)$count;
}
// If WooCommerce Tickets is active, count WooCommerce ticket attendees too
if (class_exists('Tribe__Tickets_Plus__Commerce__WooCommerce__Main')) {
$wc_attendees = $wpdb->get_var("
SELECT COUNT(*) FROM {$wpdb->postmeta}
WHERE meta_key = '_tribe_wooticket_attendance'
");
$total_attendees += (int)$wc_attendees;
}
} }
return array( return array(
@ -423,59 +461,186 @@ class HVAC_Admin_Dashboard {
$week_ago = date('Y-m-d H:i:s', strtotime('-1 week')); $week_ago = date('Y-m-d H:i:s', strtotime('-1 week'));
// These would need to be integrated with your payment system
// Using placeholder values for demonstration
$total_revenue = 0; $total_revenue = 0;
$revenue_week = 0; $revenue_week = 0;
$total_purchases = 0; $total_purchases = 0;
$purchases_week = 0; $purchases_week = 0;
// If using WooCommerce for tickets // If using Event Tickets Plus with WooCommerce
if (class_exists('WooCommerce')) { if (class_exists('Tribe__Tickets_Plus__Commerce__WooCommerce__Main')) {
// Total revenue // Gather data from WooCommerce orders that contain tickets
$total_revenue = $wpdb->get_var(" // First, find all orders with ticket items
SELECT SUM(meta.meta_value) $ticket_product_ids = $wpdb->get_col("
FROM {$wpdb->postmeta} meta SELECT ID FROM {$wpdb->posts}
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID WHERE post_type = 'tribe_wooticket'
WHERE meta.meta_key = '_order_total'
AND posts.post_type = 'shop_order'
AND posts.post_status IN ('wc-completed', 'wc-processing')
"); ");
// Revenue this week if (!empty($ticket_product_ids)) {
$revenue_week = $wpdb->get_var($wpdb->prepare(" $ticket_product_ids_str = implode(',', array_map('intval', $ticket_product_ids));
// Find orders that contain ticket products
$ticket_order_ids = $wpdb->get_col("
SELECT order_id
FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE oim.meta_key = '_product_id'
AND oim.meta_value IN ({$ticket_product_ids_str})
");
if (!empty($ticket_order_ids)) {
$ticket_order_ids_str = implode(',', array_map('intval', $ticket_order_ids));
// Total revenue from these orders
$total_revenue = $wpdb->get_var("
SELECT SUM(meta.meta_value)
FROM {$wpdb->postmeta} meta
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID
WHERE meta.meta_key = '_order_total'
AND posts.ID IN ({$ticket_order_ids_str})
AND posts.post_status IN ('wc-completed', 'wc-processing')
");
// Revenue this week
$revenue_week = $wpdb->get_var($wpdb->prepare("
SELECT SUM(meta.meta_value)
FROM {$wpdb->postmeta} meta
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID
WHERE meta.meta_key = '_order_total'
AND posts.ID IN ({$ticket_order_ids_str})
AND posts.post_status IN ('wc-completed', 'wc-processing')
AND posts.post_date >= %s
", $week_ago));
// Total purchases (count of orders)
$total_purchases = count($ticket_order_ids);
// Purchases this week
$purchases_week = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(*)
FROM {$wpdb->posts}
WHERE ID IN ({$ticket_order_ids_str})
AND post_status IN ('wc-completed', 'wc-processing')
AND post_date >= %s
", $week_ago));
}
}
}
// Check for Tickets Commerce data (modern Event Tickets)
if (class_exists('TEC\\Tickets\\Commerce\\Order')) {
// Get orders through Tickets Commerce
$tc_order_post_type = \TEC\Tickets\Commerce\Order::POSTTYPE;
$tc_completed_statuses = [
'completed', 'pfc-completed', 'tpay-completed', 'paid'
];
$placeholders = implode(', ', array_fill(0, count($tc_completed_statuses), '%s'));
$query_args = $tc_completed_statuses;
// Calculate total revenue
$tc_total_revenue = $wpdb->get_var($wpdb->prepare("
SELECT SUM(meta.meta_value) SELECT SUM(meta.meta_value)
FROM {$wpdb->postmeta} meta FROM {$wpdb->postmeta} meta
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID
WHERE meta.meta_key = '_order_total' WHERE meta.meta_key = '_tec_tc_order_total'
AND posts.post_type = 'shop_order' AND posts.post_type = %s
AND posts.post_status IN ('wc-completed', 'wc-processing') AND posts.post_status IN ($placeholders)
", array_merge([$tc_order_post_type], $query_args)));
// Calculate this week's revenue
$query_args[] = $week_ago;
$tc_revenue_week = $wpdb->get_var($wpdb->prepare("
SELECT SUM(meta.meta_value)
FROM {$wpdb->postmeta} meta
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID
WHERE meta.meta_key = '_tec_tc_order_total'
AND posts.post_type = %s
AND posts.post_status IN ($placeholders)
AND posts.post_date >= %s AND posts.post_date >= %s
", $week_ago)); ", array_merge([$tc_order_post_type], $query_args)));
// Total purchases // Count total purchases
$total_purchases = $wpdb->get_var(" $tc_total_purchases = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(*) SELECT COUNT(*)
FROM {$wpdb->posts} FROM {$wpdb->posts}
WHERE post_type = 'shop_order' WHERE post_type = %s
AND post_status IN ('wc-completed', 'wc-processing') AND post_status IN ($placeholders)
"); ", array_merge([$tc_order_post_type], $tc_completed_statuses)));
// Purchases this week // Count purchases this week
$purchases_week = $wpdb->get_var($wpdb->prepare(" $tc_purchases_week = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(*) SELECT COUNT(*)
FROM {$wpdb->posts} FROM {$wpdb->posts}
WHERE post_type = 'shop_order' WHERE post_type = %s
AND post_status IN ('wc-completed', 'wc-processing') AND post_status IN ($placeholders)
AND post_date >= %s AND post_date >= %s
", $week_ago)); ", array_merge([$tc_order_post_type], $tc_completed_statuses, [$week_ago])));
// Add TC values to totals
$total_revenue += (float)$tc_total_revenue;
$revenue_week += (float)$tc_revenue_week;
$total_purchases += (int)$tc_total_purchases;
$purchases_week += (int)$tc_purchases_week;
}
// Tribe Commerce PayPal (legacy from Event Tickets)
if (class_exists('Tribe__Tickets__Commerce__PayPal__Main')) {
// PayPal orders are stored as posts with meta data
$pp_completed_status = 'completed';
// Calculate total revenue
$pp_total_revenue = $wpdb->get_var($wpdb->prepare("
SELECT SUM(meta.meta_value)
FROM {$wpdb->postmeta} meta
JOIN {$wpdb->postmeta} status ON status.post_id = meta.post_id
WHERE meta.meta_key = '_tribe_tpp_gross'
AND status.meta_key = '_tribe_tpp_status'
AND status.meta_value = %s
", $pp_completed_status));
// Calculate this week's revenue
$pp_revenue_week = $wpdb->get_var($wpdb->prepare("
SELECT SUM(meta.meta_value)
FROM {$wpdb->postmeta} meta
JOIN {$wpdb->postmeta} status ON status.post_id = meta.post_id
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID
WHERE meta.meta_key = '_tribe_tpp_gross'
AND status.meta_key = '_tribe_tpp_status'
AND status.meta_value = %s
AND posts.post_date >= %s
", $pp_completed_status, $week_ago));
// Count total PayPal orders
$pp_total_purchases = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(DISTINCT post_id)
FROM {$wpdb->postmeta}
WHERE meta_key = '_tribe_tpp_status'
AND meta_value = %s
", $pp_completed_status));
// Count purchases this week
$pp_purchases_week = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(DISTINCT meta.post_id)
FROM {$wpdb->postmeta} meta
JOIN {$wpdb->posts} posts ON meta.post_id = posts.ID
WHERE meta.meta_key = '_tribe_tpp_status'
AND meta.meta_value = %s
AND posts.post_date >= %s
", $pp_completed_status, $week_ago));
// Add PayPal values to totals
$total_revenue += (float)$pp_total_revenue;
$revenue_week += (float)$pp_revenue_week;
$total_purchases += (int)$pp_total_purchases;
$purchases_week += (int)$pp_purchases_week;
} }
return array( return array(
'total_revenue' => $total_revenue ?: 0, 'total_revenue' => $total_revenue ?: 0,
'revenue_week' => $revenue_week ?: 0, 'revenue_week' => $revenue_week ?: 0,
'total_purchases' => $total_purchases, 'total_purchases' => $total_purchases ?: 0,
'purchases_week' => $purchases_week 'purchases_week' => $purchases_week ?: 0
); );
} }