• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/compatible/basketcompatibility.php
  • Класс: BitrixSaleCompatibleBasketCompatibility
  • Вызов: BasketCompatibility::parseBasketItems
protected function parseBasketItems(SaleBasket $basket, array $requestBasketItems)
{
	$result = new SaleResult();

	$basketCodeList = array();
	$basketItemList = array();
	$basketParentList = array();
	$basketChildList = array();

	$basketChanged = false;

	$registry = SaleRegistry::getInstance(static::getRegistryType());
	$basketItemEntity = $registry->getBasketItemClassName();

	$publicMode = DiscountCompatibility::usedByClient();
	foreach ($requestBasketItems as $basketIndex => $basketItemData)
	{
		if (isset($basketItemData['SET_PARENT_ID']) && strval($basketItemData['SET_PARENT_ID']) != '')
		{
			$parentId = intval($basketItemData['SET_PARENT_ID']);
			if ($basketItemData['TYPE'] != $basketItemEntity::TYPE_SET && !array_key_exists($parentId, $basketParentList))
			{
				$basketChildList[intval($basketItemData['SET_PARENT_ID'])] = $basketItemData['SET_PARENT_ID'];
			}
		}
	}

	$orderCompatibility = $this->getOrderCompatibility();

	/** @var SaleOrder $order */
	$order = $orderCompatibility->getOrder();
	$basketItemsIndexList = array();

	foreach ($basket as $basketItem)
	{
		$basketItemsIndexList[$basketItem->getId()] = true;
	}

	$sort = 100;
	foreach ($requestBasketItems as $basketIndex => $basketItemData)
	{
		if (!isset($basketItemData['BASE_PRICE']) && isset($basketItemData['PRICE']))
		{
			$basketItemData['BASE_PRICE'] = $basketItemData['PRICE'];
		}

		$basketItem = null;
		if (isset($basketItemData['ID']) && intval($basketItemData['ID']) > 0)
		{
			/** @var SaleBasketItem $basketItem */
			if ($basketItem = $basket->getItemById($basketItemData['ID']))
			{
				if (isset($basketItemsIndexList[$basketItem->getId()]))
					unset($basketItemsIndexList[$basketItem->getId()]);
			}
		}


		if (!$basketItem)
		{
			/** @var SaleBasketItem $basketItem */
			$basketItem = $basketItemEntity::create($basket, $basketItemData['MODULE'], $basketItemData['PRODUCT_ID']);
			$basketChanged = true;
		}

		$itemDuplicate = (isset($basketItemData['DUPLICATE']) && $basketItemData['DUPLICATE'] == "Y");

		$basketItemData['SORT'] = $sort;
		$sort += 100;

		$basketFields = static::clearFields($basketItemData);

		if ($order->getId() > 0)
		{
			/** @var SaleShipmentCollection $shipmentCollection */
			if ($shipmentCollection = $order->getShipmentCollection())
			{
				if (count($shipmentCollection) == 2
					&& (isset($basketItemData['QUANTITY']) && floatval($basketItemData['QUANTITY']) <= $basketItem->getQuantity()))
				{

					/** @var SaleShipment $shipment */
					foreach ($shipmentCollection as $shipment)
					{
						if ($shipment->isSystem())
							continue;


						$basketQuantity = $shipment->getBasketItemQuantity($basketItem);
						if ($basketQuantity <= floatval($basketItemData['QUANTITY']))
							continue;


						/** @var SaleShipmentItemCollection $shipmentItemCollection */
						if ($shipmentItemCollection = $shipment->getShipmentItemCollection())
						{
							/** @var SaleShipmentItem $shipmentItem */
							if (!$shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))
								continue;

							$shipmentItem->setQuantity(floatval($basketItemData['QUANTITY']));
						}
					}
				}
			}
		}


		$isBasketItemCanBeAdded = true;
		if ($publicMode)
		{
			if (CSaleBasketHelper::isSetParent($basketItemData))
			{
				$parentId = (int)$basketItemData['ID'];
				$parentCode = $basketItemData['ID'];
			}
			else
			{
				$parentId = (int)$basketItemData['SET_PARENT_ID'];
				$parentCode = $basketItemData['SET_PARENT_ID'];
			}
		}
		else
		{
			$parentId = (int)$basketItemData['SET_PARENT_ID'];
			$parentCode = $basketItemData['SET_PARENT_ID'];
		}

		if ($parentId > 0)
		{
			if ($basketItem->isBundleParent())
			{
				$basketParentList[$parentCode] = $basketItem->getBasketCode();
			}
			else
			{
				$isBasketItemCanBeAdded = false;
				$basketItemList[$parentCode][$basketIndex] = $basketItem;
			}
		}

		if ($isBasketItemCanBeAdded)
		{
			$propList = array();
			/** @var SaleBasketPropertiesCollection $propertyCollection */
			if ($propertyCollection = $basketItem->getPropertyCollection())
			{
				$propList = $propertyCollection->getPropertyValues();
			}

			/** @var null|SaleBasketItem $foundedBasketItem */
			$foundedBasketItem = null;

			if ($basketItem->getId() > 0 && ($foundedBasketItem = $basket->getItemById($basketItem->getId())))
			{
				$basketCodeList[($publicMode ? $foundedBasketItem->getId() : $basketIndex)] = $foundedBasketItem->getBasketCode();
			}
			else
			{
				if (!$itemDuplicate && ($foundedBasketItem = $basket->getExistsItem($basketItem->getField('MODULE'), $basketItem->getProductId(), $propList)))
				{
					$basketCodeList[($publicMode ? $foundedBasketItem->getId() : $basketIndex)] = $foundedBasketItem->getBasketCode();
				}
			}

			if ($foundedBasketItem === null)
			{
				$basket->addItem($basketItem);
				$basketCodeList[($publicMode ? $basketItem->getId() : $basketIndex)] = $basketItem->getBasketCode();

				$basketChanged = true;
			}
		}


		/** @var SaleResult $r */
		$r = $basketItem->setFields($basketFields);
		if ($r->isSuccess())
		{
			if (array_key_exists('PROPS', $basketItemData) && is_array($basketItemData))
			{
				/** @var SaleBasketPropertiesCollection $propertyCollection */
				if ($propertyCollection = $basketItem->getPropertyCollection())
				{
					$propertyCollection->setProperty($basketItemData['PROPS']);
				}
			}
		}
		else
		{
			$result->addErrors($r->getErrors());
		}

	}

	if (!empty($basketChildList))
	{
		foreach($basketItemList as $parentBasketCode => $childBasketItemList)
		{
			$parentCode = null;
			if (!empty($basketParentList[$parentBasketCode]))
				$parentCode = $basketParentList[$parentBasketCode];

			if (strval($parentCode) == '')
				continue;

			/** @var SaleBasketItem $parentBasketItem */
			if (!$parentBasketItem = $basket->getItemByBasketCode($parentCode))
			{
				throw new MainObjectNotFoundException('Entity parent "BasketItem" not found');
			}

			if (!empty($childBasketItemList) && is_array($childBasketItemList))
			{
				/** @var SaleBasketItem $childBasketItem */
				foreach ($childBasketItemList as $indexChildBasketItem => $childBasketItem)
				{
					$basketCodeIndex = ($publicMode ? $childBasketItem->getId() : $indexChildBasketItem);
					$childBasketCode = $childBasketItem->getBasketCode();

					$propList = array();
					/** @var SaleBasketPropertiesCollection $propertyCollection */
					if ($propertyCollection = $childBasketItem->getPropertyCollection())
					{
						$propList = $propertyCollection->getPropertyValues();
					}

					$bundleCollection = $parentBasketItem->getBundleCollection();
					/** @var SaleBasketItem $foundedBasketItem */
					if ($foundedBasketItem = $bundleCollection->getExistsItem($childBasketItem->getField('MODULE'), $childBasketItem->getProductId(), $propList))
					{
						$childBasketCode = $foundedBasketItem->getBasketCode();
						unset($childBasketItemList[$indexChildBasketItem]);
						$basketCodeIndex = ($publicMode ? $foundedBasketItem->getId() : $indexChildBasketItem);
					}

					if (strval($childBasketCode) != '')
						$basketCodeList[$basketCodeIndex] = $childBasketCode;
				}

				if (!empty($childBasketItemList))
				{
					$this->setChildBundleCollection($basket, $childBasketItemList, $parentBasketItem);
				}
			}
		}
	}

	if (!empty($basketItemsIndexList) && is_array($basketItemsIndexList))
	{
		foreach ($basketItemsIndexList as $basketIndexId => $basketIndexValue)
		{
			if ($foundedBasketItem = $basket->getItemById($basketIndexId))
			{
				$foundedBasketItem->delete();
				$basketChanged = true;
			}
		}
	}

	$result->setData(array(
		'BASKET' => $basket,
		'BASKET_CODE_LIST' => $basketCodeList,
		'BASKET_CHANGED' => $basketChanged,
	));

	return $result;
}