%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 3.12.74.189
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/components/bitrix/sale.order.checkout/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/components/bitrix/sale.order.checkout//ajax.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Main;
use Bitrix\Sale;
use BItrix\Catalog;
use Bitrix\Rest;

Main\Localization\Loc::loadMessages(__DIR__ . '/class.php');

/**
 * Class SaleOrderCheckoutAjaxController
 */
class SaleOrderCheckoutAjaxController extends Main\Engine\Controller
{
	private $params;
	private $actionName;
	private $config;

	protected function processBeforeAction(Main\Engine\Action $action)
	{
		if (!Main\Loader::includeModule('sale'))
		{
			$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_MODULE_SALE_NOT_INSTALLED')));
			return false;
		}

		if (!Main\Loader::includeModule('iblock'))
		{
			$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_MODULE_IBLOCK_NOT_INSTALLED')));
			return false;
		}

		if (!Main\Loader::includeModule('catalog'))
		{
			$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_MODULE_CATALOG_NOT_INSTALLED')));
			return false;
		}

		$this->params = $this->getUnsignedParameters();
		$this->actionName = $action->getName();
		$this->config = $action->getConfig() ?? [];

		$arguments = $action->getArguments();

		// convert keys
		$converter = new Main\Engine\Response\Converter(
			Main\Engine\Response\Converter::KEYS
			| Main\Engine\Response\Converter::RECURSIVE
			| Main\Engine\Response\Converter::TO_SNAKE
			| Main\Engine\Response\Converter::TO_SNAKE_DIGIT
			| Main\Engine\Response\Converter::TO_UPPER
		);
		$arguments = $converter->process($arguments);

		$action->setArguments($arguments);

		return parent::processBeforeAction($action);
	}

	protected function processAfterAction(Main\Engine\Action $action, $result)
	{
		if (is_array($result) && empty($this->getErrors()))
		{
			$result = self::prepareJsonData($result);

			if (Main\Loader::includeModule('rest'))
			{
				$result = Rest\Integration\Externalizer::multiSortKeysArray($result);
			}
		}

		return $result;
	}

	private static function prepareJsonData(array $result): array
	{
		if (!empty($result['BASKET_ITEMS']))
		{
			$basketItems = $result['BASKET_ITEMS'];

			$sku = [];
			foreach ($basketItems as $index => $item)
			{
				if (empty($item['CATALOG_PRODUCT']['SKU']))
				{
					$sku[$index] = [];
				}
				else
				{
					$sku[$index]['tree'] = $item['CATALOG_PRODUCT']['SKU']['TREE'];
					$sku[$index]['parentProductId'] = $item['CATALOG_PRODUCT']['SKU']['PARENT_PRODUCT_ID'];
				}

				unset($basketItems[$index]['CATALOG_PRODUCT']['SKU']);
			}

			$result['BASKET_ITEMS'] = $basketItems;
		}

		$result = Main\Engine\Response\Converter::toJson()->process($result);

		if (!empty($result['basketItems']) && isset($sku))
		{
			$basketItems = $result['basketItems'];
			foreach ($basketItems as $index => $item)
			{
				$basketItems[$index]['catalogProduct']['sku'] = $sku[$index];
			}

			$result['basketItems'] = $basketItems;
		}

		return $result;
	}

	public function configureActions()
	{
		return [
			'addbasketitem' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'deleteBasketItem' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'updateBasketItem' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'paymentPay' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'userConsentRequest' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'getBasket' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'saveOrder' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
			'recalculateBasket' => [
				'-prefilters' => [
					Main\Engine\ActionFilter\Authentication::class,
				],
			],
		];
	}

	private function fillBasketItems(array $basketItems): array
	{
		$urlPathToDetailProduct = $this->params['URL_PATH_TO_DETAIL_PRODUCT'] ?? '';
		if ($urlPathToDetailProduct)
		{
			$basketItems = $this->setDetailPageUrlForBasketItems($basketItems, $urlPathToDetailProduct);
		}

		return $basketItems;
	}

	private function setDetailPageUrlForBasketItems(array $basketItems, string $pathToDetailProductUrl): array
	{
		$repositoryFacade = Catalog\v2\IoC\ServiceContainer::getRepositoryFacade();
		$repositoryFacade->setDetailUrlTemplate($pathToDetailProductUrl);

		foreach ($basketItems as $item => $basketItem)
		{
			$product = $repositoryFacade->loadVariation($basketItem['PRODUCT_ID']);
			if ($product)
			{
				/** @var Catalog\v2\Product\Product $parent */
				$parent = $product->getParent();
				$basketItems[$item]['DETAIL_PAGE_URL'] = $parent->getDetailUrl();
			}
		}

		return $basketItems;
	}

