@PaulTes

С помощью какого метода в битриксе можно получить стоимость заказа, до того как он оформлен, на основании списка товаров которые в него будут входить?

Я оформляю заказ методом CSaleOrder::Add на оформление заказа завязана отправка письма и PRICE в этом письме равен 0, т.к. заранее я его не указываю, а его расчитывает битрикс после того как я прикрепляю корзину к заказу методом CSaleBasket::DoSaveOrderBasket. Как можно получить стоимость корзины до создания заказа?
  • Вопрос задан
  • 2667 просмотров
Решения вопроса 1
workDNK
@workDNK
Разработчик сайтов на 1С-Битрикс
Если вы самостоятельно создаете заказ, после чего прикрепляете к нему товары из корзины, то и сделайте отправку письма не после создания заказа (Add), а уже после того, как привяжете к нему товары. Мне кажется, это более простой способ, чем предварительно получать записи корзины и делать расчет стоимости. Кроме того, после DoSaveOrderBasket у вас уже однозначно в заказе будет действительная стоимость заказа.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@PaulTes Автор вопроса
Решил проблему используя D7.

//Формируем массив товаров корзины
        $cartArray = $this->parser->getCart();

        if (empty($cartArray)) {
            throw new Exception('MSHOP_ERROR_EMPTY_CART');
        }

        $basket = Basket::create(SITE_ID);
        foreach($cartArray as $item_id => $quantity) {
            $item = $basket->createItem('catalog', $item_id);
            $item->setFields([
                'QUANTITY' => (int)$quantity,
                'CURRENCY' => CurrencyManager::getBaseCurrency(),
                'LID' => SITE_ID,
                'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
            ]);
        }

        $order = Order::create(SITE_ID, $this->ownerId);
        $order->setBasket($basket);
        $order->setFields([
            "PERSON_TYPE_ID" => $this->payerType,
            "CURRENCY" => $this->getBaseCurrency(),
            "USER_DESCRIPTION" => $this->parser->getComment()
        ]);

        //Сохраняем информацию о методе оплаты
        $sum = $order->getPrice();
        $service = PaySystemManager::getObjectById($this->parser->getPaymentMethodId());
        /**@var Payment $payment*/
        $payment = $order->getPaymentCollection()->createItem($service);
        $payment->setFields(['SUM' => $sum]);

        //Сохраняем свойства заказа
        $collection = $order->getPropertyCollection();
        $parsedValues = $this->parser->getFields();

        /**@var PropertyValue $property*/
        foreach($collection as $property){
            if ($property->getPersonTypeId() == $this->payerType){

                $fieldName = OrderPropertiesHelper::getField($property->getField('CODE'));
                $value = $parsedValues[$fieldName];

                if (!empty($value)) {
                    $property->setValue($value);
                }
            }
        }

        //Выбираем способ доставки
        $delivery = DeliveryManager::getObjectById(20);
        $shipment = $order->getShipmentCollection()->createItem($delivery);
        $shipment->setFields(array(
            'DELIVERY_ID' => $delivery->getId(),
            'DELIVERY_NAME' => $delivery->getName(),
        ));

        $order->save();

        //Костыль для корректного отображения выбранного способа оплаты, связан с тем что в новом апи возможно множество платежных систем в одном заказе а в старом нет.
        if ($order->getId()){
            $orderStore = new CSaleOrder();

            $fields = $order->getFields()->getValues();
            $fields['PAY_SYSTEM_ID'] = $payment->getPaymentSystemId();
            $orderStore->Update($order->getId(), $fields);
        }
Ответ написан
Ваш ответ на вопрос

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

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