error('Der Newsletter-Versand ist gesperrt (NEWSLETTER_SENDING_ENABLED=false) — nichts eingeplant.'); return self::FAILURE; } $campaign = NewsletterCampaign::query()->find((int) $this->argument('campaign')); if ($campaign === null) { $this->error('Kampagne nicht gefunden.'); return self::FAILURE; } if ($campaign->status !== NewsletterCampaignStatus::Sending) { $this->error(sprintf('Kampagne #%d ist „%s“, nicht „%s“ — nichts zu tun.', $campaign->id, $campaign->status->label(), NewsletterCampaignStatus::Sending->label())); return self::FAILURE; } $stuckMinutes = max(0, (int) $this->option('stuck-minutes')); $stuck = 0; if ($stuckMinutes > 0) { $stuck = $campaign->recipients() ->where('status', NewsletterRecipientStatus::Sending->value) ->where('updated_at', '<', now()->subMinutes($stuckMinutes)) ->update([ 'status' => NewsletterRecipientStatus::Pending->value, 'error' => null, 'updated_at' => now(), ]); } $failed = 0; if ($this->option('failed')) { $failed = DB::transaction(function () use ($campaign): int { $reset = $campaign->recipients() ->where('status', NewsletterRecipientStatus::Failed->value) ->update([ 'status' => NewsletterRecipientStatus::Pending->value, 'error' => null, 'updated_at' => now(), ]); if ($reset > 0) { NewsletterCampaign::query()->whereKey($campaign->id)->decrement('failed_count', $reset); } return $reset; }); } $dispatched = CampaignSender::dispatchPending($campaign); $this->info(sprintf( 'Kampagne #%d: %d Empfänger neu eingeplant (%d hängende zurückgesetzt, %d fehlgeschlagene zurückgesetzt).', $campaign->id, $dispatched, $stuck, $failed, )); return self::SUCCESS; } }