refactor: move order number generation and stock management logic to OrderObserver
This commit is contained in:
parent
2793abd8ed
commit
00a9eb96d0
@ -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();
|
||||
}
|
||||
});
|
||||
|
||||
@ -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;
|
||||
|
||||
35
app/Observers/OrderObserver.php
Normal file
35
app/Observers/OrderObserver.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user