diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/admin-dashboard.css b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/admin-dashboard.css
new file mode 100644
index 00000000..87eba6f0
--- /dev/null
+++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/css/admin-dashboard.css
@@ -0,0 +1,233 @@
+.hvac-admin-dashboard {
+ max-width: 1200px;
+ margin: 20px 0;
+}
+
+/* Health Check */
+.hvac-health-check {
+ background: #fff;
+ border: 1px solid #ccd0d4;
+ box-shadow: 0 1px 1px rgba(0,0,0,0.04);
+ margin-bottom: 20px;
+ padding: 20px;
+}
+
+.health-status {
+ display: flex;
+ align-items: center;
+ margin: 15px 0;
+ font-size: 16px;
+}
+
+.status-indicator {
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ margin-right: 10px;
+ display: inline-block;
+}
+
+.health-status.healthy .status-indicator {
+ background-color: #46b450;
+}
+
+.health-status.warning .status-indicator {
+ background-color: #ffb900;
+}
+
+.health-status.critical .status-indicator {
+ background-color: #dc3232;
+}
+
+.status-badge {
+ display: inline-block;
+ padding: 3px 8px;
+ border-radius: 3px;
+ font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+}
+
+.status-ok {
+ background-color: #d4edda;
+ color: #155724;
+}
+
+.status-warning {
+ background-color: #fff3cd;
+ color: #856404;
+}
+
+.status-error {
+ background-color: #f8d7da;
+ color: #721c24;
+}
+
+/* Dashboard Grid */
+.hvac-dashboard-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+/* Dashboard Widgets */
+.hvac-dashboard-widget {
+ background: #fff;
+ border: 1px solid #ccd0d4;
+ box-shadow: 0 1px 1px rgba(0,0,0,0.04);
+ padding: 20px;
+}
+
+.hvac-dashboard-widget h3 {
+ margin: 0 0 15px 0;
+ padding: 0;
+ font-size: 18px;
+ font-weight: 600;
+ color: #23282d;
+ border-bottom: 1px solid #eee;
+ padding-bottom: 10px;
+}
+
+/* Metrics Grid */
+.metrics-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 15px;
+}
+
+.metric {
+ text-align: center;
+ padding: 15px 10px;
+ background-color: #f8f9fa;
+ border-radius: 5px;
+ transition: background-color 0.3s ease;
+}
+
+.metric:hover {
+ background-color: #e9ecef;
+}
+
+.metric-value {
+ font-size: 28px;
+ font-weight: 700;
+ color: #0073aa;
+ margin-bottom: 5px;
+ transition: transform 0.3s ease;
+}
+
+.metric-value.updated {
+ animation: pulse 0.6s ease-in-out;
+}
+
+@keyframes pulse {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.1); }
+ 100% { transform: scale(1); }
+}
+
+.metric-label {
+ font-size: 12px;
+ color: #666;
+ font-weight: 500;
+ text-transform: uppercase;
+}
+
+/* Maintenance Controls */
+.maintenance-controls .maintenance-actions {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 10px;
+ margin-bottom: 15px;
+}
+
+.maintenance-controls button {
+ width: 100%;
+ padding: 8px 12px;
+ text-align: center;
+}
+
+.maintenance-log {
+ margin-top: 20px;
+ padding: 15px;
+ background-color: #f5f5f5;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+}
+
+.maintenance-log h4 {
+ margin: 0 0 10px 0;
+ font-size: 14px;
+ font-weight: 600;
+}
+
+#maintenance-output {
+ padding: 10px;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ font-family: monospace;
+ font-size: 12px;
+ max-height: 200px;
+ overflow-y: auto;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+/* Dashboard Actions */
+.hvac-dashboard-actions {
+ background: #fff;
+ border: 1px solid #ccd0d4;
+ box-shadow: 0 1px 1px rgba(0,0,0,0.04);
+ padding: 15px 20px;
+ text-align: center;
+}
+
+.hvac-dashboard-actions button {
+ margin: 0 5px;
+}
+
+/* Responsive adjustments */
+@media screen and (max-width: 768px) {
+ .hvac-dashboard-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .metrics-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .maintenance-controls .maintenance-actions {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* Loading state */
+.loading {
+ opacity: 0.6;
+ pointer-events: none;
+}
+
+.loading::after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 20px;
+ height: 20px;
+ margin: -10px 0 0 -10px;
+ border: 2px solid #f3f3f3;
+ border-top: 2px solid #0073aa;
+ border-radius: 50%;
+ animation: spin 0.8s linear infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* Notices */
+.hvac-admin-dashboard .notice {
+ margin: 10px 0;
+}
\ No newline at end of file
diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/admin-dashboard.js b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/admin-dashboard.js
new file mode 100644
index 00000000..d7a48556
--- /dev/null
+++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/assets/js/admin-dashboard.js
@@ -0,0 +1,193 @@
+jQuery(document).ready(function($) {
+ 'use strict';
+
+ // Refresh metrics
+ $('#refresh-metrics').on('click', function() {
+ var $button = $(this);
+ $button.prop('disabled', true).text('Refreshing...');
+
+ $.ajax({
+ url: hvac_admin_dashboard.ajax_url,
+ type: 'POST',
+ data: {
+ action: 'hvac_refresh_dashboard_metrics',
+ nonce: hvac_admin_dashboard.nonce
+ },
+ success: function(response) {
+ if (response.success) {
+ updateMetrics(response.data);
+ showNotice('Metrics refreshed successfully', 'success');
+ } else {
+ showNotice('Failed to refresh metrics', 'error');
+ }
+ },
+ error: function() {
+ showNotice('Error refreshing metrics', 'error');
+ },
+ complete: function() {
+ $button.prop('disabled', false).text('Refresh All Metrics');
+ }
+ });
+ });
+
+ // Export metrics
+ $('#export-metrics').on('click', function() {
+ var $button = $(this);
+ $button.prop('disabled', true).text('Exporting...');
+
+ $.ajax({
+ url: hvac_admin_dashboard.ajax_url,
+ type: 'POST',
+ data: {
+ action: 'hvac_export_metrics',
+ nonce: hvac_admin_dashboard.nonce
+ },
+ success: function(response) {
+ if (response.success) {
+ downloadCSV(response.data.csv, response.data.filename);
+ showNotice('Metrics exported successfully', 'success');
+ } else {
+ showNotice('Failed to export metrics', 'error');
+ }
+ },
+ error: function() {
+ showNotice('Error exporting metrics', 'error');
+ },
+ complete: function() {
+ $button.prop('disabled', false).text('Export Metrics (CSV)');
+ }
+ });
+ });
+
+ // Maintenance actions
+ $('.maintenance-actions button').on('click', function() {
+ var $button = $(this);
+ var action = $button.data('action');
+
+ if (!confirm('Are you sure you want to run this maintenance action?')) {
+ return;
+ }
+
+ $button.prop('disabled', true).text('Running...');
+ $('.maintenance-log').show();
+ $('#maintenance-output').text('Running ' + action + '...');
+
+ $.ajax({
+ url: hvac_admin_dashboard.ajax_url,
+ type: 'POST',
+ data: {
+ action: 'hvac_run_maintenance',
+ action_type: action,
+ nonce: hvac_admin_dashboard.nonce
+ },
+ success: function(response) {
+ if (response.success) {
+ $('#maintenance-output').append('\n' + response.data.message);
+ showNotice('Maintenance action completed', 'success');
+ } else {
+ $('#maintenance-output').append('\nError: ' + response.data.message);
+ showNotice('Maintenance action failed', 'error');
+ }
+ },
+ error: function() {
+ $('#maintenance-output').append('\nError: Failed to run maintenance action');
+ showNotice('Error running maintenance action', 'error');
+ },
+ complete: function() {
+ $button.prop('disabled', false).text($button.text().replace('Running...', ''));
+ }
+ });
+ });
+
+ // Update metrics on the page
+ function updateMetrics(data) {
+ // Update trainer metrics
+ if (data.trainer) {
+ updateMetricValue('.hvac-dashboard-widget:contains("Trainer Metrics")', 'Total Trainers', data.trainer.total_trainers);
+ updateMetricValue('.hvac-dashboard-widget:contains("Trainer Metrics")', 'New This Week', data.trainer.new_trainers_week);
+ updateMetricValue('.hvac-dashboard-widget:contains("Trainer Metrics")', 'Total Logins', data.trainer.total_logins);
+ updateMetricValue('.hvac-dashboard-widget:contains("Trainer Metrics")', 'Logins This Week', data.trainer.logins_week);
+ }
+
+ // Update event statistics
+ if (data.events) {
+ updateMetricValue('.hvac-dashboard-widget:contains("Event Statistics")', 'Total Events', data.events.total_events);
+ updateMetricValue('.hvac-dashboard-widget:contains("Event Statistics")', 'Past Events', data.events.past_events);
+ updateMetricValue('.hvac-dashboard-widget:contains("Event Statistics")', 'Future Events', data.events.future_events);
+ updateMetricValue('.hvac-dashboard-widget:contains("Event Statistics")', 'Draft Events', data.events.draft_events);
+ updateMetricValue('.hvac-dashboard-widget:contains("Event Statistics")', 'Cancelled Events', data.events.cancelled_events);
+ updateMetricValue('.hvac-dashboard-widget:contains("Event Statistics")', 'Total Attendees', data.events.total_attendees);
+ }
+
+ // Update revenue statistics
+ if (data.revenue) {
+ updateMetricValue('.hvac-dashboard-widget:contains("Revenue Statistics")', 'Total Revenue', '$' + formatNumber(data.revenue.total_revenue));
+ updateMetricValue('.hvac-dashboard-widget:contains("Revenue Statistics")', 'Revenue This Week', '$' + formatNumber(data.revenue.revenue_week));
+ updateMetricValue('.hvac-dashboard-widget:contains("Revenue Statistics")', 'Total Purchases', data.revenue.total_purchases);
+ updateMetricValue('.hvac-dashboard-widget:contains("Revenue Statistics")', 'Purchases This Week', data.revenue.purchases_week);
+ }
+ }
+
+ // Update individual metric value
+ function updateMetricValue(widgetSelector, metricLabel, newValue) {
+ $(widgetSelector).find('.metric').each(function() {
+ if ($(this).find('.metric-label').text() === metricLabel) {
+ $(this).find('.metric-value').text(newValue);
+ // Add animation
+ $(this).find('.metric-value').addClass('updated');
+ setTimeout(function() {
+ $(this).find('.metric-value').removeClass('updated');
+ }.bind(this), 1000);
+ }
+ });
+ }
+
+ // Format number with commas
+ function formatNumber(num) {
+ return parseFloat(num).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+ }
+
+ // Download CSV
+ function downloadCSV(csvData, filename) {
+ var csv = csvData.map(function(row) {
+ return row.map(function(cell) {
+ // Escape quotes and wrap in quotes if contains comma
+ if (typeof cell === 'string' && (cell.includes(',') || cell.includes('"'))) {
+ return '"' + cell.replace(/"/g, '""') + '"';
+ }
+ return cell;
+ }).join(',');
+ }).join('\n');
+
+ var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
+ var link = document.createElement('a');
+
+ if (link.download !== undefined) {
+ var url = URL.createObjectURL(blob);
+ link.setAttribute('href', url);
+ link.setAttribute('download', filename);
+ link.style.visibility = 'hidden';
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ }
+ }
+
+ // Show notice
+ function showNotice(message, type) {
+ var $notice = $('
');
+ $('.wrap').prepend($notice);
+
+ // Auto-dismiss after 5 seconds
+ setTimeout(function() {
+ $notice.fadeOut(function() {
+ $(this).remove();
+ });
+ }, 5000);
+ }
+
+ // Auto-refresh metrics every 5 minutes
+ setInterval(function() {
+ $('#refresh-metrics').trigger('click');
+ }, 300000);
+});
\ No newline at end of file
diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/hvac-community-events.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/hvac-community-events.php
index 6d23eed7..413f7dc3 100644
--- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/hvac-community-events.php
+++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/hvac-community-events.php
@@ -155,6 +155,40 @@ function hvac_ce_enqueue_dashboard_styles() {
}
add_action( 'wp_enqueue_scripts', 'hvac_ce_enqueue_dashboard_styles' );
+/**
+ * Enqueue styles and scripts for admin dashboard
+ */
+function hvac_ce_enqueue_admin_assets($hook) {
+ // Only load on our dashboard page
+ if ($hook !== 'hvac-community-events_page_hvac-ce-dashboard') {
+ return;
+ }
+
+ // Enqueue dashboard CSS
+ wp_enqueue_style(
+ 'hvac-admin-dashboard-style',
+ HVAC_CE_PLUGIN_URL . 'assets/css/admin-dashboard.css',
+ array('wp-admin'),
+ HVAC_CE_VERSION
+ );
+
+ // Enqueue dashboard JS
+ wp_enqueue_script(
+ 'hvac-admin-dashboard-script',
+ HVAC_CE_PLUGIN_URL . 'assets/js/admin-dashboard.js',
+ array('jquery', 'wp-util'),
+ HVAC_CE_VERSION,
+ true
+ );
+
+ // Localize script with AJAX data
+ wp_localize_script('hvac-admin-dashboard-script', 'hvac_admin_dashboard', array(
+ 'ajax_url' => admin_url('admin-ajax.php'),
+ 'nonce' => wp_create_nonce('hvac_admin_nonce')
+ ));
+}
+add_action('admin_enqueue_scripts', 'hvac_ce_enqueue_admin_assets');
+
/**
* Enqueue styles specifically for the HVAC Event Summary page.
diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/admin/class-admin-dashboard.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/admin/class-admin-dashboard.php
new file mode 100644
index 00000000..f67b5e75
--- /dev/null
+++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/admin/class-admin-dashboard.php
@@ -0,0 +1,693 @@
+
+
+
+
+ render_health_check(); ?>
+
+
+ render_trainer_metrics(); ?>
+ render_event_statistics(); ?>
+ render_revenue_statistics(); ?>
+ render_maintenance_controls(); ?>
+
+
+
+
+
+
+
+ get_health_status();
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+ |
+
+
+
+
+ |
+ |
+
+
+
+
+
+ get_trainer_metrics();
+ ?>
+
+ get_event_statistics();
+ ?>
+
+ get_revenue_statistics();
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+ 'The Events Calendar',
+ 'status' => $tec_active ? 'ok' : 'error',
+ 'status_text' => $tec_active ? __('Active', 'hvac-ce') : __('Inactive', 'hvac-ce'),
+ 'details' => $tec_active ? __('Plugin is active and functioning', 'hvac-ce') : __('Required plugin is not active', 'hvac-ce')
+ );
+
+ if (!$tec_active) {
+ $overall_status = 'critical';
+ }
+
+ // Check Community Events
+ $ce_active = class_exists('Tribe__Events__Community__Main');
+ $checks[] = array(
+ 'component' => 'Community Events',
+ 'status' => $ce_active ? 'ok' : 'warning',
+ 'status_text' => $ce_active ? __('Active', 'hvac-ce') : __('Inactive', 'hvac-ce'),
+ 'details' => $ce_active ? __('Plugin is active', 'hvac-ce') : __('Recommended plugin is not active', 'hvac-ce')
+ );
+
+ if (!$ce_active && $overall_status !== 'critical') {
+ $overall_status = 'warning';
+ }
+
+ // Check database tables
+ global $wpdb;
+ $tables_exist = $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}posts'") === "{$wpdb->prefix}posts";
+ $checks[] = array(
+ 'component' => 'Database Tables',
+ 'status' => $tables_exist ? 'ok' : 'error',
+ 'status_text' => $tables_exist ? __('OK', 'hvac-ce') : __('Error', 'hvac-ce'),
+ 'details' => $tables_exist ? __('All required tables exist', 'hvac-ce') : __('Missing required database tables', 'hvac-ce')
+ );
+
+ // Check file permissions
+ $upload_dir = wp_upload_dir();
+ $uploads_writable = wp_is_writable($upload_dir['basedir']);
+ $checks[] = array(
+ 'component' => 'File Permissions',
+ 'status' => $uploads_writable ? 'ok' : 'warning',
+ 'status_text' => $uploads_writable ? __('OK', 'hvac-ce') : __('Warning', 'hvac-ce'),
+ 'details' => $uploads_writable ? __('Upload directory is writable', 'hvac-ce') : __('Upload directory is not writable', 'hvac-ce')
+ );
+
+ // Memory limit check
+ $memory_limit = wp_convert_hr_to_bytes(ini_get('memory_limit'));
+ $recommended_limit = 256 * MB_IN_BYTES;
+ $checks[] = array(
+ 'component' => 'Memory Limit',
+ 'status' => $memory_limit >= $recommended_limit ? 'ok' : 'warning',
+ 'status_text' => size_format($memory_limit),
+ 'details' => $memory_limit >= $recommended_limit
+ ? __('Memory limit is sufficient', 'hvac-ce')
+ : sprintf(__('Recommended: %s or higher', 'hvac-ce'), size_format($recommended_limit))
+ );
+
+ return array(
+ 'overall_status' => $overall_status,
+ 'status_text' => $this->get_status_text($overall_status),
+ 'checks' => $checks
+ );
+ }
+
+ /**
+ * Get status text
+ */
+ private function get_status_text($status) {
+ switch ($status) {
+ case 'healthy':
+ return __('All Systems Operational', 'hvac-ce');
+ case 'warning':
+ return __('Minor Issues Detected', 'hvac-ce');
+ case 'critical':
+ return __('Critical Issues Found', 'hvac-ce');
+ default:
+ return __('Unknown Status', 'hvac-ce');
+ }
+ }
+
+ /**
+ * Get trainer metrics
+ */
+ private function get_trainer_metrics() {
+ global $wpdb;
+
+ // Total trainers
+ $total_trainers = count(get_users(array(
+ 'role' => 'trainer',
+ 'fields' => 'ID'
+ )));
+
+ // New trainers this week
+ $week_ago = date('Y-m-d H:i:s', strtotime('-1 week'));
+ $new_trainers_week = count(get_users(array(
+ 'role' => 'trainer',
+ 'date_query' => array(
+ array(
+ 'after' => $week_ago,
+ 'inclusive' => true
+ )
+ ),
+ 'fields' => 'ID'
+ )));
+
+ // Login statistics (would require custom tracking)
+ $total_logins = get_option('hvac_total_logins', 0);
+ $logins_week = get_option('hvac_logins_week', 0);
+
+ return array(
+ 'total_trainers' => $total_trainers,
+ 'new_trainers_week' => $new_trainers_week,
+ 'total_logins' => $total_logins,
+ 'logins_week' => $logins_week
+ );
+ }
+
+ /**
+ * Get event statistics
+ */
+ private function get_event_statistics() {
+ global $wpdb;
+
+ $now = current_time('mysql');
+
+ // Total events
+ $total_events = $wpdb->get_var($wpdb->prepare("
+ SELECT COUNT(*) FROM {$wpdb->posts} p
+ WHERE p.post_type = %s
+ AND p.post_status IN ('publish', 'draft', 'private')
+ ", 'tribe_events'));
+
+ // Past events
+ $past_events = $wpdb->get_var($wpdb->prepare("
+ SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
+ JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
+ WHERE p.post_type = %s
+ AND p.post_status = 'publish'
+ AND pm.meta_key = '_EventEndDate'
+ AND pm.meta_value < %s
+ ", 'tribe_events', $now));
+
+ // Future events
+ $future_events = $wpdb->get_var($wpdb->prepare("
+ SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
+ JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
+ WHERE p.post_type = %s
+ AND p.post_status = 'publish'
+ AND pm.meta_key = '_EventStartDate'
+ AND pm.meta_value > %s
+ ", 'tribe_events', $now));
+
+ // Draft events
+ $draft_events = $wpdb->get_var($wpdb->prepare("
+ SELECT COUNT(*) FROM {$wpdb->posts}
+ WHERE post_type = %s
+ AND post_status = 'draft'
+ ", 'tribe_events'));
+
+ // Cancelled events (assuming there's a meta field for cancelled status)
+ $cancelled_events = $wpdb->get_var($wpdb->prepare("
+ SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
+ JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
+ WHERE p.post_type = %s
+ AND pm.meta_key = '_event_cancelled'
+ AND pm.meta_value = '1'
+ ", 'tribe_events'));
+
+ // Total attendees (would require integration with Event Tickets Plus)
+ $total_attendees = 0;
+ if (class_exists('Tribe__Tickets_Plus__Main')) {
+ $total_attendees = $wpdb->get_var("
+ SELECT COUNT(DISTINCT attendee_id)
+ FROM {$wpdb->prefix}tickets_attendees
+ ");
+ }
+
+ return array(
+ 'total_events' => $total_events,
+ 'past_events' => $past_events,
+ 'future_events' => $future_events,
+ 'draft_events' => $draft_events,
+ 'cancelled_events' => $cancelled_events,
+ 'total_attendees' => $total_attendees
+ );
+ }
+
+ /**
+ * Get revenue statistics
+ */
+ private function get_revenue_statistics() {
+ global $wpdb;
+
+ $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;
+ $revenue_week = 0;
+ $total_purchases = 0;
+ $purchases_week = 0;
+
+ // If using WooCommerce for tickets
+ if (class_exists('WooCommerce')) {
+ // Total revenue
+ $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.post_type = 'shop_order'
+ 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.post_type = 'shop_order'
+ AND posts.post_status IN ('wc-completed', 'wc-processing')
+ AND posts.post_date >= %s
+ ", $week_ago));
+
+ // Total purchases
+ $total_purchases = $wpdb->get_var("
+ SELECT COUNT(*)
+ FROM {$wpdb->posts}
+ WHERE post_type = 'shop_order'
+ AND post_status IN ('wc-completed', 'wc-processing')
+ ");
+
+ // Purchases this week
+ $purchases_week = $wpdb->get_var($wpdb->prepare("
+ SELECT COUNT(*)
+ FROM {$wpdb->posts}
+ WHERE post_type = 'shop_order'
+ AND post_status IN ('wc-completed', 'wc-processing')
+ AND post_date >= %s
+ ", $week_ago));
+ }
+
+ return array(
+ 'total_revenue' => $total_revenue ?: 0,
+ 'revenue_week' => $revenue_week ?: 0,
+ 'total_purchases' => $total_purchases,
+ 'purchases_week' => $purchases_week
+ );
+ }
+
+ /**
+ * AJAX handler for refreshing metrics
+ */
+ public function ajax_refresh_metrics() {
+ check_ajax_referer('hvac_admin_nonce', 'nonce');
+
+ if (!current_user_can('manage_options')) {
+ wp_die('Unauthorized');
+ }
+
+ $metrics = array(
+ 'trainer' => $this->get_trainer_metrics(),
+ 'events' => $this->get_event_statistics(),
+ 'revenue' => $this->get_revenue_statistics()
+ );
+
+ wp_send_json_success($metrics);
+ }
+
+ /**
+ * AJAX handler for exporting metrics
+ */
+ public function ajax_export_metrics() {
+ check_ajax_referer('hvac_admin_nonce', 'nonce');
+
+ if (!current_user_can('manage_options')) {
+ wp_die('Unauthorized');
+ }
+
+ $metrics = array(
+ 'trainer' => $this->get_trainer_metrics(),
+ 'events' => $this->get_event_statistics(),
+ 'revenue' => $this->get_revenue_statistics()
+ );
+
+ // Generate CSV
+ $csv_data = array();
+
+ // Headers
+ $csv_data[] = array('Metric Category', 'Metric', 'Value');
+
+ // Trainer metrics
+ foreach ($metrics['trainer'] as $key => $value) {
+ $csv_data[] = array('Trainer Metrics', $this->humanize_key($key), $value);
+ }
+
+ // Event statistics
+ foreach ($metrics['events'] as $key => $value) {
+ $csv_data[] = array('Event Statistics', $this->humanize_key($key), $value);
+ }
+
+ // Revenue statistics
+ foreach ($metrics['revenue'] as $key => $value) {
+ if (strpos($key, 'revenue') !== false) {
+ $value = '$' . number_format($value, 2);
+ }
+ $csv_data[] = array('Revenue Statistics', $this->humanize_key($key), $value);
+ }
+
+ // Add timestamp
+ $csv_data[] = array('Export Date', date('Y-m-d H:i:s'), '');
+
+ wp_send_json_success(array(
+ 'csv' => $csv_data,
+ 'filename' => 'hvac-metrics-' . date('Y-m-d') . '.csv'
+ ));
+ }
+
+ /**
+ * AJAX handler for maintenance actions
+ */
+ public function ajax_run_maintenance() {
+ check_ajax_referer('hvac_admin_nonce', 'nonce');
+
+ if (!current_user_can('manage_options')) {
+ wp_die('Unauthorized');
+ }
+
+ $action = sanitize_text_field($_POST['action_type']);
+ $result = array();
+
+ switch ($action) {
+ case 'clear_transients':
+ $result = $this->clear_transients();
+ break;
+
+ case 'optimize_tables':
+ $result = $this->optimize_tables();
+ break;
+
+ case 'regenerate_roles':
+ $result = $this->regenerate_roles();
+ break;
+
+ case 'sync_event_meta':
+ $result = $this->sync_event_metadata();
+ break;
+
+ default:
+ $result = array(
+ 'success' => false,
+ 'message' => __('Invalid maintenance action', 'hvac-ce')
+ );
+ }
+
+ if ($result['success']) {
+ wp_send_json_success($result);
+ } else {
+ wp_send_json_error($result);
+ }
+ }
+
+ /**
+ * Clear transients
+ */
+ private function clear_transients() {
+ global $wpdb;
+
+ // Clear all transients
+ $query = "DELETE FROM {$wpdb->options}
+ WHERE option_name LIKE '_transient_%'
+ OR option_name LIKE '_site_transient_%'";
+
+ $deleted = $wpdb->query($query);
+
+ // Clear object cache
+ wp_cache_flush();
+
+ return array(
+ 'success' => true,
+ 'message' => sprintf(__('Cleared %d transients and flushed object cache', 'hvac-ce'), $deleted)
+ );
+ }
+
+ /**
+ * Optimize database tables
+ */
+ private function optimize_tables() {
+ global $wpdb;
+
+ $tables = array(
+ $wpdb->posts,
+ $wpdb->postmeta,
+ $wpdb->users,
+ $wpdb->usermeta,
+ $wpdb->options
+ );
+
+ $optimized = 0;
+ foreach ($tables as $table) {
+ if ($wpdb->query("OPTIMIZE TABLE $table")) {
+ $optimized++;
+ }
+ }
+
+ return array(
+ 'success' => true,
+ 'message' => sprintf(__('Optimized %d database tables', 'hvac-ce'), $optimized)
+ );
+ }
+
+ /**
+ * Regenerate user roles
+ */
+ private function regenerate_roles() {
+ // Re-add custom roles
+ $role_manager = new HVAC_Role_Manager();
+ $role_manager->add_roles();
+
+ return array(
+ 'success' => true,
+ 'message' => __('User roles regenerated successfully', 'hvac-ce')
+ );
+ }
+
+ /**
+ * Sync event metadata
+ */
+ private function sync_event_metadata() {
+ global $wpdb;
+
+ // Example: Ensure all events have required metadata
+ $events = get_posts(array(
+ 'post_type' => 'tribe_events',
+ 'posts_per_page' => -1,
+ 'post_status' => array('publish', 'draft', 'private')
+ ));
+
+ $synced = 0;
+ foreach ($events as $event) {
+ // Check for required meta fields
+ if (!get_post_meta($event->ID, '_EventStartDate', true)) {
+ // Set default start date if missing
+ update_post_meta($event->ID, '_EventStartDate', current_time('mysql'));
+ $synced++;
+ }
+ }
+
+ return array(
+ 'success' => true,
+ 'message' => sprintf(__('Synced metadata for %d events', 'hvac-ce'), $synced)
+ );
+ }
+
+ /**
+ * Humanize key for display
+ */
+ private function humanize_key($key) {
+ $key = str_replace('_', ' ', $key);
+ return ucwords($key);
+ }
+}
\ No newline at end of file
diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-community-events.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-community-events.php
index d551f6ba..380fd18d 100644
--- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-community-events.php
+++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-community-events.php
@@ -125,6 +125,12 @@ class HVAC_Community_Events {
// Initialize settings (admin menu)
$this->init_settings();
+ // Initialize Zoho admin if in admin
+ if (is_admin()) {
+ $this->init_zoho_admin();
+ $this->init_admin_dashboard();
+ }
+
// Initialize forms
$this->init_forms();
@@ -151,6 +157,26 @@ class HVAC_Community_Events {
private function init_settings() {
new HVAC_Settings();
}
+
+ /**
+ * Initialize Zoho admin
+ */
+ private function init_zoho_admin() {
+ if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php')) {
+ require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php';
+ new HVAC_Zoho_Admin();
+ }
+ }
+
+ /**
+ * Initialize admin dashboard
+ */
+ private function init_admin_dashboard() {
+ if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php')) {
+ require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php';
+ new HVAC_Admin_Dashboard();
+ }
+ }
/**
* Initialize forms
diff --git a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-settings.php b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-settings.php
index 756237ca..7ce4b0cc 100644
--- a/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-settings.php
+++ b/wordpress-dev/wordpress/wp-content/plugins/hvac-community-events/includes/class-hvac-settings.php
@@ -34,6 +34,16 @@ class HVAC_Settings {
'hvac-community-events',
array($this, 'options_page')
);
+
+ // Add dashboard submenu
+ add_submenu_page(
+ 'hvac-community-events',
+ __('Dashboard', 'hvac-ce'),
+ __('Dashboard', 'hvac-ce'),
+ 'manage_options',
+ 'hvac-ce-dashboard',
+ array($this, 'dashboard_page')
+ );
}
public function register_settings() {
@@ -81,4 +91,17 @@ class HVAC_Settings {
render_page();
+ }
}
\ No newline at end of file