%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/ |
Current File : //home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/orderedit.php |
<?php namespace Bitrix\Sale\Helpers\Admin; use Bitrix\Main\Error; use Bitrix\Sale\BasketItemBase; use Bitrix\Sale\Fuser; use Bitrix\Sale\Order; use Bitrix\Main\Loader; use Bitrix\Sale\Basket; use Bitrix\Sale\Result; use Bitrix\Sale\Discount; use Bitrix\Sale\Provider; use Bitrix\Main\UserTable; use Bitrix\Sale\BasketItem; use Bitrix\Main\Page\Asset; use Bitrix\Iblock\IblockTable; use Bitrix\Main\Config\Option; use Bitrix\Highloadblock as HL; use Bitrix\Main\SystemException; use Bitrix\Main\Localization\Loc; use Bitrix\Sale\SaleProviderBase; use Bitrix\Sale\Services\Company; use Bitrix\Main\Entity\EntityError; use Bitrix\Sale\UserMessageException; use Bitrix\Main\ArgumentNullException; use Bitrix\Main\ArgumentTypeException; use Bitrix\Sale\DiscountCouponsManager; use Bitrix\Sale\Helpers\Admin\Blocks\OrderBasket; Loc::loadMessages(__FILE__); Loader::registerAutoLoadClasses('sale', array( '\Bitrix\Sale\Helpers\Admin\Blocks\OrderShipmentStatus' => 'lib/helpers/admin/blocks/ordershipmentstatus.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderFinanceInfo' => 'lib/helpers/admin/blocks/orderfinanceinfo.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderAdditional' => 'lib/helpers/admin/blocks/orderadditional.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderShipment' => 'lib/helpers/admin/blocks/ordershipment.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderPayment' => 'lib/helpers/admin/blocks/orderpayment.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderStatus' => 'lib/helpers/admin/blocks/orderstatus.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderBasket' => 'lib/helpers/admin/blocks/orderbasket.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderBuyer' => 'lib/helpers/admin/blocks/orderbuyer.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderInfo' => 'lib/helpers/admin/blocks/orderinfo.php', '\Bitrix\Sale\Helpers\Admin\Blocks\OrderMarker' => 'lib/helpers/admin/blocks/ordermarker.php', )); /** * Class OrderEdit * Helper class for order administration. * @package Bitrix\Sale\Helpers\Admin */ class OrderEdit { protected static $productsDetails = null; public static $isTrustProductFormData = false; public static $needUpdateNewProductPrice = false; public static $isBuyerIdChanged = false; public static $isRefreshData = false; const BASKET_CODE_NEW = 'new'; /** * @param string $name * @param array $data * @param string $selected * @param bool $showNotUse * @param array $attributes * @return string "<select>....</select>" * @throws ArgumentTypeException */ public static function makeSelectHtml($name, array $data, $selected = "", $showNotUse = true, $attributes = array()) { if(!is_array($data)) throw new ArgumentTypeException("data", "array"); if(!is_array($attributes)) throw new ArgumentTypeException("attributies", "array"); $result = '<select name="'.htmlspecialcharsbx($name).'"'; foreach($attributes as $attrName => $attrValue ) $result.=" ".$attrName."=\"".htmlspecialcharsbx($attrValue)."\""; $result .= '>'; if($showNotUse) $result .= '<option value="">'.GetMessage("SALE_ORDEREDIT_NOT_USE").'</option>'; foreach($data as $value => $title) $result .= '<option value="'.htmlspecialcharsbx($value).'"'.($selected == $value ? " selected" : "").'>'.htmlspecialcharsbx(TruncateText($title, 40)).'</option>'; $result .= '</select>'; return $result; } /** * @param $name * @param array $data * @param string $selected * @param bool|true $showNotUse * @param array $attributes * @return string * @throws ArgumentTypeException */ public static function makeSelectHtmlWithRestricted($name, array $data, $selected = "", $showNotUse = true, $attributes = array()) { if(!is_array($data)) throw new ArgumentTypeException("data", "array"); if(!is_array($attributes)) throw new ArgumentTypeException("attributies", "array"); $result = '<select name="'.htmlspecialcharsbx($name).'"'; foreach($attributes as $attrName => $attrValue ) $result .= " ".$attrName."=\"".htmlspecialcharsbx($attrValue)."\""; $result .= '>'; $result .= self::makeSelectHtmlBodyWithRestricted($data, $selected, $showNotUse); $result .= '</select>'; return $result; } /** * @param $data * @param string $selected * @param bool|true $showNotUse * @return string */ public static function makeSelectHtmlBodyWithRestricted($data, $selected = '', $showNotUse = true) { $activePaySystems = ''; if($showNotUse) $activePaySystems .= '<option value="">'.GetMessage("SALE_ORDEREDIT_NOT_USE").'</option>'; $restrictedPaySystems = ''; foreach($data as $item) { if (!isset($item['RESTRICTED'])) { $activePaySystems .= '<option value="'.htmlspecialcharsbx($item['ID']).'"'.($selected == $item['ID'] ? " selected" : "").'>'.htmlspecialcharsbx(TruncateText($item['NAME'], 40)).'</option>'; } else { $restrictedPaySystems .= '<option value="'.htmlspecialcharsbx($item['ID']).'"'.($selected == $item['ID'] ? " selected" : "").' class="bx-admin-service-restricted">'.htmlspecialcharsbx(TruncateText($item['NAME'], 40)).'</option>'; } } return $activePaySystems.$restrictedPaySystems; } /** * @param Order $order * @param $formId * @return string */ public static function getScripts(Order $order, $formId) { Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_edit.js"); Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_ajaxer.js"); $currencyId = $order->getCurrency(); $currencies = array(); if(Loader::includeModule('currency')) { \CJSCore::Init(array('currency')); $currencyFormat = \CCurrencyLang::getFormatDescription($currencyId); $currencies = array( array( 'CURRENCY' => $currencyId, 'FORMAT' => array( 'FORMAT_STRING' => $currencyFormat['FORMAT_STRING'], 'DEC_POINT' => $currencyFormat['DEC_POINT'], 'THOUSANDS_SEP' => $currencyFormat['THOUSANDS_SEP'], 'DECIMALS' => $currencyFormat['DECIMALS'], 'THOUSANDS_VARIANT' => $currencyFormat['THOUSANDS_VARIANT'], 'HIDE_ZERO' => "N" //$currencyFormat['HIDE_ZERO'] ) ) ); } $curFormat = \CCurrencyLang::GetFormatDescription($currencyId); $currencyLang = preg_replace("/(^|[^&])#/", '$1', $curFormat["FORMAT_STRING"]); $langPhrases = array("SALE_ORDEREDIT_DISCOUNT_UNKNOWN", "SALE_ORDEREDIT_REFRESHING_DATA", "SALE_ORDEREDIT_FIX", "SALE_ORDEREDIT_UNFIX", "SALE_ORDEREDIT_CLOSE", "SALE_ORDEREDIT_MESSAGE", "SALE_ORDEREDIT_CONFIRM", "SALE_ORDEREDIT_CONFIRM_CONTINUE", "SALE_ORDEREDIT_CONFIRM_ABORT"); $result = ' <script type="text/javascript"> BX.ready(function(){ BX.Sale.Admin.OrderEditPage.orderId = "'.$order->getId().'"; BX.Sale.Admin.OrderEditPage.siteId = "'.$order->getSiteId().'"; BX.Sale.Admin.OrderEditPage.languageId = "'.LANGUAGE_ID.'"; BX.Sale.Admin.OrderEditPage.formId = "'.$formId.'_form"; BX.Sale.Admin.OrderEditPage.adminTabControlId = "'.$formId.'"; '.(!empty($currencies) ? 'BX.Currency.setCurrencies('.\CUtil::PhpToJSObject($currencies, false, true, true).');' : ''). 'BX.Sale.Admin.OrderEditPage.currency = "'.$currencyId.'"; BX.Sale.Admin.OrderEditPage.currencyLang = "'.\CUtil::JSEscape($currencyLang).'";'; if($formId == "sale_order_create") $result .= ' BX.Sale.Admin.OrderEditPage.registerFieldsUpdaters(BX.Sale.Admin.OrderPayment.prototype.getCreateOrderFieldsUpdaters());'; foreach($langPhrases as $phrase) $result .= ' BX.message({'.$phrase.': "'.\CUtil::JSEscape(Loc::getMessage($phrase)).'"});'; $result .= '}); </script> '; return $result; } /** * @param int $userId. * @param string $siteId. * @return string User name. */ public static function getUserName($userId, $siteId = "") { if(intval($userId) <= 0) return Loc::getMessage("SALE_ORDEREDIT_NAME_NULL"); static $userNames = array(); if(!isset($userNames[$userId])) { $res = UserTable::getById($userId); if($buyer = $res->fetch()) { $userNames[$userId] = \CUser::FormatName( \CSite::GetNameFormat( null, $siteId ), $buyer, true, false ); } } return $userNames[$userId]; } /** * @param string $text The order problem description. * @param int $orderId * @return string HTML Problem block. */ public static function getProblemBlockHtml($text, $orderId) { if(strlen($text) <= 0) $result = ""; else $result = ' <div class="adm-bus-orderproblem" id="sale-adm-order-problem-block"> <div class="adm-bus-orderproblem-container"> <table> <tr> <td class="adm-bus-orderproblem-title">'.Loc::getMessage("SALE_ORDEREDIT_ORDER_PROBLEM").':</td> <td class="adm-bus-orderproblem-text">'.$text.'</td> </tr> </table> <span class="adm-bus-orderproblem-close" title="'.Loc::getMessage("SALE_ORDEREDIT_CLOSE").'" onclick="BX.Sale.Admin.OrderEditPage.onProblemCloseClick(\''.$orderId.'\',\'sale-adm-order-problem-block\');"></span> </div> </div>'; return $result; } /** * @param array $items. * @return string HTML Navigation block. */ public static function getFastNavigationHtml(array $items, $formId = '', $tabId = '') { if(empty($items)) return ""; $result = ' <div class="adm-bus-fastnav adm-detail-tabs-block-pin" id="sale-order-edit-block-fast-nav"> <div class="adm-bus-fastnav-container"> <table> <tr> <td class="adm-bus-fastnav-title">'.Loc::getMessage('SALE_ORDEREDIT_NAVIGATION').':</td> <td> <ul class="adm-bus-fastnav-navlist" id="adm-bus-fastnav-navlist">'; foreach($items as $anchor => $itemName) { if(strlen($formId) > 0 && strlen($tabId) > 0) { $href = 'javascript:void(0);'; $onClick = ' onclick="BX.Sale.Admin.OrderEditPage.fastNavigation.onClickItem(\''.$formId.'\', \''.$tabId.'\', \''.$anchor.'\')"'; } else { $href = '#'.$anchor; $onClick = ''; } if ($anchor == 'relprops') $result .= '<li style="display:none;"><a href="'.$href.'" id="nav_'.$anchor.'"'.$onClick.'>'.$itemName.'</a></li>'; else $result .= '<li><a href="'.$href.'" id="nav_'.$anchor.'"'.$onClick.'>'.$itemName.'</a></li>'; } $result .= ' </ul> </td> </tr> </table> <div id="sale-order-edit-block-fast-nav-pin" onclick="BX.Sale.Admin.OrderEditPage.toggleFix(this.id, \'sale-order-edit-block-fast-nav\');" class="adm-detail-pin-btn-tabs" style="top: 9px;right: 0px;"></div> </div> </div>'; $orderEditOpts = \CUserOptions::GetOption("sale_admin", "sale_order_edit", array()); $isFixed = isset($orderEditOpts["fix_sale-order-edit-block-fast-nav"]) && $orderEditOpts["fix_sale-order-edit-block-fast-nav"] == "Y" ? true : false; $result .= ' <script type="text/javascript"> BX.ready(function(){ BX.bind(window, "scroll", BX.Sale.Admin.OrderEditPage.fastNavigation.markItem); setTimeout(function(){ BX.Sale.Admin.OrderEditPage.fastNavigation.markItem();' .($isFixed ? 'BX.Sale.Admin.OrderEditPage.toggleFix("sale-order-edit-block-fast-nav-pin", "sale-order-edit-block-fast-nav");' : ''). ' }, 1 ); }); </script>'; return $result; } /** * @param Order $order * @param array $formData * @return bool|int|string * @throws UserMessageException */ protected static function createUserFromForm(Order &$order, array $formData) { $errors = array(); $orderProps = $order->getPropertyCollection(); if($email = $orderProps->getUserEmail()) $email = $email->getValue(); if($name = $orderProps->getPayerName()) $name = $name->getValue(); if($phone = $orderProps->getPhone()) $phone = $phone->getValue(); $userId = \CSaleUser::DoAutoRegisterUser( $email, $name, $formData["SITE_ID"], $errors, array('PERSONAL_PHONE' => $phone) ); if (!empty($errors)) { $errorMessage = ""; foreach($errors as $val) $errorMessage .= $val["TEXT"]; throw new UserMessageException($errorMessage); } return $userId; } public static function getUserId($order, $formData, $createUserIfNeed, \Bitrix\Sale\Result &$result) { if(intval($formData["USER_ID"]) > 0) return intval($formData["USER_ID"]); $userId = 0; if($createUserIfNeed && (!isset($formData["USER_ID"]) || intval($formData["USER_ID"]) <= 0)) { try { $userId = self::createUserFromForm($order, $formData); } catch(UserMessageException $e) { $result->addError( new EntityError($e->getMessage())); } } return $userId; } /** * @param array $formData * @param $creatorUserId * @param bool $createUserIfNeed * @param array $files * @param Result &$opResult * @return Order * @throws ArgumentNullException * @throws SystemException */ public static function createOrderFromForm(array $formData, $creatorUserId, $createUserIfNeed = true, array $files = array(), Result &$opResult) { if(!isset($formData["SITE_ID"]) || strlen($formData["SITE_ID"]) <= 0) throw new ArgumentNullException('formData["SITE_ID"]'); global $APPLICATION, $USER; $order = Order::create($formData["SITE_ID"]); $saleModulePermissions = $APPLICATION->GetGroupRight("sale"); $userCompanyId = null; if($saleModulePermissions == "P") { $userCompanyList = Company\Manager::getUserCompanyList($USER->GetID()); if (!empty($userCompanyList) && is_array($userCompanyList)) { $userCompanyId = reset($userCompanyList); if (intval($userCompanyId) > 0 && empty($formData['ORDER']['COMPANY_ID'])) { $formData['ORDER']['COMPANY_ID'] = $userCompanyId; } } } /** @var \Bitrix\Sale\Result $res */ $res = self::fillSimpleFields($order, $formData, $creatorUserId); if(!$res->isSuccess()) $opResult->addErrors($res->getErrors()); $propCollection = $order->getPropertyCollection(); $res = $propCollection->setValuesFromPost($formData, $files); if(!$res->isSuccess()) $opResult->addErrors($res->getErrors()); //creates new user if need $order->setFieldNoDemand( "USER_ID", self::getUserId($order, $formData, $createUserIfNeed, $opResult) ); $fUserId = null; if ($order->getUserId() > 0) { $fUserId = Fuser::getIdByUserId($order->getUserId()); } $needDataUpdate = array(); $basketCodeMap = array(); //init basket if(isset($formData["PRODUCT"]) && is_array($formData["PRODUCT"]) && !empty($formData["PRODUCT"])) { $isStartField = $order->isStartField(); $basket = \Bitrix\Sale\Basket::create($formData["SITE_ID"]); $res = $order->setBasket($basket); if(!$res->isSuccess()) $opResult->addErrors($res->getErrors()); $basket->setFUserId($fUserId); \Bitrix\Sale\ProviderBase::setUsingTrustData(true); $sort = 100; $maxBasketCodeIdx = 0; foreach($formData["PRODUCT"] as $basketCode => $productData) { $formData["PRODUCT"][$basketCode]["SORT"] = $sort; $sort += 100; /* Fix collision if price of new product is larger than exists have. * After sorting new product pick basket code from existing products. * See below. */ if(self::isBasketItemNew($basketCode)) { $basketInternalId = intval(substr($basketCode, 1)); if($basketInternalId > $maxBasketCodeIdx) $maxBasketCodeIdx = $basketInternalId; if(self::$needUpdateNewProductPrice) { unset($formData["PRODUCT"][$basketCode]["PROVIDER_DATA"]); unset($formData["PRODUCT"][$basketCode]["SET_ITEMS_DATA"]); } } } sortByColumn($formData["PRODUCT"], array("BASE_PRICE" => SORT_DESC, "PRICE" => SORT_DESC), '', null, true); foreach($formData["PRODUCT"] as $basketCode => $productData) { if($productData["IS_SET_ITEM"] == "Y") continue; if(!isset($productData["PROPS"]) || !is_array($productData["PROPS"])) $productData["PROPS"] = array(); $item = $basket->getExistsItem($productData["MODULE"], $productData["OFFER_ID"], $productData["PROPS"]); if($item == null && $basketCode != self::BASKET_CODE_NEW) $item = $basket->getItemByBasketCode($basketCode); if($item && $item->isBundleChild()) $item = null; if($item) { //Let's extract cached provider product data from field if(!empty($productData["PROVIDER_DATA"]) && CheckSerializedData($productData["PROVIDER_DATA"])) { $providerData = unserialize($productData["PROVIDER_DATA"]); self::setProviderTrustData($item, $order, $providerData); } if(!empty($productData["SET_ITEMS_DATA"]) && CheckSerializedData($productData["SET_ITEMS_DATA"])) $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); $res = $item->setField("QUANTITY", $item->getField("QUANTITY")+$productData["QUANTITY"]); if(!$res->isSuccess()) $opResult->addErrors($res->getErrors()); } else { if($basketCode != self::BASKET_CODE_NEW) $setBasketCode = $basketCode; elseif(intval($maxBasketCodeIdx) > 0) $setBasketCode = 'n'.strval($maxBasketCodeIdx+1); //Fix collision part 2. else $setBasketCode = null; $productId = $productData["PRODUCT_ID"]; if (isset($productData["OFFER_ID"]) && !empty($productData["OFFER_ID"])) { $productId = $productData["OFFER_ID"]; } $item = $basket->createItem($productData["MODULE"], $productId, $setBasketCode); if ($basketCode != $productData["BASKET_CODE"]) $productData["BASKET_CODE"] = $item->getBasketCode(); if($basketCode == self::BASKET_CODE_NEW) { $opResult->setData(array("NEW_ITEM_BASKET_CODE" => $productData["BASKET_CODE"])); $needDataUpdate[] = $item->getBasketCode(); } if(!empty($productData['REPLACED']) && $productData['REPLACED'] == 'Y') $needDataUpdate[] = $item->getBasketCode(); if($basketCode != $item->getBasketCode()) $basketCodeMap[$basketCode] = $item->getBasketCode(); if(isset($productData["PROPS"]) && !empty($productData["PROPS"]) && is_array($productData["PROPS"])) { /** @var \Bitrix\Sale\BasketPropertiesCollection $property */ $property = $item->getPropertyCollection(); $property->setProperty($productData["PROPS"]); } } } $productsData = $formData["PRODUCT"]; if(!empty($basketCodeMap)) { foreach($basketCodeMap as $old => $new) { $productsData[$new] = $productsData[$old]; unset($productsData[$old]); } } $res = self::fillBasketItems($basket, $productsData, $order, array_unique($needDataUpdate)); if(!$res->isSuccess()) { $opResult->addErrors($res->getErrors()); return null; } if ($isStartField) { $hasMeaningfulFields = $order->hasMeaningfulField(); /** @var Result $r */ $r = $order->doFinalAction($hasMeaningfulFields); if (!$r->isSuccess()) { $opResult->addErrors($r->getErrors()); } } if(isset($formData["DISCOUNTS"]) && is_array($formData["DISCOUNTS"])) $order->getDiscount()->setApplyResult($formData["DISCOUNTS"]); } else { $opResult->addError(new EntityError(Loc::getMessage("SALE_ORDEREDIT_ERROR_NO_PRODUCTS"))); } return $order; } public static function isBasketItemNew($basketCode) { return (strpos($basketCode, 'n') === 0) && ($basketCode != self::BASKET_CODE_NEW); } public static function saveCoupons($userId, $formData) { if(intval($userId) <= 0) return false; // init discount coupons DiscountCouponsManager::init(DiscountCouponsManager::MODE_MANAGER, array("userId" => $userId)); if(!DiscountCouponsManager::isSuccess()) throw new UserMessageException(implode(" \n", DiscountCouponsManager::getErrors())); if(isset($formData["COUPONS"]) && strlen($formData["COUPONS"]) > 0) { $coupons = explode(",", $formData["COUPONS"]); if(is_array($coupons) && count($coupons) > 0) { foreach($coupons as $coupon) DiscountCouponsManager::add($coupon); } } return true; } public static function saveProfileData($profileId, Order $order, array $formData) { $result = new Result(); $errors = array(); $name = ""; if($profileName = $order->getPropertyCollection()->getProfileName()) $name = $profileName->getValue(); $res = \CSaleOrderUserProps::DoSaveUserProfile( $order->getUserId(), $profileId, $name, $order->getPersonTypeId(), $propCollection = $formData["PROPERTIES"], $errors ); if($res === false) { if(!empty($errors)) { foreach($errors as $error) $result->addError(new EntityError($error."<br>\n")); } else { $result->addError(new EntityError(Loc::getMessage("SALE_ORDEREDIT_PROFILE_ERROR_SAVE"))); } } return $result; } /** * @param array $formData * @param Order $order * @param int $userId * @param bool $createUserIfNeed * @param array $files * @param \Bitrix\Sale\Result $result * @return \Bitrix\Sale\Order * @throws SystemException * @throws \Bitrix\Main\ObjectNotFoundException */ public static function editOrderByFormData(array $formData, Order $order, $userId, $createUserIfNeed = true, array $files = array(), \Bitrix\Sale\Result &$result) { /** @var \Bitrix\Sale\Result $res */ $res = self::fillSimpleFields($order, $formData, $userId); if(!$res->isSuccess()) $result->addErrors($res->getErrors()); $propCollection = $order->getPropertyCollection(); $res = $propCollection->setValuesFromPost($formData, $files); if(!$res->isSuccess()) $result->addErrors($res->getErrors()); $currentUserId = $order->getUserId(); if ($currentUserId && ((int)$currentUserId !== (int)$formData['USER_ID'])) { $paymentCollection = $order->getPaymentCollection(); /** @var \Bitrix\Sale\Payment $payment */ foreach ($paymentCollection as $payment) { if ($payment->isPaid()) { $result->addError(new EntityError( Loc::getMessage("SALE_ORDEREDIT_ERROR_CHANGE_USER_WITH_PAID_PAYMENTS") , 'SALE_ORDEREDIT_ERROR_CHANGE_USER_WITH_PAID_PAYMENTS')); return null; } } } $order->setFieldNoDemand( "USER_ID", self::getUserId($order, $formData, $createUserIfNeed, $result) ); if(isset($formData["DISCOUNTS"]) && is_array($formData["DISCOUNTS"])) $order->getDiscount()->setApplyResult($formData["DISCOUNTS"]); //init basket $basket = $order->getBasket(); $itemsBasketCodes = array(); $maxBasketCodeIdx = 0; $productAdded = false; if(isset($formData["PRODUCT"]) && is_array($formData["PRODUCT"]) && !empty($formData["PRODUCT"])) { $sort = 100; foreach($formData["PRODUCT"] as $basketCode => $productData) { $formData["PRODUCT"][$basketCode]["SORT"] = $sort; $sort += 100; /* Fix collision if price of new product is larger than added earlier have. * After sorting new product pick basket code from existing products. * See below. */ if(self::isBasketItemNew($basketCode)) { $basketInternalId = intval(substr($basketCode, 1)); if($basketInternalId > $maxBasketCodeIdx) $maxBasketCodeIdx = $basketInternalId; $needDataUpdate[] = $basketCode; unset($formData["PRODUCT"][$basketCode]["PROVIDER_DATA"]); unset($formData["PRODUCT"][$basketCode]["SET_ITEMS_DATA"]); } } sortByColumn($formData["PRODUCT"], array("BASE_PRICE" => SORT_DESC, "PRICE" => SORT_DESC), '', null, true); //we choose sku wich already exist in basket, so we must kill one of them. if(!empty($formData["ALREADY_IN_BASKET_CODE"])) { $item = $basket->getItemByBasketCode($formData["ALREADY_IN_BASKET_CODE"]); if($item) { $res = $item->delete(); if (!$res->isSuccess()) { $errMess = ""; foreach($res->getErrors() as $error) $errMess .= $error->getMessage()."\n"; if(strlen($errMess) <= 0) $errMess = Loc::getMessage("SALE_ORDEREDIT_BASKET_ITEM_DEL_ERROR"); $result->addError(new Error($errMess)); return null; } } } foreach($formData["PRODUCT"] as $basketCode => $productData) { if (!isset($productData["PROPS"])) $productData["PROPS"] = array(); $item = $basket->getExistsItem($productData["MODULE"], $productData["OFFER_ID"], $productData["PROPS"]); if ($item == null) DiscountCouponsManager::useSavedCouponsForApply(false); if($item == null && $basketCode != self::BASKET_CODE_NEW) $item = $basket->getItemByBasketCode($basketCode); if($item && $item->isBundleChild()) continue; if(!$item) continue; $itemsBasketCodes[] = $item->getBasketCode(); } } /** @var \Bitrix\Sale\BasketItem $item */ $basketItems = $basket->getBasketItems(); foreach($basketItems as $item) { if(!in_array($item->getBasketCode(), $itemsBasketCodes)) { $res = $item->delete(); if (!$res->isSuccess()) { $errMess = ""; foreach($res->getErrors() as $error) $errMess .= $error->getMessage()."\n"; if(strlen($errMess) <= 0) $errMess = Loc::getMessage("SALE_ORDEREDIT_BASKET_ITEM_DEL_ERROR"); $result->addError(new Error($errMess)); return null; } } } \Bitrix\Sale\ProviderBase::setUsingTrustData(true); $isStartField = $order->isStartField(); $needDataUpdate = array(); $basketCodeMap = array(); if(isset($formData["PRODUCT"]) && is_array($formData["PRODUCT"]) && !empty($formData["PRODUCT"])) { foreach($formData["PRODUCT"] as $basketCode => $productData) { $providerData = array(); if($productData["IS_SET_ITEM"] == "Y") continue; if(!isset($productData["PROPS"]) || !is_array($productData["PROPS"])) $productData["PROPS"] = array(); if(empty($productData['MANUALLY_EDITED'])) $item = $basket->getExistsItem($productData["MODULE"], $productData["OFFER_ID"], $productData["PROPS"]); else $item = $basket->getItemByBasketCode($basketCode); //sku was changed if($item == null && $basketCode != self::BASKET_CODE_NEW) { if($item = $basket->getItemByBasketCode($basketCode)) { $res = $item->delete(); if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); return null; } $item = null; } } if($item && $item->isBundleChild()) $item = null; if(!$item) { if($basketCode != self::BASKET_CODE_NEW) $setBasketCode = $basketCode; elseif(intval($maxBasketCodeIdx) > 0) $setBasketCode = 'n'.strval($maxBasketCodeIdx+1); //Fix collision part 2. else $setBasketCode = null; $item = $basket->createItem( $productData["MODULE"], $productData["OFFER_ID"], $setBasketCode ); if ($basketCode != $productData["BASKET_CODE"]) $productData["BASKET_CODE"] = $item->getBasketCode(); if($basketCode == self::BASKET_CODE_NEW) { $result->setData(array("NEW_ITEM_BASKET_CODE" => $productData["BASKET_CODE"])); $needDataUpdate[] = $item->getBasketCode(); } if(!empty($productData['REPLACED']) && $productData['REPLACED'] == 'Y') $needDataUpdate[] = $item->getBasketCode(); if(!$productAdded) $productAdded = true; } else { if ($basketCode != $productData["BASKET_CODE"]) $productData["BASKET_CODE"] = $item->getBasketCode(); if(isset($productData["OFFER_ID"]) || intval($productData["OFFER_ID"]) >= 0) $productData["PRODUCT_ID"] = $productData["OFFER_ID"]; $itemFields = array_intersect_key($productData, array_flip($item::getAvailableFields())); if(isset($itemFields["MEASURE_CODE"]) && strlen($itemFields["MEASURE_CODE"]) > 0) { $measures = OrderBasket::getCatalogMeasures(); if(isset($measures[$itemFields["MEASURE_CODE"]]) && strlen($measures[$itemFields["MEASURE_CODE"]]) > 0) $itemFields["MEASURE_NAME"] = $measures[$itemFields["MEASURE_CODE"]]; } if(!empty($productData["PROVIDER_DATA"]) && !self::$needUpdateNewProductPrice && CheckSerializedData($productData["PROVIDER_DATA"])) { $providerData = unserialize($productData["PROVIDER_DATA"]); } if(is_array($providerData) && !empty($providerData)) self::setProviderTrustData($item, $order, $providerData); if(!empty($productData["SET_ITEMS_DATA"]) && CheckSerializedData($productData["SET_ITEMS_DATA"])) $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); /** @var \Bitrix\Sale\Result $res */ $res = self::setBasketItemFields($item, $itemFields); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); return null; } } /* * Could be deleted and than added one more time product. * Or just added product. */ if($basketCode != $item->getBasketCode()) $basketCodeMap[$basketCode] = $item->getBasketCode(); if(!empty($productData["PROPS"]) && is_array($productData["PROPS"])) { /** @var \Bitrix\Sale\BasketPropertiesCollection $property */ $property = $item->getPropertyCollection(); $property->setProperty($productData["PROPS"]); } } $productsData = $formData["PRODUCT"]; if(!empty($basketCodeMap)) { foreach($basketCodeMap as $old => $new) { $productsData[$new] = $productsData[$old]; unset($productsData[$old]); } } $res = self::fillBasketItems($basket, $productsData, $order, array_unique($needDataUpdate)); if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); return null; } if ($isStartField) { $hasMeaningfulFields = $order->hasMeaningfulField(); /** @var Result $r */ $r = $order->doFinalAction($hasMeaningfulFields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if(isset($formData["DISCOUNTS"]) && is_array($formData["DISCOUNTS"])) $order->getDiscount()->setApplyResult($formData["DISCOUNTS"]); } else { $result->addError(new EntityError(Loc::getMessage("SALE_ORDEREDIT_ERROR_NO_PRODUCTS"))); } return $order; } /** * @param Order $order * @param array $formData * @param int $userId * * @return \Bitrix\Sale\Result */ public static function fillSimpleFields(Order $order, array $formData, $userId = 0) { $result = new \Bitrix\Sale\Result(); if(isset($formData["ORDER"]["RESPONSIBLE_ID"])) { if (intval($formData["ORDER"]["RESPONSIBLE_ID"]) != intval($order->getField('RESPONSIBLE_ID'))) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("RESPONSIBLE_ID", $formData["ORDER"]["RESPONSIBLE_ID"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } if(!empty($formData["ORDER"]) && array_key_exists('COMPANY_ID', $formData["ORDER"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("COMPANY_ID", (isset($formData["ORDER"]['COMPANY_ID']) && $formData["ORDER"]['COMPANY_ID'] > 0) ? $formData["ORDER"]['COMPANY_ID'] : 0); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if(isset($formData["PERSON_TYPE_ID"]) && intval($formData["PERSON_TYPE_ID"]) > 0) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setPersonTypeId(intval($formData['PERSON_TYPE_ID'])); } else { /** @var \Bitrix\Sale\Result $r */ $r = $order->setPersonTypeId( Blocks\OrderBuyer::getDefaultPersonType( $order->getSiteId() ) ); } if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if(isset($formData["ORDER"]["COMMENTS"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("COMMENTS", $formData["ORDER"]["COMMENTS"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if(isset($formData["USER_DESCRIPTION"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("USER_DESCRIPTION", $formData["USER_DESCRIPTION"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if(isset($formData["RESPONSIBLE_ID"])) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("RESPONSIBLE_ID", $formData["RESPONSIBLE_ID"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if(isset($formData["STATUS_ID"]) && strlen($formData["STATUS_ID"]) > 0) { $statusesList = \Bitrix\Sale\OrderStatus::getAllowedUserStatuses( $userId, \Bitrix\Sale\OrderStatus::getInitialStatus() ); if(array_key_exists($formData["STATUS_ID"], $statusesList)) { /** @var \Bitrix\Sale\Result $r */ $r = $order->setField("STATUS_ID", $formData["STATUS_ID"]); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } return $result; } public static function fillBasketItems(Basket &$basket, array $productsFormData, Order $order, array $needDataUpdate = array()) { $basketItems = $basket->getBasketItems(); $result = new Result(); $catalogProductsIds = array(); $trustData = array(); // Preparing fields need by provider /** @var \Bitrix\Sale\BasketItem $item */ foreach($basketItems as $item) { $basketCode = $item->getBasketCode(); if(empty($productsFormData[$basketCode])) continue; $productData = $productsFormData[$basketCode]; $isDataNeedUpdate = in_array($basketCode, $needDataUpdate); if(isset($productData["PRODUCT_PROVIDER_CLASS"]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) { $item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"])); } /* * Let's extract cached provider product data from field * in case activity is through ajax. */ if(self::$isTrustProductFormData && !$isDataNeedUpdate) { if(!empty($productData["PROVIDER_DATA"]) && CheckSerializedData($productData["PROVIDER_DATA"])) $trustData[$basketCode] = unserialize($productData["PROVIDER_DATA"]); // if quantity changed we must get fresh data from provider if(!empty($trustData[$basketCode]) && $trustData[$basketCode]["QUANTITY"] == $productData["QUANTITY"]) { if(!empty($productData["SET_ITEMS_DATA"]) && CheckSerializedData($productData["SET_ITEMS_DATA"])) $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); if(is_array($trustData[$basketCode]) && !empty($trustData[$basketCode])) self::setProviderTrustData($item, $order, $trustData[$basketCode]); } else { unset($trustData[$basketCode]); } } $item->setField("NAME", $productData["NAME"]); $res = $item->setField("QUANTITY", $productData["QUANTITY"]); if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); return $result; } if(isset($productData["MODULE"]) && $productData["MODULE"] == "catalog") { $catalogProductsIds[] = $item->getField('PRODUCT_ID'); } elseif(empty($productData["PRODUCT_PROVIDER_CLASS"])) { $availableFields = BasketItemBase::getAvailableFields(); $availableFields = array_fill_keys($availableFields, true); $fillFields = array_intersect_key($productData, $availableFields); if (!empty($fillFields)) { $r = $item->setFields($fillFields); } } } $catalogData = array(); if(!empty($catalogProductsIds)) $catalogData = OrderBasket::getProductsData($catalogProductsIds, $order->getSiteId(), array(), $order->getUserId()); $providerData = array(); if(!self::$isTrustProductFormData || !empty($needDataUpdate) || self::$needUpdateNewProductPrice) { $params = array("AVAILABLE_QUANTITY"); if($order->getId() <= 0) $params[] = "PRICE"; $providerData = Provider::getProductData($basket, $params); foreach($basketItems as $item) { $basketCode = $item->getBasketCode(); if($order->getId() <= 0 && !empty($providerData[$basketCode]) && empty($providerData[$basketCode]['QUANTITY'])) { $result->addError( new Error( Loc::getMessage( "SALE_ORDEREDIT_PRODUCT_QUANTITY_IS_EMPTY", array( "#NAME#" => $item->getField('NAME') ) ), 'SALE_ORDEREDIT_PRODUCT_QUANTITY_IS_EMPTY' ) ); } } } if (!$result->isSuccess()) { return $result; } $data = array(); foreach($basketItems as $item) { $basketCode = $item->getBasketCode(); $productData = $productsFormData[$basketCode]; $isDataNeedUpdate = in_array($basketCode, $needDataUpdate); $data[$basketCode] = $item->getFieldValues(); if(!empty($providerData[$basketCode])) { if (static::$isRefreshData === true) { unset($providerData[$basketCode]['QUANTITY']); } $data[$basketCode] = $providerData[$basketCode]; } elseif(!empty($trustData[$basketCode])) { $data[$basketCode] = $trustData[$basketCode]; } else { $data = Provider::getProductData($basket, array("PRICE", "AVAILABLE_QUANTITY"), $item); if(is_array($data[$basketCode]) && !empty($data[$basketCode])) self::setProviderTrustData($item, $order, $data[$basketCode]); } /* Get actual info from provider * cases: * 1) add new product to basket; * 2) saving operation; * 3) changing quantity; * 4) changing buyerId */ if($order->getId() <= 0 && (empty($data[$basketCode]) || !self::$isTrustProductFormData || $isDataNeedUpdate)) { if(empty($providerData[$basketCode]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) { $name = ""; if(!empty($productData["NAME"])) $name = $productData["NAME"]; if(!empty($productData["PRODUCT_ID"])) $name .= " (".$productData['PRODUCT_ID'].")"; $result->addError( new Error( Loc::getMessage( "SALE_ORDEREDIT_PRODUCT_IS_NOT_AVAILABLE", array( "#NAME_ID#" => $name ) ) ) ); // return $result; } } $product = array(); if(isset($data[$basketCode]) && !empty($data[$basketCode])) { $product = $data[$basketCode]; if(isset($productData['PRICE']) && isset($productData['CUSTOM_PRICE']) && $productData['CUSTOM_PRICE'] == 'Y') $product['PRICE'] = $productData['PRICE']; elseif(isset($product['BASE_PRICE'])) $product['PRICE'] = $product['BASE_PRICE'] - $product['DISCOUNT_PRICE']; } if($item->getField("MODULE") == "catalog") { if(!empty($catalogData[$item->getProductId()])) { $product = array_merge($product, $catalogData[$item->getProductId()]); unset($productData["CURRENCY"]); } } if(!self::$isTrustProductFormData || $isDataNeedUpdate) { $product = array_merge($productData, $product); } else { $needUpdateItemPrice = self::$needUpdateNewProductPrice && self::isBasketItemNew($basketCode); $isPriceCustom = isset($productData['CUSTOM_PRICE']) && $productData['CUSTOM_PRICE'] == 'Y'; if(($order->getId() <= 0 && !$isPriceCustom) || $needUpdateItemPrice) unset($productData['PRICE'], $productData['PRICE_BASE'], $productData['BASE_PRICE']); $product = array_merge($product, $productData); } if(isset($product["OFFER_ID"]) && intval($product["OFFER_ID"]) > 0) $product["PRODUCT_ID"] = $product["OFFER_ID"]; $product = array_intersect_key($product, array_flip($item::getAvailableFields())); if(isset($product["MEASURE_CODE"]) && strlen($product["MEASURE_CODE"]) > 0) { $measures = OrderBasket::getCatalogMeasures(); if(isset($measures[$product["MEASURE_CODE"]]) && strlen($measures[$product["MEASURE_CODE"]]) > 0) $product["MEASURE_NAME"] = $measures[$product["MEASURE_CODE"]]; } if(!isset($product["CURRENCY"]) || strlen($product["CURRENCY"]) <= 0) $product["CURRENCY"] = $order->getCurrency(); if($productData["IS_SET_PARENT"] == "Y") $product["TYPE"] = BasketItem::TYPE_SET; OrderEdit::setProductDetails( $productData["OFFER_ID"], $order->getUserId(), $order->getSiteId(), array_merge($product, $productData) ); $res = self::setBasketItemFields($item, $product); if(!$res->isSuccess()) { foreach($res->getErrors() as $newError) { foreach($result->getErrors() as $existError) if($newError->getMessage() == $existError->getMessage()) continue 2; $result->addError($newError); } } } return $result; } /** * @param BasketItem $item * @param array $productData * @return \Bitrix\Sale\Result * @throws SystemException * @deprecated use \Bitrix\Sale\Helpers\Admin\OrderEdit::fillBasketItems() */ public static function fillBasketItem(BasketItem &$item, array $productData, Order $order, Basket $basket, $needDataUpdate = false) { $result = new Result(); $basketCode = $item->getBasketCode(); if(isset($productData["PRODUCT_PROVIDER_CLASS"]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) $item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"])); $data = array(); /* * Let's extract cached provider product data from field * in case activity is through ajax. */ if(self::$isTrustProductFormData && !$needDataUpdate) { if(!empty($productData["PROVIDER_DATA"]) && CheckSerializedData($productData["PROVIDER_DATA"])) $data[$basketCode] = unserialize($productData["PROVIDER_DATA"]); // if quantity changed we must get fresh data from provider if(!empty($data[$basketCode]) && $data[$basketCode] == $productData["QUANTITY"]) { if(!empty($productData["SET_ITEMS_DATA"]) && CheckSerializedData($productData["SET_ITEMS_DATA"])) $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); if(is_array($data[$basketCode]) && !empty($data[$basketCode])) self::setProviderTrustData($item, $order, $data[$basketCode]); } else { unset($data[$basketCode]); } } $item->setField("NAME", $productData["NAME"]); $res = $item->setField("QUANTITY", $productData["QUANTITY"]); if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); return $result; } $product = array(); /* Get actual info from provider * cases: * 1) add new product to basket; * 2) saving operation; * 3) changing quantity; */ if(empty($data[$basketCode]) || !self::$isTrustProductFormData || $needDataUpdate) { $data = Provider::getProductData($basket, array("PRICE", "AVAILABLE_QUANTITY"), $item); if(empty($data[$basketCode]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) { $name = ""; if(!empty($productData["NAME"])) $name = $productData["NAME"]; if(!empty($productData["PRODUCT_ID"])) $name .= " (".$productData['PRODUCT_ID'].")"; $result->addError( new Error( Loc::getMessage( "SALE_ORDEREDIT_PRODUCT_IS_NOT_AVAILABLE", array( "#NAME_ID#" => $name ) ) ) ); return $result; } if(is_array($data[$basketCode]) && !empty($data[$basketCode])) self::setProviderTrustData($item, $order, $data[$basketCode]); } if(isset($data[$basketCode]) && !empty($data[$basketCode])) { $product = $data[$basketCode]; if(isset($productData['PRICE']) && isset($productData['CUSTOM_PRICE']) && $productData['CUSTOM_PRICE'] == 'Y') $product['PRICE'] = $productData['PRICE']; elseif(isset($product['BASE_PRICE'])) $product['PRICE'] = $product['BASE_PRICE'] - $product['DISCOUNT_PRICE']; } if(!self::$isTrustProductFormData) { if(isset($productData["MODULE"]) && $productData["MODULE"] == "catalog") { $data = OrderBasket::getProductDetails( $item->getProductId(), $productData["QUANTITY"], $order->getUserId(), $order->getSiteId() ); $product = array_merge($product, $data); } unset($productData["CURRENCY"]); } $product = array_merge($product, $productData); if(isset($product["OFFER_ID"]) || intval($product["OFFER_ID"]) >= 0) $product["PRODUCT_ID"] = $product["OFFER_ID"]; $product = array_intersect_key($product, array_flip($item::getAvailableFields())); if(isset($product["MEASURE_CODE"]) && strlen($product["MEASURE_CODE"]) > 0) { $measures = OrderBasket::getCatalogMeasures(); if(isset($measures[$product["MEASURE_CODE"]]) && strlen($measures[$product["MEASURE_CODE"]]) > 0) $product["MEASURE_NAME"] = $measures[$product["MEASURE_CODE"]]; } if(!isset($product["CURRENCY"]) || strlen($product["CURRENCY"]) <= 0) $product["CURRENCY"] = $order->getCurrency(); if($productData["IS_SET_PARENT"] == "Y") $product["TYPE"] = BasketItem::TYPE_SET; OrderEdit::setProductDetails( $productData["OFFER_ID"], $order->getUserId(), $order->getSiteId(), array_merge($product, $productData) ); $result = self::setBasketItemFields($item, $product); return $result; } public static function setProviderTrustData(BasketItem $item, Order $order, array $data) { if(empty($data)) return false; Provider::setTrustData($order->getSiteId(), $item->getField('MODULE'), $item->getProductId(), $data); if ($item->isBundleParent()) { if ($bundle = $item->getBundleCollection()) { /** @var \Bitrix\Sale\BasketItem $bundleItem */ foreach ($bundle as $bundleItem) { $bundleItemData = $bundleItem->getFields()->getValues(); Provider::setTrustData($order->getSiteId(), 'sale', $bundleItem->getProductId(), $bundleItemData); } } } return true; } public static function setBasketItemFields(\Bitrix\Sale\BasketItem &$item, array $fields = array()) { return $item->setFields($fields); } public static function getSiteName(&$siteId) { $siteName = ""; if(strlen($siteId) <= 0) { $res = \CSite::GetList($by="id", $order="asc", array("ACTIVE" => "Y", "DEF" => "Y")); if($site = $res->Fetch()) { $siteId = $site["ID"]; $siteName = $site["NAME"]." (".$siteId.")"; } } else { $res = \CSite::GetByID($siteId); if($site = $res->Fetch()) $siteName = $site["NAME"]." (".$siteId.")"; } return $siteName; } public static function restoreFieldsNames(array $data, $path = "") { $result = array(); foreach($data as $fieldName => $fieldValue) { $fullName = ($path == "" ? $fieldName : $path."[".$fieldName."]"); if(is_array($fieldValue)) $result = array_merge($result, self::restoreFieldsNames($fieldValue, $fullName)); else $result[$fullName] = $fieldValue; } return $result; } /** * @param $newUserId * @param int $orderId * @param int|null $oldUserId */ public static function initCouponsData($newUserId, $orderId = 0, $oldUserId = 0) { $newUserId = (int)$newUserId; $orderId = (int)$orderId; $params = array('userId' => $newUserId); if ($oldUserId !== null) { $oldUserId = (int)$oldUserId; if ($oldUserId != $newUserId) $params["oldUserId"] = $oldUserId; } if ($orderId > 0) { $params['orderId'] = $orderId; DiscountCouponsManager::init( DiscountCouponsManager::MODE_ORDER, $params ); } else { DiscountCouponsManager::init( DiscountCouponsManager::MODE_MANAGER, $params ); } } public static function getCouponsData() { return DiscountCouponsManager::get(true, array(), true, false); } public static function getDiscountsApplyResult(\Bitrix\Sale\Order $order, $needRecalculate = false) { static $calcResults = null; if ($order instanceof \Bitrix\Sale\Archive\Order) { /** @var \Bitrix\Sale\Archive\Order $order*/ return $order->getDiscountData(); } if($calcResults === null || $needRecalculate) { if($needRecalculate) { /** @var \Bitrix\Sale\Result $r */ $r = $order->getDiscount()->calculate(); if ($r->isSuccess()) { $discountData = $r->getData(); $order->applyDiscount($discountData); } } $calcResults = $order->getDiscount()->getApplyResult(true); } return $calcResults === null ? array() : $calcResults; } public static function getOrderedDiscounts(\Bitrix\Sale\Order $order, $needRecalculate = true) { $discounts = self::getDiscountsApplyResult($order, $needRecalculate); $discounts["ORDER"] = array(); if(isset($discounts["DISCOUNT_LIST"]) && is_array($discounts["DISCOUNT_LIST"])) $discounts["ORDER"]["DISCOUNT_LIST"] = array_keys($discounts["DISCOUNT_LIST"]); return $discounts; } public static function getCouponList(\Bitrix\Sale\Order $order = null, $needRecalculate = true) { $result = array(); $discounts = array(); if ($order instanceof \Bitrix\Sale\Archive\Order) { $discounts = $order->getDiscountData(); return $discounts['COUPON_LIST']; } $couponsList = self::getCouponsData(); if($order) $discounts = self::getDiscountsApplyResult($order, $needRecalculate); if (!empty($couponsList)) { foreach ($couponsList as &$oneCoupon) { if ($oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_NOT_FOUND || $oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_FREEZE) $oneCoupon['JS_STATUS'] = 'BAD'; elseif ($oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_NOT_APPLYED || $oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_ENTERED) $oneCoupon['JS_STATUS'] = 'ENTERED'; else $oneCoupon['JS_STATUS'] = 'APPLYED'; $oneCoupon['JS_CHECK_CODE'] = ''; if (isset($oneCoupon['CHECK_CODE_TEXT'])) { $oneCoupon['JS_CHECK_CODE'] = ( is_array($oneCoupon['CHECK_CODE_TEXT']) ? implode('<br>', $oneCoupon['CHECK_CODE_TEXT']) : $oneCoupon['CHECK_CODE_TEXT'] ); } if(!empty($discounts) && isset($discounts["COUPON_LIST"]) && is_array($discounts["COUPON_LIST"])) { foreach($discounts["COUPON_LIST"] as $coupon => $couponParams) { $couponsList[$coupon]["APPLY"] = $couponParams["APPLY"]; $couponsList[$coupon]["DISCOUNT_SIZE"] = ""; if(isset($couponParams["ORDER_DISCOUNT_ID"]) && strlen($couponParams["ORDER_DISCOUNT_ID"]) > 0) { $couponsList[$coupon]["ORDER_DISCOUNT_ID"] = $couponParams["ORDER_DISCOUNT_ID"]; if(isset($discounts["DISCOUNT_LIST"][$couponParams["ORDER_DISCOUNT_ID"]])) { $couponDiscountParams = $discounts["DISCOUNT_LIST"][$couponParams["ORDER_DISCOUNT_ID"]]; if(isset($couponDiscountParams["ACTIONS_DESCR"]) && is_array($couponDiscountParams["ACTIONS_DESCR"])) foreach($couponDiscountParams["ACTIONS_DESCR"] as $key => $val) $couponsList[$coupon]["DISCOUNT_SIZE"] .= $val; } } } } } $result = array_values($couponsList); } return $result; } public static function getTotalPrices(Order $order, OrderBasket $orderBasket, $needRecalculate = true) { $result = array( 'PRICE_TOTAL' => $order->getPrice(), 'TAX_VALUE' => $order->getTaxValue(), 'PRICE_DELIVERY_DISCOUNTED' => $order->getDeliveryPrice(), 'SUM_PAID' => $order->getSumPaid(), 'ORDER_DISCOUNT_VALUE' => $order->getField('DISCOUNT_VALUE') ); $result["SUM_UNPAID"] = $result["PRICE_TOTAL"] - $result["SUM_PAID"]; if(!$result["PRICE_DELIVERY_DISCOUNTED"]) $result["PRICE_DELIVERY_DISCOUNTED"] = 0; if(!$result["TAX_VALUE"]) $result["TAX_VALUE"] = 0; $orderDiscount = $order->getDiscount(); if($orderDiscount) $discountsList = self::getDiscountsApplyResult($order, $needRecalculate); else $discountsList = array(); if(isset($discountsList["PRICES"]["DELIVERY"]["DISCOUNT"])) $result['DELIVERY_DISCOUNT'] = $discountsList["PRICES"]["DELIVERY"]["DISCOUNT"]; else $result['DELIVERY_DISCOUNT'] = 0; $result['PRICE_DELIVERY'] = $result['PRICE_DELIVERY_DISCOUNTED'] + $result['DELIVERY_DISCOUNT']; $basketData = $orderBasket->getPrices($discountsList); $result["PRICE_BASKET_DISCOUNTED"] = $basketData["BASKET_PRICE"]; $result["PRICE_BASKET"] = $basketData["BASKET_PRICE_BASE"]; return $result; } /** * @param $productId * @param $userId * @param $siteId * @param array $params * @throws ArgumentNullException */ public static function setProductDetails($productId, $userId, $siteId, array $params) { if(strlen($productId) <= 0) return; if(strlen($userId) <= 0) $userId = "0"; if(strlen($siteId) <= 0) throw new ArgumentNullException("siteId"); self::$productsDetails[$productId."_".$userId."_".$siteId] = $params; } public static function getProductDetails($productId, $userId, $siteId) { if(strlen($productId) <= 0) { throw new ArgumentNullException("productId"); } if(strlen($userId) <= 0) $userId = "0"; if(strlen($siteId) <= 0) throw new ArgumentNullException("siteId"); if(isset(self::$productsDetails[$productId."_".$userId."_".$siteId])) $result = self::$productsDetails[$productId."_".$userId."_".$siteId]; else $result = false; return $result; } /** * @return array * @throws \Bitrix\Main\ArgumentException */ public static function getCompanyList() { $dbRes = Company\Manager::getList( array( 'select' => array('ID', 'NAME'), 'filter' => array('ACTIVE' => 'Y') ) ); $result = array(); while ($company = $dbRes->fetch()) $result[$company["ID"]] = $company["NAME"]." [".$company["ID"]."]"; return $result; } public static function getLockingMessage($orderId) { $intLockUserID = 0; $strLockTime = ''; $r = \Bitrix\Sale\Order::getLockedStatus($orderId); if ($r->isSuccess()) { $lockResult = $r->getData(); if (array_key_exists('LOCKED_BY', $lockResult) && intval($lockResult['LOCKED_BY']) > 0) $intLockUserID = intval($lockResult['LOCKED_BY']); if (array_key_exists('DATE_LOCK', $lockResult) && $lockResult['DATE_LOCK'] instanceof \Bitrix\Main\Type\DateTime) $strLockTime = $lockResult['DATE_LOCK']->toString(); } $strLockUserInfo = $intLockUserID; $userIterator = \Bitrix\Main\UserTable::getList(array( 'select' => array('ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL'), 'filter' => array('=ID' => $intLockUserID) )); if ($arOneUser = $userIterator->fetch()) { $strNameFormat = \CSite::GetNameFormat(true); $strLockUser = \CUser::FormatName($strNameFormat, $arOneUser); $strLockUserInfo = '<a href="/bitrix/admin/user_edit.php?lang='.LANGUAGE_ID.'&ID='.$intLockUserID.'">'.$strLockUser.'</a>'; } return Loc::getMessage( 'SALE_ORDEREDIT_LOCKED', array( '#ID#' => $strLockUserInfo, '#DATE#' => $strLockTime, ) ); } }