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/yandex.market/lib/catalog/endpoint/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/yandex.market/lib/catalog/endpoint/offer.php
<?php
namespace Yandex\Market\Catalog\Endpoint;

use Yandex\Market\Api;
use Yandex\Market\Api\Reference\Auth;
use Yandex\Market\Config;
use Yandex\Market\Error;
use Yandex\Market\Catalog;
use Yandex\Market\Logger\Trading\Audit;
use Yandex\Market\Reference\Concerns;
use Yandex\Market\Result;
use Yandex\Market\Psr\Log\LoggerInterface;

class Offer implements Driver
{
	use Concerns\HasMessage;

	private $businessId;

	public function __construct($businessId)
	{
		$this->businessId = (int)$businessId;
	}

	public function type()
	{
		return Catalog\Glossary::ENDPOINT_OFFER;
	}

	public function campaignId()
	{
		return 0;
	}

	public function audit()
	{
		return Audit::CATALOG_OFFER;
	}

	public function priority($placementStatus, array $prepared, array $submitted = null)
	{
        if (!PriorityDictionary::wasPublished($placementStatus))
        {
            return PriorityDictionary::OFFER_NEW;
        }

		return PriorityDictionary::OFFER_PUBLISHED;
	}

	public function limit()
	{
		return max(1, Config::getOption('catalog_endpoint_offer_limit', 50)); // todo The request is too big
	}

	public function submit(array $payloadBag, Auth $auth, LoggerInterface $logger)
	{
        list($offers, $root) = $this->compileOfferMappings($payloadBag);

		$skus = array_keys($payloadBag);
		$submitResults = array_combine($skus, array_map(static function() { return new Result\Base(); }, $skus));

		$request = new Api\Business\OfferMappings\Update\Request($this->businessId, $auth, $logger);
		$request->setOfferMappings($offers);
        $this->passRequestRoot($request, $root);

		$response = $request->execute();

		$errorOfferIds = $this->fillResponseResult($submitResults, $response->getResults());
		$repeatOffers = $this->sliceErrorOffers($offers, $errorOfferIds);

		if (!empty($repeatOffers))
		{
			$request->setOfferMappings($repeatOffers);
			$response = $request->execute();

			$this->fillResponseResult($submitResults, $response->getResults());
		}

        $this->fillSubmitData($submitResults, $payloadBag, $logger);

		return $submitResults;
	}

    private function passRequestRoot(Api\Business\OfferMappings\Update\Request $request, array $root = null)
    {
        if (isset($root['onlyPartnerMediaContent']))
        {
            $request->setOnlyPartnerMediaContent($root['onlyPartnerMediaContent']);
        }
    }

	private function compileOfferMappings(array $bag)
	{
		$offers = [];
        $root = null;

		foreach ($bag as $sku => $data)
		{
            list($offer, $mapping, $root) = $this->splitData($data);

            $payload = [
                'offer' => [ 'offerId' => (string)$sku ] + $this->sanitize($offer),
            ];

            if (!empty($mapping))
            {
                $payload['mapping'] = $mapping;
            }

			$offers[] = $payload;
		}

		return [$offers, $root];
	}

    private function splitData(array $data)
    {
        $root = array_intersect_key($data, [
            'onlyPartnerMediaContent' => true,
        ]);
        $mapping = array_intersect_key($data, [
            'marketSku' => true,
        ]);
        $offer = array_diff_key($data, $root, $mapping);

        return [ $offer, $mapping, $root ];
    }

    private function sanitize(array $data)
    {
        $data = $this->sanitizePrices($data);
        $data = $this->sanitizeDiscount($data);
        $data = $this->sanitizeCurrency($data);

        return $data;
    }

    private function sanitizePrices(array $data)
    {
        $keys = [ 'basicPrice', 'purchasePrice', 'additionalExpenses', 'cofinancePrice' ];

        foreach ($keys as $key)
        {
            if (!isset($data[$key])) { continue; }

            $data[$key] = [
                'value' => $data[$key],
                'currencyId' => $data['currencyId'],
            ];
        }

        return $data;
    }

    private function sanitizeDiscount(array $data)
    {
        if (!isset($data['discountBase'])) { return $data; }

        if (isset($data['basicPrice']))
        {
            $data['basicPrice']['discountBase'] = $data['discountBase'];
        }

        unset($data['discountBase']);

        return $data;
    }

    private function sanitizeCurrency(array $data)
    {
        if (isset($data['currencyId']))
        {
            unset($data['currencyId']);
        }

        return $data;
    }

	private function sliceErrorOffers(array $offers, array $errorOfferIds)
	{
		if (empty($errorOfferIds)) { return null; }

		$errorOfferMap = array_flip($errorOfferIds);

		return array_values(array_filter($offers, static function(array $offer) use ($errorOfferMap) {
			return !isset($errorOfferMap[$offer['offer']['offerId']]);
		}));
	}

	private function fillResponseResult(array $submitResults, Api\Business\OfferMappings\Update\OfferResultCollection $responseResults)
	{
		$errorOfferIds = [];

		/** @var Api\Business\OfferMappings\Update\OfferResult $responseResult */
		foreach ($responseResults as $responseResult)
		{
			$offerId = $responseResult->getOfferId();

			if (!isset($submitResults[$offerId])) { continue; }

			/** @var Result\Base $submitResult */
			$submitResult = $submitResults[$offerId];

			/** @var Api\Business\OfferMappings\Update\OfferError $error */
			foreach ($responseResult->getErrors() as $error)
			{
				$errorOfferIds[$offerId] = $offerId;
				$submitResult->addError(new Error\Base($error->errorMessage()));
			}

			if ($submitResult->hasWarnings()) { continue; }

			/** @var Api\Business\OfferMappings\Update\OfferError $error */
			foreach ($responseResult->getWarnings() as $error)
			{
				$submitResult->addWarning(new Error\Base($error->errorMessage()));
			}
		}

		return array_values($errorOfferIds);
	}

	private function fillSubmitData(array $submitResults, array $payloadBag, LoggerInterface $logger)
    {
        /** @var Result\Base $submitResult */
        foreach ($submitResults as $sku => $submitResult)
        {
            if (!$submitResult->isSuccess()) { continue; }

            $payload = $payloadBag[$sku];

            $data = [
                'ASSORTMENT' => [
                    'STATUS' => Catalog\Run\Storage\AssortmentTable::STATUS_PLACED,
                ],
            ];

            if (isset($payload['marketCategoryId']))
            {
                $data['ASSORTMENT']['CATEGORY_ID'] = (int)$payload['marketCategoryId'];
            }

			$logger->info(self::getMessage('SUBMITTED', [
				'#KEYS#' => $this->submittedLogMessage($payloadBag[$sku]),
			]), [
				'ENTITY_TYPE' => Catalog\Glossary::ENTITY_SKU,
				'ENTITY_ID' => $sku,
			]);

            $submitResult->setData($data);
        }
    }

	private function submittedLogMessage(array $payload)
	{
		$partials = [];

		foreach ($payload as $key => $value)
		{
			if ($key === 'currencyId') { continue; }

			$partials[] = $key . (is_array($value) ? sprintf(" (%s)", count($value)) : '');
		}

		return implode(', ', $partials);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit