Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/wbs24.ozonapinew/lib/Api/Fbs/ |
Upload File : |
<?php namespace Wbs24\Ozonapinew\Api\Fbs; use Bitrix\Main\Loader; use Bitrix\Main\SystemException; use Wbs24\Ozonapinew\Api; class Ship extends Api { public function apiLaunch($data) { try { $result = false; $externalIdPropValue = $this->getExternalIdPropValue($data['order_id']); $shippingInfo = $this->getShippingInformation($externalIdPropValue); $needShippingInfo = [ 'marketplace_status' => $shippingInfo['status'], 'products' => $shippingInfo['products'], 'externalId' => $externalIdPropValue, 'packages' => $data['packages'], 'one_package' => $data['one_package'] ]; $exemplars = []; if (!empty($shippingInfo['product_exemplars'])) { foreach ($shippingInfo['product_exemplars']['products'] as $key => $product) { $exemplars[$product['sku']] = $product['exemplars']; } } // функционал разбития на упаковки $needShippingInfo['packages'] = $this->filterPackageNumbers($needShippingInfo['packages']); $needShippingInfo['exemplars'] = $exemplars; return $this->runStatusChangeOnTradingPlatform('awaiting_deliver', $needShippingInfo); } catch (SystemException $exception) { $this->exceptionHandler($exception); } } protected function filterPackageNumbers($packages) { // сортируем товары по возрастанию упаковок, в которых лежат эти товары $sortedPackageNumbers = $this->sortProductsByPackaging($packages['products']); $filteredPackageNumbers = $this->removeGapsBetweenPackages($sortedPackageNumbers); foreach ($packages['products'] as $packageKey => $package) { $newPackageNumber = $filteredPackageNumbers[$package['id']] ?? false; if ($newPackageNumber !== false) { $package['packageNumber'] = $newPackageNumber; $packages['products'][$packageKey] = $package; } } $lastPackageNumber = end($filteredPackageNumbers); $packages['packagesCount'] = $lastPackageNumber; return $packages; } protected function sortProductsByPackaging($products) { uasort($products, function($a, $b) { if ((int) $a['packageNumber'] == (int) $b['packageNumber']) { return 0; } return ((int) $a['packageNumber'] < (int) $b['packageNumber']) ? -1 : 1; }); $productIdsToPackageNumbers = []; foreach ($products as $package) { $productIdsToPackageNumbers[$package['id']] = (int) $package['packageNumber']; } return $productIdsToPackageNumbers; } protected function removeGapsBetweenPackages($productIdsToPackageNumbers) { $firstElement = true; foreach ($productIdsToPackageNumbers as $tempProductId => $packageNumber) { if ($firstElement) { $productIdsToPackageNumbers[$tempProductId] = 0; $oldPackageNumber = $productIdsToPackageNumbers[$tempProductId]; $oldTempProductId = $tempProductId; $firstElement = false; continue; } $newTempProductId = substr($tempProductId, -1); $newOldTempProductId = substr($oldTempProductId, -1); if ($newTempProductId == $newOldTempProductId) { $productIdsToPackageNumbers[$tempProductId] = $oldPackageNumber; } else { $productIdsToPackageNumbers[$tempProductId] = $oldPackageNumber + 1; } $oldPackageNumber = $productIdsToPackageNumbers[$tempProductId]; $oldTempProductId = $tempProductId; } return $productIdsToPackageNumbers; } protected function getExternalIdPropValue($orderId) { try { if (!Loader::IncludeModule('sale')) { throw new SystemException("Sale module isn`t installed"); } $order = \Bitrix\Sale\Order::load($orderId); $collection = $order->getPropertyCollection(); $externalIdProp = $collection->getItemByOrderPropertyId(intval($this->wrappers->Option->get($this->moduleId, 'propertyOfExternalOrderNumber'))); $externalIdPropValue = $externalIdProp ? $externalIdProp->getValue() : ''; return $externalIdPropValue; } catch (SystemException $exception) { $this->exceptionHandler($exception); } } protected function runStatusChangeOnTradingPlatform($statusChangeMarketplace, $needShippingInfo) { $requestUrl = $this->getRequestUrl('/v3/posting/fbs/ship'); $requestBody = $this->getRequestBody($needShippingInfo); $result = $this->createRequest($requestUrl, $requestBody); $message = $result['message'] ?? ''; return !empty($result['result']) ? 'success' : $message; } protected function getRequestBody($prepareInfo) { $requestBody = []; // если разделдено на несколько упаковок, новая логика if ($prepareInfo['packages']['packagesCount'] > 0) { for ($i = 0; $i <= $prepareInfo['packages']['packagesCount']; $i++) { foreach ($prepareInfo['packages']['products'] as $product) { if ($product['packageNumber'] == $i) { $exemplarInfo = $this->getExemplarsForCurrentQuantity($product['product_id'], $prepareInfo['exemplars'], $product['quantity']); $requestBody['packages'][$i]['products'][] = [ 'exemplar_info' => $exemplarInfo, 'product_id' => $product['product_id'], 'quantity' => $product['quantity'], ]; } } } } else { // Старая логика осталась не измененной $packageCount = 0; foreach ($prepareInfo['products'] as $id => $product) { $exemplarInfo = $this->getExemplars($product['sku'], $prepareInfo['exemplars']); $requestBody['packages'][$packageCount]['products'][] = [ 'exemplar_info' => $exemplarInfo, 'product_id' => $product['sku'], 'quantity' => $product['quantity'], ]; } } $requestBody['posting_number'] = $prepareInfo['externalId']; return $requestBody; } protected function getExemplars($productSku, $exemplars) { if (!empty($exemplars[$productSku])) { $result = $exemplars[$productSku]; } return $result ?? [ [ "is_gtd_absent" => true, ], ]; } protected function getExemplarsForCurrentQuantity($productSku, $exemplars, $quantity) { if (!empty($exemplars[$productSku])) { $result = $exemplars[$productSku][0]; } $currentExemplarInfo = []; for ($i = 0; $i < $quantity; $i++) { $currentExemplarInfo[] = $result; } return $currentExemplarInfo ?? [ [ "is_gtd_absent" => true, ], ]; } public function processAction($data) { $result = $data['result']; if ($data['result'] == 'success') { $this->OrdersState->setSuccessShip($data['external_id']); } return ['result' => $result]; } }