	private function fillOrderProperties(array $properties): array
	{
		foreach ($properties as $id => $property)
		{
			if ($property['IS_PAYER'] === 'Y')
			{
				$properties[$id]['TYPE'] = 'NAME';
			}
			elseif ($property['IS_PHONE'] === 'Y')
			{
				$properties[$id]['TYPE'] = 'PHONE';
			}
			elseif ($property['IS_EMAIL'] === 'Y')
			{
				$properties[$id]['TYPE'] = 'EMAIL';
			}
		}

		return $properties;
	}

	/**
	 * @deprecated
	 * @see \SaleOrderCheckoutAjaxController::recalculateBasketAction
	 *
	 * @param array $fields
	 * @return array|null
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'addBasketItem', { mode: 'ajax', data: { fields: { ... }}});
	 */
	public function addBasketItemAction(array $fields): ?array
	{
		$action = new Sale\Controller\Action\Entity\AddBasketItemAction($this->actionName, $this, $this->config);

		$fields['FUSER_ID'] = Sale\Fuser::getId();

		$result = $action->run($fields);

		$errors = $action->getErrors();
		if ($errors)
		{
			$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_ADD_BASKET_ITEM')));
			return null;
		}

		$basketItems = [$result];
		$result = $this->fillBasketItems($basketItems);

		return $result[0];
	}

	/**
	 * @deprecated
	 * @see \SaleOrderCheckoutAjaxController::recalculateBasketAction
	 *
	 * @param int $id
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'deleteBasketItem', { mode: 'ajax', data: { id: ""}});
	 */
	public function deleteBasketItemAction(int $id)
	{
		$action = new Sale\Controller\Action\Entity\DeleteBasketItemAction($this->actionName, $this, $this->config);
		$action->run($id);

		$errors = $action->getErrors();
		if ($errors)
		{
			$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_DELETE_BASKET_ITEM')));
		}
	}

	/**
	 * @deprecated
	 * @see \SaleOrderCheckoutAjaxController::recalculateBasketAction
	 *
	 * @param int $id
	 * @param array $fields
	 * @return array|null
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'updateBasketItem', { mode: 'ajax', data: { id: "", fields: { ... }}});
	 */
	public function updateBasketItemAction(int $id, array $fields): ?array
	{
		$action = new Sale\Controller\Action\Entity\UpdateBasketItemAction($this->actionName, $this, $this->config);

		$result = $action->run($id, $fields);

		$errors = $action->getErrors();
		if ($errors)
		{
			$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_UPDATE_BASKET_ITEM')));
			return null;
		}

		$basketItems = [$result];
		$result = $this->fillBasketItems($basketItems);

		return $result[0];
	}

	/**
	 * @param array $fields
	 * @return Main\Engine\Response\Component|null
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'paymentPay', { mode: 'ajax', data: { fields: { ... }}});
	 */
	public function paymentPayAction(array $fields): ?Main\Engine\Response\Component
	{
		if (empty($fields['ORDER_ID']) || (int)$fields['ORDER_ID'] <= 0)
		{
			$this->addError(new Main\Error('orderId not found'));
		}

		if (empty($fields['ACCESS_CODE']))
		{
			$this->addError(new Main\Error('accessCode not found'));
		}

		if ($this->getErrors())
		{
			return null;
		}

		$params = [
			'ORDER_ID' => (int)$fields['ORDER_ID'],
			'ACCESS_CODE' => $fields['ACCESS_CODE'],
			'RETURN_URL' => $fields['RETURN_URL'] ?? '',
		];

		$result = new Main\Engine\Response\Component('bitrix:salescenter.payment.pay', 'checkout_form', $params);

		$order = $this->loadOrder($fields['ORDER_ID']);

		$event = new Main\Event(
			'sale',
			'onComponentSaleOrderCheckoutPaymentPayAction',
			[
				'ORDER' => $order,
			]
		);
		$event->send();

		return $result;
	}

