with(['campaign', 'user']) ->find($this->recipientId); if ($recipient === null || $recipient->status !== NewsletterRecipientStatus::Pending) { return; } $campaign = $recipient->campaign; $user = $recipient->user; if ($user === null || ! $user->is_active) { $this->conclude($recipient, NewsletterRecipientStatus::Failed, 'failed_count', 'Benutzer gelöscht oder deaktiviert.'); return; } if (! $user->wantsEmailNotification(EmailNotificationType::Newsletter)) { $this->conclude($recipient, NewsletterRecipientStatus::SkippedOptOut, 'skipped_count'); return; } Mail::to($recipient->email)->send(new NewsletterCampaignMail($campaign, $user)); $this->conclude($recipient, NewsletterRecipientStatus::Sent, 'sent_count'); } /** * Endgültiger Fehlschlag nach allen Versuchen des Workers. */ public function failed(\Throwable $exception): void { $recipient = NewsletterCampaignRecipient::query()->find($this->recipientId); if ($recipient === null || $recipient->status !== NewsletterRecipientStatus::Pending) { return; } $this->conclude($recipient, NewsletterRecipientStatus::Failed, 'failed_count', $exception->getMessage()); } private function conclude( NewsletterCampaignRecipient $recipient, NewsletterRecipientStatus $status, string $campaignCounter, ?string $error = null, ): void { $recipient->update([ 'status' => $status->value, 'error' => $error !== null ? Str::limit($error, 480) : null, 'sent_at' => $status === NewsletterRecipientStatus::Sent ? now() : null, ]); $campaign = NewsletterCampaign::query()->find($recipient->newsletter_campaign_id); if ($campaign === null) { return; } $campaign->increment($campaignCounter); $hasPending = $campaign->recipients() ->where('status', NewsletterRecipientStatus::Pending->value) ->exists(); if (! $hasPending && $campaign->status === NewsletterCampaignStatus::Sending) { $campaign->update([ 'status' => NewsletterCampaignStatus::Sent->value, 'sent_at' => now(), ]); } } }