File: /home/armgroup/libs/app/Http/Livewire/Admin/Order/Status.php
<?php
namespace App\Http\Livewire\Admin\Order;
use App\Enums\OrderStatus;
use App\Events\IncreaseOrderProductsStock;
use App\Events\ReduceOrderProductsStock;
use App\Http\Livewire\ConvertEmptyStringsToNull;
use App\Http\Livewire\General;
use App\Models\Order;
use App\Notifications\OrderSent;
use Illuminate\Support\Facades\DB;
use Livewire\Component;
class Status extends Component
{
use ConvertEmptyStringsToNull, General;
public Order $order;
public $status;
public function mount()
{
$this->status = $this->order->status->value;
}
public function render()
{
return view('livewire.admin.order.status');
}
public function updatingStatus($value)
{
$this->order->status = $value;
if (! in_array($value, OrderStatus::getValues())) {
$this->ajaxDoneMessage('وضعیت انتخاب شده نامعتبر است', 'error');
} elseif ($this->order->isDirty('status')) {
DB::transaction(function () use ($value) {
$originalStatus = $this->order->getOriginal('status')->value;
if ($this->checkStockChange($value, $originalStatus)) {
IncreaseOrderProductsStock::dispatch($this->order);
} elseif ($this->checkStockChange($originalStatus, $value)) {
ReduceOrderProductsStock::dispatch($this->order);
}
if ($value == OrderStatus::SENT) {
$this->order->user?->notify(new OrderSent($this->order));
}
if ($value == OrderStatus::COMPLETED) {
$this->order->changeCustomerPoints();
} elseif ($originalStatus == OrderStatus::COMPLETED) {
$this->order->changeCustomerPoints(false);
}
$this->order->save();
saveActivity("وضعیت سفارش {$this->order->tracking_code} ویرایش شد", $this->order);
});
$this->ajaxDoneMessage('وضعیت سفارش با موفقیت تغییر کرد');
} else {
$this->ajaxDoneMessage('وضعیت سفارش تغییری نکرد!', 'info');
}
}
private function checkStockChange(int $status1, int $status2): bool
{
return in_array($status1, $this->getNegativeStatuses()) && in_array($status2, $this->getPositiveStatuses());
}
private function getNegativeStatuses(): array
{
return [OrderStatus::CANCELED, OrderStatus::RETURNED];
}
private function getPositiveStatuses(): array
{
return [OrderStatus::PROCESSING, OrderStatus::SENT, OrderStatus::COMPLETED];
}
}