qrCodes() ->whereIn('type', QrTypeCatalog::storefrontTypes()) ->pluck('id'); $todayStart = now()->startOfDay(); $todayOrders = QrSaleOrder::query() ->whereIn('qr_code_id', $qrIds) ->where('status', QrSaleOrder::STATUS_PAID) ->where('paid_at', '>=', $todayStart); $todayCount = (clone $todayOrders)->count(); $todayRevenue = (float) (clone $todayOrders)->sum('merchant_amount_ghs'); $recentOrders = QrSaleOrder::query() ->whereIn('qr_code_id', $qrIds) ->where('status', QrSaleOrder::STATUS_PAID) ->with('qrCode') ->latest('paid_at') ->limit(8) ->get(); $storefrontCount = $qrIds->count(); $orders30d = QrSaleOrder::query() ->whereIn('qr_code_id', $qrIds) ->where('status', QrSaleOrder::STATUS_PAID) ->where('paid_at', '>=', now()->subDays(30)) ->count(); $balanceMinor = 0; try { $balanceMinor = $this->billing->balanceMinor($account->public_id); } catch (Throwable $e) { Log::warning('Merchant dashboard could not load wallet balance', [ 'user' => $account->public_id, 'error' => $e->getMessage(), ]); } return view('merchant.dashboard', [ 'todayCount' => $todayCount, 'todayRevenue' => $todayRevenue, 'storefrontCount' => $storefrontCount, 'orders30d' => $orders30d, 'recentOrders' => $recentOrders, 'balanceMinor' => $balanceMinor, ]); } }