refactor: move order number generation and stock management logic to OrderObserver

This commit is contained in:
Yoga Pangestu 2026-04-29 21:41:28 +07:00
parent 2793abd8ed
commit 00a9eb96d0
3 changed files with 41 additions and 30 deletions

View File

@ -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();
}
});

View File

@ -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;

View File

@ -0,0 +1,35 @@
<?php
namespace App\Observers;
use App\Models\Order;
class OrderObserver
{
/**
* Handle the Order "creating" event.
*/
public function creating(Order $order): void
{
$lastOrder = Order::whereDate('created_at', now()->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);
}
}
}