dispatch($request, $productionOrder, ProductionOrderDocumentService::TYPE_ITEMS); return back()->with('success', 'Задача экспорта МАФ создана.'); } public function deliveryRequest( Request $request, ProductionOrder $productionOrder, ProductionOrderDelivery $delivery, ): RedirectResponse { $this->assertDeliveryBelongsToOrder($productionOrder, $delivery); $this->dispatch( $request, $productionOrder, ProductionOrderDocumentService::TYPE_DELIVERY, $delivery->id, ); return back()->with('success', 'Задача формирования заявки на доставку создана.'); } public function installationPack( Request $request, ProductionOrder $productionOrder, ProductionOrderInstallation $installation, ): RedirectResponse { $this->assertInstallationBelongsToOrder($productionOrder, $installation); $this->dispatch( $request, $productionOrder, ProductionOrderDocumentService::TYPE_INSTALLATION, $installation->id, ); return back()->with('success', 'Задача формирования монтажного пакета создана.'); } public function technicalDocuments(Request $request, ProductionOrder $productionOrder): RedirectResponse { $validated = $request->validate([ 'item_ids' => ['required', 'array', 'min:1'], 'item_ids.*' => ['required', 'integer', 'distinct'], ]); $itemIds = collect($validated['item_ids'])->map(static fn ($id): int => (int) $id)->values(); abort_unless( $productionOrder->items()->whereKey($itemIds)->count() === $itemIds->count(), 404, ); $this->dispatch( $request, $productionOrder, ProductionOrderDocumentService::TYPE_TECHNICAL_DOCUMENTS, itemIds: $itemIds->all(), ); return back()->with('success', 'Задача архивации техдокументации создана.'); } public function download(Request $request, File $file): StreamedResponse { abort_unless($file->is_generated, 404); abort_unless(Str::startsWith((string) $file->path, 'generated/production-orders/'), 404); abort_unless( (int) $file->user_id === (int) $request->user()->id || $request->user()->hasRole(Role::ADMIN), 403, ); abort_unless(Storage::disk('local')->exists((string) $file->path), 404); return Storage::disk('local')->download((string) $file->path, (string) $file->original_name); } /** @param list $itemIds */ private function dispatch( Request $request, ProductionOrder $order, string $type, ?int $relatedId = null, array $itemIds = [], ): void { GenerateProductionOrderFileJob::dispatch( $type, $order->id, (int) $request->user()->id, $relatedId, $itemIds, ); } private function assertDeliveryBelongsToOrder( ProductionOrder $order, ProductionOrderDelivery $delivery, ): void { abort_unless((int) $delivery->production_order_id === (int) $order->id, 404); } private function assertInstallationBelongsToOrder( ProductionOrder $order, ProductionOrderInstallation $installation, ): void { abort_unless((int) $installation->production_order_id === (int) $order->id, 404); } }