55 lines
1.3 KiB
PHP
55 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Observers;
|
|
|
|
use App\Enums\OrderStatus;
|
|
use App\Models\Order;
|
|
|
|
class OrderObserver
|
|
{
|
|
/**
|
|
* Handle the Order "creating" event.
|
|
*/
|
|
public function creating(Order $order): void
|
|
{
|
|
$date = $order->created_at ?? now();
|
|
|
|
$lastOrder = Order::whereDate('created_at', $date->format('Y-m-d'))
|
|
->lockForUpdate()
|
|
->count();
|
|
|
|
$sequence = str_pad($lastOrder + 1, 3, '0', STR_PAD_LEFT);
|
|
$order->order_number = 'ORD-'.$date->format('Ymd').'-'.$sequence;
|
|
|
|
if (! $order->user_id) {
|
|
$order->user_id = auth()->id();
|
|
}
|
|
|
|
$order->total = $order->subtotal - $order->discount;
|
|
}
|
|
|
|
/**
|
|
* Handle the Order "updating" event.
|
|
*/
|
|
public function updating(Order $order): void
|
|
{
|
|
$order->total = $order->subtotal - $order->discount;
|
|
}
|
|
|
|
/**
|
|
* Handle the Order "deleting" event.
|
|
*/
|
|
public function deleting(Order $order): void
|
|
{
|
|
$isCancelled = ($order->order_status instanceof OrderStatus ? $order->order_status->value : $order->order_status) === OrderStatus::CANCELLED->value;
|
|
|
|
if (! $isCancelled) {
|
|
foreach ($order->items as $item) {
|
|
$item->product->increment('stock', $item->qty);
|
|
}
|
|
}
|
|
|
|
$order->items()->delete();
|
|
}
|
|
}
|