🚨 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>
383 lines
No EOL
12 KiB
PHP
383 lines
No EOL
12 KiB
PHP
<?php
|
|
/**
|
|
* HVAC Community Events - Communication Installer
|
|
*
|
|
* Handles database table creation and updates for communication system.
|
|
* Creates tables for schedules, logs, and tracking.
|
|
*
|
|
* @package HVAC_Community_Events
|
|
* @subpackage Communication
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
// Exit if accessed directly
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Class HVAC_Communication_Installer
|
|
*
|
|
* Manages database installation for communication system.
|
|
*/
|
|
class HVAC_Communication_Installer {
|
|
|
|
/**
|
|
* Database version
|
|
*/
|
|
const DB_VERSION = '1.0.0';
|
|
|
|
/**
|
|
* Install database tables
|
|
*/
|
|
public static function install() {
|
|
global $wpdb;
|
|
|
|
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
|
|
|
$charset_collate = $wpdb->get_charset_collate();
|
|
|
|
self::create_schedules_table( $charset_collate );
|
|
self::create_logs_table( $charset_collate );
|
|
self::create_tracking_table( $charset_collate );
|
|
|
|
// Update version option
|
|
update_option( 'hvac_communication_db_version', self::DB_VERSION );
|
|
|
|
if ( class_exists( 'HVAC_Logger' ) ) {
|
|
HVAC_Logger::info( 'Communication system database tables installed', 'Communication Installer' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create communication schedules table
|
|
*
|
|
* @param string $charset_collate Database charset and collation
|
|
*/
|
|
private static function create_schedules_table( $charset_collate ) {
|
|
global $wpdb;
|
|
|
|
$table_name = $wpdb->prefix . 'hvac_communication_schedules';
|
|
|
|
$sql = "CREATE TABLE {$table_name} (
|
|
schedule_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
trainer_id BIGINT(20) UNSIGNED NOT NULL,
|
|
event_id BIGINT(20) UNSIGNED DEFAULT NULL,
|
|
template_id BIGINT(20) UNSIGNED NOT NULL,
|
|
schedule_name VARCHAR(255) NOT NULL DEFAULT '',
|
|
schedule_type VARCHAR(50) NOT NULL DEFAULT 'time_based',
|
|
trigger_type VARCHAR(50) NOT NULL,
|
|
trigger_value INT(11) NOT NULL DEFAULT 0,
|
|
trigger_unit VARCHAR(20) NOT NULL DEFAULT 'days',
|
|
status VARCHAR(20) NOT NULL DEFAULT 'active',
|
|
target_audience VARCHAR(50) NOT NULL DEFAULT 'all_attendees',
|
|
custom_recipient_list TEXT DEFAULT NULL,
|
|
conditions TEXT DEFAULT NULL,
|
|
next_run DATETIME DEFAULT NULL,
|
|
last_run DATETIME DEFAULT NULL,
|
|
run_count INT(11) NOT NULL DEFAULT 0,
|
|
is_recurring TINYINT(1) NOT NULL DEFAULT 0,
|
|
recurring_interval INT(11) DEFAULT NULL,
|
|
recurring_unit VARCHAR(20) DEFAULT NULL,
|
|
max_runs INT(11) DEFAULT NULL,
|
|
created_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
modified_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (schedule_id),
|
|
KEY trainer_id (trainer_id),
|
|
KEY event_id (event_id),
|
|
KEY template_id (template_id),
|
|
KEY status (status),
|
|
KEY trigger_type (trigger_type),
|
|
KEY next_run (next_run),
|
|
KEY created_date (created_date)
|
|
) {$charset_collate};";
|
|
|
|
dbDelta( $sql );
|
|
}
|
|
|
|
/**
|
|
* Create communication logs table
|
|
*
|
|
* @param string $charset_collate Database charset and collation
|
|
*/
|
|
private static function create_logs_table( $charset_collate ) {
|
|
global $wpdb;
|
|
|
|
$table_name = $wpdb->prefix . 'hvac_communication_logs';
|
|
|
|
$sql = "CREATE TABLE {$table_name} (
|
|
log_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
schedule_id BIGINT(20) UNSIGNED NOT NULL,
|
|
recipient_email VARCHAR(255) DEFAULT NULL,
|
|
status VARCHAR(20) NOT NULL,
|
|
sent_date DATETIME NOT NULL,
|
|
recipient_count INT(11) NOT NULL DEFAULT 0,
|
|
success_count INT(11) NOT NULL DEFAULT 0,
|
|
error_count INT(11) NOT NULL DEFAULT 0,
|
|
execution_time DECIMAL(8,4) NOT NULL DEFAULT 0.0000,
|
|
details TEXT DEFAULT NULL,
|
|
PRIMARY KEY (log_id),
|
|
KEY schedule_id (schedule_id),
|
|
KEY status (status),
|
|
KEY sent_date (sent_date),
|
|
KEY recipient_email (recipient_email)
|
|
) {$charset_collate};";
|
|
|
|
dbDelta( $sql );
|
|
}
|
|
|
|
/**
|
|
* Create event communication tracking table
|
|
*
|
|
* @param string $charset_collate Database charset and collation
|
|
*/
|
|
private static function create_tracking_table( $charset_collate ) {
|
|
global $wpdb;
|
|
|
|
$table_name = $wpdb->prefix . 'hvac_event_communication_tracking';
|
|
|
|
$sql = "CREATE TABLE {$table_name} (
|
|
tracking_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
event_id BIGINT(20) UNSIGNED NOT NULL,
|
|
attendee_id BIGINT(20) UNSIGNED NOT NULL,
|
|
schedule_id BIGINT(20) UNSIGNED NOT NULL,
|
|
email VARCHAR(255) NOT NULL,
|
|
sent_date DATETIME NOT NULL,
|
|
delivery_status VARCHAR(20) NOT NULL DEFAULT 'sent',
|
|
opened TINYINT(1) NOT NULL DEFAULT 0,
|
|
opened_date DATETIME DEFAULT NULL,
|
|
clicked TINYINT(1) NOT NULL DEFAULT 0,
|
|
clicked_date DATETIME DEFAULT NULL,
|
|
bounced TINYINT(1) NOT NULL DEFAULT 0,
|
|
bounce_reason TEXT DEFAULT NULL,
|
|
PRIMARY KEY (tracking_id),
|
|
UNIQUE KEY event_attendee_schedule (event_id, attendee_id, schedule_id),
|
|
KEY event_id (event_id),
|
|
KEY attendee_id (attendee_id),
|
|
KEY schedule_id (schedule_id),
|
|
KEY email (email),
|
|
KEY delivery_status (delivery_status),
|
|
KEY sent_date (sent_date)
|
|
) {$charset_collate};";
|
|
|
|
dbDelta( $sql );
|
|
}
|
|
|
|
/**
|
|
* Check if tables need to be updated
|
|
*
|
|
* @return bool True if update needed
|
|
*/
|
|
public static function needs_update() {
|
|
$installed_version = get_option( 'hvac_communication_db_version', '0' );
|
|
return version_compare( $installed_version, self::DB_VERSION, '<' );
|
|
}
|
|
|
|
/**
|
|
* Update database tables if needed
|
|
*/
|
|
public static function maybe_update() {
|
|
if ( self::needs_update() ) {
|
|
self::install();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if all required tables exist
|
|
*
|
|
* @return bool True if all tables exist
|
|
*/
|
|
public static function tables_exist() {
|
|
global $wpdb;
|
|
|
|
$required_tables = array(
|
|
$wpdb->prefix . 'hvac_communication_schedules',
|
|
$wpdb->prefix . 'hvac_communication_logs',
|
|
$wpdb->prefix . 'hvac_event_communication_tracking'
|
|
);
|
|
|
|
foreach ( $required_tables as $table ) {
|
|
if ( $wpdb->get_var( "SHOW TABLES LIKE '{$table}'" ) !== $table ) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Drop all communication tables (for uninstall)
|
|
*/
|
|
public static function drop_tables() {
|
|
global $wpdb;
|
|
|
|
$tables = array(
|
|
$wpdb->prefix . 'hvac_communication_schedules',
|
|
$wpdb->prefix . 'hvac_communication_logs',
|
|
$wpdb->prefix . 'hvac_event_communication_tracking'
|
|
);
|
|
|
|
foreach ( $tables as $table ) {
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$table}" );
|
|
}
|
|
|
|
delete_option( 'hvac_communication_db_version' );
|
|
|
|
if ( class_exists( 'HVAC_Logger' ) ) {
|
|
HVAC_Logger::info( 'Communication system database tables dropped', 'Communication Installer' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get table status information
|
|
*
|
|
* @return array Table status information
|
|
*/
|
|
public static function get_table_status() {
|
|
global $wpdb;
|
|
|
|
$tables = array(
|
|
'schedules' => $wpdb->prefix . 'hvac_communication_schedules',
|
|
'logs' => $wpdb->prefix . 'hvac_communication_logs',
|
|
'tracking' => $wpdb->prefix . 'hvac_event_communication_tracking'
|
|
);
|
|
|
|
$status = array();
|
|
|
|
foreach ( $tables as $key => $table_name ) {
|
|
$exists = $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) === $table_name;
|
|
$count = 0;
|
|
|
|
if ( $exists ) {
|
|
$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$table_name}" );
|
|
}
|
|
|
|
$status[$key] = array(
|
|
'table_name' => $table_name,
|
|
'exists' => $exists,
|
|
'record_count' => intval( $count )
|
|
);
|
|
}
|
|
|
|
$status['db_version'] = get_option( 'hvac_communication_db_version', '0' );
|
|
$status['current_version'] = self::DB_VERSION;
|
|
$status['needs_update'] = self::needs_update();
|
|
|
|
return $status;
|
|
}
|
|
|
|
/**
|
|
* Repair corrupted tables
|
|
*
|
|
* @return array Repair results
|
|
*/
|
|
public static function repair_tables() {
|
|
global $wpdb;
|
|
|
|
$tables = array(
|
|
$wpdb->prefix . 'hvac_communication_schedules',
|
|
$wpdb->prefix . 'hvac_communication_logs',
|
|
$wpdb->prefix . 'hvac_event_communication_tracking'
|
|
);
|
|
|
|
$results = array();
|
|
|
|
foreach ( $tables as $table ) {
|
|
$result = $wpdb->query( "REPAIR TABLE {$table}" );
|
|
$results[$table] = $result !== false;
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* Optimize database tables
|
|
*
|
|
* @return array Optimization results
|
|
*/
|
|
public static function optimize_tables() {
|
|
global $wpdb;
|
|
|
|
$tables = array(
|
|
$wpdb->prefix . 'hvac_communication_schedules',
|
|
$wpdb->prefix . 'hvac_communication_logs',
|
|
$wpdb->prefix . 'hvac_event_communication_tracking'
|
|
);
|
|
|
|
$results = array();
|
|
|
|
foreach ( $tables as $table ) {
|
|
$result = $wpdb->query( "OPTIMIZE TABLE {$table}" );
|
|
$results[$table] = $result !== false;
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* Get database size information
|
|
*
|
|
* @return array Database size information
|
|
*/
|
|
public static function get_database_size() {
|
|
global $wpdb;
|
|
|
|
$tables = array(
|
|
$wpdb->prefix . 'hvac_communication_schedules',
|
|
$wpdb->prefix . 'hvac_communication_logs',
|
|
$wpdb->prefix . 'hvac_event_communication_tracking'
|
|
);
|
|
|
|
$total_size = 0;
|
|
$table_sizes = array();
|
|
|
|
foreach ( $tables as $table ) {
|
|
$size_result = $wpdb->get_row(
|
|
$wpdb->prepare(
|
|
"SELECT
|
|
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'size_mb'
|
|
FROM information_schema.TABLES
|
|
WHERE table_schema = %s
|
|
AND table_name = %s",
|
|
DB_NAME,
|
|
$table
|
|
)
|
|
);
|
|
|
|
$size_mb = $size_result ? floatval( $size_result->size_mb ) : 0;
|
|
$table_sizes[$table] = $size_mb;
|
|
$total_size += $size_mb;
|
|
}
|
|
|
|
return array(
|
|
'total_size_mb' => round( $total_size, 2 ),
|
|
'table_sizes' => $table_sizes
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Create default communication schedules
|
|
*/
|
|
public static function create_default_schedules() {
|
|
// This would create some default schedule templates
|
|
// For now, we'll just log that defaults would be created
|
|
|
|
if ( class_exists( 'HVAC_Logger' ) ) {
|
|
HVAC_Logger::info( 'Default communication schedules would be created here', 'Communication Installer' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Migrate data from older versions
|
|
*
|
|
* @param string $from_version Version to migrate from
|
|
*/
|
|
public static function migrate_data( $from_version ) {
|
|
// Handle data migration between versions
|
|
// For now, this is a placeholder
|
|
|
|
if ( class_exists( 'HVAC_Logger' ) ) {
|
|
HVAC_Logger::info( "Data migration from version {$from_version} to " . self::DB_VERSION, 'Communication Installer' );
|
|
}
|
|
}
|
|
} |