	/**
	 * @param array $fields
	 * @return Main\Engine\Response\Component|null
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'userConsentRequest', { mode: 'ajax', data: { fields: { ... }}});
	 */
	public function userConsentRequestAction(array $fields): ?Main\Engine\Response\Component
	{
		$action = new Sale\Controller\Action\Entity\UserConsentRequestAction($this->actionName, $this, $this->config);

		$result = $action->run($fields);

		$errors = $action->getErrors();
		if ($errors)
		{
			$this->addErrors($errors);
			return null;
		}

		return $result;
	}

	/**
	 * @param array $fields
	 * @return array|null
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'getBasketAction', { mode: 'ajax', data: { fields: { ... }}});
	 */
	public function getBasketAction(array $fields): ?array
	{
		$action = new Sale\Controller\Action\Entity\GetBasketAction($this->actionName, $this, $this->config);

		$fields['FUSER_ID'] = Sale\Fuser::getId();

		$result = $action->run($fields);

		$errors = $action->getErrors();
		if ($errors)
		{
			$this->addErrors($errors);
			return null;
		}

		$basketItems = $result['BASKET_ITEMS'];
		$basketItems = $this->fillBasketItems($basketItems);

		$result['BASKET_ITEMS'] = $basketItems;

		return $result;
	}

	/**
	 * @param array $fields
	 * @return array|null
	 * @example BX.ajax.runComponentAction('bitrix:sale.order.checkout', 'saveOrder', { mode: 'ajax', data: { fields: { ... }}});
	 */
	public function saveOrderAction(array $fields): ?array
	{
		$action = new Sale\Controller\Action\Entity\SaveOrderAction($this->actionName, $this, $this->config);

		if ($this->isUserAuthorized())
		{
			$fields['USER_ID'] = $this->getUserId();
		}

		$fields['FUSER_ID'] = Sale\Fuser::getId();

		$result = $action->run($fields);

		$errors = $action->getErrors();
		if ($errors)
		{
			foreach ($errors as $error)
			{
				$errorCode = $error->getCode();

				if ((int)$errorCode === Sale\Controller\ErrorEnumeration::SAVE_ORDER_ACTION_SET_PROPERTIES)
				{
					$this->addError(
						new Main\Error(
							$error->getMessage(),
							'PROPERTIES',
							$error->getCustomData()
						)
					);
				}

				if ((int)$errorCode === Sale\Controller\ErrorEnumeration::SAVE_ORDER_ACTION_SET_USER)
				{
					$this->addError(new Main\Error($error->getMessage()));
				}
			}

			if (empty($this->getErrors()))
			{
				$this->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_SAVE_ORDER')));
			}

			return null;
		}

		$basketItems = $result['BASKET_ITEMS'];
		$basketItems = $this->fillBasketItems($basketItems);
		$result['BASKET_ITEMS'] = $basketItems;

		$result['PROPERTIES'] = $this->fillOrderProperties($result['PROPERTIES']);

		$this->onSaveOrder($result);

		return $result;
	}

	private function onSaveOrder(array $result): void
	{
		if (isset($result['USER']))
		{
			if ($result['USER']['IS_NEW'])
			{
				$this->authorizeUser($result['USER']['ID']);
			}

			if (!$this->isUserAuthorized())
			{
				$this->saveOrderToSession($result['ORDER']['ACCOUNT_NUMBER']);
			}
		}
	}

	private function loadOrder(int $id): ?Sale\Order
	{
		$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
		/** @var Sale\Order $orderClassName */
		$orderClassName = $registry->getOrderClassName();

		return $orderClassName::load($id);
	}

	private function saveOrderToSession($accountNumber): void
	{
		$session = Main\Application::getInstance()->getSession();

		$saleNumberAccountList = $session->get('SALE_ACCOUNT_NUMBER_LIST');
		if (!is_array($saleNumberAccountList))
		{
			$saleNumberAccountList = [];
		}

		$saleNumberAccountList[] = $accountNumber;

		$session->set('SALE_ACCOUNT_NUMBER_LIST', $saleNumberAccountList);
	}

	private function authorizeUser(int $userId): void
	{
		global $USER;
		$USER->Authorize($userId);
	}

	private function isUserAuthorized(): bool
	{
		global $USER;
		return $USER->IsAuthorized();
	}

	private function getUserId()
	{
		global $USER;
		return $USER->getId();
	}

