subDay(); // ─── KPI 1: سفارشات در انتظار تأیید ─── $pendingApprovalCount = Shipment::where('status', ShipmentStatus::PendingApproval)->count(); $approvedUnpaidCount = Shipment::where('status', ShipmentStatus::Approved)->count(); $pendingOrdersTotal = $pendingApprovalCount + $approvedUnpaidCount; $pendingSparkline = []; for ($i = 6; $i >= 0; $i--) { $date = today()->subDays($i); $pendingSparkline[] = (int) Shipment::whereDate('created_at', $date) ->whereIn('status', [ShipmentStatus::PendingApproval, ShipmentStatus::Approved]) ->count(); } // ─── KPI 2: درآمد امروز ─── $todayRevenue = (float) WalletTransaction::where('type', 'order_payment') ->where('status', 'completed') ->where('amount', '>', 0) ->whereDate('created_at', $today) ->sum('amount'); $yesterdayRevenue = (float) WalletTransaction::where('type', 'order_payment') ->where('status', 'completed') ->where('amount', '>', 0) ->whereDate('created_at', $yesterday) ->sum('amount'); [$revPercent, $revDirection, $revFormatted] = ifnex_trend_percent($todayRevenue, $yesterdayRevenue); $revenueSparkline = []; for ($i = 6; $i >= 0; $i--) { $date = today()->subDays($i); $revenueSparkline[] = (float) WalletTransaction::where('type', 'order_payment') ->where('status', 'completed') ->where('amount', '>', 0) ->whereDate('created_at', $date) ->sum('amount'); } // ─── KPI 3: پرداخت‌های معوق ─── $pendingAmount = (float) Shipment::where('status', ShipmentStatus::Approved)->sum('total_fee'); $pendingShipmentsCount = Shipment::where('status', ShipmentStatus::Approved)->count(); $yesterdayPendingAmount = (float) Shipment::where('status', ShipmentStatus::Approved) ->whereDate('updated_at', '<', $today) ->sum('total_fee'); [$pendingPercent, $pendingDirection, $pendingFormatted] = ifnex_trend_percent( $pendingAmount, $yesterdayPendingAmount ); // ─── KPI 4: موجودی کیف پول‌ها ─── $totalWalletBalance = (float) Wallet::sum('balance'); $activeWallets = Wallet::where('balance', '>', 0)->count(); $walletSparkline = []; for ($i = 6; $i >= 0; $i--) { $date = today()->subDays($i); $walletSparkline[] = (float) WalletTransaction::where('status', 'completed') ->where('amount', '>', 0) ->whereDate('created_at', $date) ->sum('amount'); } return [ Stat::make('سفارشات در انتظار', ifnex_persian_digits(number_format($pendingOrdersTotal))) ->description( $pendingOrdersTotal > 0 ? sprintf('%s در انتظار تأیید، %s آماده پرداخت', ifnex_persian_digits(number_format($pendingApprovalCount)), ifnex_persian_digits(number_format($approvedUnpaidCount))) : 'سفارش جدیدی نیست' ) ->descriptionIcon('heroicon-m-clock') ->icon('heroicon-o-clock') ->color('warning') ->chart($pendingSparkline) ->url( $pendingOrdersTotal > 0 ? route('filament.admin.resources.shipments.index') : null ), Stat::make('درآمد امروز', ifnex_format_number($todayRevenue)) ->description( $revDirection === 'up' ? sprintf('↑ %s نسبت به دیروز', $revFormatted) : ($revDirection === 'down' ? sprintf('↓ %s نسبت به دیروز', $revFormatted) : 'بدون تغییر نسبت به دیروز') ) ->descriptionIcon( $revDirection === 'up' ? 'heroicon-m-arrow-trending-up' : ($revDirection === 'down' ? 'heroicon-m-arrow-trending-down' : 'heroicon-m-minus') ) ->icon('heroicon-o-arrow-trending-up') ->color( $revDirection === 'up' ? 'success' : ($revDirection === 'down' ? 'danger' : 'gray') ) ->chart($revenueSparkline) ->url(route('filament.admin.resources.wallet-transactions.index')), Stat::make('پرداخت‌های معوق', ifnex_format_number($pendingAmount)) ->description( $pendingShipmentsCount > 0 ? sprintf('%s سفارش در انتظار پرداخت — %s', ifnex_persian_digits(number_format($pendingShipmentsCount)), $pendingDirection === 'up' ? sprintf('↑ %s', $pendingFormatted) : ($pendingDirection === 'down' ? sprintf('↓ %s', $pendingFormatted) : 'بدون تغییر')) : 'پرداخت معوقی نیست' ) ->descriptionIcon( $pendingDirection === 'up' ? 'heroicon-m-arrow-trending-up' : ($pendingDirection === 'down' ? 'heroicon-m-arrow-trending-down' : 'heroicon-m-minus') ) ->icon('heroicon-o-banknotes') ->color('danger') ->chart($pendingSparkline) ->url( $pendingShipmentsCount > 0 ? route('filament.admin.resources.shipments.index') : null ), Stat::make('موجودی کیف پول‌ها', ifnex_format_number($totalWalletBalance)) ->description( sprintf('%s کیف پول فعال', ifnex_persian_digits(number_format($activeWallets))) ) ->descriptionIcon('heroicon-m-wallet') ->icon('heroicon-o-wallet') ->color('info') ->chart($walletSparkline) ->url(route('filament.admin.resources.wallets.index')), ]; } }