<?php
namespace App\Jobs\Order;
use App\Http\Controllers\OrderController;
use App\Models\Mediator;
use App\Presets\OrderPreset;
use App\Services\Bitrix24\Bitrix24Service;
use App\Services\IfNeededToUpdateOrderCheckService;
use App\Services\MoiSklad\MoiSkladService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class UpdateOrderJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3;
/** @var OrderPreset */
private $orderPreset;
/** @var int */
private $serviceNumber;
/** @var MoiSkladService */
private $moiskladService;
/** @var Bitrix24Service */
private $bx24Service;
/** @var bool */
private $isNeedToCreate = false;
/** @var bool */
private $isNeedToUpdate = true;
/** @var bool */
private $orderWasCreated = false;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(OrderPreset $orderPreset, int $serviceNumber)
{
$this->onQueue('creating_and_updating');
$this->orderPreset = $orderPreset;
$this->serviceNumber = $serviceNumber;
}
/**
* Execute the job.
*
* @return void
* @throws \Exception
*/
public function handle()
{
$this->initializeServices();
Log::info('UpdateOrderJob@handle [$this->orderPreset]: ', $this->orderPreset->toArray());
// Получаем сделку или заказ и системы БТР или МС
if ($this->serviceNumber === Mediator::BITRIX_24) {
$dealInfoRequest = $this->bx24Service->getFormattedDealInfo($this->orderPreset->getBitrixId());
if ($dealInfoRequest['status'] === false) {
return;
}
/** @var OrderPreset $orderPreset */
$orderPreset = $dealInfoRequest['data'];
} elseif ($this->serviceNumber === Mediator::MOI_SKLAD) {
$dealInfoRequest = $this->moiskladService->getFormattedDealInfo(
'https://online.moysklad.ru/api/remap/1.2/entity/customerorder/' . $this->orderPreset->getMoiskladId()
);
if ($dealInfoRequest['status'] === false) {
return;
}
/** @var OrderPreset $orderPreset */
$orderPreset = $dealInfoRequest['data'];
} else {
Log::error('UpdateOrderJob@handle | Such Service ' . "[$this->serviceNumber]" . ' is not existed!');
return;
}
// Получаем сделку\заказ из нашйе базы
$getOrderRequest = (new OrderController())->get($orderPreset, true);
if ($getOrderRequest['status'] === false) {
$this->isNeedToCreate = true;
$this->isNeedToUpdate = false;
}
if ($this->isNeedToUpdate) {
/** @var OrderPreset $oldOrderPreset */
$oldOrderPreset = $getOrderRequest['data']['old_order_preset'];
/** @var OrderPreset $orderPreset */
$orderPreset = $getOrderRequest['data']['order_preset'];
Log::info('MediatorService@handleUpdatedOrderInService [$oldOrderPreset]: ', $oldOrderPreset->toArray());
$isNeededToUpdate = (new IfNeededToUpdateOrderCheckService($orderPreset, $oldOrderPreset))->check();
Log::info('MediatorService@handleUpdatedOrderInService [BitrixId] - ' . "[{$orderPreset->getBitrixId()}]" . ' | [$isNeededToUpdate]: ' . "[$isNeededToUpdate]");
if ( ! $isNeededToUpdate) {
return; // Не нужно и не создавать и не обновлять.
}
}
if ($this->serviceNumber === Mediator::BITRIX_24) {
if ($this->isNeedToCreate) {
$createOrderInMoiSkladRequest = $this->moiskladService->createOrder($orderPreset);
if ($createOrderInMoiSkladRequest['status'] === false) {
return;
}
$orderPreset = $createOrderInMoiSkladRequest['data'];
$this->orderWasCreated = true;
} else {
$updateOrderInMoiSkladRequest = $this->moiskladService->updateOrder($orderPreset);
if ($updateOrderInMoiSkladRequest['status'] === false) {
return;
}
$orderPreset = $updateOrderInMoiSkladRequest['data'];
}
} elseif ($this->serviceNumber === Mediator::MOI_SKLAD) {
if ($this->isNeedToCreate) {
$createOrderInBitrix24Request = $this->bx24Service->createOrder($orderPreset);
if ($createOrderInBitrix24Request['status'] === false) {
return;
}
$orderPreset = $createOrderInBitrix24Request['data'];
$this->orderWasCreated = true;
} else {
$updateOrderInBitrix24Request = $this->bx24Service->updateOrder($orderPreset);
if ($updateOrderInBitrix24Request['status'] === false) {
return;
}
$orderPreset = $updateOrderInBitrix24Request['data'];
}
} else {
Log::error('UpdateOrderJob@handle | Such Service ' . "[$this->serviceNumber]" . ' is not existed!');
return;
}
if ($this->orderWasCreated) {
(new OrderController())->create($orderPreset);
} else {
(new OrderController())->update($orderPreset);
}
}
private function initializeServices()
{
$moiskladService = new MoiSkladService();
$this->moiskladService = $moiskladService;
$bx24Service = new Bitrix24Service();
$this->bx24Service = $bx24Service;
}
}