HEX
Server: LiteSpeed
System: Linux sv4.hami.host 5.14.0-611.54.3.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 7 16:31:24 EDT 2026 x86_64
User: armgroup (1008)
PHP: 8.2.32
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open, mail, socket_create, socket_create_listen, socket_create_pair, link, dl, openlog, syslog, stream_socket_server, curl_multi_init
Upload Files
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];
    }
}