119 lines
3.5 KiB
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');
|
|
}
|
|
}
|