• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/reservation/availablequantitycalculator.php
  • Класс: BitrixSaleReservationAvailableQuantityCalculator
  • Вызов: AvailableQuantityCalculator::getPreparedReservationHistory
private function getPreparedReservationHistory(): array
{
	$reverseHistory = array_reverse($this->reservationHistory);
	$negativeReservations = [];

	$tmp = [];
	foreach ($reverseHistory as $item)
	{
		$storeId = $item['storeId'];
		$productId = $item['productId'];
		$basketId = $item['basketId'];
		$quantity = $item['quantity'];

		$key = join("_", [
			$storeId,
			$productId,
			$basketId,
		]);

		if ($quantity < 0.0)
		{
			$negativeReservations[$key] = $negativeReservations[$key] ?? 0.0;
			$negativeReservations[$key] += abs($quantity);
			continue;
		}
		elseif (isset($negativeReservations[$key]))
		{
			$negativeQuantity = $negativeReservations[$key];
			if ($negativeQuantity >= $quantity)
			{
				$negativeQuantity -= $quantity;
				if ($negativeQuantity > 0)
				{
					$negativeReservations[$key] = $negativeQuantity;
				}
				else
				{
					unset($negativeReservations[$key]);
				}
				continue;
			}
			else
			{
				$item['quantity'] -= $negativeQuantity;
				unset($negativeReservations[$key]);
			}
		}

		$tmp[] = $item;
	}

	return array_reverse($tmp);
}