Добавление нового заказа API-методами Битрикс

UPD: в скрипте используются старые методы работы с заказом, для тех у кого Битрикс новых редакций рекомендую в работе с заказами использовать D7!

Пост не удаляю, чтобы вновь открыв его, ужаснуться какие раньше велосипеды изобретал :)

Данной темы косвенно касался уже несколько раз, напишу более простой и обновленный вариант оформления заказа с помощью API методов Битрикса. Если кому-то понадобится буду рад=)


require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
$APPLICATION->SetTitle("Перенос заказов");
@set_time_limit(0);

if(!CModule::IncludeModule("sale") && !CModule::IncludeModule("catalog"))
	die();

if(
	!empty($_POST["FIO"])&&
	!empty($_POST["EMAIL"])&&
	!empty($_POST["PHONE"])
)
{

	// Шаг 0. Lexa.pro: параметры
	
	$arIBLOCKS = array(10, 11); // инфоблоки с товарами
	// в моем случае одинаковое для двух инфоблоков
	$typePrice = 1; // Тип цены
	
	$PERSON_TYPE_ID = 1;
	$PAY_SYSTEM_ID = 1;
	$DELIVERY_ID = 2;

	// Шаг 1. Lexa.pro: найти/создать пользователя
	
	global $USER;

	$emailUser = CUser::GetList($by="", $order="", array('=EMAIL' => $_POST["EMAIL"]));
	while($arUser = $emailUser->Fetch())
		$USER_ID = $arUser["ID"];
			
	if(empty($USER_ID)){ // Если не нашлось email-а в БД, созданим нового юзвера
		
		$NEW_LOGIN = $_POST["EMAIL"];
		$NEW_EMAIL = $_POST["EMAIL"];
		$NEW_NAME = "";
		$NEW_LAST_NAME = "";

		if(strlen($_POST["FIO"]) > 0)
		{
			$arNames = explode(" ", $_POST["FIO"]);
			$NEW_NAME = $arNames[1];
			$NEW_LAST_NAME = $arNames[0];
		}

		$pos = strpos($NEW_LOGIN, "@");
		if ($pos !== false)
			$NEW_LOGIN = substr($NEW_LOGIN, 0, $pos);

		if (strlen($NEW_LOGIN) > 47)
			$NEW_LOGIN = substr($NEW_LOGIN, 0, 47);

		if (strlen($NEW_LOGIN) < 3)
			$NEW_LOGIN .= "___";

		$dbUserLogin = CUser::GetByLogin($NEW_LOGIN);
		if ($arUserLogin = $dbUserLogin->Fetch())
		{
			$newLoginTmp = $NEW_LOGIN;
			$uind = 0;
			do
			{
				$uind++;
				if ($uind == 10)
				{
					$NEW_LOGIN = $arUserResult["USER_EMAIL"];
					$newLoginTmp = $NEW_LOGIN;
				}
				elseif ($uind > 10)
				{
					$NEW_LOGIN = "buyer".time().GetRandomCode(2);
					$newLoginTmp = $NEW_LOGIN;
					break;
				}
				else
				{
					$newLoginTmp = $NEW_LOGIN.$uind;
				}
				$dbUserLogin = CUser::GetByLogin($newLoginTmp);
			}
			while ($arUserLogin = $dbUserLogin->Fetch());
			$NEW_LOGIN = $newLoginTmp;
		}

		$GROUP_ID = array(2);
		$def_group = COption::GetOptionString("main", "new_user_registration_def_group", "");
		if($def_group!="")
		{
			$GROUP_ID = explode(",", $def_group);
			$arPolicy = $USER->GetGroupPolicy($GROUP_ID);
		}
		else
		{
			$arPolicy = $USER->GetGroupPolicy(array());
		}

		$password_min_length = intval($arPolicy["PASSWORD_LENGTH"]);
		if($password_min_length <= 0)
			$password_min_length = 6;
		$password_chars = array(
			"abcdefghijklnmopqrstuvwxyz",
			"ABCDEFGHIJKLNMOPQRSTUVWXYZ",
			"0123456789",
		);
		if($arPolicy["PASSWORD_PUNCTUATION"] === "Y")
			$password_chars[] = ",.<>/?;:'\"[]{}\|`~!@#\$%^&*()-_+=";
		$NEW_PASSWORD = $NEW_PASSWORD_CONFIRM = randString($password_min_length+2, $password_chars);

		$user = new CUser;
		$arAuthResult = $user->Add(Array(
			"LOGIN" => $NEW_LOGIN,
			"NAME" => $NEW_NAME,
			"LAST_NAME" => $NEW_LAST_NAME,
			"PASSWORD" => $NEW_PASSWORD,
			"CONFIRM_PASSWORD" => $NEW_PASSWORD_CONFIRM,
			"EMAIL" => $NEW_EMAIL,
			"GROUP_ID" => $GROUP_ID,
			"ACTIVE" => "Y",
			"LID" => SITE_ID,
			)
		);

		if (IntVal($arAuthResult) <= 0)
		{
			$arResult["ERROR"][] = GetMessage("STOF_ERROR_REG").((strlen($user->LAST_ERROR) > 0) ? ": ".$user->LAST_ERROR : "" );
		}
		else
		{
			$USER->Authorize($arAuthResult);
		}
	} else {
		$USER->Authorize($USER_ID); // авторизуем, если новый
	}
	
	// Шаг 2. Lexa.pro: оформляем заказ
	// в моем случае не важно какие тип платильщика, способы доставки и оплаты были указаны

	// 2.1 Получаем корзину
	$basket = array(); // корзина
	$summ = 0;
	
	$dbBasketItems = CSaleBasket::GetList(
		 array(),
		 array("FUSER_ID" => CSaleBasket::GetBasketUserID(),"LID" => SITE_ID, "ORDER_ID" => "NULL"),
		 false,
		 false,
		 array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS", "PRICE")
	);
	while ($arItems = $dbBasketItems->GetNext())
	{
		$basket[] = $arItems;
		$summ += $basket["QUANTITY"]*$basket["PRICE"];
	}

	// 2.2Добавляем заказ
	$arOrderDat = CSaleOrder::DoCalculateOrder(
		SITE_ID,
		$USER->GetID(),
		$basket,
		$PERSON_TYPE_ID, // тип плательщика
		array(),
		$DELIVERY_ID, // доставка
		$PAY_SYSTEM_ID, // оплата
		array(),
		$arErrors,
		$arWarnings
	);	
	
	
	$arFields = array(
		"LID" => SITE_ID,
		"PERSON_TYPE_ID" => $PERSON_TYPE_ID,
		"PAYED" => "N",
		"CANCELED" => "N",
		"STATUS_ID" => "N",
		"PRICE" => $summ,
		"CURRENCY" => "RUB",
		"USER_ID" => (int)$USER->GetID(),
		"PAY_SYSTEM_ID" => $PAY_SYSTEM_ID,
		//"PRICE_DELIVERY" => $arResult["DELIVERY_PRICE"],
		"DELIVERY_ID" => $DELIVERY_ID,
		//"DISCOUNT_VALUE" => $arResult["DISCOUNT_PRICE"],
		//"TAX_VALUE" => $arResult["bUsingVat"] == "Y" ? $arResult["VAT_SUM"] : $arResult["TAX_PRICE"],
		"USER_DESCRIPTION" => $_POST["SITE"],
		"ORDER_PROP" => array(
			3 => $_POST["PHONE"],
			1 => $_POST["FIO"],
			7 => $_POST["ADDRESS"],
			2=> $_POST["EMAIL"],
		),
	);
	
	//не получилось прикрепить корзину к заказу
	$orderID = (int)CSaleOrder::DoSaveOrder($arOrderDat, $arFields, 0, $arErrors);
	CSaleBasket::OrderBasket($orderID, $_SESSION["SALE_USER_ID"], SITE_ID); // привязывает товары из корзины к заказу.

}

Возврат к списку