get_charset_collate(); // Pricing Rules Table. $table_rules = $wpdb->prefix . 'dp_aicoso_rules'; $sql_rules = "CREATE TABLE IF NOT EXISTS $table_rules ( rule_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, rule_name VARCHAR(255) NOT NULL, rule_type ENUM('product', 'category', 'role', 'time', 'custom') NOT NULL, rule_status ENUM('active', 'inactive', 'scheduled') DEFAULT 'active', priority INT(11) DEFAULT 10, conditions LONGTEXT, adjustments LONGTEXT, start_date DATETIME DEFAULT NULL, end_date DATETIME DEFAULT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (rule_id), INDEX idx_type_status (rule_type, rule_status), INDEX idx_dates (start_date, end_date) ) $charset_collate;"; // Rule Relationships Table. $table_relationships = $wpdb->prefix . 'dp_aicoso_rule_relationships'; $sql_relationships = "CREATE TABLE IF NOT EXISTS $table_relationships ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, rule_id BIGINT(20) UNSIGNED NOT NULL, object_id BIGINT(20) UNSIGNED NOT NULL, object_type VARCHAR(50) NOT NULL, PRIMARY KEY (id), INDEX idx_rule (rule_id), INDEX idx_object (object_id, object_type) ) $charset_collate;"; // Pricing Cache Table. $table_cache = $wpdb->prefix . 'dp_aicoso_price_cache'; $sql_cache = "CREATE TABLE IF NOT EXISTS $table_cache ( cache_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, product_id BIGINT(20) UNSIGNED NOT NULL, user_role VARCHAR(50) DEFAULT 'guest', quantity INT(11) DEFAULT 1, calculated_price DECIMAL(10,2), original_price DECIMAL(10,2), applied_rules TEXT, cache_key VARCHAR(255) UNIQUE, expires_at DATETIME, PRIMARY KEY (cache_id), INDEX idx_product_role (product_id, user_role), INDEX idx_cache_key (cache_key), INDEX idx_expires (expires_at) ) $charset_collate;"; // Audit Log Table. $table_audit = $wpdb->prefix . 'dp_aicoso_audit_log'; $sql_audit = "CREATE TABLE IF NOT EXISTS $table_audit ( log_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, rule_id BIGINT(20) UNSIGNED, user_id BIGINT(20) UNSIGNED, action VARCHAR(50), details LONGTEXT, ip_address VARCHAR(45), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (log_id), INDEX idx_rule_audit (rule_id), INDEX idx_user_audit (user_id), INDEX idx_created (created_at) ) $charset_collate;"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta( $sql_rules ); dbDelta( $sql_relationships ); dbDelta( $sql_cache ); dbDelta( $sql_audit ); // Store database version. update_option( 'dp_aicoso_db_version', '1.0.0' ); } /** * Set default plugin options. */ private static function set_default_options() { // General settings. add_option( 'dp_aicoso_settings', array( 'enable_cache' => true, 'cache_expiry' => 3600, 'enable_bulk_pricing' => true, 'show_bulk_table' => true, 'enable_role_pricing' => true, 'enable_time_pricing' => true, 'minimum_price' => 0, 'maximum_discount' => 100, 'debug_mode' => false, 'show_original_price' => true, 'show_discount_badge' => true, 'bulk_table_position' => 'woocommerce_single_product_summary', 'bulk_table_priority' => 15, ) ); // Plugin version. add_option( 'dp_aicoso_version', DP_AICOSO_VERSION ); // Installation date. add_option( 'dp_aicoso_installed', current_time( 'mysql' ) ); } /** * Schedule cron events. */ private static function schedule_events() { // Schedule cache cleanup. if ( ! wp_next_scheduled( 'dp_aicoso_cleanup_cache' ) ) { wp_schedule_event( time(), 'hourly', 'dp_aicoso_cleanup_cache' ); } // Schedule expired rules check. if ( ! wp_next_scheduled( 'dp_aicoso_check_expired_rules' ) ) { wp_schedule_event( time(), 'daily', 'dp_aicoso_check_expired_rules' ); } } /** * Create initial pricing rules for demonstration. */ private static function create_initial_rules() { // Load test rules class. require_once DP_AICOSO_PLUGIN_DIR . 'includes/class-dp-aicoso-test-rules.php'; // Create test rules. DP_AICOSO_Test_Rules::create_test_rules(); } }