10Loc::loadMessages(__FILE__);
30 $deliveryId, $paySystemId,
$arOptions, &$arErrors, &$arWarnings)
32 if(!is_array($arErrors))
51 if (!is_array($arShoppingCart) || (
count($arShoppingCart) <= 0))
60 $arOrder[
"TAX_PRICE"] ??= 0.0;
61 $arOrder[
"DELIVERY_PRICE"] ??= 0.0;
62 $arOrder[
"DISCOUNT_PRICE"] ??= 0.0;
64 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderShoppingCart",
true) as $arEvent)
67 CSalePersonType::DoProcessOrder($arOrder, $personTypeId, $arErrors,
$arOptions);
68 if (
count($arErrors) > 0)
71 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderPersonType",
true) as $arEvent)
74 CSaleOrderProps::DoProcessOrder($arOrder, $arOrderPropsValues, $arErrors, $arWarnings, $paySystemId, $deliveryId,
$arOptions);
75 if (
count($arErrors) > 0)
78 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderProps",
true) as $arEvent)
82 if (
count($arErrors) > 0)
85 $arOrder[
"PRICE_DELIVERY"] = $arOrder[
"DELIVERY_PRICE"];
87 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderDelivery",
true) as $arEvent)
91 if (
count($arErrors) > 0)
94 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderPaySystem",
true) as $arEvent)
100 if (
count($arErrors) > 0)
103 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderDiscount",
true) as $arEvent)
106 if (isset($arOrder[
'ORDER_PRICE']))
108 $roundOrderFields = static::getRoundFields();
109 foreach ($arOrder as $fieldName => $fieldValue)
111 if (in_array($fieldName, $roundOrderFields))
118 if (!empty($arOrder[
'BASKET_ITEMS']) && is_array($arOrder[
'BASKET_ITEMS']))
120 $arOrder[
'ORDER_PRICE'] = 0;
121 $roundBasketFields = CSaleBasket::getRoundFields();
122 foreach ($arOrder[
'BASKET_ITEMS'] as &$basketItem)
124 foreach($basketItem as $fieldName => $fieldValue)
126 if (in_array($fieldName, $roundBasketFields))
128 if (isset($basketItem[$fieldName]))
144 if (
count($arErrors) > 0)
147 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderShoppingCartTax",
true) as $arEvent)
151 if (
count($arErrors) > 0)
154 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrderDeliveryTax",
true) as $arEvent)
157 $arOrder[
"PRICE"] = $arOrder[
"ORDER_PRICE"] + $arOrder[
"DELIVERY_PRICE"] + $arOrder[
"TAX_PRICE"] - $arOrder[
"DISCOUNT_PRICE"];
158 $arOrder[
"TAX_VALUE"] = ($arOrder[
"USE_VAT"] ? $arOrder[
"VAT_SUM"] : $arOrder[
"TAX_PRICE"]);
160 foreach(
GetModuleEvents(
"sale",
"OnSaleCalculateOrder",
true) as $arEvent)
180 $parentWeight =
array();
181 foreach ($shoppingCart as $item)
184 $parentWeight[$item[
"SET_PARENT_ID"]][
"WEIGHT"] += $item[
"WEIGHT"] * $item[
"QUANTITY"];
187 foreach ($shoppingCart as &$item)
190 $item[
"WEIGHT"] = $parentWeight[$item[
"SET_PARENT_ID"]][
"WEIGHT"];
206 "BASKET_ITEMS" => $shoppingCart,
213 "DELIVERY_ID" =>
false,
216 if (isset(
$options[
"DELIVERY_EXTRA_SERVICES"]))
218 $arOrder[
"DELIVERY_EXTRA_SERVICES"] =
$options[
"DELIVERY_EXTRA_SERVICES"];
222 if (is_array($orderPrices))
224 $arOrder[
'ORDER_PRICE'] = $orderPrices[
'ORDER_PRICE'];
225 $arOrder[
'ORDER_WEIGHT'] = $orderPrices[
'ORDER_WEIGHT'];
226 $arOrder[
'VAT_RATE'] = $orderPrices[
'VAT_RATE'];
227 $arOrder[
'VAT_SUM'] = $orderPrices[
'VAT_SUM'];
228 $arOrder[
"USE_VAT"] = ($orderPrices[
'USE_VAT'] ==
"Y");
253 foreach (
$arResult[
'BASKET_ITEMS'] as &$arItem)
257 if (array_key_exists(
'CUSTOM_PRICE', $arItem) && $arItem[
'CUSTOM_PRICE'] ==
'Y')
259 $defaultPrice = (float)($arItem[
'DEFAULT_PRICE'] ?? 0.0);
260 $arItem[
'DISCOUNT_PRICE'] = $defaultPrice - $arItem[
'PRICE'];
262 if ($arItem[
'DISCOUNT_PRICE'] < 0)
264 $arItem[
'DISCOUNT_PRICE'] = 0;
267 if ($defaultPrice > 0)
269 $arItem[
'DISCOUNT_PRICE_PERCENT'] = $arItem[
'DISCOUNT_PRICE'] * 100 / $defaultPrice;
273 $arItem[
'DISCOUNT_PRICE_PERCENT'] = 0;
279 if (isset($arItem[
'CURRENCY']) && $arItem[
'CURRENCY'] <>
'' )
280 $arItem[
"PRICE_FORMATED"] =
SaleFormatCurrency($arItem[
"PRICE"], $arItem[
"CURRENCY"]);
283 $arResult[
'ORDER_WEIGHT'] += $arItem[
"WEIGHT"] * $arItem[
"QUANTITY"];
285 if ($arItem[
"VAT_RATE"] > 0)
289 if ($arItem[
"VAT_RATE"] >
$arResult[
'VAT_RATE'])
290 $arResult[
'VAT_RATE'] = $arItem[
"VAT_RATE"];
294 $arItem[
"VAT_VALUE"] = $arItem[
"QUANTITY"] > 0
319 array(
"SORT" =>
"ASC"),
321 'PERSON_TYPE_ID' => $personTypeId
325 array(
"ID",
"NAME",
"TYPE",
"IS_LOCATION",
"IS_LOCATION4TAX",
"IS_PROFILE_NAME",
"IS_PAYER",
"IS_EMAIL",
"REQUIED",
"SORT",
"IS_ZIP",
"CODE",
"MULTIPLE")
327 while($item = $dbOrderProps->fetch())
329 if($item[
'TYPE'] ==
'LOCATION' && mb_strlen($orderProps[$item[
'ID']]))
331 $source = $orderProps[$item[
'ID']];
334 $orderProps[$item[
'ID']] = $replace;
344 public static function DoSaveOrder(&$arOrder, $arAdditionalFields,
$orderId, &$arErrors, $arCoupons =
array(), $arStoreBarcodeOrderFormData =
array(), $bSaveBarcodes =
false)
354 "ID" => $arOrder[
"ID"],
355 "LID" => $arOrder[
"SITE_ID"],
356 "PERSON_TYPE_ID" => $arOrder[
"PERSON_TYPE_ID"],
357 "PRICE" => $arOrder[
"PRICE"],
358 "CURRENCY" => $arOrder[
"CURRENCY"],
359 "USER_ID" => $arOrder[
"USER_ID"],
360 "PAY_SYSTEM_ID" => $arOrder[
"PAY_SYSTEM_ID"],
361 "PRICE_DELIVERY" => $arOrder[
"DELIVERY_PRICE"],
362 "DELIVERY_ID" => ($arOrder[
"DELIVERY_ID"] <>
'' ? $arOrder[
"DELIVERY_ID"] :
false),
363 "DISCOUNT_VALUE" => $arOrder[
"DISCOUNT_PRICE"],
364 "TAX_VALUE" => $arOrder[
"TAX_VALUE"],
365 "TRACKING_NUMBER" => $arOrder[
"TRACKING_NUMBER"]
368 if ($arOrder[
"DELIVERY_PRICE"] == $arOrder[
"PRICE_DELIVERY"]
369 && isset($arOrder[
'PRICE_DELIVERY_DIFF']) && floatval($arOrder[
'PRICE_DELIVERY_DIFF']) > 0)
371 $arFields[
"DELIVERY_PRICE"] = $arOrder[
'PRICE_DELIVERY_DIFF'] + $arOrder[
"PRICE_DELIVERY"];
382 if(!$arOrder[
'LOCATION_IN_CODES'])
383 static::TranslateLocationPropertyValues($arOrder[
"PERSON_TYPE_ID"], $arOrder[
"ORDER_PROP"]);
384 unset($arOrder[
'LOCATION_IN_CODES']);
387 if ($isOrderConverted !=
'N')
389 $orderFields = array_merge($arOrder,
$arFields, $arAdditionalFields);
390 if (isset($orderFields[
'CUSTOM_DISCOUNT_PRICE']) && $orderFields[
'CUSTOM_DISCOUNT_PRICE'] ===
true)
393 if (!empty($arStoreBarcodeOrderFormData))
395 $orderFields[
'BARCODE_LIST'] = $arStoreBarcodeOrderFormData;
398 $orderFields[
'BARCODE_SAVE'] = $bSaveBarcodes;
411 foreach ($r->getErrorMessages() as
$error)
428 if (COption::GetOptionString(
"sale",
"product_reserve_condition",
"O") ==
"O")
438 $arErrors[] = $ex->GetString();
440 $arErrors[] = Loc::getMessage(
"SOA_ERROR_ORDER");
443 if (!empty($arErrors))
446 CSaleBasket::DoSaveOrderBasket(
$orderId, $arOrder[
"SITE_ID"], $arOrder[
"USER_ID"], $arOrder[
"BASKET_ITEMS"], $arErrors, $arCoupons, $arStoreBarcodeOrderFormData, $bSaveBarcodes);
448 CSaleTax::DoSaveOrderTax(
$orderId, $arOrder[
"TAX_LIST"]);
450 Sale\DiscountCouponsManager::finalApply();
451 Sale\DiscountCouponsManager::saveApplied();
471 $userID = intval($userID);
473 $permList = self::checkUserPermissionOrderList(
array(
$ID),
'view', $arUserGroups, $userID);
474 return (isset($permList[
$ID]) && $permList[
$ID] ===
true);
487 static $cacheGroupAccess =
array();
488 $userRights = CMain::GetUserRight(
"sale", $arUserGroups,
"Y",
"Y");
490 if ($userRights >=
"W")
493 if ($userRights ==
"U")
497 $permList = self::checkUserPermissionOrderList(
array(
$ID),
'update', $arUserGroups);
498 return (isset($permList[
$ID]) && $permList[
$ID] ===
true);
504 $hashGroupAccess = md5(
$siteID.
"|" . join(
', ', $arUserGroups));
505 if (array_key_exists($hashGroupAccess, $cacheGroupAccess))
507 $num = $cacheGroupAccess[$hashGroupAccess];
515 "GROUP_ID" => $arUserGroups
520 $cacheGroupAccess[$hashGroupAccess] = $num;
523 if (intval($num) > 0)
541 $userID = intval($userID);
543 $permList = self::checkUserPermissionOrderList(
array(
$ID),
'cancel', $arUserGroups, $userID);
544 return (isset($permList[
$ID]) && $permList[
$ID] ===
true);
556 $userID = intval($userID);
558 $permList = self::checkUserPermissionOrderList(
array(
$ID),
'mark', $arUserGroups, $userID);
559 return (isset($permList[
$ID]) && $permList[
$ID] ===
true);
573 $userRights = CMain::GetUserRight(
"sale", $arUserGroups,
"Y",
"Y");
574 if ($userRights >=
"W")
577 if ($userRights ==
"U")
579 $arOrder = CSaleOrder::GetByID(
$ID);
585 "SITE_ID" => $arOrder[
"LID"],
586 "GROUP_ID" => $arUserGroups
591 if (intval($num) > 0)
593 if ($flag ==
"P" || $flag ==
"PERM_PAYMENT")
594 $fieldName =
"PERM_PAYMENT";
595 elseif ($flag ==
"PERM_DEDUCTION")
596 $fieldName =
"PERM_DEDUCTION";
598 $fieldName =
"PERM_DELIVERY";
603 "STATUS_ID" => $arOrder[
"STATUS_ID"],
604 "GROUP_ID" => $arUserGroups
606 array(
"MAX" => $fieldName)
608 if ($arStatusPerms = $dbStatusPerms->Fetch())
609 if ($arStatusPerms[$fieldName] ==
"Y")
627 $statusID = Trim($statusID);
629 $userRights = CMain::GetUserRight(
"sale", $arUserGroups,
"Y",
"Y");
630 if ($userRights >=
"W")
633 if ($userRights ==
"U")
635 $arOrder = CSaleOrder::GetByID(
$ID);
641 "SITE_ID" => $arOrder[
"LID"],
642 "GROUP_ID" => $arUserGroups
647 if (intval($num) > 0)
652 "STATUS_ID" => $arOrder[
"STATUS_ID"],
653 "GROUP_ID" => $arUserGroups
655 array(
"MAX" =>
"PERM_STATUS_FROM")
657 if ($arStatusPerms = $dbStatusPerms->Fetch())
659 if ($arStatusPerms[
"PERM_STATUS_FROM"] ==
"Y")
664 "STATUS_ID" => $statusID,
665 "GROUP_ID" => $arUserGroups
667 array(
"MAX" =>
"PERM_STATUS")
669 if ($arStatusPerms = $dbStatusPerms->Fetch())
670 if ($arStatusPerms[
"PERM_STATUS"] ==
"Y")
690 $userID = intval($userID);
692 $permList = self::checkUserPermissionOrderList(
array(
$ID),
'delete', $arUserGroups, $userID);
693 return (isset($permList[
$ID]) && $permList[
$ID] ===
true);
780 $dbSite = CSite::GetByID(
$arFields[
"LID"]);
781 if (!$dbSite->Fetch())
790 $dbUser = CUser::GetByID(
$arFields[
"USER_ID"]);
791 if (!$dbUser->Fetch())
843 $dbres =
$DB->Query(
"SELECT ID, ACCOUNT_NUMBER FROM b_sale_order WHERE ACCOUNT_NUMBER = '".
$DB->ForSql(
$arFields[
"ACCOUNT_NUMBER"]).
"'",
true);
844 if (
$arRes = $dbres->GetNext())
873 foreach(
GetModuleEvents(
"sale",
"OnBeforeOrderDelete",
true) as $arEvent)
877 $DB->StartTransaction();
887 $bSuccess = CSaleBasket::Delete($arBasket[
"ID"]);
914 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
917 $bSuccess =
$DB->Query(
"DELETE FROM b_sale_order WHERE ID = ".
$ID.
"",
true);
934 public static function Delete(
$ID)
943 $arOrder = CSaleOrder::GetByID(
$ID);
947 if ($isOrderConverted !=
'N')
952 $r = \Bitrix\Sale\Compatible\OrderCompatibility::delete(
$ID);
954 $orderDeleted = (bool)$r->isSuccess();
956 if (!$r->isSuccess())
958 foreach($r->getErrorMessages() as
$error)
966 return $orderDeleted;
971 if ($arOrder[
"CANCELED"] !=
"Y")
974 if ($arOrder[
"ALLOW_DELIVERY"] ==
"Y")
975 CSaleOrder::DeliverOrder(
$ID,
"N");
977 if ($arOrder[
"DEDUCTED"] ==
"Y")
982 if ($arOrder[
"RESERVED"] ==
"Y")
984 CSaleOrder::ReserveOrder(
$ID,
"N");
988 if ($arOrder[
"PAYED"] !=
"Y")
990 $arOrder[
"SUM_PAID"] = DoubleVal($arOrder[
"SUM_PAID"]);
991 if ($arOrder[
"SUM_PAID"] > 0)
1001 if (CSaleOrder::PayOrder(
$ID,
"N", True, True))
1014 if (mb_substr(
$key, 0, 1) ==
"!")
1021 if (mb_substr(
$key, 0, 1) ==
"+")
1027 if (mb_substr(
$key, 0, 2) ==
">=")
1030 $strOperation =
">=";
1035 $strOperation =
">";
1040 $strOperation =
"<=";
1045 $strOperation =
"<";
1050 $strOperation =
"IN";
1055 $strOperation =
"LIKE";
1060 $strOperation =
"QUERY";
1064 $strOperation =
"=";
1067 return array(
"FIELD" =>
$key,
"NEGATIVE" => $strNegative,
"OPERATION" => $strOperation,
"OR_NULL" => $strOrNull);
1074 $arGroupByFunct =
array(
"COUNT",
"AVG",
"MIN",
"MAX",
"SUM");
1076 $arAlreadyJoined =
array();
1078 $strSqlGroupBy =
'';
1084 if (is_array($arGroupBy) &&
count($arGroupBy) > 0)
1086 $arSelectFields = $arGroupBy;
1087 foreach ($arGroupBy as
$key =>
$val)
1093 if ($strSqlGroupBy !=
'')
1094 $strSqlGroupBy .=
", ";
1101 if ($strSqlFrom !=
'')
1114 if (is_array($arGroupBy) &&
count($arGroupBy)==0)
1116 $strSqlSelect =
"COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]][
"FIELD"].
") as CNT ";
1120 if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && $arSelectFields <>
'' && array_key_exists($arSelectFields,
$arFields))
1121 $arSelectFields =
array($arSelectFields);
1123 if (!isset($arSelectFields)
1124 || !is_array($arSelectFields)
1125 ||
count($arSelectFields)<=0
1126 || in_array(
"*", $arSelectFields))
1128 $countFieldKey =
count($arFieldsKeys);
1129 for (
$i = 0;
$i < $countFieldKey;
$i++)
1131 if (isset(
$arFields[$arFieldsKeys[
$i]][
"WHERE_ONLY"])
1132 &&
$arFields[$arFieldsKeys[
$i]][
"WHERE_ONLY"] ==
"Y")
1137 if ($strSqlSelect !=
'')
1138 $strSqlSelect .=
", ";
1140 if (
$arFields[$arFieldsKeys[
$i]][
"TYPE"] ==
"datetime")
1142 if ((mb_strtoupper(
$DB->type)==
"ORACLE" || mb_strtoupper(
$DB->type)==
"MSSQL") && (array_key_exists($arFieldsKeys[
$i], $arOrder)))
1143 $strSqlSelect .=
$arFields[$arFieldsKeys[
$i]][
"FIELD"].
" as ".$arFieldsKeys[
$i].
"_X1, ";
1145 $strSqlSelect .=
$DB->DateToCharFunction(
$arFields[$arFieldsKeys[
$i]][
"FIELD"],
"FULL").
" as ".$arFieldsKeys[
$i];
1149 if ((mb_strtoupper(
$DB->type)==
"ORACLE" || mb_strtoupper(
$DB->type)==
"MSSQL") && (array_key_exists($arFieldsKeys[
$i], $arOrder)))
1150 $strSqlSelect .=
$arFields[$arFieldsKeys[
$i]][
"FIELD"].
" as ".$arFieldsKeys[
$i].
"_X1, ";
1152 $strSqlSelect .=
$DB->DateToCharFunction(
$arFields[$arFieldsKeys[
$i]][
"FIELD"],
"SHORT").
" as ".$arFieldsKeys[
$i];
1155 $strSqlSelect .=
$arFields[$arFieldsKeys[
$i]][
"FIELD"].
" as ".$arFieldsKeys[
$i];
1159 && !in_array(
$arFields[$arFieldsKeys[
$i]][
"FROM"], $arAlreadyJoined))
1161 if ($strSqlFrom <>
'')
1163 $strSqlFrom .=
$arFields[$arFieldsKeys[
$i]][
"FROM"];
1164 $arAlreadyJoined[] =
$arFields[$arFieldsKeys[
$i]][
"FROM"];
1170 foreach ($arSelectFields as
$key =>
$val)
1176 if ($strSqlSelect <>
'')
1177 $strSqlSelect .=
", ";
1179 if (in_array(
$key, $arGroupByFunct))
1187 if ((mb_strtoupper(
$DB->type)==
"ORACLE" || mb_strtoupper(
$DB->type)==
"MSSQL") && (array_key_exists(
$val, $arOrder)))
1194 if ((mb_strtoupper(
$DB->type)==
"ORACLE" || mb_strtoupper(
$DB->type)==
"MSSQL") && (array_key_exists(
$val, $arOrder)))
1207 if ($strSqlFrom <>
'')
1216 if ($strSqlGroupBy <>
'')
1218 if ($strSqlSelect <>
'')
1219 $strSqlSelect .=
", ";
1220 $strSqlSelect .=
"COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]][
"FIELD"].
") as CNT";
1223 $strSqlSelect =
"%%_DISTINCT_%% ".$strSqlSelect;
1228 $arSqlSearch = Array();
1231 $filter_keys = Array();
1235 $countFilterKey =
count($filter_keys);
1236 for (
$i = 0;
$i < $countFilterKey;
$i++)
1239 if (!is_array($vals))
1240 $vals =
array($vals);
1242 $vals = array_values($vals);
1246 $key = $key_res[
"FIELD"];
1247 $strNegative = $key_res[
"NEGATIVE"];
1248 $strOperation = $key_res[
"OPERATION"];
1249 $strOrNull = $key_res[
"OR_NULL"];
1253 $arSqlSearch_tmp =
array();
1254 if (
count($vals) > 0)
1256 if ($strOperation ==
"IN")
1260 $arSqlSearch_tmp1 = call_user_func_array(
1264 if ($arSqlSearch_tmp1 !==
false)
1265 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
1278 $vals = array_unique($vals);
1279 $val = implode(
",", $vals);
1281 if (
count($vals) <= 0)
1282 $arSqlSearch_tmp[] =
"(1 = 2)";
1284 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" IN (".
$val.
"))";
1291 $item = (float)$item;
1294 $vals = array_unique($vals);
1295 $val = implode(
",", $vals);
1297 if (
count($vals) <= 0)
1298 $arSqlSearch_tmp[] =
"(1 = 2)";
1300 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
1308 $item =
"'".$GLOBALS[
"DB"]->ForSql($item).
"'";
1311 $vals = array_unique($vals);
1312 $val = implode(
",", $vals);
1314 if (
count($vals) <= 0)
1315 $arSqlSearch_tmp[] =
"(1 = 2)";
1317 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
1325 $item =
$GLOBALS[
"DB"]->CharToDateFunction($item,
"FULL");
1328 $vals = array_unique($vals);
1329 $val = implode(
",", $vals);
1331 if (
count($vals) <= 0)
1332 $arSqlSearch_tmp[] =
"1 = 2";
1334 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
1342 $item =
$GLOBALS[
"DB"]->CharToDateFunction($item,
"SHORT");
1345 $vals = array_unique($vals);
1346 $val = implode(
",", $vals);
1348 if (
count($vals) <= 0)
1349 $arSqlSearch_tmp[] =
"1 = 2";
1351 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" (".
$val.
"))";
1357 $countVals =
count($vals);
1358 for ($j = 0; $j < $countVals; $j++)
1364 $arSqlSearch_tmp1 = call_user_func_array(
1368 if ($arSqlSearch_tmp1 !==
false)
1369 $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
1375 if ((intval(
$val) == 0) && (mb_strpos($strOperation,
"=") !== False))
1376 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND" :
"OR").
" ".(($strNegative ==
"Y") ?
"NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" 0)";
1378 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".intval(
$val).
" )";
1382 $val = str_replace(
",",
".",
$val);
1384 if ((DoubleVal(
$val) == 0) && (mb_strpos($strOperation,
"=") !== False))
1385 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND" :
"OR").
" ".(($strNegative ==
"Y") ?
"NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" 0)";
1387 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".DoubleVal(
$val).
" )";
1391 if ($strOperation ==
"QUERY")
1397 if ((
$val ==
'') && (mb_strpos($strOperation,
"=") !== False))
1398 $arSqlSearch_tmp[] =
"(".$arFields[
$key][
"FIELD"].
" IS ".(($strNegative ==
"Y") ?
"NOT " :
"").
"NULL) ".(($strNegative ==
"Y") ?
"AND NOT" :
"OR").
" (".
$DB->Length(
$arFields[
$key][
"FIELD"]).
" <= 0) ".(($strNegative ==
"Y") ?
"AND NOT" :
"OR").
" (".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" '".
$DB->ForSql(
$val).
"' )";
1400 $arSqlSearch_tmp[] = (($strNegative ==
"Y") ?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT " :
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" '".
$DB->ForSql(
$val).
"' )";
1406 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
"NOT":
"").
"(".
$arFields[
$key][
"FIELD"].
" IS NULL)";
1408 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"FULL").
")";
1413 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
"NOT":
"").
"(".
$arFields[
$key][
"FIELD"].
" IS NULL)";
1415 $arSqlSearch_tmp[] = ($strNegative==
"Y"?
" ".$arFields[
$key][
"FIELD"].
" IS NULL OR NOT ":
"").
"(".
$arFields[
$key][
"FIELD"].
" ".$strOperation.
" ".
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"SHORT").
")";
1426 if ($strSqlFrom <>
'')
1432 $strSqlSearch_tmp =
"";
1433 $countSqlSearch =
count($arSqlSearch_tmp);
1434 for ($j = 0; $j < $countSqlSearch; $j++)
1437 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
1438 $strSqlSearch_tmp .=
"(".$arSqlSearch_tmp[$j].
")";
1440 if ($strOrNull ==
"Y")
1442 if ($strSqlSearch_tmp <>
'')
1443 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
1444 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" IS ".($strNegative==
"Y" ?
"NOT " :
"").
"NULL)";
1448 if ($strSqlSearch_tmp <>
'')
1449 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
1450 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" ".($strNegative==
"Y" ?
"<>" :
"=").
" 0)";
1454 if ($strSqlSearch_tmp <>
'')
1455 $strSqlSearch_tmp .= ($strNegative==
"Y" ?
" AND " :
" OR ");
1456 $strSqlSearch_tmp .=
"(".$arFields[
$key][
"FIELD"].
" ".($strNegative==
"Y" ?
"<>" :
"=").
" '')";
1460 if ($strSqlSearch_tmp !=
"")
1461 $arSqlSearch[] =
"(".$strSqlSearch_tmp.
")";
1466 if (is_callable($callback))
1468 $arSqlSearch[] = call_user_func_array($callback,
array(
$arFields));
1471 $countSqlSearch =
count($arSqlSearch);
1472 for (
$i = 0;
$i < $countSqlSearch;
$i++)
1474 if ($strSqlWhere !=
'')
1475 $strSqlWhere .=
" AND ";
1476 $strSqlWhere .=
"(".$arSqlSearch[
$i].
")";
1482 $arSqlOrder = Array();
1483 if (!is_array($arOrder))
1485 foreach ($arOrder as $by =>
$order)
1487 $by = mb_strtoupper($by);
1495 if (is_array($arGroupBy) &&
count($arGroupBy) > 0 && in_array($by, $arGroupBy))
1497 $arSqlOrder[] =
" ".$by.
" ".
$order.
" ";
1501 $arSqlOrder[] =
" ".$arFields[$by][
"FIELD"].
" ".
$order.
" ";
1505 && !in_array(
$arFields[$by][
"FROM"], $arAlreadyJoined))
1507 if ($strSqlFrom <>
'')
1510 $arAlreadyJoined[] =
$arFields[$by][
"FROM"];
1513 elseif ($obUserFieldsSql)
1515 $arSqlOrder[] =
" ".$obUserFieldsSql->GetOrder($by).
" ".
$order.
" ";
1520 $strSqlOrderBy =
"";
1522 $countSqlOrder =
count($arSqlOrder);
1523 for (
$i=0;
$i < $countSqlOrder;
$i++)
1525 if ($strSqlOrderBy <>
'')
1526 $strSqlOrderBy .=
", ";
1528 $order = (mb_substr($arSqlOrder[
$i], -3) ==
"ASC") ?
"ASC" :
"DESC";
1531 if(mb_strtoupper(
$DB->type)==
"ORACLE")
1534 $strSqlOrderBy .= $arSqlOrder[
$i].
" NULLS FIRST";
1536 $strSqlOrderBy .= $arSqlOrder[
$i].
" NULLS LAST";
1539 $strSqlOrderBy .= $arSqlOrder[
$i];
1543 $field = mb_substr($arSqlOrder[
$i], 0, -mb_strlen(
$order) - 1);
1544 if(mb_strtoupper(
$DB->type) ===
"MYSQL")
1547 $strSqlOrderBy .=
'(CASE WHEN ISNULL('.$field.
') THEN 1 ELSE 0 END) '.
$order.
', '.$field.
" ".
$order;
1549 $strSqlOrderBy .= $field.
" ".
$order;
1551 elseif(mb_strtoupper(
$DB->type) ===
"MSSQL")
1554 $strSqlOrderBy .=
'(CASE WHEN '.$field.
' IS NULL THEN 1 ELSE 0 END) '.
$order.
', '.$field.
" ".
$order;
1556 $strSqlOrderBy .= $field.
" ".
$order;
1559 elseif(mb_strtoupper(
$DB->type) ===
"ORACLE")
1562 $strSqlOrderBy .= $field.
" ".
$order.
" NULLS LAST";
1564 $strSqlOrderBy .= $field.
" ".
$order;
1571 "SELECT" => $strSqlSelect,
1572 "FROM" => $strSqlFrom,
1573 "WHERE" => $strSqlWhere,
1574 "GROUPBY" => $strSqlGroupBy,
1575 "ORDERBY" => $strSqlOrderBy
1581 public static function GetByID(
$ID)
1585 if (intval(
$ID) <= 0)
1590 return $GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".$ID];
1594 $isOrderConverted = \Bitrix\Main\Config\Option::get(
"main",
"~sale_converted_15",
'Y');
1596 if ($isOrderConverted !=
'N')
1598 $db_res = \Bitrix\Sale\Compatible\OrderCompatibility::getById(
$ID);
1604 " ".$DB->DateToCharFunction(
"O.DATE_STATUS",
"FULL").
" as DATE_STATUS_FORMAT, ".
1605 " ".$DB->DateToCharFunction(
"O.DATE_INSERT",
"SHORT").
" as DATE_INSERT_FORMAT, ".
1606 " ".$DB->DateToCharFunction(
"O.DATE_UPDATE",
"FULL").
" as DATE_UPDATE_FORMAT, ".
1607 " ".$DB->DateToCharFunction(
"O.DATE_LOCK",
"FULL").
" as DATE_LOCK_FORMAT ".
1608 "FROM b_sale_order O ".
1609 "WHERE O.ID = ".$ID.
"";
1616 if ($isOrderConverted !=
'N')
1618 $dataKeys = array_keys(
$res);
1619 foreach ($dataKeys as
$key)
1623 && ((
$res[
$key] instanceof \Bitrix\Main\Type\DateTime)
1624 || (
$res[
$key] instanceof \Bitrix\Main\Type\Date)))
1629 if (
$key ==
"DATE_INSERT")
1631 $res[
'DATE_INSERT_FORMAT'] = Sale\Compatible\OrderCompatibility::convertDateFieldToFormat($dateObject,
FORMAT_DATE);
1635 $res[
'DATE_STATUS_FORMAT'] = Sale\Compatible\OrderCompatibility::convertDateFieldToFormat($dateObject,
FORMAT_DATETIME);
1639 $res[
'DATE_UPDATE_FORMAT'] = Sale\Compatible\OrderCompatibility::convertDateFieldToFormat($dateObject,
FORMAT_DATETIME);
1643 $res[
'DATE_LOCK_FORMAT'] = Sale\Compatible\OrderCompatibility::convertDateFieldToFormat($dateObject,
FORMAT_DATETIME);
1646 $res[
$key] = $dateObject->format(
'Y-m-d H:i:s');
1649 $res = \Bitrix\Sale\Compatible\OrderFetchAdapter::convertRowData(
$res);
1652 $GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".$ID] =
$res;
1680 'select' =>
array(
'ID'),
1696 $userID = intval($userID);
1699 $APPLICATION->ThrowException(
"Empty user ID",
"EMPTY_USER_ID");
1704 'filter' =>
array(
'=USER_ID' => $userID),
1713 'filter' =>
array(
'=USER_ID' => $userID),
1725 public static function PayOrder(
$ID,
$val, $bWithdraw = True, $bPay = True, $recurringID = 0, $arAdditionalFields =
array())
1730 $val = ((
$val !=
"Y") ?
"N" :
"Y");
1731 $bWithdraw = ($bWithdraw ? True : False);
1732 $bPay = ($bPay ? True : False);
1733 $recurringID = intval($recurringID);
1738 $NO_CHANGE_STATUS =
'N';
1739 if (isset($arAdditionalFields[
'NOT_CHANGE_STATUS']) && $arAdditionalFields[
'NOT_CHANGE_STATUS'] ===
'Y')
1741 $NO_CHANGE_STATUS =
"Y";
1742 unset($arAdditionalFields[
"NOT_CHANGE_STATUS"]);
1747 $APPLICATION->ThrowException(Loc::getMessage(
"SKGO_NO_ORDER_ID"),
"NO_ORDER_ID");
1751 $arOrder = CSaleOrder::GetByID(
$ID);
1754 $APPLICATION->ThrowException(str_replace(
"#ID#",
$ID, Loc::getMessage(
"SKGO_NO_ORDER")),
"NO_ORDER");
1758 if ($arOrder[
"PAYED"] ==
$val)
1760 $APPLICATION->ThrowException(str_replace(
"#ID#",
$ID, Loc::getMessage(
"SKGO_DUB_PAY")),
"ALREADY_FLAG");
1764 foreach(
GetModuleEvents(
"sale",
"OnSaleBeforePayOrder",
true) as $arEvent)
1768 if ($isOrderConverted ==
"N" && $bWithdraw)
1772 $needPaySum = DoubleVal($arOrder[
"PRICE"]) - DoubleVal($arOrder[
"SUM_PAID"]);
1793 "=DATE_PAYED" => $helper->getCurrentDateTimeFunction(),
1794 "EMP_PAYED_ID" => ((
int)
$USER->GetID() > 0 ? (
int)
$USER->GetID() :
false),
1797 if (
count($arAdditionalFields) > 0)
1799 foreach ($arAdditionalFields as $addKey => $addValue)
1801 if (!array_key_exists($addKey,
$arFields))
1806 if ($isOrderConverted !=
'N')
1810 $r = \Bitrix\Sale\Compatible\OrderCompatibility::pay(
$ID,
$arFields, $bWithdraw, $bPay);
1812 if (!$r->isSuccess(
true))
1814 foreach($r->getErrorMessages() as
$error)
1832 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
1837 $arOrder = CSaleOrder::GetByID(
$ID);
1840 if ($NO_CHANGE_STATUS !=
"Y")
1843 if($orderStatus <>
'' && $orderStatus != $arOrder[
"STATUS_ID"])
1846 while ($arStatus = $dbStatus->GetNext())
1858 if($arOrderProp = $dbOrderProp->Fetch())
1859 $userEMail = $arOrderProp[
"VALUE"];
1861 if($userEMail ==
'')
1864 if($arUser = $dbUser->Fetch())
1865 $userEMail = $arUser[
"EMAIL"];
1868 if ($isOrderConverted ==
'N')
1871 "ORDER_ID" => $arOrder[
"ACCOUNT_NUMBER"],
1872 "ORDER_DATE" => $arOrder[
"DATE_INSERT_FORMAT"],
1873 "EMAIL" => $userEMail,
1874 "SALE_EMAIL" => COption::GetOptionString(
"sale",
"order_email",
"order@".
$_SERVER[
"SERVER_NAME"])
1876 $eventName =
"SALE_ORDER_PAID";
1879 foreach(
GetModuleEvents(
"sale",
"OnOrderPaySendEmail",
true) as $arEvent)
1894 if (CModule::IncludeModule(
"statistic"))
1901 if (CModule::IncludeModule(
"statistic"))
1903 CStatEvent::AddByEvents(
"eStore",
"order_chargeback",
$ID,
"", $arOrder[
"STAT_GID"], $arOrder[
"PRICE"], $arOrder[
"CURRENCY"],
"Y");
1907 if ($isOrderConverted ==
'N')
1910 if (COption::GetOptionString(
"sale",
"product_reserve_condition",
"O") ==
"P" && $arOrder[
"RESERVED"] !=
$val)
1912 if (!CSaleOrder::ReserveOrder(
$ID,
$val))
1919 if($allowDelivery ==
"Y" && $arOrder[
"ALLOW_DELIVERY"] ==
"N")
1921 CSaleOrder::DeliverOrder(
$ID,
"Y");
1929 public static function DeliverOrder(
$ID,
$val, $recurringID = 0, $arAdditionalFields =
array())
1934 $val = ((
$val !=
"Y") ?
"N" :
"Y");
1935 $recurringID = intval($recurringID);
1937 $isOrderConverted = \Bitrix\Main\Config\Option::get(
"main",
"~sale_converted_15",
'Y');
1939 $NO_CHANGE_STATUS =
"N";
1940 if (isset($arAdditionalFields[
'NOT_CHANGE_STATUS']) && $arAdditionalFields[
'NOT_CHANGE_STATUS'] ===
'Y')
1942 $NO_CHANGE_STATUS =
"Y";
1943 unset($arAdditionalFields[
"NOT_CHANGE_STATUS"]);
1948 $APPLICATION->ThrowException(Loc::getMessage(
"SKGO_NO_ORDER_ID"),
"NO_ORDER_ID");
1952 $arOrder = CSaleOrder::GetByID(
$ID);
1955 $APPLICATION->ThrowException(str_replace(
"#ID#",
$ID, Loc::getMessage(
"SKGO_NO_ORDER")),
"NO_ORDER");
1959 if ($arOrder[
"ALLOW_DELIVERY"] ==
$val)
1961 $APPLICATION->ThrowException(str_replace(
"#ID#",
$ID, Loc::getMessage(
"SKGO_DUB_DELIVERY")),
"ALREADY_FLAG");
1965 foreach(
GetModuleEvents(
"sale",
"OnSaleBeforeDeliveryOrder",
true) as $arEvent)
1969 if ($isOrderConverted ==
'N')
1972 "ALLOW_DELIVERY" =>
$val,
1973 "=DATE_ALLOW_DELIVERY" =>
$DB->GetNowFunction(),
1974 "EMP_ALLOW_DELIVERY_ID" => ( intval(
$USER->GetID())>0 ? intval(
$USER->GetID()) :
false )
1976 if (
count($arAdditionalFields) > 0)
1978 foreach ($arAdditionalFields as $addKey => $addValue)
1980 if (!array_key_exists($addKey,
$arFields))
1991 $r = \Bitrix\Sale\Compatible\OrderCompatibility::allowDelivery(
$ID, (
$val ==
"Y" ?
true :
false));
1992 if (!$r->isSuccess(
true))
1994 foreach($r->getErrorMessages() as
$error)
2006 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
2008 if ($recurringID <= 0)
2010 if (intval($arOrder[
"RECURRING_ID"]) > 0)
2011 $recurringID = intval($arOrder[
"RECURRING_ID"]);
2014 CSaleBasket::OrderDelivery(
$ID, ((
$val==
"Y") ? True : False), $recurringID);
2016 if ($isOrderConverted ==
'N')
2018 foreach(
GetModuleEvents(
"sale",
"OnSaleDeliveryOrder",
true) as $arEvent)
2025 $arOrder = CSaleOrder::GetByID(
$ID);
2028 if ($NO_CHANGE_STATUS !=
"Y")
2031 if($orderStatus <>
'' && $orderStatus != $arOrder[
"STATUS_ID"])
2033 $dbStatus =
CSaleStatus::GetList(Array(
"SORT" =>
"ASC"), Array(
"LID" => LANGUAGE_ID),
false,
false, Array(
"ID",
"SORT"));
2034 while ($arStatus = $dbStatus->GetNext())
2046 if($arOrderProp = $dbOrderProp->Fetch())
2047 $userEMail = $arOrderProp[
"VALUE"];
2049 if($userEMail ==
'')
2052 if($arUser = $dbUser->Fetch())
2053 $userEMail = $arUser[
"EMAIL"];
2056 if ($isOrderConverted ==
'N')
2058 $eventName =
"SALE_ORDER_DELIVERY";
2060 "ORDER_ID" => $arOrder[
"ACCOUNT_NUMBER"],
2061 "ORDER_DATE" => $arOrder[
"DATE_INSERT_FORMAT"],
2062 "EMAIL" => $userEMail,
2063 "SALE_EMAIL" => COption::GetOptionString(
"sale",
"order_email",
"order@".
$_SERVER[
"SERVER_NAME"])
2067 foreach(
GetModuleEvents(
"sale",
"OnOrderDeliverSendEmail",
true) as $arEvent)
2082 if (COption::GetOptionString(
"sale",
"product_reserve_condition",
"O") ==
"D" && $arOrder[
"RESERVED"] !=
$val)
2084 if (!CSaleOrder::ReserveOrder(
$ID,
$val))
2092 if($allowDeduction ==
"Y" && $arOrder[
"DEDUCTED"] ==
"N")
2106 $val = ((
$val !=
"Y") ?
"N" :
"Y");
2108 $recurringID = intval($recurringID);
2118 $arOrder = CSaleOrder::GetByID(
$ID);
2125 if ($arOrder[
"DEDUCTED"] ==
$val)
2131 foreach(
GetModuleEvents(
"sale",
"OnSaleBeforeDeductOrder",
true) as $arEvent)
2135 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
2137 if ($recurringID <= 0)
2139 if (intval($arOrder[
"RECURRING_ID"]) > 0)
2140 $recurringID = intval($arOrder[
"RECURRING_ID"]);
2143 $arDeductResult = CSaleBasket::OrderDeduction(
$ID, ((
$val ==
"N") ?
true :
false), $recurringID, $bAutoDeduction, $arStoreBarcodeOrderFormData);
2145 if (array_key_exists(
"ERROR", $arDeductResult))
2147 if ($isOrderConverted ==
'N')
2157 if ($arOrder[
"MARKED"] ==
"Y")
2163 if ($isOrderConverted !=
'N')
2165 if ($arDeductResult[
"RESULT"])
2176 if ($arDeductResult[
"RESULT"])
2182 "EMP_DEDUCTED_ID" => ( intval(
$USER->GetID())>0 ? intval(
$USER->GetID()) :
false ),
2183 "=DATE_DEDUCTED" =>
$DB->GetNowFunction()
2190 "EMP_DEDUCTED_ID" => ( intval(
$USER->GetID())>0 ? intval(
$USER->GetID()) :
false ),
2191 "=DATE_DEDUCTED" =>
$DB->GetNowFunction()
2205 foreach(
GetModuleEvents(
"sale",
"OnSaleDeductOrder",
true) as $arEvent)
2218 public static function ReserveOrder(
$ID,
$val)
2223 $val = ((
$val !=
"Y") ?
"N" :
"Y");
2230 $APPLICATION->ThrowException(Loc::getMessage(
"SKGO_NO_ORDER_ID"),
"NO_ORDER_ID");
2234 $arOrder = CSaleOrder::GetByID(
$ID);
2237 $APPLICATION->ThrowException(str_replace(
"#ID#",
$ID, Loc::getMessage(
"SKGO_NO_ORDER")),
"NO_ORDER");
2241 if ($arOrder[
"RESERVED"] ==
$val)
2243 $APPLICATION->ThrowException(str_replace(
"#ID#",
$ID, Loc::getMessage(
"SKGO_DUB_RESERVATION")),
"ALREADY_FLAG");
2247 foreach(
GetModuleEvents(
"sale",
"OnSaleBeforeReserveOrder",
true) as $arEvent)
2251 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
2253 if ($isOrderConverted !=
'N')
2256 $r = \Bitrix\Sale\Compatible\OrderCompatibility::reserve(
$ID,
$val);
2258 if (!$r->isSuccess(
true))
2260 foreach($r->getErrorMessages() as
$error)
2276 $arRes = CSaleBasket::OrderReservation(
$ID, ((
$val ==
"N") ?
true :
false));
2277 if (array_key_exists(
"ERROR",
$arRes))
2279 foreach (
$arRes[
"ERROR"] as $arError)
2290 if ($arOrder[
"MARKED"] ==
"Y")
2297 foreach(
GetModuleEvents(
"sale",
"OnSaleReserveOrder",
true) as $arEvent)
2310 $val = ((
$val !=
"Y") ?
"N" :
"Y");
2319 $arOrder = CSaleOrder::GetByID(
$ID);
2326 if ($arOrder[
"CANCELED"] ==
$val)
2332 if ($isOrderConverted !=
'N')
2335 if ($r->isSuccess(
true))
2342 foreach($r->getErrorMessages() as
$error)
2354 foreach(
GetModuleEvents(
"sale",
"OnSaleBeforeCancelOrder",
true) as $arEvent)
2360 if ($arOrder[
"DEDUCTED"] ==
"Y")
2366 if ($arOrder[
"RESERVED"] ==
"Y")
2368 if (!CSaleOrder::ReserveOrder(
$ID,
"N"))
2372 if ($arOrder[
"PAYED"] ==
"Y")
2374 if (!CSaleOrder::PayOrder(
$ID,
"N", True, True))
2379 $arOrder[
"SUM_PAID"] = DoubleVal($arOrder[
"SUM_PAID"]);
2380 if ($arOrder[
"SUM_PAID"] > 0)
2388 if ($arOrder[
"ALLOW_DELIVERY"] ==
"Y")
2390 if (!CSaleOrder::DeliverOrder(
$ID,
"N"))
2396 if (COption::GetOptionString(
"sale",
"product_reserve_condition",
"O") ==
"O" && $arOrder[
"RESERVED"] !=
"Y")
2398 if (!CSaleOrder::ReserveOrder(
$ID,
"Y"))
2405 "=DATE_CANCELED" =>
$DB->GetNowFunction(),
2407 "EMP_CANCELED_ID" => ( intval(
$USER->GetID())>0 ? intval(
$USER->GetID()) :
false )
2412 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
2414 if ($isOrderConverted ==
'N')
2419 foreach(
GetModuleEvents(
"sale",
"OnSaleCancelOrder",
true) as $arEvent)
2425 CTimeZone::Disable();
2426 $arOrder = CSaleOrder::GetByID(
$ID);
2427 CTimeZone::Enable();
2431 if($arOrderProp = $dbOrderProp->Fetch())
2432 $userEmail = $arOrderProp[
"VALUE"];
2433 if($userEmail ==
'')
2435 $dbUser = CUser::GetByID($arOrder[
"USER_ID"]);
2436 if($arUser = $dbUser->Fetch())
2437 $userEmail = $arUser[
"EMAIL"];
2440 if (CModule::IncludeModule(
"statistic"))
2464 $arOrder = CSaleOrder::GetByID(
$ID);
2471 if ($arOrder[
"STATUS_ID"] ==
$val)
2478 "STATUS_ID" =>
$val,
2479 "=DATE_STATUS" =>
$DB->GetNowFunction(),
2480 "EMP_STATUS_ID" => ((isset(
$USER) &&
$USER instanceof \
CUser) && intval(
$USER->GetID())>0 ? intval(
$USER->GetID()) :
false )
2484 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
2499 unset(
$GLOBALS[
"SALE_ORDER"][
"SALE_ORDER_CACHE_".
$ID]);
2514 "LOCKED_BY" =>
$GLOBALS[
"USER"]->GetID()
2517 return Sale\Internals\OrderTable::update(
$ID,
$arFields)->isSuccess();
2526 $arOrder = CSaleOrder::GetByID(
$ID);
2530 $userRights = CMain::GetUserRight(
"sale",
$GLOBALS[
"USER"]->GetUserGroupArray(),
"Y",
"Y");
2532 if (($userRights >=
"W") || ($arOrder[
"LOCKED_BY"] ==
$GLOBALS[
"USER"]->GetID()))
2535 "DATE_LOCK" =>
false,
2536 "LOCKED_BY" =>
false
2539 return Sale\Internals\OrderTable::update(
$ID,
$arFields)->isSuccess();
2549 return static::GetLockStatus(
$ID, $lockedBY, $dateLock) ===
'red';
2560 $order = Sale\Internals\OrderTable::getRow([
2576 $lockedBY =
$order[
'LOCKED_BY'];
2579 return $order[
'LOCK_STATUS'];
2582 public static function RemindPayment()
2584 $reminder = COption::GetOptionString(
"sale",
"pay_reminder",
"");
2593 $use =
$val[
"use"] ??
null;
2594 $frequency = (float)(
$val[
"frequency"] ?? 0.0);
2596 if ($use ===
"Y" && $frequency > 0)
2601 for(
$i=0;
$i <= floor(
$val[
"period"] / $frequency);
$i++)
2609 $day = ConvertTimeStamp($day);
2631 "ALLOW_DELIVERY" =>
"N",
2635 $dbOrder =
CSaleOrder::GetList(Array(
"ID" =>
"DESC"),
$arFilter,
false,
false, Array(
"ID",
"DATE_INSERT",
"PAYED",
"USER_ID",
"LID",
"PRICE",
"CURRENCY",
"ACCOUNT_NUMBER"));
2636 while($arOrder = $dbOrder -> GetNext())
2638 $date_insert =
ConvertDateTime($arOrder[
"DATE_INSERT"], CSite::GetDateFormat(
"SHORT"));
2640 if(in_array($date_insert,
$arReminder[$arOrder[
"LID"]][
"days"]))
2645 array(
"NAME" =>
"ASC"),
2646 array(
"ORDER_ID" => $arOrder[
"ID"]),
2649 array(
"ID",
"NAME",
"QUANTITY")
2651 while ($arBasketTmp = $dbBasketTmp->Fetch())
2653 $strOrderList .= $arBasketTmp[
"NAME"].
" (".$arBasketTmp[
"QUANTITY"].
")";
2654 $strOrderList .=
"\n";
2659 if($arOrderProp = $dbOrderProp->Fetch())
2660 $payerEMail = $arOrderProp[
"VALUE"];
2664 if ($arUser = $dbUser->Fetch())
2666 if ($payerName ==
'')
2667 $payerName = $arUser[
"NAME"].(($arUser[
"NAME"] ==
'' || $arUser[
"LAST_NAME"] ==
'') ?
"" :
" ").$arUser[
"LAST_NAME"];
2668 if ($payerEMail ==
'')
2669 $payerEMail = $arUser[
"EMAIL"];
2674 $registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
2677 $orderClass = $registry->getOrderClassName();
2679 $order = $orderClass::load($arOrder[
'ID']);
2680 if (Sale\Helpers\Order::isAllowGuestView(
$order))
2682 $publicLink = Sale\Helpers\Order::getPublicLink(
$order);
2686 "ORDER_ID" => $arOrder[
"ACCOUNT_NUMBER"],
2687 "ORDER_DATE" => $date_insert,
2688 "ORDER_USER" => $payerName,
2690 "BCC" => COption::GetOptionString(
"sale",
"order_email",
"order@".
$_SERVER[
"SERVER_NAME"]),
2691 "EMAIL" => $payerEMail,
2692 "ORDER_LIST" => $strOrderList,
2693 "SALE_EMAIL" => COption::GetOptionString(
"sale",
"order_email",
"order@".
$_SERVER[
'SERVER_NAME']),
2694 "ORDER_PUBLIC_URL" => $publicLink
2697 $eventName =
"SALE_ORDER_REMIND_PAYMENT";
2700 foreach(
GetModuleEvents(
"sale",
"OnOrderRemindSendEmail",
true) as $arEvent)
2719 return "CSaleOrder::RemindPayment();";
2739 switch ($templateType)
2743 $param = intval($param);
2746 $strSql =
"SELECT ID, ACCOUNT_NUMBER FROM b_sale_order WHERE ACCOUNT_NUMBER IS NOT NULL ORDER BY ID DESC LIMIT 1";
2748 $dbres =
$DB->Query($strSql,
true);
2749 if (
$arRes = $dbres->GetNext())
2751 if (mb_strlen(
$arRes[
"ACCOUNT_NUMBER"]) === mb_strlen(intval(
$arRes[
"ACCOUNT_NUMBER"])))
2752 $maxLastID = intval(
$arRes[
"ACCOUNT_NUMBER"]);
2755 $value = ($maxLastID >= $param) ? $maxLastID + 1 : $param;
2760 $value = $param.$orderID;
2765 $rand =
randString(intval($param),
array(
"ABCDEFGHIJKLNMOPQRSTUVWXYZ",
"0123456789"));
2766 $dbres =
$DB->Query(
"SELECT ID, ACCOUNT_NUMBER FROM b_sale_order WHERE ACCOUNT_NUMBER = '".$rand.
"'",
true);
2767 $value = (
$arRes = $dbres->GetNext()) ?
false : $rand;
2772 $dbres =
$DB->Query(
"SELECT USER_ID FROM b_sale_order WHERE ID = '".
$orderID.
"'",
true);
2774 if (
$arRes = $dbres->GetNext())
2776 $userID =
$arRes[
"USER_ID"];
2778 $strSql =
"SELECT MAX(CAST(SUBSTRING(ACCOUNT_NUMBER, LENGTH('".$userID.
"_') + 1) as UNSIGNED)) as NUM_ID FROM b_sale_order WHERE ACCOUNT_NUMBER LIKE '".$userID.
"\_%'";
2779 $dbres =
$DB->Query($strSql,
true);
2780 if (
$arRes = $dbres->GetNext())
2782 $numID = (intval(
$arRes[
"NUM_ID"]) > 0) ?
$arRes[
"NUM_ID"] + 1 : 1;
2783 $value = $userID.
"_".$numID;
2786 $value = $userID.
"_1";
2799 $date = date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"SHORT")), mktime(0, 0, 0, date(
"m"), date(
"d"), date(
"Y")));
2800 $date = preg_replace(
"/[^0-9]/",
"", $date);
2803 $date = date(
$DB->DateFormatToPHP(str_replace(
"DD",
"", CSite::GetDateFormat(
"SHORT"))), mktime(0, 0, 0, date(
"m"), date(
"d"), date(
"Y")));
2804 $date = preg_replace(
"/[^0-9]/",
"", $date);
2811 $strSql =
"SELECT MAX(CAST(SUBSTRING(ACCOUNT_NUMBER, LENGTH('".$date.
" / ') + 1) as UNSIGNED)) as NUM_ID FROM b_sale_order WHERE ACCOUNT_NUMBER LIKE '".$date.
" / %'";
2812 $dbres =
$DB->Query($strSql,
true);
2813 if (
$arRes = $dbres->GetNext())
2815 $numID = (intval(
$arRes[
"NUM_ID"]) > 0) ?
$arRes[
"NUM_ID"] + 1 : 1;
2816 $value = $date.
" / ".$numID;
2819 $value = $date.
" / 1";
2833 $strCurrency = strval($strCurrency);
2834 $mxLastOrderDate =
'';
2835 $intMaxTimestamp = 0;
2841 array(
'ID',
'PRICE',
'CURRENCY',
'DATE_INSERT')
2843 while ($arSaleOrder = $rsSaleOrders->Fetch())
2846 if ($intMaxTimestamp < $intTimeStamp)
2848 $intMaxTimestamp = $intTimeStamp;
2849 $mxLastOrderDate = $arSaleOrder[
'DATE_INSERT'];
2851 if (empty($strCurrency))
2853 $dblPrice += $arSaleOrder[
'PRICE'];
2854 $strCurrency = $arSaleOrder[
'CURRENCY'];
2859 $strCurrency != $arSaleOrder[
'CURRENCY']
2861 : $arSaleOrder[
'PRICE']
2864 unset($intTimeStamp);
2866 unset($arSaleOrder, $rsSaleOrders);
2871 'select' =>
array(
'DATE_INSERT',
'PRICE',
'CURRENCY')
2875 while($archiveOrder = $archiveData->fetch())
2877 $intTimeStamp =
MakeTimeStamp($archiveOrder[
'DATE_INSERT']);
2878 if ($intMaxTimestamp < $intTimeStamp)
2880 $intMaxTimestamp = $intTimeStamp;
2881 $mxLastOrderDate = $archiveOrder[
'DATE_INSERT'];
2883 if (empty($strCurrency))
2885 $dblPrice += $archiveOrder[
'PRICE'];
2886 $strCurrency = $archiveOrder[
'CURRENCY'];
2890 $strCurrency != $archiveOrder[
'CURRENCY']
2892 : $archiveOrder[
'PRICE']
2897 'PRICE' => $dblPrice,
2898 'CURRENCY' => $strCurrency,
2899 'LAST_ORDER_DATE' => $mxLastOrderDate,
2900 'TIMESTAMP' => $intMaxTimestamp,
2921 if (array_key_exists(
"H_DATE_INSERT_FROM",
$arFilter))
2927 if (array_key_exists(
"H_DATE_INSERT_TO",
$arFilter))
2934 if (!$arSelectFields ||
count($arSelectFields) <= 0 || in_array(
"*", $arSelectFields))
2936 $arSelectFields =
array(
2954 "REASON_UNDO_DEDUCTED",
2960 "DATE_ALLOW_DELIVERY",
2969 "PS_STATUS_DESCRIPTION",
2970 "PS_STATUS_MESSAGE",
2986 "ID" =>
array(
"FIELD" =>
"V.ID",
"TYPE" =>
"int"),
2987 "H_ORDER_ID" =>
array(
"FIELD" =>
"V.H_ORDER_ID",
"TYPE" =>
"int"),
2988 "H_USER_ID" =>
array(
"FIELD" =>
"V.H_USER_ID",
"TYPE" =>
"int"),
2989 "H_DATE_INSERT" =>
array(
"FIELD" =>
"V.H_DATE_INSERT",
"TYPE" =>
"datetime"),
2990 "H_CURRENCY" =>
array(
"FIELD" =>
"V.H_CURRENCY",
"TYPE" =>
"string"),
2991 "PERSON_TYPE_ID" =>
array(
"FIELD" =>
"V.PERSON_TYPE_ID",
"TYPE" =>
"int"),
2992 "PAYED" =>
array(
"FIELD" =>
"V.PAYED",
"TYPE" =>
"char"),
2993 "DATE_PAYED" =>
array(
"FIELD" =>
"V.DATE_PAYED",
"TYPE" =>
"datetime"),
2994 "EMP_PAYED_ID" =>
array(
"FIELD" =>
"V.EMP_PAYED_ID",
"TYPE" =>
"int"),
2995 "CANCELED" =>
array(
"FIELD" =>
"V.CANCELED",
"TYPE" =>
"char"),
2996 "DATE_CANCELED" =>
array(
"FIELD" =>
"V.DATE_CANCELED",
"TYPE" =>
"datetime"),
2997 "REASON_CANCELED" =>
array(
"FIELD" =>
"V.REASON_CANCELED",
"TYPE" =>
"string"),
2998 "MARKED" =>
array(
"FIELD" =>
"V.MARKED",
"TYPE" =>
"char"),
2999 "DATE_MARKED" =>
array(
"FIELD" =>
"V.DATE_MARKED",
"TYPE" =>
"datetime"),
3000 "REASON_MARKED" =>
array(
"FIELD" =>
"V.REASON_MARKED",
"TYPE" =>
"string"),
3001 "DEDUCTED" =>
array(
"FIELD" =>
"V.DEDUCTED",
"TYPE" =>
"char"),
3002 "DATE_DEDUCTED" =>
array(
"FIELD" =>
"V.DATE_DEDUCTED",
"TYPE" =>
"datetime"),
3003 "REASON_DEDUCTED" =>
array(
"FIELD" =>
"V.REASON_UNDO_DEDUCTED",
"TYPE" =>
"string"),
3004 "RESERVED" =>
array(
"FIELD" =>
"V.RESERVED",
"TYPE" =>
"char"),
3005 "STATUS_ID" =>
array(
"FIELD" =>
"V.STATUS_ID",
"TYPE" =>
"char"),
3006 "DATE_STATUS" =>
array(
"FIELD" =>
"V.DATE_STATUS",
"TYPE" =>
"datetime"),
3007 "PAY_VOUCHER_NUM" =>
array(
"FIELD" =>
"V.PAY_VOUCHER_NUM",
"TYPE" =>
"string"),
3008 "PAY_VOUCHER_DATE" =>
array(
"FIELD" =>
"V.PAY_VOUCHER_DATE",
"TYPE" =>
"date"),
3009 "PRICE_DELIVERY" =>
array(
"FIELD" =>
"V.PRICE_DELIVERY",
"TYPE" =>
"double"),
3010 "ALLOW_DELIVERY" =>
array(
"FIELD" =>
"V.ALLOW_DELIVERY",
"TYPE" =>
"char"),
3011 "DATE_ALLOW_DELIVERY" =>
array(
"FIELD" =>
"V.DATE_ALLOW_DELIVERY",
"TYPE" =>
"datetime"),
3012 "PRICE" =>
array(
"FIELD" =>
"V.PRICE",
"TYPE" =>
"double"),
3013 "CURRENCY" =>
array(
"FIELD" =>
"V.CURRENCY",
"TYPE" =>
"string"),
3014 "DISCOUNT_VALUE" =>
array(
"FIELD" =>
"V.DISCOUNT_VALUE",
"TYPE" =>
"double"),
3015 "SUM_PAID" =>
array(
"FIELD" =>
"V.SUM_PAID",
"TYPE" =>
"double"),
3016 "USER_ID" =>
array(
"FIELD" =>
"V.USER_ID",
"TYPE" =>
"int"),
3017 "PAY_SYSTEM_ID" =>
array(
"FIELD" =>
"V.PAY_SYSTEM_ID",
"TYPE" =>
"int"),
3018 "DELIVERY_ID" =>
array(
"FIELD" =>
"V.DELIVERY_ID",
"TYPE" =>
"string"),
3019 "PS_STATUS" =>
array(
"FIELD" =>
"V.PS_STATUS",
"TYPE" =>
"char"),
3020 "PS_STATUS_CODE" =>
array(
"FIELD" =>
"V.PS_STATUS_CODE",
"TYPE" =>
"string"),
3021 "PS_STATUS_DESCRIPTION" =>
array(
"FIELD" =>
"V.PS_STATUS_DESCRIPTION",
"TYPE" =>
"string"),
3022 "PS_STATUS_MESSAGE" =>
array(
"FIELD" =>
"V.PS_STATUS_MESSAGE",
"TYPE" =>
"string"),
3023 "PS_SUM" =>
array(
"FIELD" =>
"V.PS_SUM",
"TYPE" =>
"double"),
3024 "PS_CURRENCY" =>
array(
"FIELD" =>
"V.PS_CURRENCY",
"TYPE" =>
"string"),
3025 "PS_RESPONSE_DATE" =>
array(
"FIELD" =>
"V.PS_RESPONSE_DATE",
"TYPE" =>
"datetime"),
3026 "TAX_VALUE" =>
array(
"FIELD" =>
"V.TAX_VALUE",
"TYPE" =>
"double"),
3027 "AFFILIATE_ID" =>
array(
"FIELD" =>
"V.AFFILIATE_ID",
"TYPE" =>
"int"),
3028 "DELIVERY_DOC_NUM" =>
array(
"FIELD" =>
"V.DELIVERY_DOC_NUM",
"TYPE" =>
"string"),
3029 "DELIVERY_DOC_DATE" =>
array(
"FIELD" =>
"V.DELIVERY_DOC_DATE",
"TYPE" =>
"date"),
3034 $arSqls[
"SELECT"] = str_replace(
"%%_DISTINCT_%%",
"", $arSqls[
"SELECT"]);
3035 $strSql =
"SELECT ".$arSqls[
"SELECT"].
" FROM b_sale_order_history V ";
3037 if ($arSqls[
"WHERE"] <>
'')
3038 $strSql .=
"WHERE ".$arSqls[
"WHERE"].
" ";
3039 if ($arSqls[
"GROUPBY"] <>
'')
3040 $strSql .=
"GROUP BY ".$arSqls[
"GROUPBY"].
" ";
3041 if ($arSqls[
"ORDERBY"] <>
'')
3042 $strSql .=
"ORDER BY ".$arSqls[
"ORDERBY"].
" ";
3044 if (is_array($arGroupBy) &&
count($arGroupBy) == 0)
3053 if (is_array($arNavStartParams) && intval($arNavStartParams[
"nTopCount"]) <= 0 )
3055 $strSql_tmp =
"SELECT COUNT('x') as CNT FROM b_sale_order_history V ";
3056 if ($arSqls[
"WHERE"] <>
'')
3057 $strSql_tmp .=
"WHERE ".$arSqls[
"WHERE"].
" ";
3058 if ($arSqls[
"GROUPBY"] <>
'')
3059 $strSql_tmp .=
"GROUP BY ".$arSqls[
"GROUPBY"].
" ";
3063 if ($arSqls[
"GROUPBY"] ==
'')
3070 $cnt =
$dbRes->SelectedRowsCount();
3074 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
3078 if (isset($arNavStartParams[
"nTopCount"]))
3080 $strSql =
$DB->TopSql($strSql, $arNavStartParams[
"nTopCount"]);
3097 $userID = intval($userID);
3102 "EMP_MARKED_ID" => $userID,
3103 "=DATE_MARKED" =>
$DB->GetNowFunction()
3119 $userID = intval($userID);
3123 "REASON_MARKED" =>
"",
3124 "EMP_MARKED_ID" => $userID,
3125 "=DATE_MARKED" =>
$DB->GetNowFunction()
3139 public static function SetAccountNumber(
$ID)
3142 $r = static::setAccountNumberById(
$ID);
3143 return $r->isSuccess();
3153 public static function setAccountNumberById($id)
3161 new Sale\ResultError(
3162 Loc::getMessage(
'SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_WRONG_ID'),
3163 'SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_WRONG_ID'
3169 $registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
3172 $orderClass = $registry->getOrderClassName();
3174 $order = $orderClass::load($id);
3178 new \Bitrix\Main\
Error(
3179 Bitrix\Main\Localization\Loc::getMessage(
'ERROR')
3186 $accountNumber = Internals\AccountNumberGenerator::generateForOrder(
$order);
3188 $r = Internals\OrderTable::update($id, [
'ACCOUNT_NUMBER' => $accountNumber]);
3189 if (!$r->isSuccess())
3191 $result->addErrors($r->getErrors());
3205 \Bitrix\Sale\Helpers\ReservedProductCleaner::bind(60);
3206 return "CSaleOrder::ClearProductReservedQuantity();";
3223 if($op !=
'=' && $op !=
'IN')
3228 if(is_array($values) && !empty($values))
3230 foreach($values as
$k => $value)
3231 $values[
$k] =
"'".$DB->ForSql($value).
"'";
3233 $values =
'('.implode(
',', $values).
')';
3236 $values =
"'".$DB->ForSql($values).
"'";
3240 if($opNegative ==
'Y')
3241 return "( (NOT (".$fields[
"STATUS_ID"][
"FIELD"].
" ".$op.
" ".$values.
")) AND (".
$fields[
"CANCELED"][
"FIELD"].
" = 'N'))";
3243 return "((".$fields[
"STATUS_ID"][
"FIELD"].
" ".$op.
" ".$values.
") OR (".
$fields[
"CANCELED"][
"FIELD"].
" = 'Y'))";
3257 while($item =
$res->fetch())
3259 $info[
'ID'][$item[
'ID']] = $item[
'CODE'];
3260 $info[
'CODE'][$item[
'CODE']] = $item[
'ID'];
3292 public static function checkUserPermissionOrderList(
array $list,
$perm, $userGroups =
false,
$userId =
false)
3296 $userRights = CMain::GetUserRight(
"sale", $userGroups,
"Y",
"Y");
3302 if ($userRights >=
"W")
3305 $orderList =
array();
3308 $accessSiteList =
array();
3309 $statusPermissionList =
array();
3310 $statusIndexList =
array();
3312 $cacheAccessSite =
array();
3313 $cacheStatusGroupOperation =
array();
3315 $selectOrder =
array(
'ID',
'LID',
'STATUS_ID');
3319 $selectOrder[] =
'USER_ID';
3322 $registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
3325 $orderClass = $registry->getOrderClassName();
3327 $res = $orderClass::getList([
3331 'select' => $selectOrder,
3333 while($orderData =
$res->fetch())
3335 if (!in_array($orderData[
'LID'], array_keys(
$siteList)))
3337 $siteList[$orderData[
'LID']][] = $orderData[
'ID'];
3342 $output[$orderData[
'ID']] =
true;
3346 $orderList[$orderData[
'ID']] = $orderData;
3349 if ($userRights ==
"U" && !empty($orderList))
3351 $hashAccessSite = md5(join(
',', array_keys(
$siteList)).
"|". join(
', ', $userGroups));
3353 if (array_key_exists($hashAccessSite, $cacheAccessSite))
3355 $accessSiteList = $cacheAccessSite[$hashAccessSite];
3363 "GROUP_ID" => $userGroups
3369 while($accessSiteData = $accessSiteRes->Fetch())
3371 $accessSiteList[] = $accessSiteData[
'SITE_ID'];
3374 $cacheAccessSite[$hashAccessSite] = $accessSiteList;
3379 if (!in_array(
$siteId, $accessSiteList))
3392 if (!empty($orderList))
3394 foreach ($orderList as
$orderId => $orderData)
3396 if (!in_array($orderData[
'STATUS_ID'],
$statusList))
3398 $statusList[$orderData[
'STATUS_ID']] = $orderData[
'STATUS_ID'];
3401 $statusIndexList[$orderData[
'STATUS_ID']][] = $orderData[
'ID'];
3406 if (!empty($statusIdList))
3408 foreach ($statusIdList as $statusId)
3410 $hashStatusGroupOperation = md5($statusId .
"|" . join(
',', $userGroups).
"|".
$perm);
3411 if (array_key_exists($hashStatusGroupOperation, $cacheStatusGroupOperation))
3413 $statusPermissionList[$statusId] = $cacheStatusGroupOperation[$hashAccessSite];
3417 if (Sale\OrderStatus::canGroupDoOperations($userGroups, $statusId,
array(
$perm)))
3419 $statusPermissionList[$statusId] =
true;
3420 $cacheStatusGroupOperation[$hashStatusGroupOperation] =
true;
3426 foreach ($statusIndexList as $statusId => $orderIdList)
3428 if (!array_key_exists($statusId, $statusPermissionList))
3443 if (!empty($orderList))
3445 $orderIdList = array_keys($orderList);
3449 if (in_array(
$orderId, $orderIdList))
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static get($moduleId, $name, $default="", $siteId=false)
static getMessage($code, $replace=null, $language=null)
static getList(array $parameters=array())
const ORDER_COMPAT_ACTION_SAVE
static roundPrecision($value)
static GetByID($currency)
static ConvertCurrency($valSum, $curFrom, $curTo, $valDate="")
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
static OrderCanceled($orderID, $bCancel)
static DoProcessOrder(&$arOrder, $deliveryCode, &$arErrors)
static DoProcessOrder(&$arOrder, $arOptions, &$arErrors)
static isLocationProMigrated()
static getLocationIDbyCODE($code)
static getLocationCODEbyID($id)
static DoCalculateOrder($siteId, $userId, $arShoppingCart, $personTypeId, $arOrderPropsValues, $deliveryId, $paySystemId, $arOptions, &$arErrors, &$arWarnings)
static GetFilterOperation($key)
static CancelOrder($ID, $val, $description="")
static StatusOrder($ID, $val)
static CanUserViewOrder($ID, $arUserGroups=false, $userID=0)
static __SaleOrderCount($arFilter, $strCurrency='')
static GetNextAccountNumber($orderID, $templateType, $param)
static DeductOrder($ID, $val, $description="", $bAutoDeduction=true, $arStoreBarcodeOrderFormData=array(), $recurringID=0)
static CanUserUpdateOrder($ID, $arUserGroups=false, $siteID=false)
static OnBeforeCurrencyDelete($currency)
static PrepareSql(&$arFields, $arOrder, &$arFilter, $arGroupBy, $arSelectFields, $obUserFieldsSql=false, $callback=false, $arOptions=array())
static CanUserDeleteOrder($ID, $arUserGroups=false, $userID=0)
static ClearProductReservedQuantity()
static ProcessCompleteOrdersParam($values, $key, $op, $opNegative, $field, $fields, $filter)
static CheckFields($ACTION, &$arFields, $ID=0)
static SetMark($ID, $comment="", $userID=0)
static CanUserChangeOrderFlag($ID, $flag, $arUserGroups=false)
static CanUserChangeOrderStatus($ID, $statusID, $arUserGroups=false)
static CalculateOrderPrices($arBasketItems)
static IsLocked($ID, &$lockedBY, &$dateLock)
static makeOrderArray($siteId, $userId=null, array $shoppingCart=[], array $options=[])
static UnsetMark($ID, $userID=0)
static TranslateLocationPropertyValues($personTypeId, &$orderProps, $direct=true)
static GetLockStatus($ID, &$lockedBY, &$dateLock)
static GetHistoryList($arOrder=array("ID"=>"DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static OnBeforeUserDelete($userID)
static CanUserCancelOrder($ID, $arUserGroups=false, $userID=0)
static CommentsOrder($ID, $val)
static CanUserMarkOrder($ID, $arUserGroups=false, $userID=0)
static getLocationPropertyInfo()
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static DeleteByOrder($orderID)
static DeleteEx($ORDER_ID)
static DoProcessOrder(&$arOrder, $paySystemId, &$arErrors)
static GetByID($id, $personTypeId=0)
static DoProcessOrderDelivery(&$arOrder, $arOptions, &$arErrors)
static DoProcessOrderBasket(&$arOrder, $arOptions, &$arErrors)
static Pay($userID, $paySum, $payCurrency, $orderID=0, $useCC=true, $paymentId=null)
static UpdateAccount($userID, $sum, $currency, $description="", $orderID=0, $notes="", $paymentId=null)
static DeleteByOrder($OrderID)
static AddByEvents($EVENT1, $EVENT2, $EVENT3, $DATE_ENTER, $PARAM, $MONEY="", $CURRENCY="", $CHARGEBACK="N")
static getVat(array $basketItemData)
static isSetParent($arItem)
static isSetItem($arItem)
static getFinalPrice(array $basketItemData)
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetLangCurrency($siteId)
static send($eventId, $arParams)
static Update($ID, $arFields, $bDateUpdate=true)
static GetList($arOrder=array("ID"=>"DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arOptions=array())
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static DoSaveOrderProps($orderId, $personTypeId, $arOrderProps, &$arErrors, $paysystemId=0, $deliveryId="")
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetPermissionsList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetByID($statusId, $languageId=LANGUAGE_ID, $type=null)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
$_SERVER["DOCUMENT_ROOT"]
if($NS['step']==6) if( $NS[ 'step']==7) if(COption::GetOptionInt('main', 'disk_space', 0) > 0) $info
ConvertDateTime($datetime, $to_format=false, $from_site=false, $bSearchInSitesOnly=false)
ExecuteModuleEventEx($arEvent, $arParams=[])
DelDuplicateSort(&$arSort)
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
ConvertTimeStamp($timestamp=false, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
AddToTimeStamp($arrAdd, $stmp=false)
randString($pass_len=10, $pass_chars=false)
MakeTimeStamp($datetime, $format=false)
$GLOBALS['____1690880296']
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if(CSalePaySystemAction::GetParamValue("DATE_PAY_BEFORE", false)) $dbBasket
SaleFormatCurrency($fSum, $strCurrency, $OnlyValue=false, $withoutFormat=false)
const SALE_VALUE_PRECISION
if(CBXFeatures::IsFeatureEnabled('SaleAccounts')) $arReminder
if( $guestStatuses !=='') if(!is_array($guestStatuses)) $statusList
if(CSalePaySystemAction::GetParamValue("ORDER_SUBJECT", false)) if(CSalePaySystemAction::GetParamValue("DATE_PAY_BEFORE", false)) if(CSalePaySystemAction::GetParamValue("BUYER_NAME", false)) $arBasketItems
$GLOBALS['_____370096793']