47 lines
1.7 KiB
PHP
47 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Jobs;
|
|
|
|
use App\Models\Opportunity;
|
|
use App\Models\User;
|
|
use App\Services\PortalEditorialWorkflow;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Foundation\Queue\Queueable;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
/** Existing email transport and operational allowlist; no confidential payload. */
|
|
final class NotifyPrivateOfferDecision implements ShouldQueue
|
|
{
|
|
use Queueable;
|
|
|
|
public int $tries = 3;
|
|
|
|
public int $timeout = 30;
|
|
|
|
public function __construct(public string $noticeId) {}
|
|
|
|
/** @return list<int> */
|
|
public function backoff(): array
|
|
{
|
|
return [60, 300, 900];
|
|
}
|
|
|
|
public function handle(): void
|
|
{
|
|
if (! config('portal.notifications_enabled')) {
|
|
return;
|
|
}
|
|
$notice = DB::table('portal_editorial_notifications')->where('id', $this->noticeId)->first();
|
|
$user = $notice ? User::query()->whereKey($notice->user_id)->first() : null;
|
|
$record = $notice ? Opportunity::query()->whereKey($notice->opportunity_id)->first() : null;
|
|
if (! $notice || ! $user || ! $record?->isPrivateOfferPreparation()
|
|
|| ! in_array($user->email, config('portal.notification_recipients', []), true)
|
|
|| ! app(PortalEditorialWorkflow::class)->visibleNotice($user, $notice)) {
|
|
return;
|
|
}
|
|
$body = 'Existe uma actualização na revisão privada da oferta '.$record->reference.'. Consulte a decisão e a versão na área protegida: '.url('/minhas-oportunidades/ofertas/'.$record->id);
|
|
Mail::raw($body, fn ($message) => $message->to($user->email)->subject('Actualização da oferta — '.$record->reference));
|
|
}
|
|
}
|