upskill-event-manager/includes/google-sheets/class-google-sheets-admin.php
bengizmo 37f4180e1c feat: Add massive missing plugin infrastructure to repository
🚨 CRITICAL: Fixed deployment blockers by adding missing core directories:

**Community System (CRITICAL)**
- includes/community/ - Login_Handler and all community classes
- templates/community/ - Community login forms

**Certificate System (CRITICAL)**
- includes/certificates/ - 8+ certificate classes and handlers
- templates/certificates/ - Certificate reports and generation templates

**Core Individual Classes (CRITICAL)**
- includes/class-hvac-event-summary.php
- includes/class-hvac-trainer-profile-manager.php
- includes/class-hvac-master-dashboard-data.php
- Plus 40+ other individual HVAC classes

**Major Feature Systems (HIGH)**
- includes/database/ - Training leads database tables
- includes/find-trainer/ - Find trainer directory and MapGeo integration
- includes/google-sheets/ - Google Sheets integration system
- includes/zoho/ - Complete Zoho CRM integration
- includes/communication/ - Communication templates system

**Template Infrastructure**
- templates/attendee/, templates/email-attendees/
- templates/event-summary/, templates/status/
- templates/template-parts/ - Shared template components

**Impact:**
- 70+ files added covering 10+ missing directories
- Resolves ALL deployment blockers and feature breakdowns
- Plugin activation should now work correctly
- Multi-machine deployment fully supported

🔧 Generated with Claude Code

Co-Authored-By: Ben Reed <ben@tealmaker.com>
2025-08-11 13:30:11 -03:00

