| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php
- declare(strict_types=1);
- namespace App\Http\Controllers;
- use App\Jobs\GenerateProductionOrderFileJob;
- use App\Models\File;
- use App\Models\ProductionOrder;
- use App\Models\ProductionOrderDelivery;
- use App\Models\ProductionOrderInstallation;
- use App\Models\Role;
- use App\Services\ProductionOrderDocumentService;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Storage;
- use Illuminate\Support\Str;
- use Symfony\Component\HttpFoundation\StreamedResponse;
- class ProductionOrderDocumentController extends Controller
- {
- public function exportItems(Request $request, ProductionOrder $productionOrder): RedirectResponse
- {
- $this->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<int> $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);
- }
- }
|