query($this->pendingQuery()) ->columns([ TextColumn::make('carrier')->badge(), TextColumn::make('tracking_reference')->label('Tracking #'), TextColumn::make('order.reference')->label('Order'), TextColumn::make('label_printed_at')->label('Printed')->dateTime()->placeholder('Not printed'), ]) ->recordActions([ Action::make('print') ->label('Print') ->icon('heroicon-o-printer') ->action(fn (Shipment $record) => $this->printShipment($record)), ]) ->toolbarActions([ BulkAction::make('print_selected') ->label('Print selected') ->icon('heroicon-o-printer') ->action(fn (Collection $records) => $records->each(fn (Shipment $shipment) => $this->printShipment($shipment))), BulkAction::make('issue_manifest') ->label('Issue Manifest') ->icon('heroicon-o-check-circle') ->action(fn (Collection $records) => $this->issueManifest($records)), ]); } private function pendingQuery(): Builder { $carriers = collect(Shipping::getSupportedDrivers())->keys()->filter( fn (string $carrier) => $this->fulfillmentService($carrier) instanceof SupportsManifestBatching ); return Shipment::query() ->whereIn('carrier', $carriers) ->whereNull('manifest_reference') ->whereNull('cancelled_at'); } private function printShipment(Shipment $shipment): void { $this->fulfillmentService($shipment->carrier)?->printLabel($shipment); } private function issueManifest(Collection $shipments): void { $shipments->groupBy('carrier')->each(function (Collection $group, string $carrier) { $service = $this->fulfillmentService($carrier); if (! $service instanceof SupportsManifestBatching) { return; } $result = $service->issueManifest($group); if (! $result->success) { Notification::make() ->title("Manifest blocked for {$carrier}: {$result->reason}") ->danger() ->send(); return; } Notification::make() ->title("Manifest issued for {$carrier}: {$result->reference}") ->success() ->send(); }); } private function fulfillmentService(string $carrier): ?CarrierFulfillmentInterface { return app(CarrierFulfillmentInterface::class, ['carrier' => $carrier]); } }