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'];
|
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([
|
$order = Order::create([
|
||||||
'user_id' => auth()->id(),
|
|
||||||
'order_number' => $orderNumber,
|
|
||||||
'customer_name' => $validated['customer_name'],
|
'customer_name' => $validated['customer_name'],
|
||||||
'cogs' => $cogs,
|
'cogs' => $cogs,
|
||||||
'subtotal' => $totalItemsPrice,
|
'subtotal' => $totalItemsPrice,
|
||||||
'discount' => $validated['discount'],
|
'discount' => $validated['discount'],
|
||||||
'payment' => $validated['payment'],
|
'payment' => $validated['payment'],
|
||||||
'total' => $totalItemsPrice - $validated['discount'],
|
|
||||||
'payment_method' => $validated['payment_method'],
|
'payment_method' => $validated['payment_method'],
|
||||||
'order_status' => $validated['order_status'],
|
'order_status' => $validated['order_status'],
|
||||||
'order_channel' => $validated['order_channel'],
|
'order_channel' => $validated['order_channel'],
|
||||||
@ -152,7 +142,6 @@ public function update(OrderRequest $request, Order $order): RedirectResponse
|
|||||||
'subtotal' => $totalItemsPrice,
|
'subtotal' => $totalItemsPrice,
|
||||||
'discount' => $validated['discount'],
|
'discount' => $validated['discount'],
|
||||||
'payment' => $validated['payment'],
|
'payment' => $validated['payment'],
|
||||||
'total' => $totalItemsPrice - $validated['discount'],
|
|
||||||
'payment_method' => $validated['payment_method'],
|
'payment_method' => $validated['payment_method'],
|
||||||
'order_status' => $validated['order_status'],
|
'order_status' => $validated['order_status'],
|
||||||
'order_channel' => $validated['order_channel'],
|
'order_channel' => $validated['order_channel'],
|
||||||
@ -188,22 +177,9 @@ public function update(OrderRequest $request, Order $order): RedirectResponse
|
|||||||
|
|
||||||
public function destroy(Order $order): RedirectResponse
|
public function destroy(Order $order): RedirectResponse
|
||||||
{
|
{
|
||||||
try {
|
$order->delete();
|
||||||
DB::transaction(function () use ($order) {
|
|
||||||
foreach ($order->items as $item) {
|
|
||||||
$item->product->increment('stock', $item->qty);
|
|
||||||
}
|
|
||||||
$order->delete();
|
|
||||||
});
|
|
||||||
|
|
||||||
return redirect()->back()->with('success', 'Pesanan berhasil dihapus');
|
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');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function bulkDestroy(Request $request): RedirectResponse
|
public function bulkDestroy(Request $request): RedirectResponse
|
||||||
@ -212,11 +188,8 @@ public function bulkDestroy(Request $request): RedirectResponse
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
DB::transaction(function () use ($ids) {
|
DB::transaction(function () use ($ids) {
|
||||||
$orders = Order::with('items')->whereIn('id', $ids)->get();
|
$orders = Order::whereIn('id', $ids)->get();
|
||||||
foreach ($orders as $order) {
|
foreach ($orders as $order) {
|
||||||
foreach ($order->items as $item) {
|
|
||||||
$item->product->increment('stock', $item->qty);
|
|
||||||
}
|
|
||||||
$order->delete();
|
$order->delete();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,8 +5,10 @@
|
|||||||
use App\Enums\OrderChannel;
|
use App\Enums\OrderChannel;
|
||||||
use App\Enums\OrderStatus;
|
use App\Enums\OrderStatus;
|
||||||
use App\Enums\PaymentMethod;
|
use App\Enums\PaymentMethod;
|
||||||
|
use App\Observers\OrderObserver;
|
||||||
use Illuminate\Database\Eloquent\Attributes\Appends;
|
use Illuminate\Database\Eloquent\Attributes\Appends;
|
||||||
use Illuminate\Database\Eloquent\Attributes\Guarded;
|
use Illuminate\Database\Eloquent\Attributes\Guarded;
|
||||||
|
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
@ -19,6 +21,7 @@
|
|||||||
|
|
||||||
#[Guarded(['id'])]
|
#[Guarded(['id'])]
|
||||||
#[Appends(['hpp_formatted', 'subtotal_formatted', 'discount_formatted', 'payment_formatted', 'total_formatted'])]
|
#[Appends(['hpp_formatted', 'subtotal_formatted', 'discount_formatted', 'payment_formatted', 'total_formatted'])]
|
||||||
|
#[ObservedBy([OrderObserver::class])]
|
||||||
class Order extends Model
|
class Order extends Model
|
||||||
{
|
{
|
||||||
use HasFactory, LogsActivity, SoftDeletes;
|
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