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/rospirotorg.ru/bitrix/modules/sale/lib/rest/entity/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/rest/entity/basketitem.php
<?php

namespace Bitrix\Sale\Rest\Entity;

use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Sale\Helpers\Order\Builder\BasketBuilderRest;
use Bitrix\Sale\Rest\Attributes;
use Bitrix\Sale\Result;

class BasketItem extends Base
{
	private bool $bitrix24Included;
	private bool $catalogIncluded;

	public function getFields()
	{
		$this->checkModules();

		return $this->getFieldsInfoItem() + $this->getCustomProductFieldsInfo();
	}

	public function getFieldsCatalogProduct()
	{
		$this->checkModules();

		return $this->getFieldsInfoItem() + $this->getFieldsInfoCatalogProduct();
	}

	private function getFieldsInfoItem(): array
	{
		$result = [];
		$result['ID'] = [
			'TYPE' => self::TYPE_INT,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['XML_ID'] = [
			'TYPE' => self::TYPE_STRING,
		];
		$result['ORDER_ID'] = [
			'TYPE' => self::TYPE_INT,
			'ATTRIBUTES' => [
				Attributes::Immutable,
				Attributes::Required,
			],
		];

		if (!$this->bitrix24Included)
		{
			$result['FUSER_ID'] = [
				'TYPE' => self::TYPE_INT,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
			$result['LID'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
		}

		$result['SORT'] = [
			'TYPE' => self::TYPE_INT,
		];
		$result['PRODUCT_ID'] = [
			'TYPE' => self::TYPE_INT,
			'ATTRIBUTES' => [
				Attributes::Immutable,
				Attributes::Required,
			],
		];
		$result['PRICE'] = [
			'TYPE' => self::TYPE_FLOAT,
		];
		$result['CURRENCY'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::Immutable,
				Attributes::Required,
			],
		];
		$result['CUSTOM_PRICE'] = [
			'TYPE' => self::TYPE_CHAR,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['QUANTITY'] = [
			'TYPE' => self::TYPE_FLOAT,
			'ATTRIBUTES' => [
				Attributes::Required,
			],
		];
		$result['DATE_INSERT'] = [
			'TYPE' => self::TYPE_DATETIME,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['DATE_UPDATE'] = [
			'TYPE' => self::TYPE_DATETIME,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['PROPERTIES'] = [
			'TYPE' => self::TYPE_LIST,
			'ATTRIBUTES' => [
				Attributes::Hidden,
			],
		];

		return $result;
	}

	private function getFieldsInfoCatalogProduct(): array
	{
		$result['NAME'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];

		if (!$this->bitrix24Included)
		{
			$result['PRODUCT_PRICE_ID'] = [
				'TYPE' => self::TYPE_INT,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
			$result['PRICE_TYPE_ID'] = [
				'TYPE' => self::TYPE_INT,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
			$result['DETAIL_PAGE_URL'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
		}

		$result['BASE_PRICE'] = [
			'TYPE' => self::TYPE_FLOAT,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['DISCOUNT_PRICE'] = [
			'TYPE' => self::TYPE_FLOAT,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['WEIGHT'] = [
			'TYPE' => self::TYPE_FLOAT,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['DIMENSIONS'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['MEASURE_CODE'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['MEASURE_NAME'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];

		$result['CAN_BUY'] = [
			'TYPE' => self::TYPE_CHAR,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];

		$result['VAT_RATE'] = [
			'TYPE' => self::TYPE_FLOAT,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['VAT_INCLUDED'] = [
			'TYPE' => self::TYPE_CHAR,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];

		if (
			$this->catalogIncluded
			&& \Bitrix\Catalog\Config\State::isUsedInventoryManagement()
		)
		{
			$result['BARCODE_MULTI'] = [
				'TYPE' => self::TYPE_CHAR,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
		}

		$result['TYPE'] = [
			'TYPE' => self::TYPE_INT,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];

		if (!$this->bitrix24Included)
		{
			$result['PRODUCT_PROVIDER_CLASS'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
			$result['MODULE'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
			$result['SET_PARENT_ID'] = [
				'TYPE' => self::TYPE_INT,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
		}

		$result['CATALOG_XML_ID'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];
		$result['PRODUCT_XML_ID'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::ReadOnly,
			],
		];

		return $result;
	}

	private function getCustomProductFieldsInfo(): array
	{
		$result = [];
		$result['NAME'] = [
			'TYPE' => self::TYPE_STRING,
		];

		if (!$this->bitrix24Included)
		{
			$result['PRODUCT_PRICE_ID'] = [
				'TYPE' => self::TYPE_INT,
			];
			$result['PRICE_TYPE_ID'] = [
				'TYPE' => self::TYPE_INT,
			];
			$result['DETAIL_PAGE_URL'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::ReadOnly,
				],
			];
		}

		$result['BASE_PRICE'] = [
			'TYPE' => self::TYPE_FLOAT,
		];
		$result['DISCOUNT_PRICE'] = [
			'TYPE' => self::TYPE_FLOAT,
		];
		$result['WEIGHT'] = [
			'TYPE' => self::TYPE_FLOAT,
		];
		$result['DIMENSIONS'] = [
			'TYPE' => self::TYPE_STRING,
		];
		$result['MEASURE_CODE'] = [
			'TYPE' => self::TYPE_STRING,
		];
		$result['MEASURE_NAME'] = [
			'TYPE' => self::TYPE_STRING,
		];
		$result['CAN_BUY'] = [
			'TYPE' => self::TYPE_CHAR,
		];
		$result['VAT_RATE'] = [
			'TYPE' => self::TYPE_FLOAT,
		];
		$result['VAT_INCLUDED'] = [
			'TYPE' => self::TYPE_CHAR,
		];

		if (
			$this->catalogIncluded
			&& \Bitrix\Catalog\Config\State::isUsedInventoryManagement()
		)
		{
			$result['BARCODE_MULTI'] = [
				'TYPE' => self::TYPE_CHAR,
			];
		}
		$result['TYPE'] = [
			'TYPE' => self::TYPE_INT,
		];

		if (!$this->bitrix24Included)
		{
			$result['PRODUCT_PROVIDER_CLASS'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::Immutable,
				],
			];
			$result['MODULE'] = [
				'TYPE' => self::TYPE_STRING,
				'ATTRIBUTES' => [
					Attributes::Immutable,
				],
			];
			$result['SET_PARENT_ID'] = [
				'TYPE' => self::TYPE_INT,
			];
		}

		$result['CATALOG_XML_ID'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::Immutable,
			],
		];
		$result['PRODUCT_XML_ID'] = [
			'TYPE' => self::TYPE_STRING,
			'ATTRIBUTES' => [
				Attributes::Immutable,
			],
		];

		return $result;
	}

	public function convertKeysToSnakeCaseArguments($name, $arguments)
	{
		if ($name === 'getfieldscatalogproduct')
		{
			return $arguments;
		}

		if (
			$name === 'addcatalogproduct'
			|| $name === 'updatecatalogproduct'
			|| $name === 'modifycatalogproduct')
		{
			if (isset($arguments['fields']))
			{
				$fields = $arguments['fields'];
				if (!empty($fields))
				{
					$arguments['fields'] = $this->convertKeysToSnakeCaseFields($fields);
				}
			}
		}
		else
		{
			$arguments = parent::convertKeysToSnakeCaseArguments($name, $arguments);
		}

		return $arguments;
	}

	public function checkArguments($name, $arguments)
	{
		$r = new Result();

		if ($name === 'getfieldscatalogproduct')
		{
			return $r;
		}

		if ($name === 'addcatalogproduct')
		{
			$fields = $arguments['fields'];
			$fieldsInfo = $this->getListFieldInfo(
				$this->getFieldsCatalogProduct(),
				[
					'filter' => [
						'ignoredAttributes' => [
							Attributes::Hidden,
							Attributes::ReadOnly,
						],
					],
				]
			);

			if (!empty($fields))
			{
				$required = $this->checkRequiredFields($fields, $fieldsInfo);
				if (!$required->isSuccess())
				{
					$r->addError(new Error(
						'Required fields: ' . implode(', ', $required->getErrorMessages())
					));
				}
			}
		}
		elseif ($name === 'updatecatalogproduct')
		{
			$fields = $arguments['fields'];
			$fieldsInfo = $this->getListFieldInfo(
				$this->getFieldsCatalogProduct(),
				[
					'filter' => [
						'ignoredAttributes' => [
							Attributes::Hidden,
							Attributes::ReadOnly,
							Attributes::Immutable,
						],
					],
				],
			);

			if (!empty($fields))
			{
				$required = $this->checkRequiredFields($fields, $fieldsInfo);
				if (!$required->isSuccess())
				{
					$r->addError(new Error(
						'Required fields: ' . implode(', ', $required->getErrorMessages())
					));
				}
			}
		}
		else
		{
			$r = parent::checkArguments($name, $arguments);
		}

		return $r;
	}

	public function internalizeArguments($name, $arguments)
	{
		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'
			|| $name === 'modifycatalogproduct'
		)
		{
			return $arguments;
		}

		if ($name === 'addcatalogproduct')
		{
			$fields = $arguments['fields'];
			$fieldsInfo = $this->getListFieldInfo(
				$this->getFieldsCatalogProduct(),
				[
					'filter' => [
						'ignoredAttributes' => [
							Attributes::Hidden,
							Attributes::ReadOnly,
						],
					],
				]
			);

			if (!empty($fields))
			{
				$arguments['fields'] = $this->internalizeFields($fields, $fieldsInfo);
			}
		}
		elseif ($name === 'updatecatalogproduct')
		{
			$fields = $arguments['fields'];
			$fieldsInfo = $this->getListFieldInfo(
				$this->getFieldsCatalogProduct(),
				[
					'filter' => [
						'ignoredAttributes' => [
							Attributes::Hidden,
							Attributes::ReadOnly,
							Attributes::Immutable,
						],
					],
				]
			);

			if (!empty($fields))
			{
				$arguments['fields'] = $this->internalizeFields($fields, $fieldsInfo);
			}
		}
		else
		{
			parent::internalizeArguments($name, $arguments);
		}

		return $arguments;
	}

	public function externalizeResult($name, $fields)
	{
		if ($name === 'getfieldscatalogproduct')
		{
			return $fields;
		}

		if (
			$name === 'addcatalogproduct'
			|| $name === 'updatecatalogproduct'
		)
		{
			$fields = $this->externalizeFields($fields);
		}
		else
		{
			parent::externalizeResult($name, $fields);
		}

		return $fields;
	}

	protected function isNewItem($fields)
	{
		if (!isset($fields['ID']))
		{
			return true;
		}
		else
		{
			return BasketBuilderRest::isBasketItemNew($fields['ID']);
		}
	}

	public function internalizeFieldsModify($fields, $fieldsInfo=[])
	{
		$result = [];
		$basketProperties = new BasketProperties();

		$fieldsInfo = empty($fieldsInfo) ? $this->getFields() : $fieldsInfo;
		$listFieldsInfoAdd = $this->getListFieldInfo(
			$fieldsInfo,
			[
				'filter' => [
					'ignoredAttributes' => [
						Attributes::Hidden,
						Attributes::ReadOnly,
					],
					'ignoredFields' => [
						'ORDER_ID',
					],
				],
			]
		);
		$listFieldsInfoUpdate = $this->getListFieldInfo(
			$fieldsInfo,
			[
				'filter' => [
					'ignoredAttributes' => [
						Attributes::Hidden,
						Attributes::ReadOnly,
						Attributes::Immutable,
					],
					'skipFields' => [
						'ID',
					],
				],
			]
		);

		if (isset($fields['ORDER']['ID']))
		{
			$result['ORDER']['ID'] = (int)$fields['ORDER']['ID'];
		}

		if (isset($fields['ORDER']['BASKET_ITEMS']))
		{
			foreach ($fields['ORDER']['BASKET_ITEMS'] as $k => $item)
			{
				$result['ORDER']['BASKET_ITEMS'][$k] = $this->internalizeFields($item,
					$this->isNewItem($item)? $listFieldsInfoAdd:$listFieldsInfoUpdate
				);

				// n1 - ref shipmentItem.basketId
				if ($this->isNewItem($item) && isset($item['ID']))
				{
					$result['ORDER']['BASKET_ITEMS'][$k]['ID'] = $item['ID'];
				}

				if (isset($item['PROPERTIES']))
				{
					$result['ORDER']['BASKET_ITEMS'][$k]['PROPERTIES'] = $basketProperties->internalizeFieldsModify(['BASKET_ITEM' => ['PROPERTIES'=>$item['PROPERTIES']]])['BASKET_ITEM']['PROPERTIES'];
				}
			}
		}

		return $result;
	}

	public function externalizeFields($fields)
	{
		$basketProperties = new BasketProperties();
		$basketReservation = new BasketReservation();

		$result = parent::externalizeFields($fields);

		if (isset($fields['PROPERTIES']))
		{
			$result['PROPERTIES'] = $basketProperties->externalizeListFields($fields['PROPERTIES']);
		}

		if (isset($fields['RESERVATIONS']))
		{
			$result['RESERVATIONS'] = $basketReservation->externalizeListFields($fields['RESERVATIONS']);
		}

		return $result;
	}

	public function externalizeFieldsModify($fields)
	{
		return $this->externalizeListFields($fields);
	}

	public function checkFieldsModify($fields)
	{
		$r = new Result();

		$emptyFields = [];
		if (!isset($fields['ORDER']['ID']))
		{
			$emptyFields[] = '[order][id]';
		}
		if (!isset($fields['ORDER']['BASKET_ITEMS']) || !is_array($fields['ORDER']['BASKET_ITEMS']))
		{
			$emptyFields[] = '[order][basketItems][]';
		}

		if (!empty($emptyFields))
		{
			$r->addError(new Error('Required fields: ' . implode(', ', $emptyFields)));
		}
		else
		{
			$r = parent::checkFieldsModify($fields);
		}

		return $r;
	}

	public function checkRequiredFieldsModify($fields)
	{
		$r = new Result();

		$basketProperties = new BasketProperties();

		$listFieldsInfoAdd = $this->getListFieldInfo(
			$this->getFields(),
			[
				'filter' => [
					'ignoredAttributes' => [
						Attributes::Hidden,
						Attributes::ReadOnly,
					],
					'ignoredFields' => [
						'ORDER_ID',
					],
				],
			]
		);
		$listFieldsInfoUpdate = $this->getListFieldInfo(
			$this->getFields(),
			[
				'filter' => [
					'ignoredAttributes' => [
						Attributes::Hidden,
						Attributes::ReadOnly,
						Attributes::Immutable,
					],
				],
			]
		);

		foreach ($fields['ORDER']['BASKET_ITEMS'] as $k => $item)
		{
			$required = $this->checkRequiredFields($item,
				$this->isNewItem($item)? $listFieldsInfoAdd:$listFieldsInfoUpdate
			);
			if (!$required->isSuccess())
			{
				$r->addError(new Error(
					'[basketItems]['.$k.'] - ' . implode(', ', $required->getErrorMessages()) . '.'
				));
			}

			if (isset($item['PROPERTIES']))
			{
				$requiredProperties = $basketProperties->checkRequiredFieldsModify([
					'BASKET_ITEM' => [
						'PROPERTIES' => $item['PROPERTIES'],
					],
				]);
				if (!$requiredProperties->isSuccess())
				{
					$requiredPropertiesFields = [];
					foreach ($requiredProperties->getErrorMessages() as $errorMessage)
					{
						$requiredPropertiesFields[] = '[basketItems]['.$k.']'.$errorMessage;
					}
					$r->addError(new Error(implode( ' ', $requiredPropertiesFields)));
				}
			}
		}
		return $r;
	}

	private function checkModules(): void
	{
		if (!isset($this->bitrix24Included))
		{
			$this->bitrix24Included = Loader::includeModule('bitrix24');
		}
		if (!isset($this->catalogIncluded))
		{
			$this->catalogIncluded = Loader::includeModule('catalog');
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit