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

	$item = null;
	$basket = null;
	/** @var SaleOrder $order */
	$order = null;
	$orderId = null;

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

	/** @var SaleResult $itemResult */
	$itemResult = static::loadEntityFromBasket($id);
	if ($itemResult->isSuccess())
	{
		$itemResultData = $itemResult->getData();
		if (isset($itemResultData['BASKET_ITEM']))
		{
			/** @var SaleBasketItem $item */
			$item = $itemResultData['BASKET_ITEM'];
			$basket = $item->getBasket();
		}

		if (isset($itemResultData['ORDER']))
		{
			$order = $itemResultData['ORDER'];
		}
	}

	if (!$item)
	{
		$result->addError(new SaleResultError(MainLocalizationLoc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_NOT_FOUND'), 'BASKET_ITEM_NOT_FOUND'));
		return $result;

	}

	if ($order !== null &&
		$fields['ORDER_ID'] > 0 &&
		(int)$fields['ORDER_ID'] !== (int)$order->getId()
	)
	{
		$result->addError(
			new SaleResultError(
				MainLocalizationLoc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_ERROR_BIND_TO_ORDER'),
				'BASKET_ITEM_NOT_FOUND'
			)
		);

		return $result;
	}

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

	if ($order !== null && isset($fields['PRICE']))
	{
		if ($fields['PRICE'] != $item->getPrice())
			$fields['CUSTOM_PRICE'] = 'Y';
	}

	if (!empty($fields['FUSER_ID']))
	{
		$item->setFieldNoDemand('FUSER_ID', intval($fields['FUSER_ID']));
		unset($fields['FUSER_ID']);
	}

	$r = $item->setFields(static::clearFields($fields));
	if (!$r->isSuccess())
	{
		$result->addErrors($r->getErrors());
	}

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


	if ($order === null && !empty($fields['ORDER_ID']) && intval($fields['ORDER_ID']) > 0)
	{
		$orderId = intval($fields['ORDER_ID']);

		$orderClassName = $registry->getOrderClassName();
		if ($order = $orderClassName::load($orderId))
		{
			/** @var SaleBasket $basket */
			if ($basket = $order->getBasket())
			{
				$basket->addItem($item);

				/** @var SaleShipmentCollection $shipmentCollection */
				if (!$shipmentCollection = $order->getShipmentCollection())
				{
					throw new MainObjectNotFoundException('Entity "ShipmentCollection" not found');
				}

				/** @var OrderCompatibility $orderCompatibilityClassName */
				$orderCompatibilityClassName = static::getOrderCompatibilityClassName();
				$orderCompatibilityClassName::createShipmentFromShipmentSystem($shipmentCollection);

				/** @var SaleResult $r */
				$r = static::syncShipmentCollectionAndBasket($shipmentCollection, $basket);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
					return $result;
				}

				$r = $order->refreshData(array("PRICE_DELIVERY"));
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
					return $result;
				}

				$r = $order->doFinalAction(true);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
					return $result;
				}
			}

		}
	}

	if ($order !== null)
	{
		/** @var SaleShipmentCollection $shipmentCollection */
		if ($shipmentCollection = $order->getShipmentCollection())
		{
			if (count($shipmentCollection) == 2 && $shipmentCollection->isExistsSystemShipment())
			{
				/** @var SaleShipment $shipment */
				foreach ($shipmentCollection as $shipment)
				{
					if ($shipment->isSystem() || $shipment->isShipped())
						continue;

					/** @var SaleShipment $systemShipment */
					$systemShipment = $shipmentCollection->getSystemShipment();

					/** @var SaleShipmentItemCollection $systemShipmentItemCollection */
					$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();

					/** @var SaleShipmentItem $systemShipmentItem */
					if (!$systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($item->getBasketCode()))
						continue;

					/** @var SaleShipmentItemCollection $shipmentItemCollection */
					if (!$shipmentItemCollection = $shipment->getShipmentItemCollection())
						continue;


					/** @var SaleShipmentItem $shipmentItem */
					if (!$shipmentItem = $shipmentItemCollection->getItemByBasketCode($item->getBasketCode()))
						continue;


					if ($systemShipmentItem->getQuantity() > 0)
					{
						$r = $shipmentItem->setQuantity(($shipmentItem->getQuantity() + $systemShipmentItem->getQuantity()));
						if (!$r->isSuccess())
						{
							$result->addErrors($r->getErrors());
						}
					}
				}
			}
		}

		if (!$result->isSuccess())
		{
			return $result;
		}

		$r = $order->save();
	}
	else
	{
		if (!$result->isSuccess())
		{
			return $result;
		}

		$r = $basket->save();
	}

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

	return $result;
}