get_charset_collate(); $affiliates_table = $wpdb->prefix . self::$affiliates_table; $referrals_table = $wpdb->prefix . self::$referrals_table; $payouts_table = $wpdb->prefix . self::$payouts_table; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // Affiliates Table $sql_affiliates = "CREATE TABLE $affiliates_table ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, user_id bigint(20) UNSIGNED NOT NULL, referral_code varchar(50) NOT NULL, coupon_id bigint(20) UNSIGNED DEFAULT NULL, commission_rate decimal(10,2) NOT NULL DEFAULT '0.00', custom_commission_rate decimal(10,2) DEFAULT NULL, status varchar(20) NOT NULL DEFAULT 'pending', total_referrals int(11) NOT NULL DEFAULT 0, total_earnings decimal(19,4) NOT NULL DEFAULT '0.0000', paid_earnings decimal(19,4) NOT NULL DEFAULT '0.0000', payment_bank_name varchar(100) DEFAULT NULL, payment_bank_account varchar(100) DEFAULT NULL, payment_email varchar(100) DEFAULT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY user_id (user_id), UNIQUE KEY referral_code (referral_code), KEY status (status) ) $charset_collate;"; dbDelta($sql_affiliates); // Add custom_commission_rate column if it doesn't exist (for existing installations) if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$affiliates_table' AND COLUMN_NAME = 'custom_commission_rate'") == 0) { $wpdb->query("ALTER TABLE $affiliates_table ADD COLUMN custom_commission_rate decimal(10,2) DEFAULT NULL AFTER commission_rate"); } // Add payment details columns if they don't exist (for existing installations) $payment_columns = ['payment_bank_name', 'payment_bank_account', 'payment_email']; foreach ($payment_columns as $col) { if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$affiliates_table' AND COLUMN_NAME = '$col'") == 0) { $col_def = $col === 'payment_email' ? "varchar(100) DEFAULT NULL" : "varchar(100) DEFAULT NULL"; $wpdb->query("ALTER TABLE $affiliates_table ADD COLUMN $col $col_def AFTER paid_earnings"); } } // Add flexible payment_details JSON column if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$affiliates_table' AND COLUMN_NAME = 'payment_details'") == 0) { $wpdb->query("ALTER TABLE $affiliates_table ADD COLUMN payment_details longtext DEFAULT NULL AFTER payment_email"); } // Add payment_method column if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$affiliates_table' AND COLUMN_NAME = 'payment_method'") == 0) { $wpdb->query("ALTER TABLE $affiliates_table ADD COLUMN payment_method varchar(50) DEFAULT NULL AFTER payment_details"); } // Referrals Table $sql_referrals = "CREATE TABLE $referrals_table ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, affiliate_id bigint(20) UNSIGNED NOT NULL, order_id bigint(20) UNSIGNED NOT NULL, customer_id bigint(20) UNSIGNED DEFAULT NULL, commission_amount decimal(19,4) NOT NULL DEFAULT '0.0000', currency varchar(10) NOT NULL DEFAULT 'USD', status varchar(20) NOT NULL DEFAULT 'pending', cancelled_reason varchar(100) DEFAULT NULL, cancelled_at datetime DEFAULT NULL, utm_source varchar(100) DEFAULT NULL, utm_medium varchar(100) DEFAULT NULL, utm_campaign varchar(255) DEFAULT NULL, utm_content varchar(255) DEFAULT NULL, utm_term varchar(255) DEFAULT NULL, referrer_url varchar(500) DEFAULT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, approved_at datetime DEFAULT NULL, paid_at datetime DEFAULT NULL, PRIMARY KEY (id), KEY affiliate_id (affiliate_id), KEY order_id (order_id), KEY status (status) ) $charset_collate;"; dbDelta($sql_referrals); // Add cancelled columns if they don't exist (for existing installations) if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$referrals_table' AND COLUMN_NAME = 'cancelled_reason'") == 0) { $wpdb->query("ALTER TABLE $referrals_table ADD COLUMN cancelled_reason varchar(100) DEFAULT NULL AFTER status"); } if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$referrals_table' AND COLUMN_NAME = 'cancelled_at'") == 0) { $wpdb->query("ALTER TABLE $referrals_table ADD COLUMN cancelled_at datetime DEFAULT NULL AFTER cancelled_reason"); } // Add UTM columns if they don't exist (for existing installations) $utm_columns = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', 'referrer_url']; foreach ($utm_columns as $col) { if ($wpdb->get_var("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$referrals_table' AND COLUMN_NAME = '$col'") == 0) { $col_def = $col === 'referrer_url' ? "varchar(500) DEFAULT NULL" : ($col === 'utm_campaign' || $col === 'utm_content' || $col === 'utm_term' ? "varchar(255) DEFAULT NULL" : "varchar(100) DEFAULT NULL"); $after_col = $col === 'utm_source' ? 'cancelled_at' : ($col === 'utm_medium' ? 'utm_source' : ($col === 'utm_campaign' ? 'utm_medium' : ($col === 'utm_content' ? 'utm_campaign' : ($col === 'utm_term' ? 'utm_content' : 'utm_term')))); $wpdb->query("ALTER TABLE $referrals_table ADD COLUMN $col $col_def AFTER cancelled_at"); } } // Payouts Table $sql_payouts = "CREATE TABLE $payouts_table ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, affiliate_id bigint(20) UNSIGNED NOT NULL, amount decimal(19,4) NOT NULL, currency varchar(10) NOT NULL DEFAULT 'USD', method varchar(50) NOT NULL, status varchar(20) NOT NULL DEFAULT 'pending', notes text DEFAULT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, completed_at datetime DEFAULT NULL, PRIMARY KEY (id), KEY affiliate_id (affiliate_id), KEY status (status) ) $charset_collate;"; dbDelta($sql_payouts); } }