From 00a9eb96d094e226d8d70f94bd54b1a2623deb57 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 29 Apr 2026 21:41:28 +0700 Subject: [PATCH] refactor: move order number generation and stock management logic to OrderObserver --- .../Admin/Manage/OrderController.php | 33 ++--------------- app/Models/Order.php | 3 ++ app/Observers/OrderObserver.php | 35 +++++++++++++++++++ 3 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 app/Observers/OrderObserver.php diff --git a/app/Http/Controllers/Admin/Manage/OrderController.php b/app/Http/Controllers/Admin/Manage/OrderController.php index 7f45dab..2067cd5 100644 --- a/app/Http/Controllers/Admin/Manage/OrderController.php +++ b/app/Http/Controllers/Admin/Manage/OrderController.php @@ -57,22 +57,12 @@ public function store(OrderRequest $request): RedirectResponse return $purchasePrice * $item['qty']; }); - $lastOrder = Order::whereDate('created_at', now()->format('Y-m-d')) - ->lockForUpdate() - ->count(); - - $sequence = str_pad($lastOrder + 1, 3, '0', STR_PAD_LEFT); - $orderNumber = 'ORD-'.now()->format('Ymd').'-'.$sequence; - $order = Order::create([ - 'user_id' => auth()->id(), - 'order_number' => $orderNumber, 'customer_name' => $validated['customer_name'], 'cogs' => $cogs, 'subtotal' => $totalItemsPrice, 'discount' => $validated['discount'], 'payment' => $validated['payment'], - 'total' => $totalItemsPrice - $validated['discount'], 'payment_method' => $validated['payment_method'], 'order_status' => $validated['order_status'], 'order_channel' => $validated['order_channel'], @@ -152,7 +142,6 @@ public function update(OrderRequest $request, Order $order): RedirectResponse 'subtotal' => $totalItemsPrice, 'discount' => $validated['discount'], 'payment' => $validated['payment'], - 'total' => $totalItemsPrice - $validated['discount'], 'payment_method' => $validated['payment_method'], 'order_status' => $validated['order_status'], 'order_channel' => $validated['order_channel'], @@ -188,22 +177,9 @@ public function update(OrderRequest $request, Order $order): RedirectResponse public function destroy(Order $order): RedirectResponse { - try { - DB::transaction(function () use ($order) { - foreach ($order->items as $item) { - $item->product->increment('stock', $item->qty); - } - $order->delete(); - }); + $order->delete(); - return redirect()->back()->with('success', 'Pesanan berhasil dihapus'); - } catch (\Throwable $e) { - LogHelper::logException($e, 'Failed to delete order', [ - 'order_id' => $order->id, - ]); - - return redirect()->back()->with('error', 'Terjadi kesalahan, silakan hubungi pengembang'); - } + return redirect()->back()->with('success', 'Pesanan berhasil dihapus'); } public function bulkDestroy(Request $request): RedirectResponse @@ -212,11 +188,8 @@ public function bulkDestroy(Request $request): RedirectResponse try { DB::transaction(function () use ($ids) { - $orders = Order::with('items')->whereIn('id', $ids)->get(); + $orders = Order::whereIn('id', $ids)->get(); foreach ($orders as $order) { - foreach ($order->items as $item) { - $item->product->increment('stock', $item->qty); - } $order->delete(); } }); diff --git a/app/Models/Order.php b/app/Models/Order.php index 91e9a17..c61e079 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -5,8 +5,10 @@ use App\Enums\OrderChannel; use App\Enums\OrderStatus; use App\Enums\PaymentMethod; +use App\Observers\OrderObserver; use Illuminate\Database\Eloquent\Attributes\Appends; use Illuminate\Database\Eloquent\Attributes\Guarded; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -19,6 +21,7 @@ #[Guarded(['id'])] #[Appends(['hpp_formatted', 'subtotal_formatted', 'discount_formatted', 'payment_formatted', 'total_formatted'])] +#[ObservedBy([OrderObserver::class])] class Order extends Model { use HasFactory, LogsActivity, SoftDeletes; diff --git a/app/Observers/OrderObserver.php b/app/Observers/OrderObserver.php new file mode 100644 index 0000000..b8404df --- /dev/null +++ b/app/Observers/OrderObserver.php @@ -0,0 +1,35 @@ +format('Y-m-d')) + ->lockForUpdate() + ->count(); + + $sequence = str_pad($lastOrder + 1, 3, '0', STR_PAD_LEFT); + $order->order_number = 'ORD-'.now()->format('Ymd').'-'.$sequence; + + $order->user_id = auth()->id(); + + $order->total = $order->subtotal - $order->discount; + } + + /** + * Handle the Order "deleting" event. + */ + public function deleting(Order $order): void + { + foreach ($order->items as $item) { + $item->product->increment('stock', $item->qty); + } + } +}