ID) && !current_user_can('manage_options')) {
return;
}
?>
roles);
}
public static function get_creator_balance($user_id) {
global $wpdb;
// Get balance from user meta (for backward compatibility and manual adjustments)
$meta_balance = floatval(get_user_meta($user_id, 'wpdd_creator_balance', true));
// If we have the creator_earnings table, calculate from there
$table_exists = $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}wpdd_creator_earnings'") == $wpdb->prefix . 'wpdd_creator_earnings';
if ($table_exists) {
// Check if payout_status column exists
$columns = $wpdb->get_results("SHOW COLUMNS FROM {$wpdb->prefix}wpdd_creator_earnings");
$has_payout_status = false;
foreach ($columns as $column) {
if ($column->Field == 'payout_status') {
$has_payout_status = true;
break;
}
}
if ($has_payout_status) {
// Calculate available earnings (not pending, not paid)
$available_earnings = $wpdb->get_var($wpdb->prepare(
"SELECT SUM(creator_earning)
FROM {$wpdb->prefix}wpdd_creator_earnings
WHERE creator_id = %d
AND payout_status = 'available'",
$user_id
));
// Calculate balance adjustments
$adjustments_table_exists = $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}wpdd_balance_adjustments'") == $wpdb->prefix . 'wpdd_balance_adjustments';
$total_adjustments = 0;
if ($adjustments_table_exists) {
$total_adjustments = $wpdb->get_var($wpdb->prepare(
"SELECT SUM(CASE
WHEN adjustment_type = 'add' THEN amount
WHEN adjustment_type = 'subtract' THEN -amount
ELSE 0
END)
FROM {$wpdb->prefix}wpdd_balance_adjustments
WHERE creator_id = %d",
$user_id
));
}
$calculated_balance = floatval($available_earnings) + floatval($total_adjustments);
// Update the meta if different
if (abs($calculated_balance - $meta_balance) > 0.01) {
update_user_meta($user_id, 'wpdd_creator_balance', $calculated_balance);
}
return $calculated_balance;
}
}
// Fall back to meta balance
return $meta_balance;
}
public static function get_creator_total_earnings($user_id) {
global $wpdb;
$total = $wpdb->get_var($wpdb->prepare(
"SELECT SUM(o.amount)
FROM {$wpdb->prefix}wpdd_orders o
INNER JOIN {$wpdb->posts} p ON o.product_id = p.ID
WHERE p.post_author = %d
AND o.status = 'completed'",
$user_id
));
return floatval($total);
}
public static function get_creator_net_earnings($user_id) {
$total = self::get_creator_total_earnings($user_id);
$commission_rate = floatval(get_option('wpdd_commission_rate', 0));
$net = $total * (1 - ($commission_rate / 100));
return $net;
}
public static function add_earnings_to_balance($order_id) {
global $wpdb;
$order = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}wpdd_orders WHERE id = %d",
$order_id
));
if (!$order || $order->status !== 'completed') {
return;
}
$product = get_post($order->product_id);
if (!$product) {
return;
}
$creator_id = $product->post_author;
$commission_rate = floatval(get_option('wpdd_commission_rate', 0));
$creator_share = $order->amount * (1 - ($commission_rate / 100));
// Update creator balance
$current_balance = self::get_creator_balance($creator_id);
update_user_meta($creator_id, 'wpdd_creator_balance', $current_balance + $creator_share);
// Calculate when earnings will be available (holding period)
$holding_days = intval(get_option('wpdd_earnings_holding_days', 15));
$available_at = ($holding_days > 0) ?
date('Y-m-d H:i:s', strtotime('+' . $holding_days . ' days')) :
current_time('mysql');
$initial_status = ($holding_days > 0) ? 'pending' : 'available';
// Log the earning
$wpdb->insert(
$wpdb->prefix . 'wpdd_creator_earnings',
array(
'creator_id' => $creator_id,
'order_id' => $order_id,
'product_id' => $order->product_id,
'sale_amount' => $order->amount,
'commission_rate' => $commission_rate,
'creator_earning' => $creator_share,
'payout_status' => $initial_status,
'available_at' => $available_at,
'created_at' => current_time('mysql')
),
array('%d', '%d', '%d', '%f', '%f', '%f', '%s', '%s', '%s')
);
}
public static function get_creators_with_balance() {
global $wpdb;
$threshold = floatval(get_option('wpdd_payout_threshold', 0));
$query = "SELECT u.ID, u.display_name, u.user_email,
um1.meta_value as paypal_email,
um2.meta_value as balance
FROM {$wpdb->users} u
INNER JOIN {$wpdb->usermeta} um ON u.ID = um.user_id
LEFT JOIN {$wpdb->usermeta} um1 ON u.ID = um1.user_id AND um1.meta_key = 'wpdd_paypal_email'
LEFT JOIN {$wpdb->usermeta} um2 ON u.ID = um2.user_id AND um2.meta_key = 'wpdd_creator_balance'
WHERE um.meta_key = '{$wpdb->prefix}capabilities'
AND um.meta_value LIKE '%wpdd_creator%'
AND CAST(um2.meta_value AS DECIMAL(10,2)) > 0";
if ($threshold > 0) {
$query .= $wpdb->prepare(" AND CAST(um2.meta_value AS DECIMAL(10,2)) >= %f", $threshold);
}
return $wpdb->get_results($query);
}
}