Как расчитать цену по купону?

Нужен хелп, куда копать.

Есть на входе ID клиента, ID доставки, список товаров.
Нужно расчитать стоимость товаров со скидкой.

Я так понял что просто через CCatalogProduct::GetOptimalPrice не выйдет, хотя вроде работало.
CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID,   $promocode);


начинаю создвать корзину и наполнять товарами

$order = Order::create($siteId, $userID);
    $order->setPersonTypeId(4);
    //$order->setField('PRICE_DELIVERY', 770);
    $order->setField('CURRENCY', $currencyCode);

    // содаем корзину
    $basket = Bitrix\Sale\Basket::create($siteId);
    foreach ($products as $k => $product) {
        $optimalPrice = CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID,
            $promocode);
        $item = $basket->createItem('catalog', $product['id']);

        $item->setFields([
            'QUANTITY' => $product['quantity'],
            'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
            'LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
            'PRICE' => $optimalPrice['PRICE']['PRICE'], // цена
            'CUSTOM_PRICE' => 'Y',
            'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
        ]);

        // получаем цены доступные для группы 8
        $return_products[$k] = [
            "name" => $product['name'],
            "id" => $product['id'],
            "privateId" => $product['privateId'],
            "price" => $optimalPrice['PRICE']['PRICE'],
            "quantity" => $product['quantity'],
            "discount" => 0,
            "subtotal" => $optimalPrice['PRICE']['PRICE'] * $product['quantity']
        ];

    }
    $order->setBasket($basket);

    // Создаём одну отгрузку и устанавливаем способ доставки
    $shipmentCollection = $order->getShipmentCollection();
    $shipment = $shipmentCollection->createItem(
        \Bitrix\Sale\Delivery\Services\Manager::getObjectById($deliveryID)
    );
    $shipmentItemCollection = $shipment->getShipmentItemCollection();


    // инициирую и добавляю промокод
 /*   Bitrix\Sale\DiscountCouponsManager::init();
    Bitrix\Sale\DiscountCouponsManager::add($promocode);*/

    // наполняем корзину
    foreach ($order->getBasket() as $item) {
        $shipmentItem = $shipmentItemCollection->createItem($item);
        $shipmentItem->setQuantity($item->getQuantity());
    }

// Создаём оплату
    $paymentCollection = $order->getPaymentCollection();
    $payment = $paymentCollection->createItem();
    $paySystemService = PaySystem\Manager::getObjectById($paymentID);
    $payment->setFields(array(
        'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"),
        'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"),
    ));



    // применяем купон
   // Bitrix\Sale\DiscountCouponsManager::add('cupon');


// получаем объект скидок для корзины
    $oDiscounts = Bitrix\Sale\Discount::loadByBasket($basket);

// обновляем поля в корзине
    $basket->refreshData(['PRICE','COUPONS']);

// пересчёт скидок для корзины
    $oDiscounts->calculate();

// получаем результаты расчёта скидок для корзины
    $result = $oDiscounts->getApplyResult();


// хочу посмотреть товары со скидкой
    foreach ($basket as $basketItem) {
        echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . '  цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />';
    }

    /*

        \Bitrix\Sale\DiscountCouponsManager::init(
            \Bitrix\Sale\DiscountCouponsManager::MODE_ORDER,
            [
                "userId" => $order->getUserId(),
                "orderId" => $order->getId()
            ]
        );
        \Bitrix\Sale\DiscountCouponsManager::add('CUPON');
        $discounts = $order->getDiscount();
        $discounts->calculate();*/

    $order->doFinalAction(true);

Но скидка не встает, при чем если на этот же товар через сайт добавить купон, то скидка всатет
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы