/** * * */ public static function DoSaveOrder(&$arOrder, $arAdditionalFields, $orderId, &$arErrors, $arCoupons = array(), $arStoreBarcodeOrderFormData = array(), $bSaveBarcodes = false) { global $APPLICATION; $orderId = (int) $orderId; $isNew = $orderId <= 0; $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N'); $arFields = array("ID" => $arOrder["ID"], "LID" => $arOrder["SITE_ID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "PRICE" => $arOrder["PRICE"], "CURRENCY" => $arOrder["CURRENCY"], "USER_ID" => $arOrder["USER_ID"], "PAY_SYSTEM_ID" => $arOrder["PAY_SYSTEM_ID"], "PRICE_DELIVERY" => $arOrder["DELIVERY_PRICE"], "DELIVERY_ID" => strlen($arOrder["DELIVERY_ID"]) > 0 ? $arOrder["DELIVERY_ID"] : false, "DISCOUNT_VALUE" => $arOrder["DISCOUNT_PRICE"], "TAX_VALUE" => $arOrder["TAX_VALUE"], "TRACKING_NUMBER" => $arOrder["TRACKING_NUMBER"]); if ($arOrder["DELIVERY_PRICE"] == $arOrder["PRICE_DELIVERY"] && isset($arOrder['PRICE_DELIVERY_DIFF']) && floatval($arOrder['PRICE_DELIVERY_DIFF']) > 0) { $arFields["DELIVERY_PRICE"] = $arOrder['PRICE_DELIVERY_DIFF'] + $arOrder["PRICE_DELIVERY"]; } if ($orderId <= 0) { $arFields["PAYED"] = "N"; $arFields["CANCELED"] = "N"; $arFields["STATUS_ID"] = "N"; } $arFields = array_merge($arFields, $arAdditionalFields); if (!$arOrder['LOCATION_IN_CODES']) { // it comes from places like crm_invoice`s Add() and tells us if we need to convert location props from ID to CODE static::TranslateLocationPropertyValues($arOrder["PERSON_TYPE_ID"], $arOrder["ORDER_PROP"]); } unset($arOrder['LOCATION_IN_CODES']); if ($isOrderConverted == "Y") { $orderFields = array_merge($arOrder, $arFields, $arAdditionalFields); if (isset($orderFields['CUSTOM_DISCOUNT_PRICE']) && $orderFields['CUSTOM_DISCOUNT_PRICE'] === true) { Sale\Compatible\DiscountCompatibility::reInit(Sale\Compatible\DiscountCompatibility::MODE_DISABLED); } if (!empty($arStoreBarcodeOrderFormData)) { $orderFields['BARCODE_LIST'] = $arStoreBarcodeOrderFormData; } $orderFields['BARCODE_SAVE'] = $bSaveBarcodes; if ($orderId > 0) { $orderFields['ID'] = $orderId; } /** @var Sale\Result $r */ $r = Sale\Compatible\OrderCompatibility::modifyOrder(Sale\Compatible\OrderCompatibility::ORDER_COMPAT_ACTION_SAVE, $orderFields); if ($r->isSuccess()) { $orderId = $r->getId(); } else { foreach ($r->getErrorMessages() as $error) { $arErrors[] = $error; $APPLICATION->ThrowException($error); } return false; } } else { if ($orderId > 0) { $orderId = CSaleOrder::Update($orderId, $arFields); } else { if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "O") { $arFields["RESERVED"] = "Y"; } $orderId = CSaleOrder::Add($arFields); } $orderId = (int) $orderId; if ($orderId <= 0) { if ($ex = $APPLICATION->GetException()) { $arErrors[] = $ex->GetString(); } else { $arErrors[] = Loc::getMessage("SOA_ERROR_ORDER"); } } if (!empty($arErrors)) { return null; } CSaleBasket::DoSaveOrderBasket($orderId, $arOrder["SITE_ID"], $arOrder["USER_ID"], $arOrder["BASKET_ITEMS"], $arErrors, $arCoupons, $arStoreBarcodeOrderFormData, $bSaveBarcodes); CSaleTax::DoSaveOrderTax($orderId, $arOrder["TAX_LIST"], $arErrors); CSaleOrderProps::DoSaveOrderProps($orderId, $arOrder["PERSON_TYPE_ID"], $arOrder["ORDER_PROP"], $arErrors); Sale\DiscountCouponsManager::finalApply(); Sale\DiscountCouponsManager::saveApplied(); foreach (GetModuleEvents("sale", "OnOrderSave", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($orderId, $arFields, $arOrder, $isNew)); } } return $orderId; }
protected function processOrderAcceptRequest($arPostData) { $arResult = array(); DiscountCompatibility::reInit(DiscountCompatibility::MODE_EXTERNAL, array('SITE_ID' => $this->siteId)); if ($this->checkOrderAcceptStructure($arPostData)) { $dbRes = \Bitrix\Sale\TradingPlatform\OrderTable::getList(array("filter" => array("TRADING_PLATFORM_ID" => YandexMarket::getInstance()->getId(), "EXTERNAL_ORDER_ID" => $arPostData["order"]["id"]))); if (!($orderCorrespondence = $dbRes->fetch())) { require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/sale/general/admin_tool.php"; $arProducts = array(); foreach ($arPostData["order"]["items"] as $arItem) { $arProduct = $this->getProductById($arItem["offerId"], $arItem["count"]); $arProduct["PRODUCT_ID"] = $arItem["offerId"]; $arProduct["MODULE"] = "catalog"; $arProduct["PRODUCT_PROVIDER_CLASS"] = "CCatalogProductProvider"; $dbIblockElement = CIBlockElement::GetList(array(), array("ID" => $arItem["offerId"]), false, false, array('XML_ID', 'IBLOCK_EXTERNAL_ID')); if ($IblockElement = $dbIblockElement->Fetch()) { if (strlen($IblockElement["XML_ID"]) > 0) { $arProduct["PRODUCT_XML_ID"] = $IblockElement["XML_ID"]; } if (strlen($IblockElement["IBLOCK_EXTERNAL_ID"]) > 0) { $arProduct["CATALOG_XML_ID"] = $IblockElement["IBLOCK_EXTERNAL_ID"]; } } if ($arProduct["CAN_BUY"] == "Y") { $arProducts[] = $arProduct; } } $arOrderProductPrice = fGetUserShoppingCart($arProducts, $this->siteId, "N"); $arErrors = array(); $userId = intval(CSaleUser::GetAnonymousUserID()); $arShoppingCart = CSaleBasket::DoGetUserShoppingCart($this->siteId, $userId, $arOrderProductPrice, $arErrors); $deliveryId = $arPostData["order"]["delivery"]["id"]; $paySystemId = $this->mapPaySystems[$arPostData["order"]["paymentMethod"]]; $locationId = $this->locationMapper->getLocationByCityName($arPostData["order"]["delivery"]["region"]["name"]); if ($locationId === false) { $this->log(self::LOG_LEVEL_INFO, "YMARKET_LOCATION_MAPPING", $arPostData["order"]["delivery"]["region"]["name"], GetMessage("SALE_YMH_LOCATION_NOT_FOUND")); } $arErrors = $arWarnings = array(); $arOptions = array(); $arOrderPropsValues = $this->makeAdditionalOrderProps($arPostData["order"]["delivery"]["address"], array(), $this->mapPaySystems[$arPostData["order"]["paymentMethod"]], $arPostData["order"]["delivery"]["id"], $locationId); $CSaleOrder = new CSaleOrder(); $arOrder = $CSaleOrder->DoCalculateOrder($this->siteId, $userId, $arShoppingCart, $this->personTypeId, $arOrderPropsValues, $deliveryId, $paySystemId, $arOptions, $arErrors, $arWarnings); $arErrors = array(); $arAdditionalFields = array("XML_ID" => self::XML_ID_PREFIX . $arPostData["order"]["id"]); $arOrder["LID"] = $this->siteId; if (isset($arPostData["order"]["notes"])) { $arAdditionalFields["USER_DESCRIPTION"] = $arPostData["order"]["notes"]; } $orderID = $CSaleOrder->DoSaveOrder($arOrder, $arAdditionalFields, 0, $arErrors); $res = \Bitrix\Sale\TradingPlatform\OrderTable::add(array("ORDER_ID" => $orderID, "TRADING_PLATFORM_ID" => YandexMarket::getInstance()->getId(), "EXTERNAL_ORDER_ID" => $arPostData["order"]["id"])); if (!$res->isSuccess()) { foreach ($res->getErrors() as $error) { $this->log(self::LOG_LEVEL_ERROR, "YMARKET_PLATFORM_ORDER_ADD_ERROR", $orderID, $error); } } } else { $orderID = $orderCorrespondence["ORDER_ID"]; } if (intval($orderID > 0)) { $arResult["order"]["accepted"] = true; $arResult["order"]["id"] = strval($orderID); $this->log(self::LOG_LEVEL_INFO, "YMARKET_ORDER_CREATE", $arPostData["order"]["id"], GetMessage("SALE_YMH_ORDER_CREATED") . " " . $orderID); } else { $arResult["order"]["accepted"] = false; $arResult["order"]["reason"] = "OUT_OF_DATE"; $this->log(self::LOG_LEVEL_ERROR, "YMARKET_ORDER_CREATE", $arPostData["order"]["id"], print_r($arErrors, true)); } } else { $arResult = $this->processError(self::ERROR_STATUS_400, GetMessage("SALE_YMH_ERROR_BAD_STRUCTURE")); } return $arResult; }