Recipes for work with orders

This section contains scripts for common tasks often found in work with orders

Get order props

<?php
\Bitrix\Main\Loader::includeModule('sale');

//get needed order properties
$db_vals = CSaleOrderPropsValue::GetList(
    array('SORT' => 'ASC'),
    array(
        'ORDER_ID' => $ORDER_ID,
        'CODE' => array(
            'PROP_CODE',
            'PROP_CODE_1',
        ),
    ),
    false,
    false,
    array(
        'VALUE',
        'CODE'
    )
);
while ($arVals = $db_vals->Fetch()) {

}

Copy order

This function shows how you can copy order by it’s ID. This function do NOT copies basket properties

<?php
/**
 * Make copy of order with $orderId. Increments value of COPIED_ORDERS_COUNT order property
 * @param $orderId
 */
function doCopyOrder($orderId)
{
    \Bitrix\Main\Loader::includeModule('sale');

    $arOrder = CSaleOrder::GetByID($orderId);

    $newOrderPrice = $arOrder['PRICE'];

    $arNewOrderFields = array(
        'LID' => $arOrder['LID'],
        'PERSON_TYPE_ID' => $arOrder['PERSON_TYPE_ID'],
        'PAYED' => 'N',
        'CANCELED' => 'N',
        'STATUS_ID' => 'N',
        'EMP_STATUS_ID' => 1,
        'PRICE_DELIVERY' => $arOrder['PRICE_DELIVERY'],
        'ALLOW_DELIVERY' => 'N',
        'PRICE' => round($newOrderPrice, 0, PHP_ROUND_HALF_DOWN),
        'CURRENCY' => $arOrder['CURRENCY'],
        'DISCOUNT_VALUE' => $arOrder['DISCOUNT_VALUE'],
        'USER_ID' => $arOrder['USER_ID'],
        'PAY_SYSTEM_ID' => $arOrder['PAY_SYSTEM_ID'],
        'DELIVERY_ID' => $arOrder['DELIVERY_ID'],
        'USER_DESCRIPTION' => $arOrder['USER_DESCRIPTION'],
        'ADDITIONAL_INFO' => $arOrder['ADDITIONAL_INFO'],
        'COMMENTS' => 'Order copy',
        'TAX_VALUE' => $arOrder['TAX_VALUE'],
        'AFFILIATE_ID' => $arOrder['AFFILIATE_ID'],
    );

    $newOrderId = CSaleOrder::Add($arNewOrderFields);

    if ($newOrderId) {
        //copy needed order properties
        $db_vals = CSaleOrderPropsValue::GetList(
            array('SORT' => 'ASC'),
            array('ORDER_ID' => $orderId),
            false,
            false,
            array()
        );
        while ($arVals = $db_vals->Fetch()) {
            unset($arVals['ID']);
            $arVals['ORDER_ID'] = $newOrderId;

            CSaleOrderPropsValue::Add($arVals);
        }

        //copy order basket items
        $dbBasket = CSaleBasket::GetList(
            array('ID' => 'ASC'),
            array('ORDER_ID' => $orderId),
            false,
            false,
            array(
                'SET_PARENT_ID', 'TYPE', 'ID',
                'PRODUCT_ID', 'PRODUCT_PRICE_ID', 'PRICE', 'CURRENCY', 'WEIGHT', 'QUANTITY', 'LID',
                'NAME', 'CALLBACK_FUNC', 'MODULE', 'NOTES', 'PRODUCT_PROVIDER_CLASS', 'CANCEL_CALLBACK_FUNC',
                'ORDER_CALLBACK_FUNC', 'PAY_CALLBACK_FUNC', 'DETAIL_PAGE_URL', 'CATALOG_XML_ID', 'PRODUCT_XML_ID',
                'VAT_RATE'
            )
        );

        $item = new \CSaleBasket;
        while ($arBasket = $dbBasket->Fetch()) {
            if (\CSaleBasketHelper::isSetItem($arBasket)) {
                continue;
            }

            $arFields = array(
                'ORDER_ID' => $newOrderId,
                'PRODUCT_ID' => $arBasket['PRODUCT_ID'],
                'PRODUCT_PRICE_ID' => $arBasket['PRODUCT_PRICE_ID'],
                'PRICE' => $arBasket['PRICE'],
                'CURRENCY' => $arBasket['CURRENCY'],
                'WEIGHT' => $arBasket['WEIGHT'],
                'QUANTITY' => $arBasket['QUANTITY'],
                'LID' => $arBasket['LID'],
                'NAME' => $arBasket['NAME'],
                'CALLBACK_FUNC' => $arBasket['CALLBACK_FUNC'],
                'MODULE' => $arBasket['MODULE'],
                'NOTES' => $arBasket['NOTES'],
                'PRODUCT_PROVIDER_CLASS' => $arBasket['PRODUCT_PROVIDER_CLASS'],
                'CANCEL_CALLBACK_FUNC' => $arBasket['CANCEL_CALLBACK_FUNC'],
                'ORDER_CALLBACK_FUNC' => $arBasket['ORDER_CALLBACK_FUNC'],
                'PAY_CALLBACK_FUNC' => $arBasket['PAY_CALLBACK_FUNC'],
                'DETAIL_PAGE_URL' => $arBasket['DETAIL_PAGE_URL'],
                'CATALOG_XML_ID' => $arBasket['CATALOG_XML_ID'],
                'PRODUCT_XML_ID' => $arBasket['PRODUCT_XML_ID'],
                'VAT_RATE' => $arBasket['VAT_RATE'],
                'PROPS' => array(),
                'TYPE' => $arBasket['TYPE']
            );

            $item->Add($arFields);
        }
    }
}

Get basket props

<?php
/**
 * Function obtains all properties of a basket item
 * @param int $id Basket item Id to search for
 * @return mixed[] List of basket item properties
 */
protected function getBasketItemProps($id)
{
    \Bitrix\Main\Loader::includeModule('sale');

    $arProps = array();
    $dbBasketProps = CSaleBasket::GetPropsList(
        array("SORT" => "ASC"),
        array("BASKET_ID" => $id),
        false,
        false,
        array("ID", "BASKET_ID", "NAME", "VALUE", "CODE", "SORT")
    );

    if ($arBasketProps = $dbBasketProps->Fetch())
    {
        do
        {
            $arProps[] = array(
                "NAME" => $arBasketProps["NAME"],
                "CODE" => $arBasketProps["CODE"],
                "VALUE" => $arBasketProps["VALUE"]
            );
        }
        while ($arBasketProps = $dbBasketProps->Fetch());
    }

    return $arProps;
}