• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/shipmentrules.php
  • Класс: BitrixSaleInternalsShipmentRules
  • Вызов: ShipmentRules::saveRules
static function saveRules(array $rules, array $context)
{
	$result = new SaleResult();
	$shipProductsList = array();

	foreach ($rules as $ruleData)
	{
		if (empty($ruleData['ACTION']))
		{
			continue;
		}

		foreach ($ruleData['ACTION'] as $action => $quantityItem)
		{
			if (is_array($quantityItem))
			{
				$quantity = $quantityItem['QUANTITY'];
				$quantityByStore = $quantityItem['QUANTITY_BY_STORE'] ?? 0;
			}
			else
			{
				$quantity = $quantityItem;
				$quantityByStore = [];
			}

			if ($quantity == 0)
			{
				continue;
			}

			$fields = $ruleData;
			$fields['QUANTITY'] = $quantity;
			$fields['QUANTITY_BY_STORE'] = $quantityByStore;
			unset($fields['ACTION']);

			if ($action === PoolQuantity::POOL_QUANTITY_TYPE)
			{
				$shipProductsList[] = $fields;
			}
			elseif ($action === PoolQuantity::POOL_RESERVE_TYPE)
			{
				$reserveProductsList[] = $fields;
			}
		}
	}

	if (!empty($reserveProductsList))
	{
		if (self::isHasDoubleBasketItems($reserveProductsList))
		{
			// each item is processed separately so that the number of identical basket items is not summed up.
			foreach ($reserveProductsList as $reserveProductData)
			{
				$creator = SaleInternalsProviderCreator::create($context);
				$creator->addProductData($reserveProductData);
				$r = $creator->reserve();
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}
			}
		}
		else
		{
			$creator = SaleInternalsProviderCreator::create($context);
			foreach ($reserveProductsList as $reserveProductData)
			{
				$creator->addProductData($reserveProductData);
			}

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

	if (!empty($shipProductsList))
	{
		$creator = SaleInternalsProviderCreator::create($context);
		foreach ($shipProductsList as $shipProductData)
		{
			$creator->addProductData($shipProductData);
		}

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

		if ($r->hasWarnings())
		{
			$result->addWarnings($r->getWarnings());
		}

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


	return $result;
}