062d46e15e
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>
48 lines
1.3 KiB
PHP
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',
|
|
],
|
|
);
|
|
}
|
|
}
|