From f801ca9eedd8d4293fd467f468d973a9a7ea3534 Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Sun, 9 Aug 2026 17:08:30 +0330 Subject: [PATCH] Updated dashboard --- .../Controllers/Admin/DashboardController.php | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index 0f5a3a5..b444e38 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -26,22 +26,41 @@ class DashboardController extends Controller ->count('user_id'); // 3. Get Paid Subscribers & Breakdown by Plan Type AND Market Provider - $paidBreakdown = UserSubscriber::where('user_subscribers.expired_at', '>=', now()) - ->whereHas('subscribe', function (Builder $query) { - $query->where('is_free', false); - }) + $rawBreakdown = UserSubscriber::where('user_subscribers.expired_at', '>=', now()) ->join('subscribe_plans', 'user_subscribers.subscribe_plan_id', '=', 'subscribe_plans.id') + ->where('subscribe_plans.is_free', false) // Replaced redundant whereHas for better performance ->selectRaw('subscribe_plans.name as plan_name, user_subscribers.market_provider, count(DISTINCT user_subscribers.user_id) as total') ->groupBy('subscribe_plans.name', 'user_subscribers.market_provider') ->get(); - // Dynamically format the display name using the provider directly from the DB - $paidBreakdown->each(function ($item) { - $provider = !empty($item->market_provider) ? $item->market_provider : 'سایت / مستقیم'; - $item->display_name = $item->plan_name . ' (' . $provider . ')'; - }); + // 4. Safely group the results in PHP to fix split numbers (merging null, '', and 'web') + $paidBreakdown = $rawBreakdown->map(function ($item) { + $provider = strtolower(trim($item->market_provider)); - // Total paid is the sum of the breakdown + // Normalize the provider names + if (empty($provider) || $provider === 'web') { + $providerName = 'سایت'; + } elseif ($provider === 'bazar') { + $providerName = 'بازار'; + } elseif ($provider === 'myket') { + $providerName = 'مایکت'; + } else { + $providerName = ucfirst($provider); // Dynamic fallback for any future gateways + } + + return [ + 'display_name' => $item->plan_name . ' (' . $providerName . ')', + 'total' => $item->total + ]; + })->groupBy('display_name')->map(function ($group, $key) { + // Merge any split rows (e.g. 'web' + null) into one accurate total sum + return (object) [ + 'display_name' => $key, + 'total' => $group->sum('total') + ]; + })->values(); + + // Total paid is the exact sum of the merged breakdown $paidSubscribers = $paidBreakdown->sum('total'); // 4. Fetch Recent Data (Limit to 5)