	public function recalculateBasketAction(array $actions): ?array
	{
		$result = [
			'ACTIONS' => [],
			'BASKET_ITEMS' => [],
			'ORDER_PRICE_TOTAL' => [],
			'NEED_FULL_RECALCULATION' => 'N',
		];

		$basketHashBeforeRecalculation = self::getBasketHash(self::getBasket());

		$preparedActions = $this->prepareRecalculateBasketActions($actions);
		foreach ($preparedActions as $actionName => $actionValues)
		{
			switch ($actionName)
			{
				case 'OFFER':
					$offerItems = [];

					foreach ($actionValues as $index => $offerFields)
					{
						$offerItems[] = $offerFields['BASKET_ID'];
						$result['ACTIONS'][$index] = $this->makeRecalculateOfferBasket($offerFields);
					}

					break;

				case 'DELETE':
					foreach ($actionValues as $index => $basketItemId)
					{
						$result['ACTIONS'][$index] = $this->makeRecalculateDeleteBasket($basketItemId);
					}

					break;

				case 'QUANTITY':
					foreach ($actionValues as $index => $quantity)
					{
						$result['ACTIONS'][$index] = $this->makeRecalculateQuantityBasket($quantity['BASKET_ID'], $quantity['QUANTITY']);
					}

					break;

				case 'RESTORE':
					foreach ($actionValues as $index => $basketItemData)
					{
						$result['ACTIONS'][$index] = $this->makeRecalculateRestoreBasket($basketItemData);
					}

					break;

				default:
					$this->errorCollection->setError(new Main\Error('action '.mb_strtolower($actionName).' not found'));
					break;
			}
		}

		$basketData = $this->getBasketAction([
			'FUSER_ID' => Sale\Fuser::getId(),
			'SITE_ID' => Main\Application::getInstance()->getContext()->getSite(),
		]);

		$basketHashAfterRecalculation = self::getBasketHash(self::getBasket());

		if (isset($offerItems))
		{
			foreach ($offerItems as $offerItem)
			{
				unset(
					$basketHashBeforeRecalculation[$offerItem],
					$basketHashAfterRecalculation[$offerItem]
				);
			}
		}

		$result['BASKET_ITEMS'] = $basketData['BASKET_ITEMS'];
		$result['ORDER_PRICE_TOTAL'] = $basketData['ORDER_PRICE_TOTAL'];

		$result['NEED_FULL_RECALCULATION'] =
			self::isBasketHashChanged($basketHashBeforeRecalculation, $basketHashAfterRecalculation) ? 'Y' : 'N';

		return $result;
	}

	private function makeRecalculateOfferBasket(array $offerFields): array
	{
		$changeBasketItemResult = $this->changeBasketItem($offerFields['BASKET_ID'], $offerFields['PRODUCT_ID']);
		if ($changeBasketItemResult->isSuccess())
		{
			return [
				'TYPE' => 'offer',
				'FIELDS' => ['ID' => $offerFields['BASKET_ID']],
			];
		}

		return [
			'TYPE' => 'offer',
			'ERRORS' => $this->getRecalculateErrorStructure($changeBasketItemResult),
		];
	}

	private function makeRecalculateDeleteBasket(int $basketItemId): array
	{
		$deleteBasketItemResult = $this->deleteBasketItem($basketItemId);
		if ($deleteBasketItemResult->isSuccess())
		{
			return [
				'TYPE' => 'delete',
				'FIELDS' => ['ID' => $basketItemId],
			];
		}

		return [
			'TYPE' => 'delete',
			'ERRORS' => $this->getRecalculateErrorStructure($deleteBasketItemResult),
		];
	}

	private function makeRecalculateQuantityBasket(int $basketId, float $quantity): array
	{
		$updateBasketItemQuantityResult = $this->updateBasketItemQuantity($basketId, $quantity);
		if ($updateBasketItemQuantityResult->isSuccess())
		{
			return [
				'TYPE' => 'quantity',
				'FIELDS' => ['ID' => $basketId],
			];
		}

		return [
			'TYPE' => 'quantity',
			'ERRORS' => $this->getRecalculateErrorStructure($updateBasketItemQuantityResult),
		];
	}

