parseDataTableQuery($request); $isActive = $request->string('is_active')->toString(); $categoryId = $request->string('category_id')->toString(); $status = $request->string('status')->toString(); return Inertia::render('admin/master/products/Index', [ 'products' => $this->productService->paginateForIndex($tableQuery, $isActive, $categoryId, $status), 'outOfStockGroups' => $this->productService->outOfStockGroups(), 'stockWarningGroups' => $this->productService->stockWarningGroups(), 'categories' => $this->productService->categoryOptions(), 'filters' => $this->dataTableFilters($tableQuery, [ 'is_active' => $isActive, 'category_id' => $categoryId, 'status' => $status, ]), ]); } public function create(): Response { return Inertia::render('admin/master/products/Create', [ 'categories' => $this->productService->categoryOptions(), ]); } public function store(ProductRequest $request): RedirectResponse { $this->productService->create($request->validated(), $request->user()); $message = $request->user()?->can(Permission::PRODUCTS_VERIFY->value) ? null : 'Pengajuan produk berhasil dikirim dan menunggu persetujuan owner.'; if ($message) { $this->flashSuccess($message); } else { $this->flashCreated('Produk'); } return redirect()->route('admin.master.products.index'); } public function edit(Product $product): Response { $product->load([ 'categories', 'variants' => fn ($query) => $query ->with('media') ->orderBy('created_at'), ]); $product->variants->each(function (ProductVariant $variant): void { $variant->setAttribute('images', MediaPresenter::collection($variant, 'images')); }); return Inertia::render('admin/master/products/Edit', [ 'categories' => $this->productService->categoryOptions(), 'product' => $product, ]); } public function update(ProductRequest $request, Product $product): RedirectResponse { $this->productService->update($product, $request->validated(), $request->user()); $message = $request->user()?->can(Permission::PRODUCTS_VERIFY->value) ? null : 'Pengajuan perubahan produk berhasil dikirim dan menunggu persetujuan owner.'; if ($message) { $this->flashSuccess($message); } else { $this->flashUpdated('Produk'); } return redirect()->route('admin.master.products.index'); } public function toggleStatus(Request $request, Product $product): RedirectResponse { $validated = $request->validate([ 'is_active' => ['required', 'boolean'], ]); $this->productService->toggleStatus($product, $validated['is_active'], $request->user()); $this->flashStatusUpdated('produk'); return back(); } public function destroy(Product $product): RedirectResponse { $user = auth()->user(); if ($user?->can(Permission::PRODUCTS_VERIFY->value)) { $this->productService->delete($product, $user); $this->flashDeleted('Produk'); return redirect()->route('admin.master.products.index'); } $wasDeleteRequest = $product->status === ProductStatus::APPROVED; $this->productService->delete($product, $user); if ($wasDeleteRequest) { $this->flashSuccess('Pengajuan penghapusan produk berhasil dikirim dan menunggu persetujuan owner.'); } else { $this->flashDeleted('Produk'); } return redirect()->route('admin.master.products.index'); } public function approve(Product $product): RedirectResponse { $user = auth()->user(); if ($user && ! $user->hasAnyRole(['owner', 'developer'])) { abort(403); } $this->productService->approve($product, $user); $this->flashSuccess('Produk berhasil disetujui.'); return redirect()->route('admin.master.products.index'); } public function reject(RejectProductRequest $request, Product $product): RedirectResponse { $user = auth()->user(); if ($user && ! $user->hasAnyRole(['owner', 'developer'])) { abort(403); } $this->productService->reject( $product, $request->validated('reason'), $user, ); $this->flashSuccess('Produk berhasil ditolak.'); return redirect()->route('admin.master.products.index'); } }