dress/app/Http/Controllers/Admin/Master/ProductController.php

119 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers\Admin\Master;
use App\Enums\PriceType;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Master\ProductRequest;
use App\Models\Category;
use App\Models\Product;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
use Inertia\Response;
class ProductController extends Controller
{
public function index(): Response
{
return Inertia::render('admin/master/product/index', [
'products' => Product::with(['prices', 'categories'])->latest()->get(),
]);
}
public function create(): Response
{
return Inertia::render('admin/master/product/create', [
'categories' => Category::active()->get(),
]);
}
public function store(ProductRequest $request): RedirectResponse
{
$validated = $request->validated();
DB::transaction(function () use ($validated) {
$product = Product::create([
'name' => $validated['name'],
'description' => $validated['description'],
]);
$product->categories()->sync($validated['category_ids'] ?? []);
foreach ($validated['prices'] as $type => $price) {
$enumType = PriceType::tryFrom($type);
if ($enumType) {
$product->prices()->create([
'price_type' => $enumType,
'price' => $price,
]);
}
}
});
return redirect()->route('product.index')->with('success', 'Data berhasil disimpan');
}
public function edit(Product $product): Response
{
$product->load(['prices', 'categories']);
return Inertia::render('admin/master/product/edit', [
'product' => $product,
'categories' => Category::active()->get(),
]);
}
public function update(ProductRequest $request, Product $product): RedirectResponse
{
$validated = $request->validated();
DB::transaction(function () use ($product, $validated) {
$product->update([
'name' => $validated['name'],
'description' => $validated['description'],
]);
$product->categories()->sync($validated['category_ids'] ?? []);
foreach ($validated['prices'] as $type => $price) {
$enumType = PriceType::tryFrom($type);
if ($enumType) {
$product->prices()->updateOrCreate(
['price_type' => $enumType],
['price' => $price]
);
}
}
});
return redirect()->route('product.index')->with('success', 'Data berhasil diperbarui');
}
public function destroy(Product $product): RedirectResponse
{
$product->delete();
return redirect()->back()->with('success', 'Data berhasil dihapus');
}
public function bulkDestroy(Request $request): RedirectResponse
{
$ids = $request->input('ids');
Product::whereIn('id', $ids)->delete();
return redirect()->back()->with('success', 'Data terpilih berhasil dihapus');
}
public function toggleStatus(Product $product): RedirectResponse
{
$product->update([
'is_active' => ! $product->is_active,
]);
return redirect()->back()->with('success', 'Status berhasil diperbarui');
}
}