Bitrix D7 — обновление и пересчёт корзины (количество, цена, купон)

Как изменить количество товара в корзине, применить купон и пересчитать корзину в Bitrix D7
use Bitrix\Main\Loader;
use Bitrix\Sale\Basket;

Loader::includeModule('sale');
Loader::includeModule('catalog');

$siteId = \Bitrix\Main\Context::getCurrent()->getSite();
$fUserId = \Bitrix\Sale\Fuser::getId();

$basket = Basket::loadItemsForFUser($fUserId, $siteId);

// Меняем количество позиции с productId=123
foreach ($basket as $basketItem) {
  if ((int)$basketItem->getProductId() === 123) {
    $basketItem->setField('QUANTITY', 3);
    // Можно менять цену вручную, если разрешено:
    // $basketItem->setField('PRICE', 950);
  }
}

// Применяем купон (если модуль скидок настроен)
\Bitrix\Sale\DiscountCouponsManager::init();
\Bitrix\Sale\DiscountCouponsManager::add('SALE10'); // пример

$basket->save();

// Пересчёт произойдёт при формировании заказа или вручную через Discount::build
echo 'Корзина обновлена';