• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/shipment.php
  • Класс: BitrixSaleShipment
  • Вызов: Shipment::syncQuantityAfterModify
protected function syncQuantityAfterModify(BasketItem $basketItem, $value = null, $oldValue = null)
{
	$result = new Result();

	/** @var ShipmentItemCollection $shipmentItemCollection */
	$shipmentItemCollection = $this->getShipmentItemCollection();

	$shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode());

	if ($value === 0)
	{
		if ($shipmentItem !== null)
		{
			$shipmentItem->setFieldNoDemand('QUANTITY', 0);
		}

		return $result;
	}

	if ($shipmentItem === null)
	{
		$shipmentItem = $shipmentItemCollection->createItem($basketItem);
	}

	$deltaQuantity = $value - $oldValue;

	if ($deltaQuantity > 0)     // plus
	{
		$shipmentItem->setFieldNoDemand(
			"QUANTITY",
			$shipmentItem->getField("QUANTITY") + $deltaQuantity
		);

		if (
			Configuration::isEnableAutomaticReservation()
			&& $this->needReservation()
		)
		{
			InternalsCatalogProvider::tryReserveShipmentItem($shipmentItem);
		}
	}
	else        // minus
	{
		if (floatval($shipmentItem->getField("QUANTITY")) <= 0)
		{
			return new Result();
		}

		if ($value != 0 && roundEx($shipmentItem->getField("QUANTITY"), SALE_VALUE_PRECISION) < roundEx(-$deltaQuantity, SALE_VALUE_PRECISION))
		{
			$result->addError(
				new ResultError(
					str_replace(
						array("#NAME#", "#QUANTITY#", "#DELTA_QUANTITY#"),
						array($basketItem->getField("NAME"), $shipmentItem->getField("QUANTITY"), abs($deltaQuantity)),
						Loc::getMessage('SALE_SHIPMENT_SYSTEM_QUANTITY_ERROR')
					),
					'SALE_SHIPMENT_SYSTEM_QUANTITY_ERROR'
				)
			);
			return $result;
		}

		if ($value > 0)
		{
			$shipmentItem->setFieldNoDemand(
				"QUANTITY",
				$shipmentItem->getField("QUANTITY") + $deltaQuantity
			);

			if (
				Configuration::isEnableAutomaticReservation()
				&& $this->needReservation()
			)
			{
				InternalsCatalogProvider::tryReserveShipmentItem($shipmentItem);
			}
		}

	}

	return $result;
}