Битрикс: Создание заказа из xml через D7

390
01 сентября 2017, 23:59

добрый день. Импортируя заказы через xml, столкнулся с проблемой: если добавляю товары - заказ создается, товары тоже попадают, но отваливаются отгрузки и оплаты. Если закомментировать код добавления товара, то отгрузки с оплатами встают как надо.  Чую проблема в задании свойств добавляемого товара, но не могу понять как надо сделать...

Подскажите, кто сталкивался, что я делаю не так? Заранее благодарен

Пользовался следующими статьями: https://github.com/SidiGi/bitrix-info/wiki/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0...

https://mrcappuccino.ru/blog/post/work-with-order-bitrix-d7

https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=8409

вот код:

<?php 
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

    use \Bitrix\Main,
        \Bitrix\Main\Localization\Loc as Loc,
        Bitrix\Main\Loader,
        Bitrix\Main\Config\Option,
        Bitrix\Sale\Delivery,
        Bitrix\Sale\PaySystem,
        Bitrix\Sale,
        Bitrix\Sale\Order,
        Bitrix\Sale\DiscountCouponsManager,
        Bitrix\Main\Context;

    if (!Loader::IncludeModule('sale'))
        die();
    if (!Loader::IncludeModule('iblock'))
        die();

if ($_POST['pass']=='' && $_POST['login']=='shop_order') {  # задумать пароль
    ///fields
    $order_status = 0; ///выставляемый статус заказа. т.е. при 0 - у нас все ОК, 1- "Загружен с ошибками", что-то иное - по усмотрению
    $shippingId = 2;
    $paymentId = 1; # т.к. эти два параметра будут передаваться с shop.ru(константно причем), а, следовательно, отличаться от имеющихся тут, укажем их вручную: доставка курьером и оплата наликом ему же

    function getPropertyByCode($propertyCollection, $code)  {
        foreach ($propertyCollection as $property)
        {
            if($property->getField('CODE') == $code)
                return $property;
        }
    }
    $siteId = \Bitrix\Main\Context::getCurrent()->getSite();
    /* пример входного xml
    <?xml version="1.0" encoding="UTF-8"?><orders><order>
                        <order_code>e_29680</order_code>
                        <name>Евгений тестовыйЗаказ не_звоните</name>
                        <phone>+7 (000) 000-00-00</phone>
                        <email>my@mail.ru</email>
                        <address>Москва, ул. Пушкина, кв. Колотушкина</address>
                        <comment>Оплата наличными</comment>
                        <shipping_id>1</shipping_id>
                        <shipping_cost>0</shipping_cost>
                        <payment_id>1</payment_id>
                        <discount>0</discount>
                        <total_cost>1055</total_cost>
                        <order_time>1504152151</order_time>
                        <products>
                            <product>
                                <code>eap211957</code>
                                <name>product_name</name>
                                <amount>5.00</amount>
                                <price>211</price>
                                <barcode>1234567</barcode>
                            </product>
                            </products></order></orders>
    */
  $orderxml = new SimpleXMLElement($_POST['data']);
  $currencyCode = Option::get('sale', 'default_currency', 'RUB');
  DiscountCouponsManager::init();

    $basket = Bitrix\Sale\Basket::create($siteId);
    foreach ($orderxml->order->products->product as $product) {
        #есть у нас штрих $product['barcode'], по нему ищем предложение, на основе которого уже достаем продукт
        if ($product->barcode=='') {
      #send angry mail
        }else {
            $result=CIBlockElement::GetList([],["IBLOCK_ID"=>3,"PROPERTY_BARCODE"=>$product->barcode,false,false,['ID']  ]);
            if ($result->SelectedRowsCount()  ) {
                $offer = $result->fetch(); ///беру только первое попавшееся предложение
                $productArr = CCatalogSku::GetProductInfo($offer['ID']);
                if ($productArr) {
                    $productID = $productArr['ID'];

                    # Если создается товар, то не добавляются отгрузки и оплаты !!!!
                   $item = $basket->createItem("catalog", $productID);
                    $item->setFields(array(
                                    'QUANTITY' => $product->amount,
                                    'CURRENCY' => $currencyCode,
                                    'LID' => $siteId,
                                    'NAME' => $product->name,
                                    'PRICE' => $product->price,
                                ));
                } else {
                    $order_status = 1;
                }
            } else {
                $order_status = 1;
            }
        }   
    }

   $order = Order::create($siteId, \CSaleUser::GetAnonymousUserID());                            
    $order->setPersonTypeId(1); # физ.лицо
    $order->setField('CURRENCY', $currencyCode);
        $order->setField('USER_DESCRIPTION', $orderxml->order[0]->comment); // Устанавливаем поля комментария покупателя

     $order->setBasket($basket);
     $order->save();


      #отгрузка
    $shipmentCollection = $order->getShipmentCollection();
    $shipment = $shipmentCollection->createItem(
            Bitrix\Sale\Delivery\Services\Manager::getObjectById($shippingId)
        );
    $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($paymentId)
        );    
    $payment->setField("SUM", $order->getPrice());
    $payment->setField("CURRENCY", $order->getCurrency());

    # Устанавливаем свойства
    $propertyCollection = $order->getPropertyCollection();
    $phoneProp = $propertyCollection->getPhone();
    $phoneProp->setValue($orderxml->order[0]->phone);
    $nameProp = $propertyCollection->getPayerName();
    $nameProp->setValue($orderxml->order[0]->name);
    $emailProperty = getPropertyByCode($propertyCollection, 'EMAIL');
    $emailProperty->setValue($orderxml->order[0]->email);

    $order->doFinalAction(true);
    $result = $order->save();
    if (!$result->isSuccess()) {
            //$result->getErrors();
    }
        $orderId = $order->GetId();
        ob_start();
        var_dump($_POST);
        $result = ob_get_clean();
        ob_start();
        var_dump($_POST['data']);
        $result2 = ob_get_clean();

        ///return $result;
        $to     = '';
        $subject = 'intercept order';
        $headers = 'From: request@sender.com' . "\r\n" .
            'Reply-To: request@sender.com' . "\r\n" .
            'X-Mailer: PHP/' . phpversion();
        $message = $result.' + orderId = '.$orderId;
        mail($to, $subject, $message, $headers); 
}

В конце кода мне на почту засылается письмо с прилетевшей xml-кой и айдишником создавшегося заказа. Так вот, при добавлении товара это письмо тоже не прилетает

READ ALSO
Оптимизация работы с БД

Оптимизация работы с БД

Есть таблицы товаров, их свойств и их значенийЗначения хранятся в разных таблицах, в зависимости от их типа

284
Сетка QTreeView

Сетка QTreeView

У QTreeView него нет метода аналогичного QTableView::setShowGridИ как теперь отобразить сетку?

401
С++ Как добавить программу в автозагрузку без прав администратора

С++ Как добавить программу в автозагрузку без прав администратора

Написал я маленькую программу, которая в свою очередь запускает другую программуИ мне нужно добавить первую программу в автозагрузу желательно...

459