	private function makeRecalculateRestoreBasket(array $basketItemData): array
	{
		$result = $this->checkRestoreFields($basketItemData);
		if ($result->isSuccess())
		{
			$result = $this->restoreBasketItem($basketItemData);
			if ($result->isSuccess())
			{
				$restoreBasketItemData = $result->getData();
				/** @var Sale\BasketItem $basketItem */
				$basketItem = $restoreBasketItemData['basketItem'];

				return [
					'TYPE' => 'restore',
					'FIELDS' => ['ID' => $basketItem->getId()],
				];
			}
		}

		return [
			'TYPE' => 'restore',
			'ERRORS' => $this->getRecalculateErrorStructure($result),
		];
	}

	private function prepareRecalculateBasketActions(array $actions): array
	{
		$result = [
			'DELETE' => [],
			'QUANTITY' => [],
			'RESTORE' => [],
			'OFFER' => [],
		];

		$actions = $this->sortRecalculateBasketAction($actions);

		$deleteList = [];
		foreach ($actions as $index => $n)
		{
			foreach ($n as $action)
			{
				$actionName = key($action);
				if (!isset($result[$actionName]))
				{
					continue;
				}

				$data = $action[$actionName]['FIELDS'];
				if (
					$actionName === 'DELETE'
					|| (isset($data['ID']) && \in_array($data['ID'], $deleteList))
				)
				{
					unset($result['QUANTITY'][$index]);

					if ($actionName !== 'DELETE')
					{
						continue;
					}
				}

				$value = null;

				if ($actionName === 'DELETE')
				{
					$deleteList[] = (int)$data['ID'];

					$value = (int)$data['ID'];
				}
				elseif ($actionName === 'QUANTITY')
				{
					$value = [
						'BASKET_ID' => (int)$data['ID'],
						'QUANTITY' => (float)$data['VALUE'],
					];
				}
				elseif ($actionName === 'RESTORE')
				{
					$value = [
						'PRODUCT_ID' => $data['PRODUCT']['ID'] ?? null,
						'QUANTITY' => $data['QUANTITY'] ?? null,
						'MODULE' => $data['MODULE'] ?? null,
						'PRODUCT_PROVIDER_CLASS' => $data['PRODUCT_PROVIDER_CLASS'] ?? null,
						'PROPS' => $data['PROPS'] ?? null,
					];
				}
				elseif ($actionName === 'OFFER')
				{
					$value = [
						'BASKET_ID' => (int)$data['ID'],
						'PRODUCT_ID' => (int)$data['FIELDS']['OFFER_ID'],
					];
				}

				$result[$actionName][$index] = $value;
			}
		}

		return $result;
	}

	private function sortRecalculateBasketAction(array $actions): array
	{
		ksort($actions);

		foreach ($actions as $key => $value)
		{
			ksort($value);
			$actions[$key] = $value;
		}

		return $actions;
	}

	private function checkRestoreFields(array $basketItemData): Sale\Result
	{
		$result = new Sale\Result();

		$restoreRequiredFields = [
			'PRODUCT_ID',
			'QUANTITY',
			'MODULE',
			'PRODUCT_PROVIDER_CLASS',
		];

		foreach ($restoreRequiredFields as $restoreRequiredField)
		{
			if (empty($basketItemData[$restoreRequiredField]))
			{
				$result->addError(new Main\Error("Field {$restoreRequiredField} is required for restore"));
			}
		}

		return $result;
	}

	private function getRecalculateErrorStructure(Sale\Result $result): array
	{
		$errors = [];
		foreach ($result->getErrors() as $error)
		{
			$errors[] = [
				'CODE' => $error->getCode(),
				'MESSAGE' => $error->getMessage(),
			];
		}

		return $errors;
	}

	private function deleteBasketItem(int $id): Sale\Result
	{
		$result = new Sale\Result();

		$action = new Sale\Controller\Action\Entity\DeleteBasketItemAction($this->actionName, $this, $this->config);

		$deleteBasketItemResult = $action->deleteBasketItem($id);
		if ($deleteBasketItemResult->isSuccess())
		{
			$result->setData($deleteBasketItemResult->getData());
		}
		else
		{
			$result->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_DELETE_BASKET_ITEM')));
		}

		return $result;
	}

	private function updateBasketItemQuantity(int $id, float $quantity): Sale\Result
	{
		$result = new Sale\Result();

		$action = new Sale\Controller\Action\Entity\UpdateBasketItemAction($this->actionName, $this, $this->config);

		$updateBasketItemResult = $action->updateBasketItem($id, ['QUANTITY' => $quantity]);
		if ($updateBasketItemResult->isSuccess())
		{
			$result->setData($updateBasketItemResult->getData());
		}
		else
		{
			$result->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_UPDATE_BASKET_ITEM_QUANTITY')));
		}

		return $result;
	}

