dress/app/Http/Controllers/Admin/Manage/PurchaseController.php

186 lines
6.6 KiB
PHP

<?php
namespace App\Http\Controllers\Admin\Manage;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Manage\Purchase\PurchaseRequest;
use App\Models\Product;
use App\Models\Purchase;
use App\Models\PurchaseItem;
use App\Support\LogHelper;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
use Inertia\Response;
class PurchaseController extends Controller
{
public function index(): Response
{
return Inertia::render('admin/manage/purchase/index', [
'purchases' => Purchase::with(['items.product'])->latest()->get(),
]);
}
public function create(): Response
{
return Inertia::render('admin/manage/purchase/create', [
'products' => Product::with(['prices', 'categories'])->active()->get(),
'cartItems' => PurchaseItem::with(['product.prices', 'product.categories'])
->where('user_id', auth()->id())
->whereNull('purchase_id')
->latest()
->get(),
]);
}
public function store(PurchaseRequest $request): RedirectResponse
{
$validated = $request->validated();
try {
DB::transaction(function () use ($validated) {
$total = collect($validated['items'])->sum(fn ($item) => $item['quantity'] * $item['unit_price']);
$purchase = Purchase::create([
'purchase_date' => $validated['purchase_date'],
'note' => $validated['note'],
'total' => $total,
]);
foreach ($validated['items'] as $item) {
PurchaseItem::create([
'user_id' => auth()->id(),
'purchase_id' => $purchase->id,
'product_id' => $item['product_id'],
'quantity' => $item['quantity'],
'unit_price' => $item['unit_price'],
'total_price' => $item['quantity'] * $item['unit_price'],
]);
Product::find($item['product_id'])->increment('stock', $item['quantity']);
}
PurchaseItem::where('user_id', auth()->id())
->whereNull('purchase_id')
->delete();
});
return redirect()->route('purchase.index')->with('success', 'Data berhasil disimpan');
} catch (\Throwable $e) {
LogHelper::logException($e, 'Failed to store purchase', [
'purchase_date' => $validated['purchase_date'] ?? null,
'items_count' => count($validated['items'] ?? []),
]);
return redirect()
->back()
->withInput()
->with('error', 'Terjadi kesalahan saat menyimpan pembelian');
}
}
public function edit(Purchase $purchase): Response
{
$purchase->load(['items.product']);
return Inertia::render('admin/manage/purchase/edit', [
'purchase' => $purchase,
'products' => Product::with(['prices', 'categories'])->active()->get(),
]);
}
public function update(PurchaseRequest $request, Purchase $purchase): RedirectResponse
{
$validated = $request->validated();
try {
DB::transaction(function () use ($validated, $purchase) {
$total = collect($validated['items'])->sum(fn ($item) => $item['quantity'] * $item['unit_price']);
$purchase->update([
'purchase_date' => $validated['purchase_date'],
'note' => $validated['note'],
'total' => $total,
]);
foreach ($purchase->items as $item) {
$item->product->decrement('stock', $item->quantity);
}
$purchase->items()->delete();
foreach ($validated['items'] as $item) {
$purchase->items()->create([
'user_id' => auth()->id(),
'product_id' => $item['product_id'],
'quantity' => $item['quantity'],
'unit_price' => $item['unit_price'],
'total_price' => $item['quantity'] * $item['unit_price'],
]);
Product::find($item['product_id'])->increment('stock', $item['quantity']);
}
});
return redirect()->route('purchase.index')->with('success', 'Data berhasil diperbarui');
} catch (\Throwable $e) {
LogHelper::logException($e, 'Failed to update purchase', [
'purchase_id' => $purchase->id,
'items_count' => count($validated['items'] ?? []),
]);
return redirect()
->back()
->withInput()
->with('error', 'Terjadi kesalahan saat memperbarui pembelian');
}
}
public function destroy(Purchase $purchase): RedirectResponse
{
try {
DB::transaction(function () use ($purchase) {
foreach ($purchase->items as $item) {
$item->product->decrement('stock', $item->quantity);
}
$purchase->delete();
});
return redirect()->back()->with('success', 'Data berhasil dihapus');
} catch (\Throwable $e) {
LogHelper::logException($e, 'Failed to delete purchase', [
'purchase_id' => $purchase->id,
]);
return redirect()->back()->with('error', 'Terjadi kesalahan saat menghapus pembelian');
}
}
public function bulkDestroy(Request $request): RedirectResponse
{
$ids = $request->input('ids');
try {
DB::transaction(function () use ($ids) {
$purchases = Purchase::with('items')->whereIn('id', $ids)->get();
foreach ($purchases as $purchase) {
foreach ($purchase->items as $item) {
$item->product->decrement('stock', $item->quantity);
}
$purchase->delete();
}
});
return redirect()->back()->with('success', 'Data terpilih berhasil dihapus');
} catch (\Throwable $e) {
LogHelper::logException($e, 'Failed to bulk delete purchases', [
'ids' => $ids,
]);
return redirect()->back()->with('error', 'Terjadi kesalahan saat menghapus beberapa pembelian');
}
}
}