- Модуль: 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;
}