with(['team', 'latestExecution']) ->where('enabled', true) ->where('missing_backup_notification_days', '>', 0) ->chunkById(100, function ($backups): void { foreach ($backups as $backup) { $this->notifyIfMissing($backup); } }); } private function notifyIfMissing(ScheduledVolumeBackup $backup): void { $lastExecutionAt = $backup->latestExecution?->created_at; $lastActivityAt = $lastExecutionAt ?? $backup->created_at; if (! $lastActivityAt || $lastActivityAt->isAfter(now()->subDays($backup->missing_backup_notification_days))) { return; } if (! $backup->team) { Log::warning("Cannot send missing volume backup notification for backup {$backup->id}: team not found"); return; } if ($backup->team->getEnabledChannels('backup_failure') === []) { return; } // Send once for each period without backup activity. NotificationThrottle::sendOnce( $backup, BackupMissing::class, $lastActivityAt, fn () => $backup->team->notify(new BackupMissing($backup, $lastExecutionAt)), ); } }