Files
portal/app/app/Mail/AutopodborReadyMail.php
T
Дмитрий 062d46e15e feat(автоподбор): письмо «подбор готов» — клиент не ждёт у экрана (фон + уведомление)
RunAutopodborSearchJob по завершении (done/empty) шлёт AutopodborReadyMail на contact_email тенанта
(с числом найденных + ссылкой на портал). Письмо не роняет подбор при недоступной почте (try/catch).
Клиент ставит задачу, работает дальше, получает «готово» письмом.

Тесты: SearchJob 4/4 (вкл. Mail::assertSent); Автоподбор unit+feature 183/183; Pint чисто.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 19:02:28 +03:00

48 lines
1.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Mail;
use App\Models\AutopodborRun;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
/**
* Уведомление клиенту, что фоновый подбор конкурентов завершён (клиент не ждёт у экрана —
* поставил задачу, работает дальше, получает письмо «готово»).
*/
class AutopodborReadyMail extends Mailable
{
use Queueable;
use SerializesModels;
public function __construct(
public AutopodborRun $run,
public int $found,
) {}
public function envelope(): Envelope
{
$subject = $this->found > 0
? "Подбор конкурентов готов: {$this->found} — Лидерра"
: 'Подбор конкурентов готов — Лидерра';
return new Envelope(subject: $subject);
}
public function content(): Content
{
return new Content(
markdown: 'mail.autopodbor-ready',
with: [
'found' => $this->found,
'url' => rtrim((string) config('app.url'), '/').'/autopodbor',
],
);
}
}