Affiliate module: fix referral approval lifecycle and settings reads

This commit is contained in:
Dwindi Ramadhana
2026-06-02 00:37:20 +07:00
parent f3c4ee7124
commit fec786daa6
8 changed files with 344 additions and 36 deletions

View File

@@ -5,6 +5,7 @@ namespace WooNooW\Api\Controllers;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;
use WooNooW\Modules\Affiliate\AffiliateSettings;
class AffiliateCustomerController
{
@@ -74,8 +75,20 @@ class AffiliateCustomerController
? (float) $affiliate['custom_commission_rate']
: $global_rate;
$referrals_table = $wpdb->prefix . 'woonoow_referrals';
$earnings = $wpdb->get_row($wpdb->prepare(
"SELECT
SUM(CASE WHEN status = 'approved' THEN commission_amount ELSE 0 END) as total_earnings,
SUM(CASE WHEN status = 'pending' THEN commission_amount ELSE 0 END) as pending_earnings
FROM $referrals_table
WHERE affiliate_id = %d",
$affiliate['id']
));
$affiliate['global_commission_rate'] = $global_rate;
$affiliate['commission_rate'] = $effective_rate;
$affiliate['total_earnings'] = $earnings->total_earnings ?: 0;
$affiliate['pending_earnings'] = $earnings->pending_earnings ?: 0;
return rest_ensure_response($affiliate);
}
@@ -136,16 +149,51 @@ class AffiliateCustomerController
return rest_ensure_response([]);
}
$referrals = $wpdb->get_results($wpdb->prepare(
"SELECT r.*,
$limit = (int) $request->get_param('limit');
$page = max(1, (int) $request->get_param('page'));
$order_id = $request->get_param('order_id') ? (int) $request->get_param('order_id') : null;
$where = $wpdb->prepare("WHERE r.affiliate_id = %d", $affiliate->id);
if ($order_id) {
$where .= $wpdb->prepare(" AND r.order_id = %d", $order_id);
}
$sql = "SELECT r.*,
COALESCE(NULLIF(r.cancelled_reason, ''), NULL) as cancelled_reason,
COALESCE(r.approved_at, r.created_at) as approved_at
FROM $referrals_table r
WHERE r.affiliate_id = %d
ORDER BY r.created_at DESC",
$affiliate->id
), ARRAY_A);
return rest_ensure_response($referrals);
$where
ORDER BY r.created_at DESC";
if ($limit > 0) {
$offset = ($page - 1) * $limit;
$sql .= $wpdb->prepare(" LIMIT %d OFFSET %d", $limit, $offset);
}
$referrals = $wpdb->get_results($sql, ARRAY_A);
$total = $wpdb->get_var("SELECT COUNT(r.id) FROM $referrals_table r $where");
// Attach customer data if enabled
if (!empty($referrals) && AffiliateSettings::get_setting('woonoow_affiliate_share_customer_data', false)) {
foreach ($referrals as &$ref) {
if (!empty($ref['order_id'])) {
$order = wc_get_order($ref['order_id']);
if ($order) {
$ref['customer_name'] = trim($order->get_billing_first_name() . ' ' . $order->get_billing_last_name());
$ref['customer_email'] = $order->get_billing_email();
}
}
}
}
return rest_ensure_response([
'referrals' => $referrals,
'total' => (int) $total,
'page' => $page,
'limit' => $limit > 0 ? $limit : (int) $total,
'total_pages' => $limit > 0 ? ceil($total / $limit) : 1
]);
}
public function get_payouts(WP_REST_Request $request)