user('web'); abort_unless($actor instanceof User && $actor->hasFunctions(['admin', 'warehouse_request_read', 'warehouse_request_prepare', 'warehouse_request_review', 'warehouse_request_deliver']), 403); $prepare = $actor->hasFunctions(['warehouse_request_prepare']) && ! app(OrganizationAccess::class)->maintenanceOnly($actor); $ready = Schema::hasTable('warehouse_requests'); $query = WarehouseRequest::query(); if (! $actor->hasFunctions(['admin', 'warehouse_request_read']) && ! ($actor->hasFunctions(['warehouse_request_deliver']) && $actor->hasFunctions(['warehouse']))) { $query->where(function ($q) use ($actor) { $q->where('created_by', $actor->id); if ($actor->hasFunctions(['warehouse_request_review']) && $actor->department_id !== null) { $q->orWhere('snapshot->requester->department_id', $actor->department_id); } }); } Inertia::encryptHistory(); $response = Inertia::render('stock/requests', ['ready' => $ready, 'canPrepare' => $prepare, 'fulfilmentReady' => Schema::hasTable('warehouse_request_events'), 'records' => $ready ? $query->latest('id')->paginate(15, ['id', 'status', 'snapshot', 'created_at'])->withQueryString()->through(fn ($r) => ['id' => $r->id, 'status' => $r->status, 'snapshot' => $r->snapshot, 'progress' => app(WarehouseFulfilment::class)->progress($r)]) : null, 'warehouses' => $prepare ? Warehouse::query()->orderBy('code')->get(['id', 'code', 'name']) : [], 'items' => $prepare ? StockItem::query()->orderBy('code')->get(['id', 'code', 'name', 'unit']) : [], 'costCenters' => $prepare ? CostCenter::query()->where('department_id', $actor->department_id)->orderBy('code')->get(['id', 'code', 'name']) : [], 'equipment' => $prepare ? Equipment::query()->where('department_id', $actor->department_id)->orderBy('code')->get(['id', 'code', 'description']) : []])->toResponse($request); $response->headers->set('Cache-Control', 'private, no-store, max-age=0'); return $response; } public function store(Request $request, WarehouseRequests $service): Response { $actor = $request->user('web'); abort_unless($actor instanceof User, 403); $service->draft($actor, $request->all()); return redirect('/stock/requisicoes'); } public function show(Request $request, int $id, WarehouseFulfilment $service): Response { $actor = $request->user('web'); abort_unless($actor instanceof User, 403); $r = WarehouseRequest::query()->findOrFail($id); $owner = $r->created_by === $actor->id && $actor->hasFunctions(['warehouse_request_prepare']); $review = $actor->hasFunctions(['warehouse_request_review']) && $actor->department_id !== null && $actor->department_id === $r->snapshot['requester']['department_id']; $deliver = $actor->hasFunctions(['warehouse_request_deliver']) && $actor->hasFunctions(['warehouse']); abort_unless($owner || $review || $deliver || $actor->hasFunctions(['admin', 'warehouse_request_read']), 403); $p = $service->progress($r); $maintenance = app(OrganizationAccess::class)->maintenanceOnly($actor); Inertia::encryptHistory(); $response = Inertia::render('stock/request', ['record' => $r->only(['id', 'snapshot', 'created_at']), 'progress' => $p, 'ready' => Schema::hasTable('warehouse_request_events'), 'canSubmit' => ! $maintenance && $owner && $p['state'] === 'draft', 'canReview' => ! $maintenance && $review && ! $owner && $r->created_by !== $actor->id && $p['state'] === 'submitted', 'canDeliver' => ! $maintenance && $deliver && $r->created_by !== $actor->id && $p['reviewer_id'] !== $actor->id && in_array($p['state'], ['authorized', 'partial'], true), 'canManageReservation' => ! $maintenance && $review && ! $owner && in_array($p['state'], ['authorized', 'partial'], true), 'canReceive' => ! $maintenance && $owner])->toResponse($request); $response->headers->set('Cache-Control', 'private, no-store, max-age=0'); return $response; } public function command(Request $request, int $id, WarehouseFulfilment $service): Response { $actor = $request->user('web'); abort_unless($actor instanceof User, 403); $service->command($actor, $id, $request->all()); return redirect('/stock/requisicoes/'.$id); } }