Answer the question
In order to leave comments, you need to log in
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
Если вы самостоятельно создаете заказ, после чего прикрепляете к нему товары из корзины, то и сделайте отправку письма не после создания заказа (Add), а уже после того, как привяжете к нему товары. Мне кажется, это более простой способ, чем предварительно получать записи корзины и делать расчет стоимости. Кроме того, после DoSaveOrderBasket у вас уже однозначно в заказе будет действительная стоимость заказа.
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 questionAsk a Question
731 491 924 answers to any question