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

	$order = null;
	$basket = null;
	$item = null;

	$registry = SaleRegistry::getInstance(static::getRegistryType());

	if (!array_key_exists('FUSER_ID', $fields) || intval($fields['FUSER_ID']) <= 0)
	{
		$fields['FUSER_ID'] = SaleFuser::getId(false);
	}

	if (!empty($fields['ORDER_ID']) && intval($fields['ORDER_ID']) > 0)
	{
		/** @var SaleOrder $orderClassName */
		$orderClassName = $registry->getOrderClassName();
		$order = $orderClassName::load(intval($fields['ORDER_ID']));

		if ($order)
		{
			/** @var SaleBasket $basket */
			$basket = $order->getBasket();
		}
	}

	if (!$basket)
	{
		/** @var SaleBasket $orderClassName */
		$basketClassName = $registry->getBasketClassName();
		$basket = $basketClassName::loadItemsForFUser($fields["FUSER_ID"], $fields['LID']);
	}


	/** @var BitrixSaleBasketItem|bool $item */
	if ($item = $basket->getExistsItem($fields["MODULE"], $fields["PRODUCT_ID"], ((!empty($fields["PROPS"]) && is_array($fields["PROPS"]))? $fields["PROPS"] : array())))
	{
		$item->setField('QUANTITY', $item->getQuantity() + $fields['QUANTITY']);

		unset($fields['QUANTITY']);

		/** @var SaleResult $r */
		$r = $item->setFields(static::clearFields($fields));
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}
		else
		{
			if (!$order)
				$basket->refreshData(array('PRICE', 'COUPONS', 'QUANTITY'), $item);
		}
	}

	if ($item === null)
	{
		/** @var BitrixSaleBasketItem $item */
		$item = $basket->createItem($fields["MODULE"], $fields["PRODUCT_ID"]);

		if (isset($fields["PROPS"]) && is_array($fields["PROPS"]))
		{
			/** @var SaleBasketPropertiesCollection $property */
			$property = $item->getPropertyCollection();
			$property->setProperty($fields["PROPS"]);
		}

		/** @var SaleResult $r */
		$r = $item->setFields(static::clearFields($fields));
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}

		if ($order)
		{
			$shipmentCollection = $order->getShipmentCollection();
			$systemShipment = $shipmentCollection->getSystemShipment();
			$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
			$systemShipmentItemCollection->resetCollection($basket);

			if ($systemShipment->getDeliveryId() > 0)
			{
				/** @var OrderCompatibility $orderCompatibilityClassName */
				$orderCompatibilityClassName = static::getOrderCompatibilityClassName();
				/** @var SaleShipment $shipment */
				$shipment = $orderCompatibilityClassName::getShipmentByDeliveryId($shipmentCollection, $systemShipment->getDeliveryId());

				if (!$shipment)
				{
					if ($service = SaleDeliveryServicesManager::getObjectById($systemShipment->getDeliveryId()))
					{
						/** @var SaleShipment $shipment */
						$shipment = $shipmentCollection->createItem($service);
					}
				}


				if ($shipment)
				{
					$shipmentItemCollection = $shipment->getShipmentItemCollection();

					/** @var SaleShipmentItem $shipmentItem */
					$shipmentItem = $shipmentItemCollection->createItem($item);
					if ($shipmentItem)
						$shipmentItem->setQuantity($item->getQuantity());
				}
			}

			/** @var SaleResult $r */
			$r = $order->refreshData(array('PRICE', 'PRICE_DELIVERY'));
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
				return $result;
			}

		}
	}

	if ($order !== null)
	{
		/** @var SaleResult $r */
		$r = $order->save();
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}
	}
	else
	{
		$isNew = false;
		if ($item->getId() == 0)
		{
			$isNew = true;
		}

		$r = $basket->save();
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}
	}

	if ($r->isSuccess())
	{
		if (!DiscountCompatibility::isInited())
			DiscountCompatibility::init();
		if (DiscountCompatibility::usedByClient())
		{
			$id = $item->getId();
			DiscountCompatibility::setBasketItemData($id, $fields);
			DiscountCompatibility::setBasketCode($id, $item->getBasketCode());
		}

		$result->setId($item->getId());
		$result->addData(array(
			'QUANTITY' => $item->getQuantity()
		));
	}


	return $result;
}