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/sale/lib/controller/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/sale/lib/controller/basketitem.php
<?php

namespace Bitrix\Sale\Controller;

use Bitrix\Catalog;
use Bitrix\Main\Engine\AutoWire\ExactParameter;
use Bitrix\Main\Engine\Response\DataType\Page;
use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Result;
use Bitrix\Main\UI\PageNavigation;
use Bitrix\Sale;
use Bitrix\Sale\Helpers\Order\Builder\SettingsContainer;

class BasketItem extends Controller
{
	public function getPrimaryAutoWiredParameter()
	{
		return new ExactParameter(
			Sale\BasketItem::class,
			'basketItem',
			function($className, $id)
			{
				$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);

				/** @var Sale\Basket $basketClass */
				$basketClass = $registry->getBasketClassName();

				$iterator = $basketClass::getList([
					'select' => [
						'ORDER_ID',
					],
					'filter'=>[
						'=ID' => (int)$id,
					],
				]);
				$row = $iterator->fetch();
				unset($iterator);
				if ($row)
				{
					/** @var Sale\Order $orderClass */
					$orderClass = $registry->getOrderClassName();

					$order = $orderClass::load((int)$row['ORDER_ID']);
					$basket = $order->getBasket()->getItemByBasketCode($id);
					if ($basket instanceof Sale\BasketItem)
					{
						return $basket;
					}
				}
				else
				{
					$this->addError(new Error('basket item is not exists', 200140400001));
				}

				return null;
			}
		);
	}

	//region Actions
	public function getFieldsAction()
	{
		$entity = new Sale\Rest\Entity\BasketItem();

		return [
			'BASKET_ITEM' => $entity->prepareFieldInfos($entity->getFields()),
		];
	}

	public function getFieldsCatalogProductAction()
	{
		$entity = new Sale\Rest\Entity\BasketItem();

		return [
			'BASKET_ITEM' => $entity->prepareFieldInfos($entity->getFieldsCatalogProduct()),
		];
	}

	public function modifyAction(array $fields)
	{
		$builder = $this->getBuilder();
		$builder->buildEntityBasket($fields);

		if (!$this->checkBuilderError($builder))
		{
			return null;
		}

		$order = $builder->getOrder();

		$result = $order->save();
		if (!$result->isSuccess())
		{
			$this->addErrors($result->getErrors());

			return null;
		}

		//TODO: return $basket->toArray();
		$convertedOrder = $this->toArray($order);
		return [
			'BASKET_ITEMS' => $convertedOrder['ORDER']['BASKET_ITEMS'] ?? null,
		];
	}

	public function addAction(array $fields)
	{
		$data = [];

		if (Loader::includeModule('bitrix24'))
		{
			if (isset($fields['PRODUCT_ID']) && (int)$fields['PRODUCT_ID'] === 0)
			{
				$fields['PRODUCT_ID'] = (int)$fields['PRODUCT_ID'];
				$fields['MODULE'] = '';
				$fields['PRODUCT_PROVIDER_CLASS'] = '';
			}
			else
			{
				if (Loader::includeModule('catalog'))
				{
					$fields = array_merge(
						$fields,
						$this->getStandartProviderDescription()
					);
				}
				else
				{
					unset(
						$fields['MODULE'],
						$fields['PRODUCT_PROVIDER_CLASS'],
					);
				}
			}
		}

		if (isset($fields['VAT_RATE']) && $fields['VAT_RATE'] === '')
		{
			$fields['VAT_RATE'] = null;
		}

		$data['ORDER'] = [
			'ID' => $fields['ORDER_ID'] ?? null,
			'BASKET_ITEMS' => [
				$fields,
			],
		];

		$result = $this->addValidate($fields);
		if (!$result->isSuccess())
		{
			$this->addErrors($result->getErrors());

			return null;
		}

		$builder = $this->getBuilder(
			new SettingsContainer([
				'deleteBasketItemsIfNotExists' => false
			])
		);
		$builder->buildEntityBasket($data);

		if (!$this->checkBuilderError($builder))
		{
			return null;
		}

		$idx = 0;
		$order = $builder->getOrder();
		$collection = $order->getBasket();
		/** @var Sale\BasketItem $basketItem */
		foreach ($collection as $basketItem)
		{
			if ($basketItem->getId() <= 0)
			{
				$idx = $basketItem->getInternalIndex();
				break;
			}
		}
		unset(
			$basketItem,
			$collection,
		);

		$result = $order->save();

		if (!$result->isSuccess())
		{
			$this->addErrors($result->getErrors());

			return null;
		}

		/** @var Sale\BasketItem $entity */
		$entity = $order->getBasket()->getItemByIndex($idx);
		if ($entity->getId() <= 0)
		{
			$this->addError(new Error('basket item is not saved - bad data', 200140400007));

			return null;
		}

		return new Page('BASKET_ITEM', $this->get($entity), 1);
	}

	public function addCatalogProductAction(array $fields)
	{
		if (!$this->checkModuleCatalog())
		{
			return null;
		}

		$fields = array_merge(
			$fields,
			$this->getStandartProviderDescription()
		);

		return $this->addAction($fields);
	}

	public function updateAction(Sale\BasketItem $basketItem, array $fields)
	{
		$data = [];

		$fields['ID'] = $basketItem->getBasketCode();
		$fields['ORDER_ID'] = $basketItem->getCollection()->getOrderId();

		if (isset($fields['VAT_RATE']) && $fields['VAT_RATE'] === '')
		{
			$fields['VAT_RATE'] = null;
		}

		$data['ORDER']['ID'] = $fields['ORDER_ID'];
		$data['ORDER']['BASKET_ITEMS'] = [$fields];

		$builder = $this->getBuilder(
			new SettingsContainer([
				'deleteBasketItemsIfNotExists' => false
			])
		);

		$builder->buildEntityBasket($data);
		if (!$this->checkBuilderError($builder))
		{
			return null;
		}

		$order = $builder->getOrder();

		$result = $order->save();
		if (!$result->isSuccess())
		{
			$this->addErrors($result->getErrors());

			return null;
		}

		/** @var Sale\BasketItem $entity */
		$entity = $order->getBasket()->getItemById($basketItem->getId());

		return new Page('BASKET_ITEM', $this->get($entity), 1);
	}

	public function updateCatalogProductAction(Sale\BasketItem $basketItem, array $fields)
	{
		if (!$this->checkModuleCatalog())
		{
			return null;
		}

		return $this->updateAction($basketItem, $fields);
	}

	public function getAction(Sale\BasketItem $basketItem)
	{
		//TODO: $basketItem->toArray();
		return [
			'BASKET_ITEM' => $this->get($basketItem),
		];
	}

	public function deleteAction(Sale\BasketItem $basketItem)
	{
		/** @var Sale\Basket $basketCollection */
		$basketCollection = $basketItem->getCollection();
		$order = $basketCollection->getOrder();

		$result = $basketItem->delete();
		if ($result->isSuccess())
		{
			$result = $order->save();
		}

		if (!$result->isSuccess())
		{
			$this->addErrors($result->getErrors());
		}

		return $result->isSuccess();
	}

	public function listAction(
		PageNavigation $pageNavigation,
		array $select = [],
		array $filter = [],
		array $order = [],
		bool $__calculateTotalCount = true
	): Page
	{
		$select = empty($select) ? ['*'] : $select;
		$order = empty($order)? ['ID' => 'ASC'] : $order;

		$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);

		/** @var Sale\Basket $basketClass */
		$basketClass = $registry->getBasketClassName();

		$iterator = $basketClass::getList([
			'select' => $select,
			'filter' => $filter,
			'order' => $order,
			'offset' => $pageNavigation->getOffset(),
			'limit' => $pageNavigation->getLimit(),
			'count_total' => $__calculateTotalCount,
		]);
		$items = $iterator->fetchAll();
		$totalCount = $__calculateTotalCount ? $iterator->getCount() : 0;
		unset($iterator);

		return new Page('BASKET_ITEMS', $items, $totalCount);
	}

	public function canBuyAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->canBuy() ? 'Y' : 'N';
	}

	public function getBasePriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getBasePrice();
	}

	public function getBasePriceWithVatAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getBasePriceWithVat();
	}

	public function getCurrencyAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getCurrency();
	}

	public function getDefaultPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getDefaultPrice();
	}

	public function getDiscountPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getDiscountPrice();
	}

	public function getFinalPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getFinalPrice();
	}

	public function getInitialPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getInitialPrice();
	}

	public function getPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getPrice();
	}

	public function getPriceWithVatAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getPriceWithVat();
	}

	public function getProductIdAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getProductId();
	}

	public function getQuantityAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getQuantity();
	}

	public function getReservedQuantityAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getReservedQuantity();
	}

	public function getVatAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getVat();
	}

	public function getVatRateAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getVatRate();
	}

	public function getWeightAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->getWeight();
	}

	public function isBarcodeMultiAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->isBarcodeMulti()? 'Y':'N';
	}

	public function isCustomMultiAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->isCustom()? 'Y':'N';
	}

	public function isCustomPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->isCustomPrice()? 'Y':'N';
	}

	public function isDelayAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->isDelay()? 'Y':'N';
	}

	public function isVatInPriceAction(Sale\BasketItem $basketItem)
	{
		return $basketItem->isVatInPrice()? 'Y':'N';
	}

	/*public function checkProductBarcodeAction(Sale\BasketItem $basketItem, array $fields)
	{
		$r = false;
		if ($basketItem)
		{
			$r = Provider::checkProductBarcode($basketItem, $fields);
		}

		if ($r)
			return true;
		else
		{
			$this->addError(new Error('barcode check failed',200150000010));
			return null;
		}

	}*/

	//endregion

	protected function get(Sale\BasketItem $basketItem, array $fields=[])
	{
		$convertedOrder = $this->toArray($basketItem->getCollection()->getOrder(), $fields);
		$items = $convertedOrder['ORDER']['BASKET_ITEMS'] ?? [];
		unset($convertedOrder);

		foreach ($items as $item)
		{
			if ($item['ID'] == $basketItem->getId())
			{
				return $item;
			}
		}

		return [];
	}

	public static function prepareFields($fields)
	{
		$data = null;
		Loader::includeModule('catalog');

		if (isset($fields['BASKET_ITEMS']))
		{
			$i = 0;
			foreach ($fields['BASKET_ITEMS'] as $item)
			{
				if (isset($item['PRODUCT_ID']))
				{
					$item['OFFER_ID'] = $item['PRODUCT_ID'];
					unset($item['PRODUCT_ID']); // need for builder
				}

				/*$properties = isset($item['PROPERTIES'])? $item['PROPERTIES']:[];
				foreach ($properties as &$property)
				{
					if(isset($property['BASKET_ID']))
						unset($property['BASKET_ID']);
				}

				$item['PROPS'] = $properties;*/

				$item['PROPS'] = $item['PROPERTIES'] ?? [];
				unset($item['PROPERTIES']);

				$basketCode = $item['ID'] ?? 'n' . ++$i;
				unset($item['ID']);

				$data[$basketCode] = $item;
			}
			unset($fields['BASKET_ITEMS']);
		}

		return is_array($data) ? ['PRODUCT' => $data] : [];
	}

	protected function checkPermissionEntity($name)
	{
		if (
			$name === 'canbuy'
			|| $name === 'getbaseprice'
			|| $name === 'getbasepricewithvat'
			|| $name === 'getcurrency'
			|| $name === 'getdefaultprice'
			|| $name === 'getdiscountprice'
			|| $name === 'getfinalprice'
			|| $name === 'getinitialprice'
			|| $name === 'getprice'
			|| $name === 'getpricewithvat'
			|| $name === 'getproductid'
			|| $name === 'getquantity'
			|| $name === 'getreservedquantity'
			|| $name === 'getvat'
			|| $name === 'getvatrate'
			|| $name === 'getweight'
			|| $name === 'isbarcodemulti'
			|| $name === 'iscustommulti'
			|| $name === 'iscustomprice'
			|| $name === 'isdelay'
			|| $name === 'isvatinprice'
			|| $name === 'getfieldscatalogproduct'
		)
		{
			$result = $this->checkReadPermissionEntity();
		}
		elseif ($name === 'addcatalogproduct' || $name === 'updatecatalogproduct')
		{
			$result = $this->checkCreatePermissionEntity();
		}
		else
		{
			$result = parent::checkPermissionEntity($name);
		}

		return $result;
	}

	protected function addValidate($fields)
	{
		$result = new Result();

		if ((int)($fields['ORDER_ID'] ?? null) <= 0)
		{
			$result->addError(new Error('Required fields: fields[ORDER_ID]', 200140400008));

			return $result;
		}

		$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
		/** @var Sale\Order $orderClass */
		$orderClass = $registry->getOrderClassName();

		$iterator = $orderClass::getList([
			'select' => [
				'ID',
				'CURRENCY',
			],
			'filter' => [
				'=ID' => (int)$fields['ORDER_ID'],
			],
		]);
		$order = $iterator->fetch();
		unset($iterator);
		if (empty($order))
		{
			$result->addError(new Error('Order not found', 200140400009));

			return $result;
		}

		if ($order['CURRENCY'] !== $fields['CURRENCY'])
		{
			$result->addError(new Error('Currency must be the currency of the order', 200140400011));

			return $result;
		}

		return $result;
	}

	private function checkBuilderError(Sale\Helpers\Order\Builder\OrderBuilder $builder): bool
	{
		$errors = $builder->getErrorsContainer();
		if (!$errors->isSuccess())
		{
			$this->addErrors($errors->getErrors());

			return false;
		}

		return true;
	}

	private function getStandartProviderDescription(): array
	{
		return [
			'MODULE' => 'catalog',
			'PRODUCT_PROVIDER_CLASS' => Catalog\Product\Basket::getDefaultProviderName(),
		];
	}

	private function checkModuleCatalog(): bool
	{
		if (!Loader::includeModule('catalog'))
		{
			$this->addError(new Error('Module catalog is not exists', 200140400006));

			return false;
		}

		return true;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit