$columnMap * @param array $formats * @param array $options */ public function __construct( protected Export $export, protected array $columnMap, protected array $formats = [], protected array $options = [], ) { $this->exporter = $this->export->getExporter( $this->columnMap, $this->options, ); } public function handle(): void { $this->export->touch('completed_at'); if (! $this->export->user instanceof Authenticatable) { return; } $failedRowsCount = $this->export->getFailedRowsCount(); Notification::make() ->title($this->exporter::getCompletedNotificationTitle($this->export)) ->body($this->exporter::getCompletedNotificationBody($this->export)) ->when( ! $failedRowsCount, fn (Notification $notification) => $notification->success(), ) ->when( $failedRowsCount && ($failedRowsCount < $this->export->total_rows), fn (Notification $notification) => $notification->warning(), ) ->when( $failedRowsCount === $this->export->total_rows, fn (Notification $notification) => $notification->danger(), ) ->when( $failedRowsCount < $this->export->total_rows, fn (Notification $notification) => $notification->actions(array_map( fn (ExportFormat $format): NotificationAction => $format->getDownloadNotificationAction($this->export), $this->formats, )), ) ->when( ($this->connection === 'sync') || (blank($this->connection) && (config('queue.default') === 'sync')), fn (Notification $notification) => $notification ->persistent() ->send(), fn (Notification $notification) => $notification->sendToDatabase($this->export->user, isEventDispatched: true), ); } }