• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitemstorecollection.php
  • Класс: BitrixSaleShipmentItemStoreCollection
  • Вызов: ShipmentItemStoreCollection::syncQuantityAfterModify
protected function syncQuantityAfterModify(ShipmentItem $shipmentItem, $oldValue = null, $value = null)
{
	if (!($basketItem = $shipmentItem->getBasketItem()) || $basketItem->getId() == 0)
		return new Result();

	$result = new Result();

	$deltaQuantity = $value - $oldValue;

	if ($deltaQuantity >= 0)
		return $result;

	$barcodeList = array();
	/** @var ShipmentItemStore $shipmentItemStore */
	foreach($this->collection as $shipmentItemStore)
	{
		if (strval($shipmentItemStore->getBarcode()) == "")
		{
			$barcodeList[$shipmentItemStore->getId()] = $shipmentItemStore;
		}
	}

	if ($basketItem->isBarcodeMulti())
	{
		if (count($barcodeList) < $oldValue)
		{
			return $result;
		}

		$oldItemsList = array();

		/** @var ShipmentItemStore $shipmentItemStore */
		foreach ($this->collection as $shipmentItemStore)
		{
			$oldItemsList[$shipmentItemStore->getId()] = $shipmentItemStore;
		}

		$cutBarcodeList = array_slice($barcodeList, 0, $deltaQuantity, true);
		if (!empty($oldItemsList) && is_array($oldItemsList))
		{
			/**
			 * @var int $oldItemId
			 * @var ShipmentItemStore $oldItem
			 */
			foreach($oldItemsList as $oldItemId => $oldItem)
			{
				if (!isset($cutBarcodeList[$oldItemId]))
				{
					$oldItem->delete();
				}
			}
		}
	}
	elseif (count($barcodeList) == 1)
	{
		/** @var ShipmentItemStore $barcodeItem */
		$barcodeItem = reset($barcodeList);

		if ($barcodeItem->getQuantity() < $oldValue)
			return new Result();

		/** @var Result $r */
		$r = $barcodeItem->setField(
				"QUANTITY",
				$barcodeItem->getField("QUANTITY") + $deltaQuantity
		);

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

	return $result;
}