P
P
PaulTes2016-12-06 18:20:11
1C-Bitrix
PaulTes, 2016-12-06 18:20:11

What method can be used in Bitrix to get the cost of an order, before it is placed, based on the list of goods that will be included in it?

I place an order using the CSaleOrder::Add method. Sending a letter is tied to placing an order, and PRICE in this letter is 0, because I do not specify it in advance, but Bitrix calculates it after I attach the basket to the order using the CSaleBasket::DoSaveOrderBasket method. How can I get the value of a cart before creating an order?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Дмитрий Королев, 2016-12-06
@PaulTes

Если вы самостоятельно создаете заказ, после чего прикрепляете к нему товары из корзины, то и сделайте отправку письма не после создания заказа (Add), а уже после того, как привяжете к нему товары. Мне кажется, это более простой способ, чем предварительно получать записи корзины и делать расчет стоимости. Кроме того, после DoSaveOrderBasket у вас уже однозначно в заказе будет действительная стоимость заказа.

P
PaulTes, 2017-01-10
@PaulTes

Solved the problem using 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);
        }

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question