	private function restoreBasketItem(array $basketItemData): Sale\Result
	{
		$result = new Sale\Result();

		$action = new Sale\Controller\Action\Entity\AddBasketItemAction($this->actionName, $this, $this->config);

		$fields['PRODUCT'] = $basketItemData;

		$fields['FUSER_ID'] = Sale\Fuser::getId();
		$fields['SITE_ID'] = Main\Application::getInstance()->getContext()->getSite();

		$addBasketItemResult = $action->addBasketItem($fields);
		if ($addBasketItemResult->isSuccess())
		{
			$result->setData($addBasketItemResult->getData());
		}
		else
		{
			$result->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_RESTORE_BASKET_ITEM')));
		}

		return $result;
	}

	private function changeBasketItem(int $basketId, int $productId): Sale\Result
	{
		$result = new Sale\Result();

		$action = new Sale\Controller\Action\Entity\ChangeBasketItemAction($this->actionName, $this, $this->config);

		$fields = [
			'BASKET_ID' => $basketId,
			'PRODUCT_ID' => $productId,
			'FUSER_ID' => Sale\Fuser::getId(),
			'SITE_ID' => Main\Application::getInstance()->getContext()->getSite(),
		];

		$changeBasketItemResult = $action->changeBasketItem($fields);
		if ($changeBasketItemResult->isSuccess())
		{
			$result->setData($changeBasketItemResult->getData());
		}
		else
		{
			$result->addError(new Main\Error(Main\Localization\Loc::getMessage('SOC_CHANGE_BASKET_ITEM')));
		}

		return $result;
	}

	private static function getBasketHash(Sale\BasketBase $basket)
	{
		$basketHash = [];

		$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
		/** @var Sale\BasketItem $basketItemClassName */
		$basketItemClassName = $registry->getBasketItemClassName();

		$settableFieldsMap = $basketItemClassName::getSettableFieldsMap();
		unset($settableFieldsMap['QUANTITY']);

		/** @var Sale\BasketItem $basketItem */
		foreach ($basket as $basketItem)
		{
			$basketItemFields = $basketItem->getFieldValues();
			$basketItemFilteredFields = array_filter(
				$basketItemFields,
				static function ($fieldName) use ($settableFieldsMap) {
					return array_key_exists($fieldName, $settableFieldsMap);
				},
				ARRAY_FILTER_USE_KEY
			);

			ksort($basketItemFilteredFields);
			$basketHash[$basketItem->getId()] = md5(serialize($basketItemFilteredFields));
		}

		return $basketHash;
	}

	private static function getBasket(): Sale\BasketBase
	{
		$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);

		/** @var Sale\Basket $basketClassName */
		$basketClassName = $registry->getBasketClassName();
		$basket = $basketClassName::loadItemsForFUser(
			Sale\Fuser::getId(),
			Main\Application::getInstance()->getContext()->getSite()
		);

		$order = $basket->getOrder();
		if (!$order)
		{
			/** @var Sale\Order $orderClassName */
			$orderClassName = $registry->getOrderClassName();
			$order = $orderClassName::create($basket->getSiteId());
			$order->setBasket($basket);
		}

		if ($order)
		{
			$discounts = $order->getDiscount();
			$showPrices = $discounts->getShowPrices();
			if (!empty($showPrices['BASKET']))
			{
				foreach ($showPrices['BASKET'] as $basketCode => $data)
				{
					$basketItem = $basket->getItemByBasketCode($basketCode);
					if ($basketItem instanceof Sale\BasketItemBase)
					{
						$basketItem->setFieldNoDemand('BASE_PRICE', $data['SHOW_BASE_PRICE']);
						$basketItem->setFieldNoDemand('PRICE', $data['SHOW_PRICE']);
						$basketItem->setFieldNoDemand('DISCOUNT_PRICE', $data['SHOW_DISCOUNT']);
					}
				}
			}
		}

		return $basket;
	}

	private static function isBasketHashChanged(array $originalHash, array $recalculatedHash): bool
	{
		foreach ($originalHash as $basketItemId => $basketItemHash)
		{
			if (
				isset($recalculatedHash[$basketItemId])
				&& $basketItemHash !== $recalculatedHash[$basketItemId]
			)
			{
				return true;
			}
		}

		return false;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit