Untitled

 avatar
webwizards
plain_text
22 days ago
6.6 kB
8
Indexable
/**
 * B2BKing Rolling 12-Month Group Management System
 * 
 * This code automatically manages customer groups based on their rolling 12-month purchase history.
 * Groups can be upgraded based on spending thresholds, but can only downgrade to the lowest group
 * when spending drops below €1 in the past year.
 * 
 * Add this to your theme's functions.php file or as a custom plugin.
 */

/**
 * CONFIGURATION SECTION - EDIT THESE VALUES
 * Replace the group IDs with your actual B2BKing group IDs
 */
function b2bking_get_rolling_groups_config() {
    return [
        'groups' => [
            'skupina_d' => [
                'id' => 123, // Replace with actual "Veľkoobchod – Skupina D" group ID
                'threshold' => 0,
                'name' => 'Skupina D'
            ],
            'skupina_c' => [
                'id' => 124, // Replace with actual "Veľkoobchod – Skupina C" group ID
                'threshold' => 2000,
                'name' => 'Skupina C'
            ],
            'skupina_b' => [
                'id' => 125, // Replace with actual "Veľkoobchod – Skupina B" group ID
                'threshold' => 5000,
                'name' => 'Skupina B'
            ],
            'skupina_a' => [
                'id' => 126, // Replace with actual "Veľkoobchod – Skupina A" group ID
                'threshold' => 10000,
                'name' => 'Skupina A'
            ]
        ],
        'downgrade_threshold' => 1, // If 12-month spending is below this amount (€1), downgrade to lowest group
        'check_on_login' => true, // Check and update groups on each login
        'cache_hours' => 24, // Cache the calculation for this many hours per user (set to 0 to disable caching)
    ];
}

/**
 * Check and update customer group on login
 */
function b2bking_check_group_on_login($user_login, $user) {
    $config = b2bking_get_rolling_groups_config();
    
    if (!$config['check_on_login']) {
        return;
    }
    
    // Only process for customers
    if (!in_array('customer', $user->roles)) {
        return;
    }
    
    // Check cache if enabled
    if ($config['cache_hours'] > 0) {
        $last_check = get_user_meta($user->ID, 'b2bking_last_group_check', true);
        if ($last_check && (time() - $last_check < $config['cache_hours'] * 3600)) {
            return; // Skip if checked recently
        }
    }
    
    b2bking_update_customer_group_rolling($user->ID);
    
    // Update cache timestamp
    if ($config['cache_hours'] > 0) {
        update_user_meta($user->ID, 'b2bking_last_group_check', time());
    }
}
add_action('wp_login', 'b2bking_check_group_on_login', 10, 2);

/**
 * Update customer group based on rolling 12-month spending
 */
function b2bking_update_customer_group_rolling($customer_id) {
    $config = b2bking_get_rolling_groups_config();
    
    // Get current group
    $current_group_id = b2bking()->get_user_group($customer_id);
    
    // Get rolling 12-month spend
    $rolling_spend = b2bking_get_customer_rolling_12_month_total($customer_id);
    
    // Determine new group based on special logic
    $new_group_id = b2bking_determine_group_with_sticky_logic($rolling_spend, $current_group_id);
    
    // Update group if changed
    if ($current_group_id != $new_group_id) {
        b2bking()->update_user_group($customer_id, $new_group_id);
        
        // Log the change for debugging (optional)
        b2bking_log_group_change($customer_id, $current_group_id, $new_group_id, $rolling_spend);
    }
}

/**
 * Determine appropriate group with the special "sticky" logic
 * - Can upgrade to any higher group based on spending
 * - Can only downgrade to lowest group (Skupina D) if spending < €1
 * - Otherwise stays in current group
 */
function b2bking_determine_group_with_sticky_logic($spend, $current_group_id) {
    $config = b2bking_get_rolling_groups_config();
    
    // Check if spending is below downgrade threshold (€1)
    if ($spend < $config['downgrade_threshold']) {
        // Drop to lowest group (Skupina D)
        return $config['groups']['skupina_d']['id'];
    }
    
    // Determine what group the spending qualifies for
    $qualified_group_id = $config['groups']['skupina_d']['id']; // Default to lowest
    
    // Check thresholds from highest to lowest
    if ($spend >= $config['groups']['skupina_a']['threshold']) {
        $qualified_group_id = $config['groups']['skupina_a']['id'];
    } elseif ($spend >= $config['groups']['skupina_b']['threshold']) {
        $qualified_group_id = $config['groups']['skupina_b']['id'];
    } elseif ($spend >= $config['groups']['skupina_c']['threshold']) {
        $qualified_group_id = $config['groups']['skupina_c']['id'];
    }
    
    // Get current group's tier level (for comparison)
    $current_tier = b2bking_get_group_tier_level($current_group_id);
    $qualified_tier = b2bking_get_group_tier_level($qualified_group_id);
    
    // Apply sticky logic:
    // - If qualified tier is higher, upgrade
    // - If qualified tier is lower but spending >= €1, stay in current group
    if ($qualified_tier > $current_tier) {
        return $qualified_group_id; // Upgrade
    } else {
        return $current_group_id; // Stay in current group (sticky)
    }
}

/**
 * Get tier level of a group (higher number = higher tier)
 */
function b2bking_get_group_tier_level($group_id) {
    $config = b2bking_get_rolling_groups_config();
    
    if ($group_id == $config['groups']['skupina_a']['id']) return 4;
    if ($group_id == $config['groups']['skupina_b']['id']) return 3;
    if ($group_id == $config['groups']['skupina_c']['id']) return 2;
    if ($group_id == $config['groups']['skupina_d']['id']) return 1;
    
    return 0; // Unknown group
}

/**
 * Get customer's completed orders total for rolling 12 months
 */
function b2bking_get_customer_rolling_12_month_total($customer_id) {
    // Calculate date range (exactly 365 days ago to now)
    $now = current_time('timestamp');
    $one_year_ago = strtotime('-365 days', $now);
    
    $start_date = date('Y-m-d 00:00:00', $one_year_ago);
    $end_date = date('Y-m-d 23:59:59', $now);
    
    // Query orders
    $args = array(
        'customer_id' => $customer_id,
        'status' => array('wc-completed'), // Only completed orders
        'date_created' => $start_date . '...' . $end_date,
        'return' => 'ids',
        'limit' => -1
    );
    
    $orders = wc_get_orders($args);
    
    // Calculate total
    $total = 0;
    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        $total += $order->get_total();
    }
    
    return $total;
}
Editor is loading...
Leave a Comment