Битрикс-разработчик Вероника Малышева

Работа с заказами битрикс api d7

Работа с заказами битрикс api d7

if (array_key_exists('site_id', $_REQUEST) && is_string($_REQUEST['site_id'])){
   $siteId = $_REQUEST['site_id'];
   if($siteId !== '' && preg_match('/^[a-z0-9_]{2}$/i', $siteId) === 1){
      define('SITE_ID', $siteId);
   }   
}
else{
   $siteId = 's1';
}

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

use \Bitrix\Main,   
    \Bitrix\Main\Localization\Loc as Loc,    
    Bitrix\Main\Loader,
    Bitrix\Main\Application,
   Bitrix\Currency,    
    Bitrix\Sale\Delivery,
    Bitrix\Sale\PaySystem,
    Bitrix\Sale,
    Bitrix\Sale\Order,
    Bitrix\Sale\Affiliate,
    Bitrix\Sale\DiscountCouponsManager,
    Bitrix\Main\Context;
получаем текущую корзину и создаем заказ
$basket = Sale\Basket::loadItemsForFUser(\CSaleBasket::GetBasketUserID(), $siteId)->getOrderableItems();
$currencyCode = Option::get('sale', 'default_currency', 'RUB');
DiscountCouponsManager::init();

$order = Order::create($siteId, $arUser["USER_ID"]);
$order->setPersonTypeId($payType);
$order->setBasket($basket);

доставка "без доставки"
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$service = Delivery\Services\Manager::getById(Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId());
$shipment->setFields(array(
    'DELIVERY_ID' => $service['ID'],
    'DELIVERY_NAME' => $service['NAME'],                         
));
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($order->getBasket() as $item)
{
    $shipmentItem = $shipmentItemCollection->createItem($item);
    $shipmentItem->setQuantity($item->getQuantity());
}
оплата
$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem();
$paySystemService = PaySystem\Manager::getObjectById($paySystemId); //$paySystemId;  - ИД оплаты
$payment->setFields(array(
    'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"),
    'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"),
    'SUM'=> $order->getPrice()
));

для crm - ответственный
$order->setFields(array(
   'RESPONSIBLE_ID' => MANAGER_ID_ORDER
));
Свойства заказа
Функция, которая возвращает по коду свойство
function GetPropertyByCode($propertyCollection, $code)  {
    foreach ($propertyCollection as $property){
        if($property->getField('CODE') == $code)
            return $property;
    }
}
Получаем и устанавливаем свойства заказа
$propertyCollection = $order->getPropertyCollection();

$property = $propertyCollection->getProfileName();
$property->setField('VALUE', $fio);

$property = $propertyCollection->getUserEmail();
$property->setField('VALUE', $email);

$property = $propertyCollection->getPhone();
$property->setField('VALUE', $phone);


$property = GetPropertyByCode($propertyCollection, 'CANCEL_UNPAID');
$property->setValue('Y');
Добавляем валюту, комментарии пользователя, комментарии менеджера, аффилиата и сохранаяем
$order->setField('CURRENCY', $currencyCode);
$order->setField('USER_DESCRIPTION', $userDescription);
$order->setField('COMMENTS', $managerComments);   
$order->setField('AFFILIATE_ID', $affiliateId);
$order->doFinalAction(true);
$order->save();

$orderId = $order->GetId();
Манипуляции после создания заказа
if($orderId > 0){                     
   
   //добавляем связь с контактом
   if($arUser["CONTACT_ID"]!=false){
      //\Bitrix\Crm\Binding\OrderContactCompanyTable::bindContactIDs($orderId, array($arUser["CONTACT_ID"]));
      \Bitrix\Crm\Binding\OrderContactCompanyTable::bindContacts($orderId, array(array("ENTITY_ID"=>$arUser["CONTACT_ID"],"IS_PRIMARY"=>"Y")));
   }
        if($bPayed == true){
      //устанавливаем флаг оплаты
              $payment->setPaid("Y");
            //$order->setField('PAYED', 'Y');      //для интернет-магазинов без crm
      $order->setField('STATUS_ID', ORDER_STATUS_PAYED); //для crm
           $order->save();
        }
   elseif (!empty($paySystemService)) {
      //получаем форму оплаты
                 $arPaySysAction = $paySystemService->getFieldsValues();
                if ($paySystemService->getField('NEW_WINDOW') === 'N' || $paySystemService->getField('ID') == PaySystem\Manager::getInnerPaySystemId()){
                     $initResult = $paySystemService->initiatePay($payment, null, PaySystem\BaseServiceHandler::STRING);
                     if ($initResult->isSuccess())
                        $arPaySysAction['BUFFERED_OUTPUT'] = $initResult->getTemplate(); // получаем форму оплаты из обработчика
                     else
                        $arPaySysAction["ERROR"] = $initResult->getErrorMessages();
                 }
        }
}