/** @global CMain $APPLICATION */
/** @global CUser $USER */
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/prolog.php");
use Bitrix\Main\Loader;
use Bitrix\Sale\Location;
use Bitrix\Sale\DiscountCouponsManager;
use Bitrix\Sale;
Loader::includeModule('sale');
$crmMode = (defined("BX_PUBLIC_MODE") && BX_PUBLIC_MODE && array_key_exists("CRM_MANAGER_USER_ID", $_REQUEST));
if ($crmMode)
{
CUtil::DecodeUriComponent($_GET);
CUtil::DecodeUriComponent($_POST);
echo '';
}
$bUseCatalog = Loader::includeModule('catalog');
$bUseIblock = $bUseCatalog;
IncludeModuleLangFile(__FILE__);
ClearVars();
$ID = 0;
if (isset($_REQUEST['ID']))
$ID = (int)$_REQUEST['ID'];
if ($ID < 0)
$ID = 0;
$COUNT_RECOM_BASKET_PROD = 2;
$arOrderOldTmp = false;
define("PROP_COUNT_LIMIT", 21);
$arFilter = array(
"LID" => LANG,
"ID" => "N"
);
$str_PRICE = 0;
$str_DISCOUNT_VALUE = 0;
if ($ID > 0)
{
$dbOrder = CSaleOrder::GetList(
array(),
array("ID" => $ID),
false,
false,
array()
);
if ($arOrderOldTmp = $dbOrder->ExtractFields("str_"))
$arFilter["ID"] = $arOrderOldTmp["STATUS_ID"];
}
$arStatusList = false;
$arGroupByTmpSt = false;
$arUserGroups = $USER->GetUserGroupArray();
$intUserID = (int)$USER->GetID();
$saleModulePermissions = $APPLICATION->GetGroupRight("sale");
if ($saleModulePermissions < "W")
{
$arFilter["GROUP_ID"] = $arUserGroups;
$arFilter["PERM_UPDATE"] = "Y";
$arGroupByTmpSt = array("ID", "NAME", "MAX" => "PERM_UPDATE");
}
$dbStatusList = CSaleStatus::GetList(
array(),
$arFilter,
$arGroupByTmpSt,
false,
array("ID", "NAME")
);
$arStatusList = $dbStatusList->Fetch();
if ($saleModulePermissions == "D" || ($saleModulePermissions < "W" && $arStatusList["PERM_UPDATE"] != "Y"))
$APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
$errorMessage = "";
/*****************************************************************************/
/********************* UTIL AJAX *********************************************/
/*****************************************************************************/
if (CSaleLocation::isLocationProEnabled())
{
if (isset($_REQUEST['ACT']))
{
$result = array(
'ERRORS' => array(),
'DATA' => array()
);
if($_REQUEST['ACT'] == 'GET_LOC_BY_ZIP')
{
$zip = '';
if (isset($_REQUEST['ZIP']))
$zip = (string)$_REQUEST['ZIP'];
if ($zip == '')
{
$result['ERRORS'] = array('Not found');
}
else
{
$item = Location\Admin\LocationHelper::getLocationsByZip($zip, array('limit' => 1))->fetch();
if (!isset($item['LOCATION_ID']))
$result['ERRORS'] = array('Not found');
else
{
$siteId = '';
if(!empty($_REQUEST['SITE_ID']))
$siteId = (string)$_REQUEST['SITE_ID'];
elseif (defined('SITE_ID'))
$siteId = SITE_ID;
$result['DATA']['ID'] = (int)$item['LOCATION_ID'];
if ($siteId != '')
{
if (!Location\SiteLocationTable::checkConnectionExists($siteId, $result['DATA']['ID']))
$result['ERRORS'] = array('Found, but not connected');
}
}
}
}
elseif($_REQUEST['ACT'] == 'GET_ZIP_BY_LOC')
{
if(!intval($_REQUEST['LOC']))
$result['ERRORS'] = array('No location id passed');
else
{
$item = \Bitrix\Sale\Location\LocationTable::getList(
array(
'filter' => array(
'=ID' => intval($_REQUEST['LOC']),
'=EXTERNAL.SERVICE.CODE' => 'ZIP'
),
'select' => array(
'ZIP' => 'EXTERNAL.XML_ID'
)
)
)->fetch();
if($item['ZIP'] <> '')
{
$result['DATA']['ZIP'] = $item['ZIP'];
}
else
{
$result['ERRORS'] = array('None were found');
}
}
}
header('Content-Type: application/x-javascript; charset='.LANG_CHARSET);
print(CUtil::PhpToJSObject(array(
'result' => empty($result['ERRORS']),
'errors' => $result['ERRORS'],
'data' => $result['DATA']
), false, false, true));
die();
}
}
/*****************************************************************************/
/********************* ORDER FUNCTIONS ***************************************/
/*****************************************************************************/
if (isset($_REQUEST['dontsave']) && $_REQUEST['dontsave'] == 'Y')
{
$intLockUserID = 0;
$strLockTime = '';
DiscountCouponsManager::clear(true);
if (!CSaleOrder::IsLocked($ID, $intLockUserID, $strLockTime))
CSaleOrder::UnLock($ID);
LocalRedirect("sale_order.php?lang=".LANGUAGE_ID.GetFilterParams("filter_", false));
}
if ($saleModulePermissions >= "W" && isset($_REQUEST['unlock']) && 'Y' == $_REQUEST['unlock'])
{
$intLockUserID = 0;
$strLockTime = '';
DiscountCouponsManager::clear(true);
if (CSaleOrder::IsLocked($ID, $intLockUserID, $strLockTime))
CSaleOrder::UnLock($ID);
LocalRedirect("sale_order_new.php?ID=".$ID."&lang=".LANGUAGE_ID.GetFilterParams("filter_", false));
}
// include functions
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/general/admin_tool.php");
$callbackList = array(
'CALLBACK_FUNC',
'ORDER_CALLBACK_FUNC',
'CANCEL_CALLBACK_FUNC',
'PAY_CALLBACK_FUNC',
'PRODUCT_PROVIDER_CLASS'
);
/*****************************************************************************/
/**************************** SAVE ORDER *************************************/
/*****************************************************************************/
$bVarsFromForm = false;
if (
$_SERVER['REQUEST_METHOD'] == 'POST'
&& check_bitrix_sessid()
&& $saleModulePermissions >= 'U'
&& isset($_POST['save_order_data']) && $_POST['save_order_data'] == 'Y'
&& empty($_POST['dontsave']))
{
$ID = intval($ID);
$recalcOrder = "N";
$isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'Y');
if (defined("SALE_DEBUG") && SALE_DEBUG)
CSaleHelper::WriteToLog("order_new.php", array("POST" => $_POST), "ORNW1");
// buyer type, new or existing
$btnNewBuyer = "N";
if ($btnTypeBuyer == "btnBuyerNew")
$btnNewBuyer = "Y";
$useStores = (isset($_POST["storeCount"]) && intval($_POST["storeCount"]) > 0) ? true : false;
if ($LID == '')
$errorMessage .= GetMessage("SOE_EMPTY_SITE")."
";
$BASE_LANG_CURRENCY = CSaleLang::GetLangCurrency($LID);
$str_PERSON_TYPE_ID = intval($buyer_type_id);
if ($str_PERSON_TYPE_ID <= 0)
$errorMessage .= GetMessage("SOE_EMPTY_PERS_TYPE")."
";
if (($str_PERSON_TYPE_ID > 0) && !($arPersonType = CSalePersonType::GetByID($str_PERSON_TYPE_ID)))
$errorMessage .= GetMessage("SOE_PERSON_NOT_FOUND")."
";
$str_STATUS_ID = trim($STATUS_ID);
if ($str_STATUS_ID <> '')
{
if ($saleModulePermissions < "W")
{
$dbStatusList = CSaleStatus::GetList(
array(),
array(
"GROUP_ID" => $arUserGroups,
"PERM_STATUS" => "Y",
"ID" => $str_STATUS_ID
),
array("ID", "MAX" => "PERM_STATUS"),
false,
array("ID")
);
if (!$dbStatusList->Fetch())
$errorMessage .= str_replace("#STATUS_ID#", $str_STATUS_ID, GetMessage("SOE_NO_STATUS_PERMS"))."
";
}
}
$str_PAY_SYSTEM_ID = intval($PAY_SYSTEM_ID);
if ($str_PAY_SYSTEM_ID <= 0)
$errorMessage .= GetMessage("SOE_PAYSYS_EMPTY")."
";
if (($str_PAY_SYSTEM_ID > 0) && !($arPaySys = CSalePaySystem::GetByID($str_PAY_SYSTEM_ID, $str_PERSON_TYPE_ID)))
$errorMessage .= GetMessage("SOE_PAYSYS_NOT_FOUND")."
";
if (empty($_POST["PRODUCT"]))
$errorMessage .= GetMessage("SOE_EMPTY_ITEMS")."
";
if (isset($DELIVERY_ID) AND $DELIVERY_ID != "")
{
$str_DELIVERY_ID = trim($DELIVERY_ID);
$PRICE_DELIVERY = floatval($PRICE_DELIVERY);
}
$arCoupon = (!empty($_POST['COUPON']) ? fGetCoupon($_POST['COUPON']) : array());
if (!empty($arCoupon))
$recalcOrder = "Y";
if (array_key_exists('ADDITIONAL_INFO', $_POST))
{
$str_ADDITIONAL_INFO = trim($_POST["ADDITIONAL_INFO"]);
}
$str_COMMENTS = trim($_POST["COMMENTS"]);
if (isset($_POST["btnTypeBuyer"]) && $_POST["btnTypeBuyer"] == "btnBuyerNew")
{
$user_id = '';
unset($user_profile);
}
$profileName = "";
if (isset($user_profile) && $user_profile != "" && $btnNewBuyer == "N")
$userProfileID = intval($user_profile);
//array field send mail
$FIO = "";
$rsUser = CUser::GetByID($user_id);
if($arUser = $rsUser->Fetch())
{
if ($arUser["LAST_NAME"] != "")
$FIO .= $arUser["LAST_NAME"]." ";
if ($arUser["NAME"] != "")
$FIO .= $arUser["NAME"];
}
$arUserEmail = array("PAYER_NAME" => $FIO, "USER_EMAIL" => $arUser["EMAIL"]);
$BREAK_NAME = isset($_POST["BREAK_NAME"]) ? $_POST["BREAK_NAME"] : "";
if ($BREAK_NAME == GetMessage('NEWO_BREAK_NAME'))
$BREAK_NAME = "";
$BREAK_LAST_NAME = isset($_POST["BREAK_LAST_NAME"]) ? $_POST["BREAK_LAST_NAME"] : "";
if ($BREAK_LAST_NAME == GetMessage('NEWO_BREAK_LAST_NAME'))
$BREAK_LAST_NAME = "";
$BREAK_SECOND_NAME = isset($_POST["BREAK_SECOND_NAME"]) ? $_POST["BREAK_SECOND_NAME"] : "";
if ($BREAK_SECOND_NAME == GetMessage('NEWO_BREAK_SECOND_NAME'))
$BREAK_SECOND_NAME = "";
// checking order properties
if ($errorMessage == '')
{
$arOrderPropsValues = array();
$arPropFilter = array(
"PERSON_TYPE_ID" => $str_PERSON_TYPE_ID,
"ACTIVE" => "Y"
);
if ($str_PAY_SYSTEM_ID != 0)
{
$arPropFilter["RELATED"]["PAYSYSTEM_ID"] = $str_PAY_SYSTEM_ID;
$arPropFilter["RELATED"]["TYPE"] = "WITH_NOT_RELATED";
}
if ($str_DELIVERY_ID <> '')
{
$arPropFilter["RELATED"]["DELIVERY_ID"] = $str_DELIVERY_ID;
$arPropFilter["RELATED"]["TYPE"] = "WITH_NOT_RELATED";
}
$orderPropList = array();
$orderFileProps = array();
$orderFilePropsValue = array();
$dbOrderProps = CSaleOrderProps::GetList(
array("ID" => "ASC"),
$arPropFilter,
false,
false,
array("ID", "NAME", "TYPE", "REQUIED", "IS_LOCATION", "IS_EMAIL", "IS_PROFILE_NAME", "IS_PAYER", "IS_LOCATION4TAX", "CODE", "SORT")
);
while ($arOrderProps = $dbOrderProps->Fetch())
{
$orderPropList[$arOrderProps['ID']] = $arOrderProps;
if ($arOrderProps['TYPE'] == 'FILE')
$orderFileProps[$arOrderProps['ID']] = $arOrderProps;
}
if ($crmMode && $ID > 0 && !empty($orderFileProps))
{
$rsFileOrderProps = CSaleOrderPropsValue::GetList(
array(),
array("ORDER_ID" => $ID, 'ORDER_PROPS_ID' => array_keys($orderFileProps)),
false,
false,
array("ID", "ORDER_ID", "ORDER_PROPS_ID", "VALUE")
);
while ($oneFileOrderProp = $rsFileOrderProps->Fetch())
{
if (!isset($orderFilePropsValue[$oneFileOrderProp['ORDER_PROPS_ID']]))
$orderFilePropsValue[$oneFileOrderProp['ORDER_PROPS_ID']] = array();
$oneFileOrderProp['VALUE'] = trim($oneFileOrderProp['VALUE']);
if ($oneFileOrderProp['VALUE'] != '')
{
$orderFilePropsValue[$oneFileOrderProp['ORDER_PROPS_ID']] = explode(', ', $oneFileOrderProp['VALUE']);
}
}
unset($oneFileOrderProp, $rsFileOrderProps);
}
foreach ($orderPropList as $arOrderProps)
{
if (!is_array(${"ORDER_PROP_".$arOrderProps["ID"]}))
$curVal = trim($_POST["ORDER_PROP_".$arOrderProps["ID"]]);
else
$curVal = $_POST["ORDER_PROP_".$arOrderProps["ID"]];
if ($arOrderProps["TYPE"] == "LOCATION")
{
$curVal = $_POST["CITY_ORDER_PROP_".$arOrderProps["ID"]];
$regId = $_POST["REGION_ORDER_PROP_".$arOrderProps["ID"]."CITY_ORDER_PROP_".$arOrderProps["ID"]];
$countryId = $_POST["ORDER_PROP_".$arOrderProps["ID"]."CITY_ORDER_PROP_".$arOrderProps["ID"]];
if (intval($curVal) <= 0 && intval($regId) > 0)
{
$dbLoc = CSaleLocation::GetList(array(), array("REGION_ID" => $regId, "CITY_ID" => false), false, false, array("ID", "REGION_ID", "CITY_ID"));
if($arLoc = $dbLoc->Fetch())
{
$curVal = $arLoc["ID"];
}
}
if(intval($curVal) <= 0 && intval($countryId) > 0)
{
$dbLoc = CSaleLocation::GetList(array(), array("COUNTRY_ID" => $countryId, "REGION_ID" => false, "CITY_ID" => false), false, false, array("ID", "COUNTRY_ID", "REGION_ID", "CITY_ID"));
if($arLoc = $dbLoc->Fetch())
{
$curVal = $arLoc["ID"];
}
}
}
if ($arOrderProps["TYPE"] == "FILE")
{
$curVal = array();
$arReplacedFiles2Delete = array();
if ($crmMode && $ID > 0)
{
if (isset($orderFilePropsValue[$arOrderProps["ID"]]))
{
foreach ($orderFilePropsValue[$arOrderProps["ID"]] as $keyFile => $valueFile)
{
$curVal[] = array('file_id' => $valueFile);
}
}
}
else
{
if (array_key_exists("ORDER_PROP_".$arOrderProps["ID"], $_FILES) && is_array($_FILES["ORDER_PROP_".$arOrderProps["ID"]]))
{
foreach ($_FILES["ORDER_PROP_".$arOrderProps["ID"]] as $param_name => $arValues)
{
if (is_array($arValues))
{
$i = 0;
foreach ($arValues as $nIndex => $val)
{
if (mb_substr($nIndex, 1) != "undefined")
{
if (mb_substr($nIndex, 0, 1) == "n" && $val <> '') // if new file is added
{
$curVal[$i][$param_name] = $val;
}
else // if there is existing file id already
{
if (intval($nIndex) > 0)
{
if ($param_name == "name" && $val == '') // no file replacement
{
$curVal[$i]["file_id"] = $nIndex;
// del flag
if (isset($_POST["ORDER_PROP_".$arOrderProps["ID"]."_del"]))
{
if (array_key_exists($nIndex, $_POST["ORDER_PROP_".$arOrderProps["ID"]."_del"]))
$curVal[$i]["del"] = $_POST["ORDER_PROP_".$arOrderProps["ID"]."_del"][$nIndex];
}
}
elseif ($_FILES["ORDER_PROP_".$arOrderProps["ID"]]["name"][$nIndex] <> '') // replacement file data
{
$curVal[$i][$param_name] = $val;
if (!in_array($nIndex, $arReplacedFiles2Delete))
$arReplacedFiles2Delete[] = $nIndex;
}
}
}
}
$i++;
}
}
}
//delete replaced files
foreach ($arReplacedFiles2Delete as $id => $file_id)
{
$arReplace = array("file_id" => $file_id, "del" => "Y");
$curVal[] = $arReplace;
}
}
}
}
if ($arOrderProps["IS_PAYER"] == "Y")
{
if ($curVal == '' && $BREAK_NAME <> '' && $BREAK_LAST_NAME <> '')
$curVal = $BREAK_NAME." ".$BREAK_LAST_NAME;
}
if ($arOrderProps["IS_EMAIL"] == "Y")
{
$arUserEmail["USER_EMAIL"] = trim($curVal);
}
if ($arOrderProps["IS_PROFILE_NAME"] == "Y")
{
$profileName = $curVal;
}
if (
($arOrderProps["IS_LOCATION"]=="Y" || $arOrderProps["IS_LOCATION4TAX"]=="Y")
&& intval($curVal) <= 0
||
($arOrderProps["IS_PROFILE_NAME"]=="Y" || $arOrderProps["IS_PAYER"]=="Y")
&& $curVal == ''
||
$arOrderProps["REQUIED"]=="Y"
&& $arOrderProps["TYPE"]=="LOCATION"
&& intval($curVal) <= 0
||
$arOrderProps["REQUIED"]=="Y"
&& ($arOrderProps["TYPE"]=="TEXT" || $arOrderProps["TYPE"]=="TEXTAREA" || $arOrderProps["TYPE"]=="RADIO" || $arOrderProps["TYPE"]=="SELECT")
&& $curVal == ''
||
($arOrderProps["REQUIED"]=="Y"
&& $arOrderProps["TYPE"]=="MULTISELECT"
&& empty($curVal))
||
($arOrderProps["REQUIED"]=="Y"
&& $arOrderProps["TYPE"]=="FILE"
&& empty($curVal))
)
{
$errorMessage .= str_replace("#NAME#", $arOrderProps["NAME"], GetMessage("SOE_EMPTY_PROP"))."
";
}
if ($arOrderProps["TYPE"] == "MULTISELECT")
{
$curVal = "";
$countOrderProp = count($_POST["ORDER_PROP_".$arOrderProps["ID"]]);
for ($i = 0; $i < $countOrderProp; $i++)
{
if ($i > 0)
$curVal .= ",";
$curVal .= $_POST["ORDER_PROP_".$arOrderProps["ID"]][$i];
}
}
if ($arOrderProps["TYPE"] == "CHECKBOX" && $curVal == '' && $arOrderProps["REQUIED"] != "Y")
{
$curVal = "N";
}
$arOrderPropsValues[$arOrderProps["ID"]] = $curVal;
}
}
//create a new user
if ($btnNewBuyer == "Y" && $errorMessage == '')
{
if ($NEW_BUYER_EMAIL == '')
{
$emailId = '';
$dbProperties = CSaleOrderProps::GetList(
array("ID" => "ASC"),
array("PERSON_TYPE_ID" => $str_PERSON_TYPE_ID, "ACTIVE" => "Y", "IS_EMAIL" => "Y", "RELATED" => false),
false,
false,
array("ID")
);
while ($arProperties = $dbProperties->Fetch())
{
if ($emailId == '')
$emailId = $arProperties["ID"];
if ($arProperties["REQUIED"] == "Y")
$emailId = $arProperties["ID"];
}
$NEW_BUYER_EMAIL = ${"ORDER_PROP_".$emailId};
}
if ($NEW_BUYER_EMAIL == '')
$errorMessage .= GetMessage("NEWO_BUYER_REG_ERR_MAIL");
//take default value PHONE for register user
$dbOrderProps = CSaleOrderProps::GetList(
array(),
array("PERSON_TYPE_ID" => $str_PERSON_TYPE_ID, "ACTIVE" => "Y", "CODE" => "PHONE", "RELATED" => false),
false,
false,
array("ID")
);
$arOrderProps = $dbOrderProps->Fetch();
$NEW_BUYER_PHONE = "";
if (!empty($arOrderProps))
$NEW_BUYER_PHONE = trim($_POST["ORDER_PROP_".$arOrderProps["ID"]]);
$NEW_BUYER_NAME = isset($_POST["NEW_BUYER_NAME"]) ? $_POST["NEW_BUYER_NAME"] : "";
$NEW_BUYER_LAST_NAME = isset($_POST["NEW_BUYER_LAST_NAME"]) ? $_POST["NEW_BUYER_LAST_NAME"] : "";
$NEW_BUYER_SECOND_NAME = isset($_POST["NEW_BUYER_SECOND_NAME"]) ? $_POST["NEW_BUYER_SECOND_NAME"] : "";
if ($NEW_BUYER_NAME == "" && $NEW_BUYER_LAST_NAME == "")
{
$NEW_BUYER_NAME = $BREAK_NAME;
$NEW_BUYER_LAST_NAME = $BREAK_LAST_NAME;
$NEW_BUYER_SECOND_NAME = $BREAK_SECOND_NAME;
}
if ($NEW_BUYER_NAME == "" || $NEW_BUYER_LAST_NAME == "")
$errorMessage .= GetMessage("NEWO_BUYER_REG_ERR_NAME")."
";
$NEW_BUYER_FIO = $NEW_BUYER_LAST_NAME." ".$NEW_BUYER_NAME." ".$NEW_BUYER_SECOND_NAME;
$arUserEmail["PAYER_NAME"] = $NEW_BUYER_FIO;
if ($errorMessage == '')
{
$userRegister = array(
"NAME" => $NEW_BUYER_NAME,
"LAST_NAME" => $NEW_BUYER_LAST_NAME,
"SECOND_NAME" => $NEW_BUYER_SECOND_NAME,
"PERSONAL_MOBILE" => $NEW_BUYER_PHONE
);
$arPersonal = array("PERSONAL_MOBILE" => $NEW_BUYER_PHONE);
$user_id = CSaleUser::DoAutoRegisterUser($NEW_BUYER_EMAIL, $userRegister, $LID, $arErrors, $arPersonal);
if (!empty($arErrors))
{
foreach($arErrors as $val)
$errorMessage .= $val["TEXT"];
}
else
{
$userProfileID = 0;
$rsUser = CUser::GetByID($user_id);
$arUser = $rsUser->Fetch();
$userNew = str_replace("#FIO#", "(".$arUser["LOGIN"].")".(($arUser["NAME"] != "") ? " ".$arUser["NAME"] : "").(($arUser["LAST_NAME"] != "") ? " ".$arUser["LAST_NAME"] : ""), GetMessage("NEWO_BUYER_REG_OK"));
}
}
}
if (!isset($userProfileID))
$profileName = "";
$str_USER_ID = intval($user_id);
if ($str_USER_ID <= 0 && $errorMessage == '')
{
$str_USER_ID = "";
$errorMessage .= GetMessage("SOE_EMPTY_USER")."
";
}
elseif ($str_USER_ID > 0 && $errorMessage == '')
{
$rsUser = CUser::GetByID($str_USER_ID);
if (!$rsUser->Fetch())
$errorMessage .= GetMessage("NEWO_ERR_EMPTY_USER")."
";
}
// tmp hack to check if any product quantity is not enough to buy before saving data
if (isset($_POST["PRODUCT"]) && !empty($_POST["PRODUCT"]))
{
foreach ($_POST["PRODUCT"] as $key => $val)
{
if (intval($val["PRODUCT_ID"]) > 0 && $val["MODULE"] == 'catalog' && $bUseCatalog)
{
if ($arCatalogProduct = CCatalogProduct::GetByID($val["PRODUCT_ID"]))
{
$dbBasketItems = CSaleBasket::GetList(array(), array("ID" => $val["ID"]), false, false, array('QUANTITY'));
$arItems = $dbBasketItems->Fetch();
if (floatval($val["QUANTITY"]) > floatval($arItems["QUANTITY"])
&& $arCatalogProduct["CAN_BUY_ZERO"]!="Y"
&& ($arCatalogProduct["QUANTITY_TRACE"]=="Y")
//&& floatval($arCatalogProduct["QUANTITY"])<=0)
//TODO - QUANTITY_RESERVED
&& floatval($val["QUANTITY"] - $arItems["QUANTITY"]) > floatval($arCatalogProduct["QUANTITY"] + $arCatalogProduct["QUANTITY_RESERVED"])
)
{
$errorMessage .= str_replace("#NAME#", $val['NAME'], GetMessage("NEWO_ERR_PRODUCT_NULL_BALANCE"));
}
}
}
}
}
// saving
if ($errorMessage == '')
{
$couponsMode = ($ID > 0 ? DiscountCouponsManager::MODE_ORDER : DiscountCouponsManager::MODE_MANAGER);
$couponsParams = array(
'userId' => $str_USER_ID
);
if ($ID > 0)
$couponsParams['orderId'] = $ID;
DiscountCouponsManager::init($couponsMode, $couponsParams, false);
unset($couponsParams, $couponsMode);
if ($isOrderConverted != 'N')
{
$discountMode = ($ID > 0 ? Sale\Compatible\DiscountCompatibility::MODE_ORDER : Sale\Compatible\DiscountCompatibility::MODE_MANAGER);
$discountParams = array(
'SITE_ID' => $LID,
'CURRENCY' => $BASE_LANG_CURRENCY
);
if ($ID > 0)
$discountParams['ORDER_ID'] = $ID;
Sale\Compatible\DiscountCompatibility::init($discountMode, $discountParams);
unset($discountParams, $discountMode);
}
//send new user mail
if ($btnNewBuyer == "Y" && $userNew <> '')
CUser::SendUserInfo($str_USER_ID, $LID, $userNew, true);
$arShoppingCart = array();
$arOrderProductPrice = fGetUserShoppingCart($_POST["PRODUCT"], $LID, $recalcOrder);
foreach ($arOrderProductPrice as &$arItem)
{
if ($arItem['BASKET_ID'] > 0)
{
$basketIdList[] = $arItem['BASKET_ID'];
}
else
{
if (empty($arItem['BASKET_ID']) && empty($arItem['ID']))
{
$module = trim($arItem['MODULE']);
if (strval($module) != '')
{
Loader::includeModule($module);
}
foreach ($callbackList as $callbackName)
{
$callbackFieldName = (isset($arItem[$callbackName]) ? $arItem[$callbackName] : '');
if ((!isset($callbackFieldName) && strval($callbackFieldName) == "")
|| (!class_exists($callbackFieldName) && !function_exists($callbackFieldName)))
{
$arItem[$callbackName] = '';
}
}
}
}
$arItem["ID_TMP"] = $arItem["ID"];
unset($arItem["ID"]);
}
unset($arItem);
if (!empty($basketIdList))
{
$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
/** @var Sale\Basket $basketClass */
$basketClass = $registry->getBasketClassName();
$basketRes = $basketClass::getList(
array(
'filter' => array(
'=ID' => $basketIdList
),
'select' => array(
'ID',
'CALLBACK_FUNC',
'ORDER_CALLBACK_FUNC',
'CANCEL_CALLBACK_FUNC',
'PAY_CALLBACK_FUNC',
'PRODUCT_PROVIDER_CLASS'
)
)
);
while($data = $basketRes->fetch())
{
$basketList[$data['ID']] = $data;
}
foreach ($arOrderProductPrice as &$itemData)
{
if (!empty($basketList[$itemData['BASKET_ID']]))
{
foreach ($callbackList as $callbackName)
{
$itemData[$callbackName] = $basketList[$itemData['BASKET_ID']][$callbackName];
}
}
}
unset($itemData);
}
$tmpOrderId = ($ID == 0) ? 0 : $ID;
$arOrderOptions = array(
'CART_FIX' => (isset($_REQUEST['CART_FIX']) && 'Y' == $_REQUEST['CART_FIX'] ? 'Y' : 'N')
);
if ('Y' == $arOrderOptions['CART_FIX'])
{
$arShoppingCart = $arOrderProductPrice;
}
else
{
$arShoppingCart = CSaleBasket::DoGetUserShoppingCart($LID, $str_USER_ID, $arOrderProductPrice, $arErrors, $arCoupon, $tmpOrderId);
}
foreach ($arOrderProductPrice as $key => &$arItem)
{
$arItem["ID"] = $arItem["ID_TMP"];
unset($arItem["ID_TMP"]);
//$arShoppingCart[$key]["ID"] = $arItem["ID"];
}
unset($arItem);
foreach ($arShoppingCart as &$v)
{
$v["ID"] = $v["ID_TMP"];
unset($v["ID_TMP"]);
}
unset($v);
$arErrors = array();
$arWarnings = array();
if (!empty($arShoppingCart))
{
foreach($arOrderProductPrice as $key => $val)
{
if ($val["NAME"] != $arShoppingCart[$key]["NAME"] AND $val["PRODUCT_ID"] == $arShoppingCart[$key]["PRODUCT_ID"])
$arShoppingCart[$key]["NAME"] = $val["NAME"];
if ($val["NOTES"] != '' && $val["NOTES"] != $arShoppingCart[$key]["NOTES"] AND $val["PRODUCT_ID"] == $arShoppingCart[$key]["PRODUCT_ID"])
$arShoppingCart[$key]["NOTES"] = $val["NOTES"];
}
}
//order parameters
$arOrder = CSaleOrder::DoCalculateOrder(
$LID,
$str_USER_ID,
$arShoppingCart,
$str_PERSON_TYPE_ID,
$arOrderPropsValues,
$str_DELIVERY_ID,
$str_PAY_SYSTEM_ID,
$arOrderOptions,
$arErrors,
$arWarnings
);
//change delivery price
if (floatval($arOrder["DELIVERY_PRICE"]) != $PRICE_DELIVERY)
{
$arOrder["PRICE"] = ($arOrder["PRICE"] - $arOrder["DELIVERY_PRICE"]) + $PRICE_DELIVERY;
$arOrder["DELIVERY_PRICE"] = $PRICE_DELIVERY;
$arOrder["PRICE_DELIVERY"] = $PRICE_DELIVERY;
}
if (!isset($arOrder["TRACKING_NUMBER"]) || $arOrder["TRACKING_NUMBER"] != $TRACKING_NUMBER)
$arOrder["TRACKING_NUMBER"] = $TRACKING_NUMBER;
if (empty($arShoppingCart) && !empty($arOrderProductPrice))
$errorMessage .= GetMessage('NEWO_ERR_BASKET_NULL')."
";
else
{
if (!empty($arWarnings))
{
foreach ($arWarnings as $val)
$errorMessage .= $val["TEXT"]."
";
}
if (!empty($arErrors))
{
foreach ($arErrors as $val)
$errorMessage .= $val["TEXT"]."
";
}
}
}
//prelimenary barcode and store quantity saving
if ($errorMessage == '')
{
// todo: necessary to handle situation with 3 stores - 1, 2, 1
// saving store / barcode data (calculating which records should be deleted / added / updated)
$arStoreBarcodeOrderFormData = array();
if ($useStores && (!isset($_POST["ORDER_DEDUCTED"]) || $_POST["ORDER_DEDUCTED"] == "N") && ($DEDUCTED == "Y" || $hasSavedBarcodes)) //not deducted yet
{
$bErrorFound = false;
foreach ($_REQUEST["PRODUCT"] as $basketId => &$arProduct)
{
if (CSaleBasketHelper::isSetParent($arProduct))
continue;
if (!empty($arProduct["STORES"]) && is_array($arProduct["STORES"]))
{
//check if store info contains all necessary fields
foreach ($arProduct["STORES"] as $recId => $arRecord)
{
if (!isset($arRecord["STORE_ID"]) || intval($arRecord["STORE_ID"]) < 0 || (!isset($arRecord["QUANTITY"])) || intval($arRecord["QUANTITY"]) < 0)
{
$errorMessage .= GetMessage("NEWO_ERR_STORE_WRONG_INFO_SAVING", array("#PRODUCT_NAME#" => $arProduct["NAME"]))."
";
$bErrorFound = true;
break;
}
}
if ($bErrorFound)
break;
//if array item is in the basket, not newly added product
if (isset($arProduct["BASKET_ID"]) && intval($arProduct["BASKET_ID"]) > 0)
{
if ($arProduct["BARCODE_MULTI"] == "N") //saving only store quantity info
{
$arStoreSavedRecords = array();
$arStoreFormRecords = array();
$arStoreIDToAdd = array();
// $arStoreIDToDelete = array();
$dbStoreBarcode = CSaleStoreBarcode::GetList(
array(),
array(
"BASKET_ID" => $arProduct["BASKET_ID"],
),
false,
false,
array("ID", "BASKET_ID", "BARCODE", "QUANTITY", "STORE_ID")
);
while ($arStoreBarcode = $dbStoreBarcode->GetNext())
{
$arStoreSavedRecords[$arStoreBarcode["STORE_ID"]] = $arStoreBarcode;
}
foreach ($arProduct["STORES"] as $index => $arStore)
{
$arStoreFormRecords[$arStore["STORE_ID"]] = $arStore;
if (!in_array($arStore["STORE_ID"], array_keys($arStoreSavedRecords)))
$arStoreIDToAdd[] = $arStore["STORE_ID"];
}
// foreach ($arStoreSavedRecords as $index => $arRecord)
// {
// if (!in_array($arRecord["STORE_ID"], array_keys($arStoreFormRecords)))
// $arStoreIDToDelete[$arRecord["ID"]] = $arRecord["STORE_ID"];
// }
//
// foreach ($arStoreIDToDelete as $id => $storeId)
// {
// CSaleStoreBarcode::Delete($id);
// }
/*
foreach ($arStoreIDToAdd as $addId)
{
$arStoreBarcodeFields = array(
"BASKET_ID" => $arProduct["BASKET_ID"],
"BARCODE" => "",
"STORE_ID" => $addId,
"QUANTITY" => $arStoreFormRecords[$addId]["QUANTITY"],
"CREATED_BY" => (0 < $intUserID ? $intUserID : ""),
"MODIFIED_BY" => (0 < $intUserID ? $intUserID : "")
);
CSaleStoreBarcode::Add($arStoreBarcodeFields);
}
foreach ($arStoreSavedRecords as $storeId => $arStoreBarcodeRecord)
{
if (!in_array($storeId, $arStoreIDToAdd) && !in_array($storeId, $arStoreIDToDelete))
{
if ($arStoreBarcodeRecord["QUANTITY"] != $arStoreFormRecords[$arStoreBarcodeRecord["STORE_ID"]]["QUANTITY"])
{
CSaleStoreBarcode::Update(
$arStoreBarcodeRecord["ID"],
array(
"QUANTITY" => $arStoreFormRecords[$arStoreBarcodeRecord["STORE_ID"]]["QUANTITY"],
"MODIFIED_BY" => (0 < $intUserID ? $intUserID : "")
)
);
}
}
}
*/
$arProduct["HAS_SAVED_QUANTITY"] = "Y";
}
else //BARCODE_MULTI = Y
{
$arStoreFormRecords = array();
foreach ($arProduct["STORES"] as $index => $arStore)
{
$arStoreFormRecords[$arStore["STORE_ID"]] = $arStore;
}
//deleting all previous records
/*
$dbStoreBarcode = CSaleStoreBarcode::GetList(
array(),
array(
"BASKET_ID" => $arProduct["BASKET_ID"],
),
false,
false,
array("ID", "BASKET_ID", "BARCODE", "QUANTITY", "STORE_ID")
);
while ($arStoreBarcode = $dbStoreBarcode->GetNext())
{
CSaleStoreBarcode::Delete($arStoreBarcode["ID"]);
}
*/
//adding new values
/*foreach ($arStoreFormRecords as $arStoreFormRecord)
{
if (isset($arStoreFormRecord["BARCODE"]) && isset($arStoreFormRecord["BARCODE_FOUND"]))
{
foreach ($arStoreFormRecord["BARCODE"] as $barcodeId => $barcodeValue)
{
//save only non-empty and valid barcodes
if (strlen($barcodeValue) > 0 && $arStoreFormRecord["BARCODE_FOUND"][$barcodeId] == "Y")
{
$arStoreBarcodeFields = array(
"BASKET_ID" => $arProduct["BASKET_ID"],
"BARCODE" => $barcodeValue,
"STORE_ID" => $arStoreFormRecord["STORE_ID"],
"QUANTITY" => 1,
"CREATED_BY" => (0 < $intUserID ? $intUserID : ""),
"MODIFIED_BY" => (0 < $intUserID ? $intUserID : "")
);
CSaleStoreBarcode::Add($arStoreBarcodeFields);
}
}
}
}
*/
$arProduct["HAS_SAVED_QUANTITY"] = "Y";
}
$arStoreBarcodeOrderFormData[$basketId] = $arProduct["STORES"];
}
}
}
unset($arProduct);
}
//newly added products info
if ($useStores)
{
foreach ($_REQUEST["PRODUCT"] as $basketId => $arProduct)
{
if (CSaleBasketHelper::isSetParent($arProduct))
continue;
if (isset($arProduct["NEW_PRODUCT"]))
$arStoreBarcodeOrderFormData["new".$basketId] = $arProduct["STORES"];
}
}
}
if ($errorMessage == '')
{
//another order parameters
$arAdditionalFields = array(
"USER_DESCRIPTION" => $_POST["USER_DESCRIPTION"],
"COMMENTS" => $str_COMMENTS,
);
if (isset($str_ADDITIONAL_INFO))
{
$arAdditionalFields['ADDITIONAL_INFO'] = $str_ADDITIONAL_INFO;
}
if (!empty($arOrder))
{
$arErrors = array();
$OrderNewSendEmail = false;
$arOldOrder = CSaleOrder::GetByID($ID);
if ($ID <= 0 || $arOldOrder["STATUS_ID"] == $str_STATUS_ID)
$arAdditionalFields["STATUS_ID"] = $str_STATUS_ID;
if ($isOrderConverted != 'N')
{
$arAdditionalFields = array_merge($arAdditionalFields, array(
'CANCELED' => (!empty($_POST["CANCELED"]) && trim($_POST["CANCELED"]) == "Y") ? "Y" : "N",
'REASON_CANCELED' => (array_key_exists('REASON_CANCELED', $_POST) && strval(trim($_POST["REASON_CANCELED"])) != "") ? trim($_POST["REASON_CANCELED"]): null,
'PAYED' => (!empty($_POST["PAYED"]) && trim($_POST["PAYED"]) == "Y") ? "Y" : "N",
'PAY_VOUCHER_NUM' => (array_key_exists('PAY_VOUCHER_NUM', $_POST) && strval(trim($_POST["PAY_VOUCHER_NUM"])) != "") ? trim($_POST["PAY_VOUCHER_NUM"]): null,
'PAY_VOUCHER_DATE' => (array_key_exists('PAY_VOUCHER_DATE', $_POST) && strval(trim($_POST["PAY_VOUCHER_DATE"])) != "") ? trim($_POST["PAY_VOUCHER_DATE"]): null,
'PAY_FROM_ACCOUNT' => (array_key_exists('PAY_FROM_ACCOUNT', $_POST) && strval(trim($_POST["PAY_FROM_ACCOUNT"])) != "") ? trim($_POST["PAY_FROM_ACCOUNT"]): null,
'PAY_CURRENT_ACCOUNT' => (array_key_exists('PAY_CURRENT_ACCOUNT', $_POST) && strval(trim($_POST["PAY_CURRENT_ACCOUNT"])) != "") ? trim($_POST["PAY_CURRENT_ACCOUNT"]): null,
'PAY_FROM_ACCOUNT_BACK' => (!empty($_POST["PAY_FROM_ACCOUNT_BACK"]) && trim($_POST["PAY_FROM_ACCOUNT_BACK"]) == "Y") ? "Y" : "N",
'SUM_PAID' => (array_key_exists('SUM_PAID', $_POST) && floatval($_POST["SUM_PAID"]) > 0) ? floatval($_POST["SUM_PAID"]): null,
'ALLOW_DELIVERY' => (!empty($_POST["ALLOW_DELIVERY"]) && trim($_POST["ALLOW_DELIVERY"]) == "Y") ? "Y" : "N",
'DELIVERY_DOC_NUM' => (array_key_exists('DELIVERY_DOC_NUM', $_POST) && strval(trim($_POST["DELIVERY_DOC_NUM"])) != "") ? trim($_POST["DELIVERY_DOC_NUM"]): null,
'DELIVERY_DOC_DATE' => (array_key_exists('DELIVERY_DOC_DATE', $_POST) && strval(trim($_POST["DELIVERY_DOC_DATE"])) != "") ? trim($_POST["DELIVERY_DOC_DATE"]): null,
'MARKED' => (!empty($_POST["MARKED"]) && trim($_POST["MARKED"]) == "Y") ? "Y" : "N",
'REASON_MARKED' => (array_key_exists('REASON_MARKED', $_POST) && strval(trim($_POST["REASON_MARKED"])) != "") ? trim($_POST["REASON_MARKED"]): null,
'DEDUCTED' => (!empty($_POST["DEDUCTED"]) && trim($_POST["DEDUCTED"]) == "Y") ? "Y" : "N",
'REASON_UNDO_DEDUCTED' => (array_key_exists('REASON_UNDO_DEDUCTED', $_POST) && strval(trim($_POST["REASON_UNDO_DEDUCTED"])) != "") ? trim($_POST["REASON_UNDO_DEDUCTED"]): null,
'RESERVED' => (!empty($_POST["RESERVED"]) && trim($_POST["RESERVED"]) == "Y") ? "Y" : "N",
));
}
$bSaveBarcodes = ($hasSavedBarcodes || $DEDUCTED == "Y") ? true : false;
$tmpID = CSaleOrder::DoSaveOrder($arOrder, $arAdditionalFields, $ID, $arErrors, $arCoupon, $arStoreBarcodeOrderFormData, $bSaveBarcodes);
//delete from basket
if ($tmpID > 0)
{
foreach($_POST["PRODUCT"] as $key => $val)
{
if (!isset($val["BASKET_ID"]) && intval($val["BASKET_ID"]) <= 0)
{
$dbBasket = CSaleBasket::GetList(
array(),
array(
"ORDER_ID" => "NULL",
"PRODUCT_ID" => $val["PRODUCT_ID"],
"USER_ID" => $str_USER_ID,
"LID" => $LID
),
false,
false,
array("ID", "TYPE", "SET_PARENT_ID")
);
$arBasket = $dbBasket->Fetch();
if (!empty($arBasket) && !CSaleBasketHelper::isSetItem($arBasket))
CSaleBasket::Delete($arBasket["ID"]);
}
}
}
if ($ID <= 0)
$OrderNewSendEmail = true;
else
{
if ($arOldOrder["STATUS_ID"] != $str_STATUS_ID)
CSaleOrder::StatusOrder($ID, $str_STATUS_ID);
}
$ID = $tmpID;
if ($ID > 0)
{
$arOrder2Update = array();
if (empty($arErrors))
{
$CANCELED = trim($_POST["CANCELED"]);
$REASON_CANCELED = trim($_POST["REASON_CANCELED"]);
if ($CANCELED != "Y")
$CANCELED = "N";
if ($arOldOrder["CANCELED"] != $CANCELED)
{
$bUserCanCancelOrder = CSaleOrder::CanUserCancelOrder($ID, $arUserGroups, $intUserID);
$errorMessageTmp = "";
if (!$bUserCanCancelOrder)
{
$errorMessageTmp .= GetMessage("SOD_NO_PERMS2CANCEL").". ";
}
else
{
if (!CSaleOrder::CancelOrder($ID, $CANCELED, $REASON_CANCELED))
{
if ($ex = $APPLICATION->GetException())
{
if ($ex->GetID() != "ALREADY_FLAG")
$errorMessageTmp .= $ex->GetString();
}
else
$errorMessageTmp .= GetMessage("ERROR_CANCEL_ORDER").". ";
}
}
if ($errorMessageTmp != "")
$arErrors[] = $errorMessageTmp;
}
else
{
if($arOldOrder["REASON_CANCELED"] != $REASON_CANCELED)
$arOrder2Update["REASON_CANCELED"] = $REASON_CANCELED;
}
}
}
if ($ID > 0 AND empty($arErrors))
{
//profile saving
$str_USER_ID = intval($str_USER_ID);
if (isset($userProfileID))
{
CSaleOrderUserProps::DoSaveUserProfile($str_USER_ID, $userProfileID, $profileName, $str_PERSON_TYPE_ID, $arOrderPropsValues, $arErrors);
}
unset($user_profile);
//send new order mail
if ($OrderNewSendEmail)
{
$strOrderList = "";
foreach ($arOrder["BASKET_ITEMS"] as $val)
{
if (CSaleBasketHelper::isSetItem($val))
continue;
$measure = (isset($val["MEASURE_TEXT"])) ? $val["MEASURE_TEXT"] : GetMessage("SOA_SHT");
$strOrderList .= $val["NAME"]." - ".$val["QUANTITY"]." ".$measure." x ".SaleFormatCurrency($val["PRICE"], $BASE_LANG_CURRENCY);
$strOrderList .= "";
}
$arOrderNew = CSaleOrder::GetByID($ID);
//send mail
$arFields = array(
"ORDER_ID" => $arOrderNew["ACCOUNT_NUMBER"],
"ORDER_DATE" => Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", $LID))),
"ORDER_USER" => $arUserEmail["PAYER_NAME"],
"PRICE" => SaleFormatCurrency($arOrder["PRICE"], $BASE_LANG_CURRENCY),
"BCC" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME),
"EMAIL" => $arUserEmail["USER_EMAIL"],
"ORDER_LIST" => $strOrderList,
"SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME),
"DELIVERY_PRICE" => $arOrder["DELIVERY_PRICE"],
);
$eventName = "SALE_NEW_ORDER";
$bSend = true;
foreach(GetModuleEvents("sale", "OnOrderNewSendEmail", true) as $arEvent)
if (ExecuteModuleEventEx($arEvent, array($ID, &$eventName, &$arFields))===false)
$bSend = false;
if($bSend)
{
$event = new CEvent;
$event->Send($eventName, $LID, $arFields, "N");
}
CSaleMobileOrderPush::send("ORDER_CREATED", array("ORDER" => $arOrderNew));
}
}
else
{
foreach($arErrors as $val)
{
if (is_array($val))
$errorMessage .= $val["TEXT"]."
";
else
$errorMessage .= $val;
}
}
}
elseif (!empty($arErrors))
{
foreach($arErrors as $val)
{
if (is_array($val))
$errorMessage .= $val["TEXT"]."
";
else
$errorMessage .= $val;
}
}
else
{
$errorMessage .= GetMessage("SOE_SAVE_ERROR")."
";
}
}//end if save
unset($location, $BTN_SAVE_BUYER, $buyertypechange, $userId, $user_id);
if ('' == $errorMessage AND $ID > 0)
{
if ($crmMode)
CRMModeOutput($ID);
DiscountCouponsManager::clear(true);
if (isset($save) AND $save <> '')
{
CSaleOrder::UnLock($ID);
LocalRedirect("/bitrix/admin/sale_order.php?lang=".LANGUAGE_ID."&LID=".urlencode($LID).GetFilterParams("filter_", false));
}
if (isset($apply) AND $apply <> '')
LocalRedirect("/bitrix/admin/sale_order_new.php?lang=".LANGUAGE_ID."&ID=".$ID."&LID=".urlencode($LID).GetFilterParams("filter_", false));
}
if ('' != $errorMessage)
$bVarsFromForm = true;
}
if (!empty($dontsave))
{
DiscountCouponsManager::clear(true);
CSaleOrder::UnLock($ID);
if ($crmMode)
CRMModeOutput($ID);
LocalRedirect("/bitrix/admin/sale_order.php?lang=".LANGUAGE_ID."&LID=".CUtil::JSEscape($LID));
}
/*****************************************************************************/
/************** Processing of requests from the proxy ************************/
/*****************************************************************************/
if (
check_bitrix_sessid()
&& !empty($_REQUEST['ORDER_AJAX']) && $_REQUEST['ORDER_AJAX'] == 'Y'
)
{
/*
* location
*/
if (isset($location) && !isset($product) && !isset($locationZip))
{
$tmpLocation = "";
ob_start();
CSaleLocation::proxySaleAjaxLocationsComponent(
array(
"SITE_ID" => $LID,
"AJAX_CALL" => "Y",
"COUNTRY_INPUT_NAME" => "ORDER_PROP_".$locid,
"REGION_INPUT_NAME" => "REGION_ORDER_PROP_".$locid,
"CITY_INPUT_NAME" => "CITY_ORDER_PROP_".$locid,
"CITY_OUT_LOCATION" => "Y",
"ALLOW_EMPTY_CITY" => "Y",
"LOCATION_VALUE" => $location,
"COUNTRY" => "",
"ONCITYCHANGE" => "fChangeLocationCity",
),
array(
"ID" => $location,
"CODE" => "",
"JS_CALLBACK" => 'fChangeLocationCity',
"SHOW_DEFAULT_LOCATIONS" => 'Y',
"JS_CONTROL_GLOBAL_ID" => 'saleOrderNew',
),
'',
true,
'location-block-wrapper'.(intval($locid) ? ' prop-'.intval($locid) : '')
);
$tmpLocation = ob_get_contents();
ob_end_clean();
$arData = array();
if (intval($locid) > 0)
{
$arData["status"] = "ok";
$arData["prop_id"] = $locid;
$arData["location"] = $tmpLocation;
}
$result = CUtil::PhpToJSObject($arData);
CRMModeOutput($result);
}
/*
* change buyer type
*/
if (isset($buyertypechange))
{
if (!isset($ID) OR $ID == "") $ID = "";
if (!isset($paysystemid) OR $paysystemid == "") $paysystemid = "";
$arData = array();
$arData["status"] = "ok";
$arData["buyertype"] = fGetBuyerType($buyertypechange, $LID, $userId, $ID);
$arData["buyerdelivery"] = fGetPaySystemsHTML($buyertypechange, $paysystemid);
$arLocation = fGetLocationID($buyertypechange);
$arData["location_id"] = $arLocation["LOCATION_ID"];
$arData["location_zip_id"] = $arLocation["LOCATION_ZIP_ID"];
$result = CUtil::PhpToJSObject($arData);
CRMModeOutput($result);
}
/*
* get locationId for delivery data
*/
if (isset($persontypeid))
{
$persontypeid = intval($persontypeid);
$arData = array();
$arLocation = fGetLocationID($persontypeid);
$arData["location_id"] = $arLocation["LOCATION_ID"];
$arData["location_zip_id"] = $arLocation["LOCATION_ZIP_ID"];
$result = CUtil::PhpToJSObject($arData);
CRMModeOutput($result);
}
/*
* take a list profile and user basket
*/
if (isset($userId) && isset($buyerType) && (!isset($profileDefault) || $profileDefault == ""))
{
$id = intval($id);
$userId = intval($userId);
$oldUserId = 0;
if (isset($_POST['oldUserId']))
$oldUserId = (int)$_POST['oldUserId'];
if ($oldUserId < 0)
$oldUserId = 0;
$buyerType = intval($buyerType);
$LID = trim($LID);
$currency = trim($currency);
$couponsMode = ($id > 0 ? DiscountCouponsManager::MODE_ORDER : DiscountCouponsManager::MODE_MANAGER);
$couponsParams = array(
'userId' => $userId
);
if ($oldUserId != $userId)
$couponsParams['oldUserId'] = $oldUserId;
if ($id > 0)
$couponsParams['orderId'] = $id;
DiscountCouponsManager::init($couponsMode, $couponsParams, false);
unset($couponsParams, $couponsMode);
$arFuserItems = CSaleUser::GetList(array("USER_ID" => $userId));
$fuserId = $arFuserItems["ID"];
$arData = array();
$arErrors = array();
$arData["status"] = "ok";
$arData["userProfileSelect"] = fUserProfile($userId, $buyerType);
$arData["userName"] = fGetUserName($userId);
$arShoppingCart = CSaleBasket::DoGetUserShoppingCart($LID, $userId, $fuserId, $arErrors, array());
$arShoppingCart = fDeleteDoubleProduct($arShoppingCart, array(), 'N');
$arData["userBasket"] = fGetFormatedProduct($userId, $LID, $arShoppingCart, $currency, 'basket');
$viewedIterator = \Bitrix\Catalog\CatalogViewedProductTable::getList(
array(
"filter" => array("FUSER_ID" => $fuserId),
"select" => array(
"ID",
"PRODUCT_ID",
"LID" => "SITE_ID",
"NAME" => "ELEMENT.NAME",
"PREVIEW_PICTURE" => "ELEMENT.PREVIEW_PICTURE",
"DETAIL_PICTURE" => "ELEMENT.DETAIL_PICTURE",
),
"order" => array("DATE_VISIT" => "DESC"),
"limit" => 10
)
);
$viewed = array();
while($row = $viewedIterator->fetch())
{
$row['MODULE'] = "catalog";
$viewed[$row['PRODUCT_ID']] = $row;
}
if (!empty($viewed))
{
$filter = array("ID" => array_keys($viewed));
$elementIterator = CIBlockElement::GetList(array(), $filter, false, false, array('ID', 'IBLOCK_ID', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE', 'DETAIL_PICTURE'));
while ($fields = $elementIterator->GetNext())
{
$viewed[$fields['ID']]['DETAIL_PAGE_URL'] = $fields['~DETAIL_PAGE_URL'];
if($viewed[$fields['ID']]['PREVIEW_PICTURE'] > 0)
{
$img = CFile::GetFileArray($viewed[$fields['ID']]['PREVIEW_PICTURE']);
if($img)
$viewed[$fields['ID']]['PREVIEW_PICTURE'] = $img['SRC'];
else
$viewed[$fields['ID']]['PREVIEW_PICTURE'] = false;
}
else
{
$viewed[$fields['ID']]['PREVIEW_PICTURE'] = false;
}
if($viewed[$fields['ID']]['DETAIL_PICTURE'] > 0)
{
$img = CFile::GetFileArray($viewed[$fields['ID']]['DETAIL_PICTURE']);
if($img)
$viewed[$fields['ID']]['DETAIL_PICTURE'] = $img['SRC'];
else
$viewed[$fields['ID']]['DETAIL_PICTURE'] = false;
}
else
{
$viewed[$fields['ID']]['DETAIL_PICTURE'] = false;
}
}
// Prices
$priceIterator = CPrice::getList(array(), array("PRODUCT_ID" => $filter['ID']), false, false, array("PRODUCT_ID", "PRICE", "CURRENCY"));
while($price = $priceIterator->fetch())
{
if(!isset($viewed[$price['PRODUCT_ID']]['PRICE']))
{
$viewed[$price['PRODUCT_ID']]['PRICE'] = $price['PRICE'];
$viewed[$price['PRODUCT_ID']]['CURRENCY'] = $price['CURRENCY'];
}
}
}
$arViewedResult = fDeleteDoubleProduct($viewed, $arFilterRecommended, 'N');
$arData["viewed"] = fGetFormatedProduct($userId, $LID, $arViewedResult, $currency, 'viewed');
$result = CUtil::PhpToJSObject($arData);
CRMModeOutput($result);
}
/*
* profile autocomplete script
*/
if (isset($userId) AND isset($buyerType) AND isset($profileDefault))
{
$userId = intval($userId);
$buyerType = intval($buyerType);
$profileDefault = intval($profileDefault);
$arPropValuesTmp = array();
$userProfile = array();
$userProfile = CSaleOrderUserProps::DoLoadProfiles($userId, $buyerType);
if ($profileDefault != "" AND $profileDefault != "0")
$arPropValuesTmp = $userProfile[$profileDefault]["VALUES"];
$dbVariants = CSaleOrderProps::GetList(
array("SORT" => "ASC"),
array(
"PERSON_TYPE_ID" => $buyerType,
"USER_PROPS" => "Y",
"ACTIVE" => "Y",
"RELATED" => false
)
);
while ($arVariants = $dbVariants->Fetch())
{
if (isset($arPropValuesTmp[$arVariants["ID"]]))
$arPropValues[$arVariants["ID"]] = $arPropValuesTmp[$arVariants["ID"]];
else
$arPropValues[$arVariants["ID"]] = $arVariants["DEFAULT_VALUE"];
if($arVariants["IS_EMAIL"] == "Y" || $arVariants["IS_PAYER"] == "Y")
{
if($arPropValues[$arVariants["ID"]] == '' && intval($userId) > 0)
{
$rsUser = CUser::GetByID($userId);
if ($arUser = $rsUser->Fetch())
{
if($arVariants["IS_EMAIL"] == "Y")
$arPropValues[$arVariants["ID"]] = $arUser["EMAIL"];
else
{
if ($arUser["LAST_NAME"] <> '')
$arPropValues[$arVariants["ID"]] .= $arUser["LAST_NAME"];
if ($arUser["NAME"] <> '')
$arPropValues[$arVariants["ID"]] .= " ".$arUser["NAME"];
if ($arUser["SECOND_NAME"] <> '' AND $arUser["NAME"] <> '')
$arPropValues[$arVariants["ID"]] .= " ".$arUser["SECOND_NAME"];
}
}
}
}
}
$strPropsList = "";
foreach ($arPropValues as $key => $val)
{
$key = CUtil::JSEscape(htmlspecialcharsback($key));
$val = CUtil::JSEscape(htmlspecialcharsback($val));
$strPropsList.=($strPropsList <> ''?', ':'').'"'.$key.'": "'.$val.'"';
}
if ($strPropsList <> '')
{
?>