$q->whereNotNull('confirmed_at')) ->whereDate('created_at', today()) ->count(); $todayAmount = Donation::whereHas('donationConfirmation', fn ($q) => $q->whereNotNull('confirmed_at')) ->whereDate('created_at', today()) ->sum('amount') / 100; return "Today: {$todayCount} confirmed (£" . number_format($todayAmount, 0) . ")"; } public function getTabs(): array { $incompleteCount = Donation::whereDoesntHave('donationConfirmation', fn ($q) => $q->whereNotNull('confirmed_at')) ->where('created_at', '>=', now()->subDays(7)) ->count(); $recurring = Donation::where('reoccurrence', '!=', -1) ->whereHas('donationConfirmation', fn ($q) => $q->whereNotNull('confirmed_at')) ->count(); // Use whereIn with subquery instead of whereHas to avoid null model crash // during Filament tab initialization (modifyQueryUsing gets a builder with no model) $confirmedSubquery = fn (Builder $q) => $q->whereIn( 'donations.id', fn ($sub) => $sub->select('donation_id') ->from('donation_confirmations') ->whereNotNull('confirmed_at') ); $unconfirmedSubquery = fn (Builder $q) => $q->whereNotIn( 'donations.id', fn ($sub) => $sub->select('donation_id') ->from('donation_confirmations') ->whereNotNull('confirmed_at') ); return [ 'today' => Tab::make('Today') ->icon('heroicon-o-clock') ->modifyQueryUsing(fn (Builder $q) => $confirmedSubquery($q) ->whereDate('created_at', today()) ), 'all_confirmed' => Tab::make('All Confirmed') ->icon('heroicon-o-check-circle') ->modifyQueryUsing(fn (Builder $q) => $confirmedSubquery($q)), 'incomplete' => Tab::make('Incomplete') ->icon('heroicon-o-exclamation-triangle') ->badge($incompleteCount > 0 ? $incompleteCount : null) ->badgeColor('danger') ->modifyQueryUsing(fn (Builder $q) => $unconfirmedSubquery($q) ->where('created_at', '>=', now()->subDays(7)) ), 'zakat' => Tab::make('Zakat') ->icon('heroicon-o-star') ->modifyQueryUsing(fn (Builder $q) => $confirmedSubquery($q) ->whereIn('donations.id', fn ($sub) => $sub->select('donation_id') ->from('donation_preferences') ->where('is_zakat', true)) ), 'gift_aid' => Tab::make('Gift Aid') ->icon('heroicon-o-gift') ->modifyQueryUsing(fn (Builder $q) => $confirmedSubquery($q) ->whereIn('donations.id', fn ($sub) => $sub->select('donation_id') ->from('donation_preferences') ->where('is_gift_aid', true)) ), 'recurring' => Tab::make('Recurring') ->icon('heroicon-o-arrow-path') ->badge($recurring > 0 ? $recurring : null) ->badgeColor('info') ->modifyQueryUsing(fn (Builder $q) => $confirmedSubquery($q) ->where('reoccurrence', '!=', -1) ), 'everything' => Tab::make('Everything') ->icon('heroicon-o-squares-2x2'), ]; } public function getDefaultActiveTab(): string | int | null { return 'today'; } }