render('product::products.index'); } public function create() { abort_if(Gate::denies('create_products'), 403); return view('product::products.create'); } public function store(StoreProductRequest $request) { $product = Product::create($request->except('document')); if ($request->has('document')) { foreach ($request->input('document', []) as $file) { $product->addMedia(Storage::path('temp/dropzone/' . $file))->toMediaCollection('images'); } } toast('Product Created!', 'success'); return redirect()->route('products.index'); } public function show(Product $product) { abort_if(Gate::denies('show_products'), 403); // Load relasi yang dibutuhkan $product->load([ 'category', 'batches' => function ($q) { $q->where('qty', '>', 0) ->orderBy('exp_date', 'asc'); // FIFO } ]); return view('product::products.show', compact('product')); } public function edit(Product $product) { abort_if(Gate::denies('edit_products'), 403); return view('product::products.edit', compact('product')); } public function update(UpdateProductRequest $request, Product $product) { $product->update($request->except('document')); if ($request->has('document')) { if (count($product->getMedia('images')) > 0) { foreach ($product->getMedia('images') as $media) { if (!in_array($media->file_name, $request->input('document', []))) { $media->delete(); } } } $media = $product->getMedia('images')->pluck('file_name')->toArray(); foreach ($request->input('document', []) as $file) { if (count($media) === 0 || !in_array($file, $media)) { $product->addMedia(Storage::path('temp/dropzone/' . $file))->toMediaCollection('images'); } } } toast('Product Updated!', 'info'); return redirect()->route('products.index'); } public function destroy(Product $product) { abort_if(Gate::denies('delete_products'), 403); $product->delete(); toast('Product Deleted!', 'warning'); return redirect()->route('products.index'); } }