- Модуль: 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;
}