Как применить купон в оформлении заказа?

есть некий хардкод который превращает данные из формы в заказ товара.
Все работает и всех все устраивает.
Нужно к нему добавить возможность добавление купона.
Я добавил следующее:
//купон
        $coupon = "testtest";
        \Bitrix\Sale\DiscountCouponsManager::add($coupon);
        $oBasket = \Bitrix\Sale\Basket::loadItemsForFUser(
            \Bitrix\Sale\Fuser::getId(),
            \Bitrix\Main\Context::getCurrent()->getSite()
        );
        $discounts = $order->getDiscount();
        $discounts->calculate();
        // // купон


Не могу понять почему не добавляет.

Вот весь код
$formId = 10;
        if ($WEB_FORM_ID != $formId) return;
        $orderIdStr = trim($arrVALUES['form_hidden_52']);
        if (!$orderIdStr) return;


        $matches = null;
        $pattern = '/\\[(\\d+)\\].*/';
        $res = preg_match($pattern, $orderIdStr, $matches);

        if (!$matches[1]) return;

        \Bitrix\Main\Loader::includeModule('sale');
        \Bitrix\Main\Loader::includeModule('catalog');
        \Bitrix\Main\Loader::includeModule('iblock');


        $productId = $matches[1];
        $name = $arrVALUES['form_text_49'];
        $phone = $arrVALUES['form_text_50'];
        $email = $arrVALUES['form_email_51'];
        $location = $arrVALUES['LOCATION'];
        $location_id = $arrVALUES['LOCATION_ID'];

        global $siteId;

        $prod = \Bitrix\Iblock\ElementTable::getList(array(
            'filter' => ['ID' => $productId],
            'select' => ['NAME'],
        ))->Fetch();

        $product = [
            'NAME' => $prod['NAME'],
            'CURRENCY' => 'RUB',
            'QUANTITY' => 1,
            'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider',
        ];

        $basket = Bitrix\Sale\Basket::create($siteId);

        $item = $basket->createItem("catalog", $productId);
        $item->setFields($product);

        $currencyCode = \Bitrix\Currency\CurrencyManager::getBaseCurrency();

        if ($arFields['USER_AUTH'] == "'Y'") {
            $registeredUserID = $arFields['USER_ID'];
        } else {
            $registeredUserID = Site::createUser([
                'NAME' => $name,
                'PERSONAL_PHONE' => $phone,
                'EMAIL' => $email,
            ]);
        }
        if (!$registeredUserID) {
            array("STATUS" => "ERROR", "MESSAGE" => "Ошибка при оформлении заказа");
        }
        $order = \Bitrix\Sale\Order::create($siteId, $registeredUserID);


        $order->setPersonTypeId(1);
        $order->setBasket($basket);

        $order->setField('CURRENCY', $currencyCode);
        $order->setField('STATUS_ID', 'PR');  //предзаказ
        $order->setField('COMMENTS', 'ГОРОД ЗАКАЗА: (' . $location_id . ")" . $location);

        // Устанавливаем свойства
        $info = ['YOUR_FAMILY' => $name, 'YOUR_PHONE' => $phone, 'YOUR_EMAIL' => $email, 'LOCATION' => $location];
        $c = $order->getPropertyCollection();
        foreach ($c->getGroups() as $g) foreach ($c->getGroupProperties($g['ID']) as $p) {
            $a = $p->getProperty()['CODE'];
            if (isset($info[$a])) $p->setValue($info[$a]);
        }

        $shipmentCollection = $order->getShipmentCollection();
        $shipment = $shipmentCollection->createItem(
            Bitrix\Sale\Delivery\Services\Manager::getObjectById(1)
        );


        $shipmentItemCollection = $shipment->getShipmentItemCollection();
        foreach ($basket as $basketItem) {
            $item = $shipmentItemCollection->createItem($basketItem);
            $item->setQuantity($basketItem->getQuantity());
        }


        $paymentCollection = $order->getPaymentCollection();
        $payment = $paymentCollection->createItem(
            Bitrix\Sale\PaySystem\Manager::getObjectById(6) //Банковской картой на сайте
        );

        $payment->setField("SUM", $order->getPrice());
        $payment->setField("CURRENCY", $order->getCurrency());

        //купон
        $coupon = "testtest";
        \Bitrix\Sale\DiscountCouponsManager::add($coupon);
        $oBasket = \Bitrix\Sale\Basket::loadItemsForFUser(
            \Bitrix\Sale\Fuser::getId(),
            \Bitrix\Main\Context::getCurrent()->getSite()
        );
        $discounts = $order->getDiscount();
        $discounts->calculate();
        // // купон


        $result = $order->save();
        global $APPLICATION;
        $APPLICATION->RestartBuffer();
        if ($result->getId()) {
            $accountNum = $order->getField("ACCOUNT_NUMBER");
            echo "Ваш заказ {$accountNum} оформлен";
        } else {
            echo 'Ошибка создания предзаказа';
        }
        die();
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
kikher
@kikher Автор вопроса
Вот блок купона заработал
//купон

        \Bitrix\Sale\DiscountCouponsManager::add($coupon);

        $discounts = $order->getDiscount();
        $discounts->setOrderRefresh(true);
        $discounts->calculate();
        $basket->refreshData(["PRICE", "COUPONS"]);
        $order->doFinalAction(true);

        // // купон
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@tgarl
Посмотрите пример добавления https://dev.1c-bitrix.ru/api_d7/bitrix/sale/classe..., думаю как раз под вашу задачу.

У вас же идет применение купона, без указания где, без пересчета, затем зачем-то получение нового объекта корзины текущего пользователя, которое нигде не используется. И проверьте купон-то рабочий, товар в корзине подходит под условия
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы