• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/tradingplatform/ymarket/order.php
  • Класс: BitrixSaleTradingPlatformYMarketOrder
  • Вызов: Order::create
static function create(array $params)
{
	if(empty($params['CURRENCY']))
		throw new ArgumentNullException('params[CURRENCY]');

	if($params['SITE_ID'] == '')
		throw new ArgumentNullException('params[SITE_ID]');

	if(intval($params['PERSON_TYPE_ID']) <= 0)
		throw new ArgumentNullException('params[PERSON_TYPE_ID]');

	if(empty($params['CART_ITEMS']))
		throw new ArgumentNullException('params[CART_ITEMS]');

	if(empty($params['IS_ACCEPT_OLD_PRICE']))
		$params['IS_ACCEPT_OLD_PRICE'] = CSaleYMHandler::NOT_ACCEPT_OLD_PRICE;

	$result = new Result();
	$currencyList = BitrixCurrencyCurrencyManager::getCurrencyList();

	if($params['CURRENCY'] == 'RUR' && empty($currencyList['RUR']) && !empty($currencyList['RUB']))
		$currency = 'RUB';
	else
		$currency = $params['CURRENCY'];

	if(empty($currencyList[$currency]))
	{
		$result->addError(new Error(Loc::getMessage('SALE_YMARKET_ORDER_CURRENCY_NOT_SUPPORTED', array('#CURRENCY#' => $currency))));
		return $result;
	}

	$registry = SaleRegistry::getInstance(SaleRegistry::REGISTRY_TYPE_ORDER);
	/** @var SaleOrder $orderClass */
	$orderClass = $registry->getOrderClassName();

	$order = $orderClass::create($params['SITE_ID'], CSaleUser::GetAnonymousUserID(), $currency);
	/** @var BitrixSaleResult $res */
	$res = $order->setPersonTypeId(intval($params['PERSON_TYPE_ID']));

	if (!$res->isSuccess())
		$result->addErrors($res->getErrors());

	if(!empty($params['PROPERTIES']))
	{
		$propCollection = $order->getPropertyCollection();
		$res = $propCollection->setValuesFromPost(array('PROPERTIES' => $params['PROPERTIES']), array());

		if (!$res->isSuccess())
			$result->addErrors($res->getErrors());
	}

	$fUserId = $order->getUserId() > 0 ? BitrixSaleFuser::getIdByUserId($order->getUserId()) : null;
	$isStartField = $order->isStartField();

	/** @var SaleBasket $basketClass */
	$basketClass = $registry->getBasketClassName();

	$basket = $basketClass::create($params['SITE_ID']);
	$res = $order->setBasket($basket);

	if (!$res->isSuccess())
		$result->addErrors($res->getErrors());

	$basket->setFUserId($fUserId);
	$discount = $order->getDiscount();

	//Hello from discounts
	//todo: sortByColumn($products, array("BASE_PRICE" => SORT_DESC, "PRICE" => SORT_DESC), '', null, true);

	Loader::includeModule('catalog');

	$itemsMap = array();

	foreach ($params['CART_ITEMS'] as $itemKey => $item)
	{
		$basketItemFields = array(
			'PRODUCT_ID' => $item['offerId'],
			'QUANTITY' => $item['count'],
			'PRODUCT_PROVIDER_CLASS' => 'BitrixCatalogProductCatalogProvider'
		);

		$context = array(
			'SITE_ID' => $params['SITE_ID'],
			'CURRENCY' => $params['CURRENCY'],
		);

		if ($order->getUserId() > 0)
		{
			$context['USER_ID'] = $order->getUserId();
		}

		$basketItem = null;

		$res = CatalogProductBasket::addProductToBasket($basket, $basketItemFields, $context);
		$resultData = $res->getData();

		if (!empty($resultData['BASKET_ITEM']))
		{
			/** @var BitrixSaleBasketItemBase $item */
			$basketItem = $resultData['BASKET_ITEM'];
		}

		if (!$res->isSuccess())
		{
			if ($basketItem)
			{
				$basketItem->setField("QUANTITY", 0);
			}
		}

		if ($basketItem)
		{
			$itemsMap[$basketItem->getBasketCode()] = $itemKey;
		}
	}

	/*
	 * 	todo: check if we still need this
		if($arProduct["CURRENCY"] != $currency && BitrixMainLoader::includeModule('currency'))
		{
				$price = CCurrencyRates::convertCurrency(
					$arProduct["PRICE"],
					$arProduct["CURRENCY"],
					$currency
				);
		}
	 */

	$r = $basket->refreshData();
	if (!$r->isSuccess())
	{
		return $r;
	}

	/** @var BasketItem $basketItem */
	foreach($basket as $basketItem)
	{
		$basketCode = $basketItem->getBasketCode();
		$item = $params['CART_ITEMS'][$itemsMap[$basketCode]];

		$basketItem->setField("NAME", $item['offerName']);
//
//			if ($discount instanceof BitrixSaleDiscount)
//				$discount->setBasketItemData($basketCode, $providerData[$basketCode]);
	}

	if($basket->count() == 0)
	{
		$result->addError(new Error(Loc::getMessage('SALE_YMARKET_ORDER_PRODUCTS_NOT_AVAILABLE')));
		return $result;
	}

	if ($isStartField)
	{
		$hasMeaningfulFields = $order->hasMeaningfulField();
		$res = $order->doFinalAction($hasMeaningfulFields);

		if (!$res->isSuccess())
			$result->addErrors($res->getErrors());
	}

	$result->setData(
		array(
			'ORDER' => $order,
			'ITEMS_MAP' => $itemsMap
		)
	);
	
	return $result;
}