- Модуль: 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;
}