find($this->tenantPackageId); if (! $tenantPackage || ! $tenantPackage->tenant) { Log::warning('Tenant package expiry warning skipped', [ 'tenant_package_id' => $this->tenantPackageId, ]); return; } $tenant = $tenantPackage->tenant; $preferences = app(\App\Services\Packages\TenantNotificationPreferences::class); if (! $preferences->shouldNotify($tenant, 'package_expiring')) { $this->logNotification($tenant, [ 'type' => 'package_expiring', 'status' => 'skipped', 'context' => [ 'tenant_package_id' => $tenantPackage->id, 'days_remaining' => $this->daysRemaining, 'reason' => 'opt_out', ], ]); return; } $emails = collect([ $tenant->contact_email, $tenant->user?->email, ])->filter(fn ($email) => is_string($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) ->unique(); if ($emails->isEmpty()) { Log::info('Tenant package expiry warning skipped due to missing recipients', [ 'tenant_package_id' => $tenantPackage->id, 'days_remaining' => $this->daysRemaining, ]); $this->logNotification($tenant, [ 'type' => 'package_expiring', 'status' => 'skipped', 'context' => [ 'tenant_package_id' => $tenantPackage->id, 'days_remaining' => $this->daysRemaining, 'reason' => 'no_recipient', ], ]); return; } $context = [ 'tenant_package_id' => $tenantPackage->id, 'days_remaining' => $this->daysRemaining, ]; $this->dispatchToRecipients( $tenant, $emails, 'package_expiring', function (string $email) use ($tenantPackage) { Notification::route('mail', $email)->notify(new TenantPackageExpiringNotification( $tenantPackage, $this->daysRemaining, )); }, $context ); } }