540 lines
No EOL
24 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Google Sheets Admin Interface
*
* Provides admin interface for Google Sheets integration
*
* @package HVAC_Community_Events
* @subpackage Google_Sheets_Integration
*/
if (!defined('ABSPATH')) {
exit;
}
require_once plugin_dir_path(__FILE__) . 'class-google-sheets-auth.php';
require_once plugin_dir_path(__FILE__) . 'class-google-sheets-manager.php';
class HVAC_Google_Sheets_Admin {
private $auth;
private $manager;
public function __construct() {
$this->auth = new HVAC_Google_Sheets_Auth();
$this->manager = new HVAC_Google_Sheets_Manager();
add_action('wp_ajax_hvac_create_master_report', array($this, 'ajax_create_master_report'));
add_action('wp_ajax_hvac_create_event_spreadsheet', array($this, 'ajax_create_event_spreadsheet'));
add_action('wp_ajax_hvac_test_google_sheets_connection', array($this, 'ajax_test_connection'));
add_action('wp_ajax_hvac_verify_folder_structure', array($this, 'ajax_verify_folder_structure'));
}
/**
* Render Google Sheets admin page
*/
public function render_admin_page() {
try {
// Initialize with safe defaults
$auth_status = array(
'has_credentials' => false,
'is_authenticated' => false,
'client_id' => 'Not configured',
'token_expires' => 'N/A'
);
// Try to get auth status
if ($this->auth) {
$auth_status = $this->auth->get_config_status();
}
// Initialize report variables
$latest_report = null;
$report_history = array();
// Try to get reports if manager is available
if ($this->manager) {
$latest_report = $this->manager->get_latest_master_report();
$report_history = $this->manager->get_master_report_history();
}
?>
<div class="hvac-google-sheets-admin">
<div class="hvac-container">
<div class="hvac-header">
<h1><i class="hvac-icon-sheets"></i>Google Sheets Integration</h1>
<div class="hvac-header-actions">
<a href="<?php echo home_url('/master-trainer/dashboard/'); ?>" class="hvac-btn hvac-btn-secondary">
<i class="hvac-icon-arrow-left"></i> Back to Master Dashboard
</a>
</div>
</div>
<!-- Success/Error Messages -->
<?php if (isset($_GET['auth_success']) && $_GET['auth_success'] == '1'): ?>
<div class="hvac-alert hvac-alert-success">
<i class="hvac-icon-check"></i>
<strong>Success!</strong> Google Sheets authorization completed successfully! You can now create reports.
</div>
<?php endif; ?>
<?php if (isset($_GET['auth_error']) && $_GET['auth_error'] == '1'): ?>
<div class="hvac-alert hvac-alert-error">
<i class="hvac-icon-warning"></i>
<strong>Error:</strong> <?php echo esc_html($_GET['message'] ?? 'Failed to complete Google Sheets authorization.'); ?>
</div>
<?php endif; ?>
<!-- Connection Status -->
<div class="hvac-card">
<div class="hvac-card-header">
<h2><i class="hvac-icon-connection"></i>Connection Status</h2>
</div>
<div class="hvac-card-body">
<div class="hvac-status-grid">
<div class="hvac-status-item">
<span class="hvac-status-label">Credentials:</span>
<span class="hvac-status-value <?php echo $auth_status['has_credentials'] ? 'success' : 'error'; ?>">
<?php echo $auth_status['has_credentials'] ? '✓ Configured' : '✗ Missing'; ?>
</span>
</div>
<div class="hvac-status-item">
<span class="hvac-status-label">Authentication:</span>
<span class="hvac-status-value <?php echo $auth_status['is_authenticated'] ? 'success' : 'error'; ?>">
<?php echo $auth_status['is_authenticated'] ? '✓ Connected' : '✗ Not Connected'; ?>
</span>
</div>
<div class="hvac-status-item">
<span class="hvac-status-label">Client ID:</span>
<span class="hvac-status-value"><?php echo esc_html($auth_status['client_id']); ?></span>
</div>
<div class="hvac-status-item">
<span class="hvac-status-label">Token Expires:</span>
<span class="hvac-status-value"><?php echo esc_html($auth_status['token_expires']); ?></span>
</div>
</div>
<div class="hvac-actions">
<button id="test-connection" class="hvac-btn hvac-btn-primary">
<i class="hvac-icon-test"></i> Test Connection
</button>
<button id="verify-folders" class="hvac-btn hvac-btn-secondary"
<?php echo !$auth_status['is_authenticated'] ? 'disabled' : ''; ?>>
<i class="hvac-icon-folder"></i> Verify Folders
</button>
<?php if (!$auth_status['is_authenticated']): ?>
<a href="<?php echo esc_url($this->auth->get_authorization_url()); ?>"
class="hvac-btn hvac-btn-secondary" target="_blank">
<i class="hvac-icon-auth"></i> Authorize Access
</a>
<?php endif; ?>
</div>
</div>
</div>
<!-- Master Report Section -->
<div class="hvac-card">
<div class="hvac-card-header">
<h2><i class="hvac-icon-report"></i>Master Report</h2>
</div>
<div class="hvac-card-body">
<p>Generate a comprehensive report with system overview, trainer performance, all events, and revenue analytics.</p>
<?php if ($latest_report): ?>
<div class="hvac-latest-report">
<h3>Latest Report</h3>
<div class="hvac-report-info">
<div class="hvac-report-meta">
<span class="hvac-report-date">
<i class="hvac-icon-calendar"></i>
<?php echo date('M j, Y g:i A', strtotime($latest_report['created_at'])); ?>
</span>
<a href="<?php echo esc_url($latest_report['url']); ?>"
target="_blank" class="hvac-btn hvac-btn-primary hvac-btn-sm">
<i class="hvac-icon-external"></i> Open Spreadsheet
</a>
</div>
</div>
</div>
<?php endif; ?>
<div class="hvac-actions">
<button id="create-master-report" class="hvac-btn hvac-btn-primary"
<?php echo !$auth_status['is_authenticated'] ? 'disabled' : ''; ?>>
<i class="hvac-icon-create"></i> Generate New Master Report
</button>
</div>
</div>
</div>
<!-- Event Spreadsheets Section -->
<div class="hvac-card">
<div class="hvac-card-header">
<h2><i class="hvac-icon-events"></i>Event Spreadsheets</h2>
</div>
<div class="hvac-card-body">
<p>Create detailed spreadsheets for individual events with attendees, financial data, and event details.</p>
<div class="hvac-event-selection">
<label for="event-select">Select Event:</label>
<select id="event-select" class="hvac-select">
<option value="">Choose an event...</option>
<?php $this->render_event_options(); ?>
</select>
<button id="create-event-spreadsheet" class="hvac-btn hvac-btn-primary"
<?php echo !$auth_status['is_authenticated'] ? 'disabled' : ''; ?>>
<i class="hvac-icon-create"></i> Create Event Spreadsheet
</button>
</div>
<div id="existing-event-sheets">
<h3>Existing Event Spreadsheets</h3>
<div class="hvac-event-sheets-list">
<?php $this->render_existing_event_sheets(); ?>
</div>
</div>
</div>
</div>
<!-- Report History -->
<?php if (!empty($report_history)): ?>
<div class="hvac-card">
<div class="hvac-card-header">
<h2><i class="hvac-icon-history"></i>Report History</h2>
</div>
<div class="hvac-card-body">
<div class="hvac-history-list">
<?php foreach (array_reverse($report_history) as $report): ?>
<div class="hvac-history-item">
<div class="hvac-history-meta">
<span class="hvac-history-date">
<?php echo date('M j, Y g:i A', strtotime($report['created_at'])); ?>
</span>
<span class="hvac-history-user">
by <?php echo get_userdata($report['created_by'])->display_name; ?>
</span>
</div>
<a href="<?php echo esc_url($report['url']); ?>" target="_blank"
class="hvac-btn hvac-btn-secondary hvac-btn-sm">
<i class="hvac-icon-external"></i> Open
</a>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
<!-- Loading Overlay -->
<div id="hvac-loading-overlay" class="hvac-loading-overlay" style="display: none;">
<div class="hvac-loading-content">
<div class="hvac-spinner"></div>
<p>Processing request...</p>
</div>
</div>
<script>
// Define ajaxurl for frontend AJAX requests
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
document.addEventListener('DOMContentLoaded', function() {
// Test Connection
document.getElementById('test-connection').addEventListener('click', function() {
showLoading();
fetch(ajaxurl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'action=hvac_test_google_sheets_connection&_wpnonce=<?php echo wp_create_nonce('hvac_google_sheets'); ?>'
})
.then(response => response.json())
.then(data => {
hideLoading();
if (data.success) {
showNotification('Connection test successful!', 'success');
} else {
showNotification('Connection test failed: ' + data.data, 'error');
}
})
.catch(error => {
hideLoading();
showNotification('Connection test failed: ' + error.message, 'error');
});
});
// Verify Folder Structure
document.getElementById('verify-folders').addEventListener('click', function() {
showLoading();
fetch(ajaxurl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'action=hvac_verify_folder_structure&_wpnonce=<?php echo wp_create_nonce('hvac_google_sheets'); ?>'
})
.then(response => response.json())
.then(data => {
hideLoading();
if (data.success) {
showNotification('Folder structure verification completed!', 'success');
} else {
showNotification('Folder verification failed: ' + data.data, 'error');
}
})
.catch(error => {
hideLoading();
showNotification('Folder verification failed: ' + error.message, 'error');
});
});
// Create Master Report
document.getElementById('create-master-report').addEventListener('click', function() {
showLoading();
fetch(ajaxurl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'action=hvac_create_master_report&_wpnonce=<?php echo wp_create_nonce('hvac_google_sheets'); ?>'
})
.then(response => response.json())
.then(data => {
hideLoading();
if (data.success) {
showNotification('Master Report created successfully!', 'success');
setTimeout(() => window.location.reload(), 2000);
} else {
showNotification('Failed to create Master Report: ' + data.data, 'error');
}
})
.catch(error => {
hideLoading();
showNotification('Failed to create Master Report: ' + error.message, 'error');
});
});
// Create Event Spreadsheet
document.getElementById('create-event-spreadsheet').addEventListener('click', function() {
const eventSelect = document.getElementById('event-select');
const eventId = eventSelect.value;
if (!eventId) {
showNotification('Please select an event first.', 'warning');
return;
}
showLoading();
fetch(ajaxurl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: `action=hvac_create_event_spreadsheet&event_id=${eventId}&_wpnonce=<?php echo wp_create_nonce('hvac_google_sheets'); ?>`
})
.then(response => response.json())
.then(data => {
hideLoading();
if (data.success) {
showNotification('Event spreadsheet created successfully!', 'success');
setTimeout(() => window.location.reload(), 2000);
} else {
showNotification('Failed to create event spreadsheet: ' + data.data, 'error');
}
})
.catch(error => {
hideLoading();
showNotification('Failed to create event spreadsheet: ' + error.message, 'error');
});
});
function showLoading() {
document.getElementById('hvac-loading-overlay').style.display = 'flex';
}
function hideLoading() {
document.getElementById('hvac-loading-overlay').style.display = 'none';
}
function showNotification(message, type) {
// Create notification element
const notification = document.createElement('div');
notification.className = `hvac-notification hvac-notification-${type}`;
notification.innerHTML = `
<span>${message}</span>
<button onclick="this.parentElement.remove()">×</button>
`;
document.body.appendChild(notification);
// Auto-remove after 5 seconds
setTimeout(() => {
if (notification.parentElement) {
notification.remove();
}
}, 5000);
}
});
</script>
<?php
} catch (Exception $e) {
// Display error message if something goes wrong
?>
<div class="hvac-google-sheets-admin">
<div class="hvac-container">
<div class="hvac-alert hvac-alert-error">
<i class="hvac-icon-warning"></i>
<strong>Error:</strong> Unable to load Google Sheets integration. <?php echo esc_html($e->getMessage()); ?>
</div>
<div class="hvac-actions">
<a href="<?php echo home_url('/master-trainer/dashboard/'); ?>" class="hvac-btn hvac-btn-secondary">
<i class="hvac-icon-arrow-left"></i> Back to Master Dashboard
</a>
</div>
</div>
</div>
<?php
error_log('HVAC Google Sheets Admin Error: ' . $e->getMessage());
}
}
/**
* Render event options for select dropdown
*/
private function render_event_options() {
$events = get_posts(array(
'post_type' => 'tribe_events',
'post_status' => 'publish',
'numberposts' => -1,
'orderby' => 'meta_value',
'meta_key' => '_EventStartDate',
'order' => 'DESC'
));
foreach ($events as $event) {
$event_date = get_post_meta($event->ID, '_EventStartDate', true);
$formatted_date = $event_date ? date('M j, Y', strtotime($event_date)) : 'No date';
$trainer_name = get_the_author_meta('display_name', $event->post_author);
echo '<option value="' . esc_attr($event->ID) . '">';
echo esc_html($event->post_title) . ' - ' . esc_html($formatted_date) . ' (' . esc_html($trainer_name) . ')';
echo '</option>';
}
}
/**
* Render existing event spreadsheets
*/
private function render_existing_event_sheets() {
global $wpdb;
$results = $wpdb->get_results(
"SELECT p.ID, p.post_title, pm.meta_value, u.display_name
FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
JOIN {$wpdb->users} u ON p.post_author = u.ID
WHERE p.post_type = 'tribe_events'
AND pm.meta_key = '_hvac_google_sheet'
ORDER BY p.post_date DESC"
);
if (empty($results)) {
echo '<p class="hvac-no-sheets">No event spreadsheets created yet.</p>';
return;
}
foreach ($results as $result) {
$sheet_data = maybe_unserialize($result->meta_value);
if (is_array($sheet_data) && isset($sheet_data['url'])) {
echo '<div class="hvac-event-sheet-item">';
echo '<div class="hvac-sheet-info">';
echo '<h4>' . esc_html($result->post_title) . '</h4>';
echo '<span class="hvac-sheet-trainer">by ' . esc_html($result->display_name) . '</span>';
echo '<span class="hvac-sheet-date">Created: ' . date('M j, Y', strtotime($sheet_data['created_at'])) . '</span>';
echo '</div>';
echo '<a href="' . esc_url($sheet_data['url']) . '" target="_blank" class="hvac-btn hvac-btn-secondary hvac-btn-sm">';
echo '<i class="hvac-icon-external"></i> Open Spreadsheet';
echo '</a>';
echo '</div>';
}
}
}
/**
* AJAX: Create Master Report
*/
public function ajax_create_master_report() {
check_ajax_referer('hvac_google_sheets', '_wpnonce');
if (!current_user_can('view_master_dashboard')) {
wp_die('Insufficient permissions');
}
$result = $this->manager->create_master_report();
if ($result['success']) {
wp_send_json_success($result);
} else {
wp_send_json_error($result['error']);
}
}
/**
* AJAX: Create Event Spreadsheet
*/
public function ajax_create_event_spreadsheet() {
check_ajax_referer('hvac_google_sheets', '_wpnonce');
if (!current_user_can('view_master_dashboard')) {
wp_die('Insufficient permissions');
}
$event_id = intval($_POST['event_id']);
if (!$event_id) {
wp_send_json_error('Invalid event ID');
}
$result = $this->manager->create_event_spreadsheet($event_id);
if ($result['success']) {
wp_send_json_success($result);
} else {
wp_send_json_error($result['error']);
}
}
/**
* AJAX: Test Connection
*/
public function ajax_test_connection() {
check_ajax_referer('hvac_google_sheets', '_wpnonce');
if (!current_user_can('view_master_dashboard')) {
wp_die('Insufficient permissions');
}
$result = $this->manager->test_connection();
if ($result['success']) {
wp_send_json_success($result['message']);
} else {
wp_send_json_error($result['message']);
}
}
/**
* AJAX: Verify Folder Structure
*/
public function ajax_verify_folder_structure() {
check_ajax_referer('hvac_google_sheets', '_wpnonce');
if (!current_user_can('view_master_dashboard')) {
wp_die('Insufficient permissions');
}
require_once plugin_dir_path(dirname(__FILE__)) . '../google-sheets-folder-manager.php';
$folder_manager = new HVAC_Google_Sheets_Folder_Manager();
$result = $folder_manager->verify_folder_structure();
wp_send_json_success($result);
}
}