user()->hasFunctions(['admin', 'warehouse']), 403); $filter = $request->validate(['search' => 'nullable|string|max:100']); $ready = Schema::hasTable('requisition_catalogue'); $query = StockItem::query()->where('tenant_id', $request->user()->tenant_id); if (($filter['search'] ?? '') !== '') { $query->where(fn ($q) => $q->whereLike('name', '%'.$filter['search'].'%')->orWhereLike('code', '%'.$filter['search'].'%')); } $records = $query->orderBy('code')->paginate(15)->withQueryString(); $entries = $ready ? DB::table('requisition_catalogue')->where('tenant_id', $request->user()->tenant_id)->whereIn('stock_item_id', $records->pluck('id'))->get()->keyBy('stock_item_id') : collect(); $records->through(function (StockItem $stock) use ($entries, $catalogue) { $entry = $entries->get($stock->id); return [...$catalogue->source($stock), 'stock_basis' => $catalogue->basis($stock), 'version' => $entry->version ?? 0, 'category' => $entry->category ?? '', 'purchase_type' => $entry->purchase_type ?? 'consumable', 'published' => (bool) ($entry->published ?? false), 'source_current' => $entry === null || json_decode($entry->source_snapshot, true, 16, JSON_THROW_ON_ERROR) === $catalogue->source($stock)]; }); Inertia::encryptHistory(); $response = Inertia::render('stock/catalogue', ['records' => $records, 'ready' => $ready, 'canManage' => $catalogue->canManage($request->user()), 'filters' => $filter])->toResponse($request); $response->headers->set('Cache-Control', 'private, no-store, max-age=0'); return $response; } public function save(Request $request, int $stock, RequisitionCatalogue $catalogue): Response { abort_unless(Schema::hasTable('requisition_catalogue'), 503, 'Instalação do catálogo pendente.'); $catalogue->save($request->user(), $stock, $request->all()); return back(); } }