$q->whereNotNull('confirmed_at'); // Today $todayQuery = Donation::whereHas('donationConfirmation', $confirmedScope) ->whereDate('created_at', today()); $todayCount = $todayQuery->count(); $todayRevenue = $todayQuery->sum('amount') / 100; // This week $weekQuery = Donation::whereHas('donationConfirmation', $confirmedScope) ->where('created_at', '>=', now()->startOfWeek()); $weekRevenue = $weekQuery->sum('amount') / 100; // This month $monthQuery = Donation::whereHas('donationConfirmation', $confirmedScope) ->where('created_at', '>=', now()->startOfMonth()); $monthCount = $monthQuery->count(); $monthRevenue = $monthQuery->sum('amount') / 100; // Last month for trend $lastMonthRevenue = Donation::whereHas('donationConfirmation', $confirmedScope) ->whereBetween('created_at', [now()->subMonth()->startOfMonth(), now()->subMonth()->endOfMonth()]) ->sum('amount') / 100; $monthTrend = $lastMonthRevenue > 0 ? round(($monthRevenue - $lastMonthRevenue) / $lastMonthRevenue * 100, 1) : null; // Failed/incomplete donations today (people who tried but didn't complete) $incompleteToday = Donation::whereDoesntHave('donationConfirmation', $confirmedScope) ->whereDate('created_at', today()) ->count(); // Monthly supporters $activeSG = ScheduledGivingDonation::where('is_active', true)->count(); // Zakat this month $zakatMonth = Donation::whereHas('donationConfirmation', $confirmedScope) ->where('created_at', '>=', now()->startOfMonth()) ->whereHas('donationPreferences', fn ($q) => $q->where('is_zakat', true)) ->sum('amount') / 100; return [ Stat::make("Today's Donations", '£' . number_format($todayRevenue, 0)) ->description($todayCount . ' donations received' . ($incompleteToday > 0 ? " · {$incompleteToday} incomplete" : '')) ->descriptionIcon($incompleteToday > 0 ? 'heroicon-m-exclamation-triangle' : 'heroicon-m-check-circle') ->color($incompleteToday > 5 ? 'warning' : 'success'), Stat::make('This Month', '£' . number_format($monthRevenue, 0)) ->description( $monthCount . ' donations' . ($monthTrend !== null ? ' · ' . ($monthTrend >= 0 ? '↑' : '↓') . abs($monthTrend) . '% vs last month' : '') ) ->descriptionIcon('heroicon-m-arrow-trending-up') ->color($monthTrend !== null && $monthTrend >= 0 ? 'success' : 'warning'), Stat::make('Monthly Supporters', number_format($activeSG)) ->description('People giving every month') ->descriptionIcon('heroicon-m-heart') ->color('success'), Stat::make('Zakat This Month', '£' . number_format($zakatMonth, 0)) ->description('Zakat-eligible donations') ->descriptionIcon('heroicon-m-star') ->color('info'), ]; } }