• Модуль: salescenter
  • Путь к файлу: ~/bitrix/modules/salescenter/lib/controller/order.php
  • Класс: BitrixSalesCenterControllerOrder
  • Вызов: Order::fillResultBasket
private function fillResultBasket(array $formBasket, SaleOrder $order): array
{
	$basket = $order->getBasket();
	$discount = $order->getDiscount();
	$discountResult = $discount->getApplyResult(true);
	$discountBasket = $discountResult['RESULT']['BASKET'];
	$discountList = $discountResult['DISCOUNT_LIST'];

	$productIds = array_map(static function ($basketItem) {
		return $basketItem->getProductId();
	}, $basket->getBasketItems());

	$measureRatios = BitrixCatalogMeasureRatioTable::getCurrentRatio($productIds);

	$resultBasket = [];

	foreach ($formBasket as $index => $item)
	{
		$basketItem = $basket->getItemByXmlId($item['innerId']);
		if (!$basketItem)
		{
			$resultBasket[$item['sort']] = $item;
			continue;
		}

		$errors = [];
		if (!$basketItem->getField('NAME'))
		{
			$errors[] = 'SALE_BASKET_ITEM_NAME';
		}

		$code = $basketItem->getBasketCode();
		$sort = $basketItem->getField('SORT');
		$productId = $basketItem->getProductId();

		$preparedItem = [
			'code' => $code,
			'productId' => $productId,
			'sort' => $sort,
			'name' => $basketItem->getField('NAME'),
			'basePrice' => SalePriceMaths::roundPrecision($basketItem->getBasePrice()),
			'price' => SalePriceMaths::roundPrecision($basketItem->getPrice()),
			'priceExclusive' => SalePriceMaths::roundPrecision($basketItem->getPrice()),
			'quantity' => $item['quantity'],
			'module' => $basketItem->getField('MODULE'),
			'formattedPrice' => SaleFormatCurrency($basketItem->getPrice(), $order->getCurrency(), true),
			'encodedFields' => MainWebJson::encode($basketItem->getFieldValues()),
			'errors' => $errors,
			'discountInfos' => [],
			'measureCode' => $basketItem->getField('MEASURE_CODE'),
			'measureName' => $basketItem->getField('MEASURE_NAME'),
			'measureRatio' => (float)($measureRatios[(int)$productId]),
		];

		$preparedItem = array_merge($item, $preparedItem);

		if (!empty($discountBasket[$code]) && is_array($discountBasket[$code]))
		{
			foreach ($discountBasket[$code] as $discountBasketItem)
			{
				$discountId = $discountBasketItem['DISCOUNT_ID'];
				$discount = $discountList[$discountId];
				if (!empty($discount))
				{
					$preparedItem['discountInfos'][] = [
						'name' => $discount['NAME'],
						'editPageUrl' => str_replace(
							[".php","/bitrix/admin/"],
							["/", "/shop/settings/"],
							$discount['EDIT_PAGE_URL']
						),
					];
				}
			}
		}

		if (
			!isset($preparedItem['discountType'])
			&& $basketItem->isCustomPrice()
			&& (int)$preparedItem['discount'] === 0
		)
		{
			$preparedItem['discountType'] = CrmDiscount::MONETARY;
		}

		if (
			!empty($basketItem->getDiscountPrice())
			&& $basketItem->getBasePrice() > 0
		)
		{
			if (empty($preparedItem['discountType']))
			{
				$preparedItem['discountType'] = CrmDiscount::PERCENTAGE;
			}

			if (empty($preparedItem['showDiscount']))
			{
				$preparedItem['showDiscount'] = 'Y';
			}

			$preparedItem['discount'] = $basketItem->getDiscountPrice();
			$preparedItem['discountRate'] = roundEx($basketItem->getDiscountPrice() / $basketItem->getBasePrice() * 100, 2);
		}
		else
		{
			$preparedItem['discount'] = 0;
		}

		$key = $preparedItem['innerId'] ?? $preparedItem['code'];
		$resultBasket[$key] = $preparedItem;
	}

	sort($resultBasket);

	return $resultBasket;
}