//название товара не пишем
Bitrix\Main\Loader::includeModule("catalog");
$fields = [
'PRODUCT_ID' => $item[offer_id], // ID товара, обязательно
'QUANTITY' => $item[quantity],
'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => Bitrix\Main\Context::getCurrent()->getSite(),
'PRICE' => $item[price], //твоя кастомная цена
'CUSTOM_PRICE' => 'Y',
];
$r = Bitrix\Catalog\Product\Basket::addProduct($fields);
if (!$r->isSuccess()) {
var_dump($r->getErrorMessages());
}Я так понимаю, что вся загвоздка состоит в том, что у вас нет четкого алгоритма - как применять скидку и вы тупо рассчитываете какую то сумму, которая должна уменьшить общую стоимость всех товаров к покупке?
и заново добавляем товары в корзину кодом:
'PRODUCT_ID' => $item[offer_id], // ID товара, обязательно
...
'PRICE' => $item[price], //твоя кастомная ценанадо взять общую сумму и вычесть из нее сумму скидки
и раскидать на все, либо один товар, в зависимости что хотите увидеть в админке.
\Bitrix\Main\Loader::includeModule('sale');
$sCoupon = $_REQUEST['COUPON'];
\Bitrix\Sale\DiscountCouponsManager::add($sCoupon);
$oBasket = \Bitrix\Sale\Basket::loadItemsForFUser(
\Bitrix\Sale\Fuser::getId(),
\Bitrix\Main\Context::getCurrent()->getSite()
);
$oDiscounts = \Bitrix\Sale\Discount::loadByBasket($oBasket);
$oBasket->refreshData([ 'PRICE' , 'COUPONS']);
$oDiscounts->calculate();
$result = $oDiscounts->getApplyResult();
$oBasket->save();