82if (!Loader::includeModule(
'iblock'))
84 $APPLICATION->ThrowException(Loc::getMessage(
'CAT_ERROR_IBLOCK_NOT_INSTALLED'));
89if (!Loader::includeModule(
'currency'))
91 $APPLICATION->ThrowException(Loc::getMessage(
'CAT_ERROR_CURRENCY_NOT_INSTALLED'));
97 'js' =>
'/bitrix/js/catalog/core_tree.js',
98 'css' =>
'/bitrix/panel/catalog/catalog_cond.css',
99 'lang' =>
'/bitrix/modules/catalog/lang/'.LANGUAGE_ID.
'/js_core_tree.php',
113require_once __DIR__ .
'/autoload.php';
115if (defined(
'CATALOG_GLOBAL_VARS') && CATALOG_GLOBAL_VARS ==
'Y')
117 global $CATALOG_CATALOG_CACHE;
118 $CATALOG_CATALOG_CACHE =
null;
120 global $CATALOG_ONETIME_COUPONS_ORDER;
121 $CATALOG_ONETIME_COUPONS_ORDER =
null;
123 global $CATALOG_PRODUCT_CACHE;
124 $CATALOG_PRODUCT_CACHE =
null;
126 global $MAIN_EXTRA_LIST_CACHE;
127 $MAIN_EXTRA_LIST_CACHE =
null;
129 global $CATALOG_BASE_GROUP;
130 $CATALOG_BASE_GROUP =
array();
132 global $CATALOG_TIME_PERIOD_TYPES;
198 return $rn[
"NAME_LANG"] ??
null;
238 'CATALOG_GROUP_ID' =>
'ASC',
241 'PRODUCT_ID' => (
int)$PRODUCT_ID,
242 'CATALOG_GROUP_ID' => (
int)$CATALOG_GROUP_ID,
265 'PRODUCT_ID' => (
int)$PRODUCT_ID,
303 return CCurrencyLang::CurrencyFormat($fSum, $strCurrency,
true);
320 'PRODUCT_ID' => $productID,
321 'QUANTITY' => $quantity,
322 'RENEWAL' => $renewal,
323 'USER_ID' => $intUserID,
324 'SITE_ID' => $strSiteID,
325 'CHECK_QUANTITY' =>
'Y',
326 'AVAILABLE_QUANTITY' =>
'Y',
346 'PRODUCT_ID' => $productID,
347 'QUANTITY' => $quantity,
348 'RENEWAL' => $renewal,
349 'USER_ID' => $intUserID,
350 'SITE_ID' => $strSiteID
374 $productID = intval($productID);
375 $UserID = intval($UserID);
380 static $arUserCache =
array();
383 if (!isset($arUserCache[$UserID]))
385 $rsUsers = CUser::GetList(
'ID',
'ASC',
array(
"ID_EQUAL_EXACT"=>$UserID),
array(
'FIELDS' =>
array(
'ID')));
386 if ($arUser = $rsUsers->Fetch())
387 $arUserCache[$arUser[
'ID']] = CUser::GetUserGroup($arUser[
'ID']);
394 $dbIBlockElement = CIBlockElement::GetList(
399 "ACTIVE_DATE" =>
"Y",
400 "CHECK_PERMISSIONS" =>
"N",
404 array(
'ID',
'IBLOCK_ID',
'NAME',
'DETAIL_PAGE_URL',
'TIMESTAMP_X',
'PREVIEW_PICTURE',
'DETAIL_PICTURE')
406 if(!($arProduct = $dbIBlockElement->GetNext()))
409 if (CIBlock::GetArrayByID($arProduct[
'IBLOCK_ID'],
"RIGHTS_MODE") ==
'E')
411 $arUserRights = CIBlockElementRights::GetUserOperations($productID,$UserID);
412 if (empty($arUserRights))
414 elseif (!is_array($arUserRights) || !array_key_exists(
'element_read',$arUserRights))
419 if (CIBlock::GetPermission($arProduct[
'IBLOCK_ID'], $UserID) <
'R')
425 $dbIBlockElement = CIBlockElement::GetList(
430 "ACTIVE_DATE" =>
"Y",
431 "CHECK_PERMISSIONS" =>
"Y",
432 "MIN_PERMISSION" =>
"R",
436 array(
'ID',
'IBLOCK_ID',
'NAME',
'DETAIL_PAGE_URL',
'TIMESTAMP_X',
'PREVIEW_PICTURE',
'DETAIL_PICTURE')
438 if(!($arProduct = $dbIBlockElement->GetNext()))
445 if ($arCatalogProduct[
"CAN_BUY_ZERO"] !=
"Y" && ($arCatalogProduct[
"QUANTITY_TRACE"] ==
"Y" && doubleval($arCatalogProduct[
"QUANTITY"]) <= 0))
448 $currentDiscount = 0.0;
457 if (!empty($arPrice) && is_array($arPrice))
459 $currentPrice = $arPrice[
"PRICE"][
"PRICE"];
460 $currentDiscount = 0.0;
462 if ($arPrice[
'PRICE'][
'VAT_INCLUDED'] ==
'N')
464 if(doubleval($arPrice[
'PRICE'][
'VAT_RATE']) > 0)
466 $currentPrice *= (1 + $arPrice[
'PRICE'][
'VAT_RATE']);
467 $arPrice[
'PRICE'][
'VAT_INCLUDED'] =
'Y';
471 if (!empty($arPrice[
"DISCOUNT"]))
473 if ($arPrice[
"DISCOUNT"][
"VALUE_TYPE"]==
"F")
475 if ($arPrice[
"DISCOUNT"][
"CURRENCY"] == $arPrice[
"PRICE"][
"CURRENCY"])
476 $currentDiscount = $arPrice[
"DISCOUNT"][
"VALUE"];
480 elseif ($arPrice[
"DISCOUNT"][
"VALUE_TYPE"]==
"S")
482 if ($arPrice[
"DISCOUNT"][
"CURRENCY"] == $arPrice[
"PRICE"][
"CURRENCY"])
483 $currentDiscount = $arPrice[
"DISCOUNT"][
"VALUE"];
489 $currentDiscount = $currentPrice * $arPrice[
"DISCOUNT"][
"VALUE"] / 100.0;
491 if (doubleval($arPrice[
"DISCOUNT"][
"MAX_DISCOUNT"]) > 0)
493 if ($arPrice[
"DISCOUNT"][
"CURRENCY"] == $arPrice[
"PRICE"][
"CURRENCY"])
494 $maxDiscount = $arPrice[
"DISCOUNT"][
"MAX_DISCOUNT"];
498 if ($currentDiscount > $maxDiscount)
499 $currentDiscount = $maxDiscount;
503 if ($arPrice[
"DISCOUNT"][
"VALUE_TYPE"] ==
"S")
505 $currentDiscount_tmp = $currentPrice - $currentDiscount;
506 $currentPrice = $currentDiscount;
507 $currentDiscount = $currentDiscount_tmp;
508 unset($currentDiscount_tmp);
512 $currentPrice = $currentPrice - $currentDiscount;
516 if (empty($arPrice[
"PRICE"][
"CATALOG_GROUP_NAME"]))
518 if (!empty($arPrice[
"PRICE"][
"CATALOG_GROUP_ID"]))
521 if ($arCatGroup = $rsCatGroups->Fetch())
523 $arPrice[
"PRICE"][
"CATALOG_GROUP_NAME"] = (!empty($arCatGroup[
'NAME_LANG']) ? $arCatGroup[
'NAME_LANG'] : $arCatGroup[
'NAME']);
531 $currentDiscount = 0.0;
536 "PREVIEW_PICTURE" => $arProduct[
'PREVIEW_PICTURE'],
537 "DETAIL_PICTURE" => $arProduct[
'DETAIL_PICTURE'],
538 "PRODUCT_PRICE_ID" => $arPrice[
"PRICE"][
"ID"],
539 "PRICE" => $currentPrice,
540 "VAT_RATE" => $arPrice[
'PRICE'][
'VAT_RATE'],
541 "CURRENCY" => $arPrice[
"PRICE"][
"CURRENCY"],
542 "DISCOUNT_PRICE" => $currentDiscount,
543 "NAME" => $arProduct[
"~NAME"],
544 "DETAIL_PAGE_URL" => $arProduct[
'~DETAIL_PAGE_URL'],
545 "NOTES" => $arPrice[
"PRICE"][
"CATALOG_GROUP_NAME"]
571 $productID = intval($productID);
572 $userID = intval($userID);
573 $bPaid = (bool)$bPaid;
579 $dbIBlockElement = CIBlockElement::GetList(
584 "ACTIVE_DATE" =>
"Y",
585 "CHECK_PERMISSIONS" =>
"N",
589 array(
'ID',
'IBLOCK_ID',
'NAME',
'DETAIL_PAGE_URL')
591 if ($arIBlockElement = $dbIBlockElement->GetNext())
600 if (
'E' == CIBlock::GetArrayByID($arIBlockElement[
'IBLOCK_ID'],
"RIGHTS_MODE"))
602 $arUserRights = CIBlockElementRights::GetUserOperations($productID, $userID);
603 if (empty($arUserRights))
607 elseif (!is_array($arUserRights) || !array_key_exists(
'element_read', $arUserRights))
614 if (
'R' > CIBlock::GetPermission($arIBlockElement[
'IBLOCK_ID'], $userID))
620 $arUserGroups =
array();
626 array(
"PRODUCT_ID" => $productID),
629 array(
"GROUP_ID",
"ACCESS_LENGTH",
"ACCESS_LENGTH_TYPE")
631 while ($arProductGroups = $dbProductGroups->Fetch())
635 $arProductGroups[
'GROUP_ID'] = intval($arProductGroups[
'GROUP_ID']);
636 $accessType = $arProductGroups[
"ACCESS_LENGTH_TYPE"];
637 $accessLength = intval($arProductGroups[
"ACCESS_LENGTH"]);
640 if (0 < $accessLength)
643 $accessVal = mktime(date(
"H") + $accessLength, date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y"));
645 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d") + $accessLength, date(
"Y"));
647 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d") + 7 * $accessLength, date(
"Y"));
649 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + $accessLength, date(
"d"), date(
"Y"));
651 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + 3 * $accessLength, date(
"d"), date(
"Y"));
653 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + 6 * $accessLength, date(
"d"), date(
"Y"));
655 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y") + $accessLength);
657 $accessVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y") + 2 * $accessLength);
660 $arUserGroups[$ind] =
array(
661 "GROUP_ID" => $arProductGroups[
"GROUP_ID"],
662 "DATE_ACTIVE_FROM" => date(
$DB->DateFormatToPHP(CLang::GetDateFormat(
"FULL",
SITE_ID)), $curTime),
663 "DATE_ACTIVE_TO" => (0 < $accessLength ? date(
$DB->DateFormatToPHP(CLang::GetDateFormat(
"FULL",
SITE_ID)), $accessVal) :
false)
666 $arTmp[$arProductGroups[
"GROUP_ID"]] = $ind;
669 if (!empty($arUserGroups))
671 $dbOldGroups = CUser::GetUserGroupEx($userID);
672 while ($arOldGroups = $dbOldGroups->Fetch())
674 $arOldGroups[
"GROUP_ID"] = intval($arOldGroups[
"GROUP_ID"]);
675 if (array_key_exists($arOldGroups[
"GROUP_ID"],
$arTmp))
677 if ($arOldGroups[
"DATE_ACTIVE_FROM"] ==
'')
679 $arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_FROM"] =
false;
683 $oldDate = CDatabase::FormatDate($arOldGroups[
"DATE_ACTIVE_FROM"], CSite::GetDateFormat(
"SHORT",
SITE_ID),
"YYYYMMDDHHMISS");
684 $newDate = CDatabase::FormatDate($arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_FROM"], CSite::GetDateFormat(
"SHORT",
SITE_ID),
"YYYYMMDDHHMISS");
685 if ($oldDate > $newDate)
686 $arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_FROM"] = $arOldGroups[
"DATE_ACTIVE_FROM"];
689 if ($arOldGroups[
"DATE_ACTIVE_TO"] ==
'')
691 $arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_TO"] =
false;
693 elseif (
false !== $arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_TO"])
695 $oldDate = CDatabase::FormatDate($arOldGroups[
"DATE_ACTIVE_TO"], CSite::GetDateFormat(
"SHORT",
SITE_ID),
"YYYYMMDDHHMISS");
696 $newDate = CDatabase::FormatDate($arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_TO"], CSite::GetDateFormat(
"SHORT",
SITE_ID),
"YYYYMMDDHHMISS");
697 if ($oldDate > $newDate)
698 $arUserGroups[
$arTmp[$arOldGroups[
"GROUP_ID"]]][
"DATE_ACTIVE_TO"] = $arOldGroups[
"DATE_ACTIVE_TO"];
705 $arUserGroups[$ind] =
array(
706 "GROUP_ID" => $arOldGroups[
"GROUP_ID"],
707 "DATE_ACTIVE_FROM" => $arOldGroups[
"DATE_ACTIVE_FROM"],
708 "DATE_ACTIVE_TO" => $arOldGroups[
"DATE_ACTIVE_TO"]
713 CUser::SetUserGroup($userID, $arUserGroups);
716 if (intval(
$USER->GetID()) == $userID)
718 $arUserGroupsTmp =
array();
719 foreach ($arUserGroups as &$arOneGroup)
721 $arUserGroupsTmp[] = $arOneGroup[
"GROUP_ID"];
723 if (isset($arOneGroup))
726 $USER->SetUserGroupArray($arUserGroupsTmp);
733 $arUserGroups =
array();
737 $dbOldGroups = CUser::GetUserGroupEx($userID);
738 while ($arOldGroups = $dbOldGroups->Fetch())
741 $arOldGroups[
"GROUP_ID"] = intval($arOldGroups[
"GROUP_ID"]);
742 $arUserGroups[$ind] =
array(
743 "GROUP_ID" => $arOldGroups[
"GROUP_ID"],
744 "DATE_ACTIVE_FROM" => $arOldGroups[
"DATE_ACTIVE_FROM"],
745 "DATE_ACTIVE_TO" => $arOldGroups[
"DATE_ACTIVE_FROM"]
748 $arTmp[$arOldGroups[
"GROUP_ID"]] = $ind;
751 $bNeedUpdate =
false;
754 array(
"PRODUCT_ID" => $productID),
759 while ($arProductGroups = $dbProductGroups->Fetch())
761 $arProductGroups[
"GROUP_ID"] = intval($arProductGroups[
"GROUP_ID"]);
762 if (array_key_exists($arProductGroups[
"GROUP_ID"],
$arTmp))
764 unset($arUserGroups[$arProductGroups[
"GROUP_ID"]]);
771 CUser::SetUserGroup($userID, $arUserGroups);
775 if (intval(
$USER->GetID()) == $userID)
777 $arUserGroupsTmp =
array();
778 foreach ($arUserGroups as &$arOneGroup)
780 $arUserGroupsTmp[] = $arOneGroup[
"GROUP_ID"];
782 if (isset($arOneGroup))
785 $USER->SetUserGroupArray($arUserGroupsTmp);
791 if ($arProduct[
"PRICE_TYPE"] !=
"S")
795 $recurType = $arProduct[
"RECUR_SCHEME_TYPE"];
796 $recurLength = intval($arProduct[
"RECUR_SCHEME_LENGTH"]);
800 $recurSchemeVal = mktime(date(
"H") + $recurLength, date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y"));
802 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d") + $recurLength, date(
"Y"));
804 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d") + 7 * $recurLength, date(
"Y"));
806 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + $recurLength, date(
"d"), date(
"Y"));
808 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + 3 * $recurLength, date(
"d"), date(
"Y"));
810 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + 6 * $recurLength, date(
"d"), date(
"Y"));
812 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y") + $recurLength);
814 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y") + 2 * $recurLength);
817 "USER_ID" => $userID,
818 "MODULE" =>
"catalog",
819 "PRODUCT_ID" => $productID,
820 "PRODUCT_NAME" => $arIBlockElement[
"~NAME"],
821 "PRODUCT_URL" => $arIBlockElement[
"~DETAIL_PAGE_URL"],
822 "PRODUCT_PRICE_ID" =>
false,
823 "PRICE_TYPE" => $arProduct[
"PRICE_TYPE"],
824 "RECUR_SCHEME_TYPE" => $recurType,
825 "RECUR_SCHEME_LENGTH" => $recurLength,
826 "WITHOUT_ORDER" => $arProduct[
"WITHOUT_ORDER"],
830 "CANCELED_REASON" =>
false,
831 "PRODUCT_PROVIDER_CLASS" =>
"CCatalogProductProvider",
832 "DESCRIPTION" =>
false,
833 "PRIOR_DATE" =>
false,
835 $DB->DateFormatToPHP(CLang::GetDateFormat(
"FULL",
SITE_ID)),
854 $productID = intval($productID);
858 $userID = intval($userID);
865 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_NO_PRODUCT")),
"NO_PRODUCT");
869 if ($arProduct[
"PRICE_TYPE"] ==
"T")
874 $APPLICATION->ThrowException(str_replace(
"#TRIAL_ID#", $productID, str_replace(
"#ID#", $arProduct[
"TRIAL_PRICE_ID"], Loc::getMessage(
"I_NO_TRIAL_PRODUCT"))),
"NO_PRODUCT_TRIAL");
878 $productID = intval($arProduct[
"ID"]);
880 if ($arProduct[
"PRICE_TYPE"] !=
"R")
882 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_PRODUCT_NOT_SUBSCR")),
"NO_IBLOCK_SUBSCR");
886 $dbIBlockElement = CIBlockElement::GetList(
891 "ACTIVE_DATE" =>
"Y",
892 "CHECK_PERMISSIONS" =>
"N",
896 array(
'ID',
'IBLOCK_ID',
'NAME',
'DETAIL_PAGE_URL')
898 if(!($arIBlockElement = $dbIBlockElement->GetNext()))
900 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_NO_IBLOCK_ELEM")),
"NO_IBLOCK_ELEMENT");
903 if (
'E' == CIBlock::GetArrayByID($arIBlockElement[
'IBLOCK_ID'],
"RIGHTS_MODE"))
905 $arUserRights = CIBlockElementRights::GetUserOperations($productID, $userID);
906 if (empty($arUserRights))
908 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_NO_IBLOCK_ELEM")),
"NO_IBLOCK_ELEMENT");
911 elseif (!is_array($arUserRights) || !array_key_exists(
'element_read', $arUserRights))
913 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_NO_IBLOCK_ELEM")),
"NO_IBLOCK_ELEMENT");
919 if (
'R' > CIBlock::GetPermission($arIBlockElement[
'IBLOCK_ID'], $userID))
921 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_NO_IBLOCK_ELEM")),
"NO_IBLOCK_ELEMENT");
929 $APPLICATION->ThrowException(str_replace(
"#ID#", $arIBlockElement[
"IBLOCK_ID"], Loc::getMessage(
"I_CATALOG_NOT_SUBSCR")),
"NOT_SUBSCRIPTION");
933 if ($arProduct[
"CAN_BUY_ZERO"]!=
"Y" && ($arProduct[
"QUANTITY_TRACE"] ==
"Y" && doubleval($arProduct[
"QUANTITY"]) <= 0))
935 $APPLICATION->ThrowException(str_replace(
"#ID#", $productID, Loc::getMessage(
"I_PRODUCT_SOLD")),
"PRODUCT_END");
939 $arUserGroups = CUser::GetUserGroup($userID);
940 $arUserGroups = array_values(array_unique($arUserGroups));
949 $quantity = $nearestQuantity;
961 $currentPrice = $arPrice[
"PRICE"][
"PRICE"];
965 if (doubleval($arPrice[
'PRICE'][
'VAT_RATE']) > 0 && $arPrice[
'PRICE'][
'VAT_INCLUDED'] !=
'Y')
966 $currentPrice *= (1 + $arPrice[
'PRICE'][
'VAT_RATE']);
968 $arDiscountList =
array();
970 if (!empty($arPrice[
"DISCOUNT_LIST"]))
972 foreach ($arPrice[
"DISCOUNT_LIST"] as &$arOneDiscount)
974 switch ($arOneDiscount[
'VALUE_TYPE'])
977 if ($arOneDiscount[
'CURRENCY'] == $arPrice[
"PRICE"][
"CURRENCY"])
978 $currentDiscount = $arOneDiscount[
'VALUE'];
981 $currentPrice = $currentPrice - $currentDiscount;
982 unset($currentDiscount);
985 $currentDiscount = $currentPrice*$arOneDiscount[
"VALUE"]/100.0;
986 if (0 < $arOneDiscount[
'MAX_DISCOUNT'])
988 if ($arOneDiscount[
'CURRENCY'] == $arPrice[
"PRICE"][
"CURRENCY"])
989 $dblMaxDiscount = $arOneDiscount[
'MAX_DISCOUNT'];
992 if ($currentDiscount > $dblMaxDiscount)
993 $currentDiscount = $dblMaxDiscount;
995 $currentPrice = $currentPrice - $currentDiscount;
996 unset($currentDiscount);
999 if ($arOneDiscount[
'CURRENCY'] == $arPrice[
"PRICE"][
"CURRENCY"])
1000 $currentPrice = $arOneDiscount[
'VALUE'];
1007 'ID' => $arOneDiscount[
'ID'],
1008 'NAME' => $arOneDiscount[
'NAME'],
1010 'MODULE_ID' =>
'catalog',
1013 if ($arOneDiscount[
'COUPON'])
1015 $arOneList[
'COUPON'] = $arOneDiscount[
'COUPON'];
1017 $arDiscountList[] = $arOneList;
1019 unset($arOneDiscount);
1022 $recurType = $arProduct[
"RECUR_SCHEME_TYPE"];
1023 $recurLength = intval($arProduct[
"RECUR_SCHEME_LENGTH"]);
1025 $recurSchemeVal = 0;
1027 $recurSchemeVal = mktime(date(
"H") + $recurLength, date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y"));
1029 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d") + $recurLength, date(
"Y"));
1031 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d") + 7 * $recurLength, date(
"Y"));
1033 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + $recurLength, date(
"d"), date(
"Y"));
1035 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + 3 * $recurLength, date(
"d"), date(
"Y"));
1037 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m") + 6 * $recurLength, date(
"d"), date(
"Y"));
1039 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y") + $recurLength);
1041 $recurSchemeVal = mktime(date(
"H"), date(
"i"), date(
"s"), date(
"m"), date(
"d"), date(
"Y") + 2 * $recurLength);
1044 "WEIGHT" => floatval($arProduct[
"WEIGHT"]),
1045 "DIMENSIONS" => serialize(
array(
1046 "WIDTH" => $arProduct[
"WIDTH"],
1047 "HEIGHT" => $arProduct[
"HEIGHT"],
1048 "LENGTH" => $arProduct[
"LENGTH"]
1050 "VAT_RATE" => $arPrice[
"PRICE"][
"VAT_RATE"],
1052 "PRICE" => $currentPrice,
1053 "WITHOUT_ORDER" => $arProduct[
"WITHOUT_ORDER"],
1054 "PRODUCT_ID" => $productID,
1055 "PRODUCT_NAME" => $arIBlockElement[
"~NAME"],
1056 "PRODUCT_URL" => $arIBlockElement[
"~DETAIL_PAGE_URL"],
1057 "PRODUCT_PRICE_ID" => $arPrice[
"PRICE"][
"ID"],
1058 "CURRENCY" => $arPrice[
"PRICE"][
"CURRENCY"],
1059 "NAME" => $arIBlockElement[
"NAME"],
1060 "MODULE" =>
"catalog",
1061 "PRODUCT_PROVIDER_CLASS" =>
"CCatalogProductProvider",
1062 "CATALOG_GROUP_NAME" => $arPrice[
"PRICE"][
"CATALOG_GROUP_NAME"],
1063 "DETAIL_PAGE_URL" => $arIBlockElement[
"~DETAIL_PAGE_URL"],
1064 "PRICE_TYPE" => $arProduct[
"PRICE_TYPE"],
1065 "RECUR_SCHEME_TYPE" => $arProduct[
"RECUR_SCHEME_TYPE"],
1066 "RECUR_SCHEME_LENGTH" => $arProduct[
"RECUR_SCHEME_LENGTH"],
1067 "PRODUCT_XML_ID" => $arIBlockElement[
"~XML_ID"],
1069 "NEXT_DATE" => date(
1070 $DB->DateFormatToPHP(CLang::GetDateFormat(
"FULL",
SITE_ID)),
1074 if (!empty($arPrice[
"DISCOUNT_LIST"]))
1076 $arResult[
'DISCOUNT_LIST'] = $arDiscountList;
1084 $PRODUCT_ID = intval($PRODUCT_ID);
1085 $QUANTITY = doubleval($QUANTITY);
1086 $bCancel = (bool)$bCancel;
1110 $PRICE_ID = (int)$PRICE_ID;
1113 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_PRODUCT_PRICE_NOT_FOUND'),
"NO_PRODUCT_PRICE");
1116 $QUANTITY = (float)$QUANTITY;
1120 if (!Loader::includeModule(
"sale"))
1122 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_SALE_MODULE'),
"NO_SALE_MODULE");
1125 if (Loader::includeModule(
"statistic") && isset($_SESSION[
'SESS_SEARCHER_ID']) && (
int)$_SESSION[
"SESS_SEARCHER_ID"] > 0)
1127 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_SESS_SEARCHER'),
"SESS_SEARCHER");
1133 array(
'ID' => $PRICE_ID),
1144 if (!($arPrice = $rsPrices->Fetch()))
1146 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_PRODUCT_PRICE_NOT_FOUND'),
"NO_PRODUCT_PRICE");
1149 $arPrice[
'CATALOG_GROUP_NAME'] =
'';
1152 array(
'ID' => $arPrice[
'CATALOG_GROUP_ID']),
1161 if ($arCatGroup = $rsCatGroups->Fetch())
1163 $arPrice[
'CATALOG_GROUP_NAME'] = (!empty($arCatGroup[
'NAME_LANG']) ? $arCatGroup[
'NAME_LANG'] : $arCatGroup[
'NAME']);
1167 array(
'ID' => $arPrice[
"PRODUCT_ID"]),
1183 if (!($arCatalogProduct = $rsProducts->Fetch()))
1185 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_PRODUCT'),
"NO_PRODUCT");
1189 ($arCatalogProduct[
'TYPE'] ==
Catalog\ProductTable::TYPE_SKU || $arCatalogProduct[
'TYPE'] ==
Catalog\ProductTable::TYPE_EMPTY_SKU)
1190 &&
Main\
Config\Option::get(
'catalog',
'show_catalog_tab_with_offers') !=
'Y'
1193 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_CANNOT_ADD_SKU'),
"NO_PRODUCT");
1196 if ($arCatalogProduct[
'TYPE'] ==
Catalog\ProductTable::TYPE_SET)
1199 if (empty($allSets))
1201 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_PRODUCT_SET'),
"NO_PRODUCT");
1204 $set = current($allSets);
1207 foreach ($set[
'ITEMS'] as $item)
1209 if ($item[
'ITEM_ID'] != $item[
'OWNER_ID'])
1210 $itemIds[$item[
'ITEM_ID']] = $item[
'ITEM_ID'];
1212 if (empty($itemIds))
1214 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_PRODUCT_SET'),
"NO_PRODUCT");
1222 'ACTIVE_DATE' =>
'Y',
1223 'CHECK_PERMISSIONS' =>
'N'
1227 array(
'ID',
'IBLOCK_ID')
1231 if (isset($itemIds[$row[
'ID']]))
1232 unset($itemIds[$row[
'ID']]);
1235 if (!empty($itemIds))
1237 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_PRODUCT_SET_ITEM'),
"NO_PRODUCT");
1242 $arCatalogProduct[
'MEASURE'] = (int)$arCatalogProduct[
'MEASURE'];
1243 $arCatalogProduct[
'MEASURE_NAME'] =
'';
1244 $arCatalogProduct[
'MEASURE_CODE'] = 0;
1245 if ($arCatalogProduct[
'MEASURE'] <= 0)
1247 $arMeasure = CCatalogMeasure::getDefaultMeasure(
true,
true);
1248 $arCatalogProduct[
'MEASURE_NAME'] = $arMeasure[
'~SYMBOL_RUS'];
1249 $arCatalogProduct[
'MEASURE_CODE'] = $arMeasure[
'CODE'];
1253 $rsMeasures = CCatalogMeasure::getList(
1255 array(
'ID' => $arCatalogProduct[
'MEASURE']),
1258 array(
'ID',
'SYMBOL_RUS',
'CODE')
1260 if ($arMeasure = $rsMeasures->GetNext())
1262 $arCatalogProduct[
'MEASURE_NAME'] = $arMeasure[
'~SYMBOL_RUS'];
1263 $arCatalogProduct[
'MEASURE_CODE'] = $arMeasure[
'CODE'];
1267 $dblQuantity = (float)$arCatalogProduct[
"QUANTITY"];
1268 $boolQuantity = ($arCatalogProduct[
"CAN_BUY_ZERO"] !=
'Y' && $arCatalogProduct[
"QUANTITY_TRACE"] ==
'Y');
1269 if ($boolQuantity && $dblQuantity <= 0)
1271 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_PRODUCT_RUN_OUT'),
"PRODUCT_RUN_OUT");
1275 $rsItems = CIBlockElement::GetList(
1278 "ID" => $arPrice[
"PRODUCT_ID"],
1280 "ACTIVE_DATE" =>
"Y",
1281 "CHECK_PERMISSIONS" =>
"Y",
1282 "MIN_PERMISSION" =>
"R"
1294 if (!($arProduct = $rsItems->GetNext()))
1296 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_PRODUCT'),
"NO_PRODUCT");
1302 $strIBlockXmlID = (string)CIBlock::GetArrayByID($arProduct[
'IBLOCK_ID'],
'XML_ID');
1303 if ($strIBlockXmlID !==
'')
1306 "NAME" =>
"Catalog XML_ID",
1307 "CODE" =>
"CATALOG.XML_ID",
1308 "VALUE" => $strIBlockXmlID
1313 $arParentSku = CCatalogSku::GetProductInfo($arProduct[
'ID'], $arProduct[
'IBLOCK_ID']);
1314 if (!empty($arParentSku))
1316 if (mb_strpos($arProduct[
"~XML_ID"],
'#') ===
false)
1318 $parentIterator = Iblock\ElementTable::getList(
array(
1319 'select' =>
array(
'ID',
'XML_ID'),
1320 'filter' =>
array(
'ID' => $arParentSku[
'ID'])
1322 if ($parent = $parentIterator->fetch())
1324 $arProduct[
"~XML_ID"] = $parent[
'XML_ID'].
'#'.$arProduct[
"~XML_ID"];
1326 unset($parent, $parentIterator);
1330 if (!empty($arProductParams) && is_array($arProductParams))
1332 foreach ($arProductParams as &$arOneProductParams)
1335 "NAME" => $arOneProductParams[
"NAME"],
1336 "CODE" => $arOneProductParams[
"CODE"],
1337 "VALUE" => $arOneProductParams[
"VALUE"],
1338 "SORT" => $arOneProductParams[
"SORT"],
1341 unset($arOneProductParams);
1345 "NAME" =>
"Product XML_ID",
1346 "CODE" =>
"PRODUCT.XML_ID",
1347 "VALUE" => $arProduct[
"~XML_ID"]
1351 "PRODUCT_ID" => $arPrice[
"PRODUCT_ID"],
1352 "PRODUCT_PRICE_ID" => $PRICE_ID,
1353 "BASE_PRICE" => $arPrice[
"PRICE"],
1354 "PRICE" => $arPrice[
"PRICE"],
1355 "DISCOUNT_PRICE" => 0,
1356 "CURRENCY" => $arPrice[
"CURRENCY"],
1357 "WEIGHT" => $arCatalogProduct[
"WEIGHT"],
1358 "DIMENSIONS" => serialize(
array(
1359 "WIDTH" => $arCatalogProduct[
"WIDTH"],
1360 "HEIGHT" => $arCatalogProduct[
"HEIGHT"],
1361 "LENGTH" => $arCatalogProduct[
"LENGTH"]
1363 "QUANTITY" => ($boolQuantity && $dblQuantity < $QUANTITY ? $dblQuantity : $QUANTITY),
1367 "NAME" => $arProduct[
"~NAME"],
1368 "MODULE" =>
"catalog",
1369 "PRODUCT_PROVIDER_CLASS" =>
"CCatalogProductProvider",
1370 "NOTES" => $arPrice[
"CATALOG_GROUP_NAME"],
1371 "DETAIL_PAGE_URL" => $arProduct[
"~DETAIL_PAGE_URL"],
1372 "CATALOG_XML_ID" => $strIBlockXmlID,
1373 "PRODUCT_XML_ID" => $arProduct[
"~XML_ID"],
1374 "PROPS" => $arProps,
1376 "MEASURE_NAME" => $arCatalogProduct[
'MEASURE_NAME'],
1377 "MEASURE_CODE" => $arCatalogProduct[
'MEASURE_CODE'],
1379 'ID' => $arCatalogProduct[
'MEASURE'],
1380 'NAME' => $arCatalogProduct[
'MEASURE_NAME'],
1381 'CODE' => $arCatalogProduct[
'MEASURE_CODE']
1385 if (!empty($arRewriteFields) && is_array($arRewriteFields))
1393 if (Loader::includeModule(
"statistic"))
1394 CStatistic::Set_Event(
"eStore",
"add2basket",
$arFields[
"PRODUCT_ID"]);
1410function Add2BasketByProductID($productId, $quantity = 1, $rewriteFields =
array(), $productParams =
false)
1416 if (!Loader::includeModule(
'sale'))
1424 if ($productParams ===
false)
1426 $productParams = $rewriteFields;
1427 $rewriteFields =
array();
1430 $rewrite = (!empty($rewriteFields) && is_array($rewriteFields));
1431 if ($rewrite && isset($rewriteFields[
'SUBSCRIBE']) && $rewriteFields[
'SUBSCRIBE'] ==
'Y')
1434 $quantity = (empty($quantity) ? 1 : (float)$quantity);
1439 'PRODUCT_ID' => $productId,
1440 'QUANTITY' => $quantity
1442 if (!empty($productParams))
1443 $product[
'PROPS'] = $productParams;
1445 $basketResult = Catalog\Product\Basket::addProduct($product, ($rewrite ? $rewriteFields :
array()));
1446 if ($basketResult->isSuccess())
1448 $data = $basketResult->getData();
1452 if (!empty($rewriteFields[
'ORDER_ID']) && intval($rewriteFields[
'ORDER_ID']) > 0)
1454 trigger_error(
"Wrong API usage of adding a product in order", E_USER_WARNING);
1457 if ($productId <= 0)
1460 Main\
Localization\Loc::getMessage(
'BX_CATALOG_PRODUCT_BASKET_ERR_NO_PRODUCT')
1465 $module =
'catalog';
1466 if (array_key_exists(
'MODULE', $rewriteFields))
1468 $module = $rewriteFields[
'MODULE'];
1472 if (!empty($rewriteFields[
'LID']))
1474 $siteId = $rewriteFields[
'LID'];
1477 $basketClassName = $registry->getBasketClassName();
1479 $basket = $basketClassName::loadItemsForFUser(\
Bitrix\Sale\Fuser::getId(),
$siteId);
1481 $propertyList =
array();
1482 if (!empty($product[
'PROPS']) && is_array($product[
'PROPS']))
1484 $propertyList = $product[
'PROPS'];
1487 $basketItems = $basket->getExistsItems($module, $productId, $propertyList);
1488 foreach ($basketItems as $basketItem)
1490 $basketItem->setFieldNoDemand(
'ORDER_ID', intval($rewriteFields[
'ORDER_ID']));
1495 $r = $basket->save();
1498 $orderClass = $registry->getOrderClassName();
1500 $orderId = intval($rewriteFields[
'ORDER_ID']);
1504 $basket =
$order->getBasket();
1507 if (!$r->isSuccess())
1510 implode(
'; ', $r->getErrorMessages())
1521 implode(
'; ', $basketResult->getErrorMessages())
1525 unset($basketResult);
1545 if (!
$USER->IsAuthorized())
1547 $intUserID = (int)
$USER->GetID();
1549 $intProductID = (int)$intProductID;
1550 if ($intProductID <= 0)
1552 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_EMPTY_PRODUCT_ID'),
"EMPTY_PRODUCT_ID");
1556 if (!Loader::includeModule(
"sale"))
1558 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_SALE_MODULE'),
"NO_SALE_MODULE");
1564 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_SESS_SEARCHER'));
1570 array(
'ID' => $intProductID),
1584 if (!($arCatalogProduct = $rsProducts->Fetch()))
1586 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_PRODUCT'),
"NO_PRODUCT");
1590 if ($arCatalogProduct[
'SUBSCRIBE'] ==
'N')
1592 $APPLICATION->ThrowException(Loc::getMessage(
'CATALOG_ERR_NO_SUBSCRIBE'),
'SUBSCRIBE');
1595 $arCatalogProduct[
'MEASURE'] = (int)$arCatalogProduct[
'MEASURE'];
1596 $arCatalogProduct[
'MEASURE_NAME'] =
'';
1597 $arCatalogProduct[
'MEASURE_CODE'] = 0;
1598 if ($arCatalogProduct[
'MEASURE'] <= 0)
1600 $arMeasure = CCatalogMeasure::getDefaultMeasure(
true,
true);
1601 $arCatalogProduct[
'MEASURE_NAME'] = $arMeasure[
'~SYMBOL_RUS'];
1602 $arCatalogProduct[
'MEASURE_CODE'] = $arMeasure[
'CODE'];
1606 $rsMeasures = CCatalogMeasure::getList(
1608 array(
'ID' => $arCatalogProduct[
'MEASURE']),
1611 array(
'ID',
'SYMBOL_RUS',
'CODE')
1613 if ($arMeasure = $rsMeasures->GetNext())
1615 $arCatalogProduct[
'MEASURE_NAME'] = $arMeasure[
'~SYMBOL_RUS'];
1616 $arCatalogProduct[
'MEASURE_CODE'] = $arMeasure[
'CODE'];
1620 $rsItems = CIBlockElement::GetList(
1623 "ID" => $intProductID,
1625 "ACTIVE_DATE" =>
"Y",
1626 "CHECK_PERMISSIONS" =>
"Y",
1627 "MIN_PERMISSION" =>
"R"
1639 if (!($arProduct = $rsItems->GetNext()))
1642 $arParentSku = CCatalogSku::GetProductInfo($intProductID, $arProduct[
'IBLOCK_ID']);
1643 if (!empty($arParentSku))
1645 if (mb_strpos($arProduct[
"~XML_ID"],
'#') ===
false)
1647 $parentIterator = Iblock\ElementTable::getList(
array(
1648 'select' =>
array(
'ID',
'XML_ID'),
1649 'filter' =>
array(
'ID' => $arParentSku[
'ID'])
1651 if ($parent = $parentIterator->fetch())
1653 $arProduct[
"~XML_ID"] = $parent[
'XML_ID'].
'#'.$arProduct[
"~XML_ID"];
1655 unset($parent, $parentIterator);
1662 'DISCOUNT_PRICE' => 0,
1665 'PRODUCT_PRICE_ID' => 0,
1666 'CATALOG_GROUP_NAME' =>
'',
1668 $arBuyerGroups =
$USER->GetUserGroupArray();
1670 if (!empty($arSubscrPrice) && is_array($arSubscrPrice))
1672 $arPrice[
'BASE_PRICE'] = $arSubscrPrice[
'RESULT_PRICE'][
'BASE_PRICE'];
1673 $arPrice[
'PRICE'] = $arSubscrPrice[
'RESULT_PRICE'][
'DISCOUNT_PRICE'];
1674 $arPrice[
'DISCOUNT_PRICE'] = $arSubscrPrice[
'RESULT_PRICE'][
'DISCOUNT'];
1675 $arPrice[
'CURRENCY'] = $arSubscrPrice[
'RESULT_PRICE'][
'CURRENCY'];
1676 $arPrice[
'VAT_RATE'] = $arSubscrPrice[
'RESULT_PRICE'][
'VAT_RATE'];
1677 $arPrice[
'PRODUCT_PRICE_ID'] = $arSubscrPrice[
'PRICE'][
'ID'];
1678 $arPrice[
'CATALOG_GROUP_NAME'] = $arSubscrPrice[
'PRICE'][
'CATALOG_GROUP_NAME'];
1683 $strIBlockXmlID = (string)CIBlock::GetArrayByID($arProduct[
'IBLOCK_ID'],
'XML_ID');
1684 if ($strIBlockXmlID !==
'')
1687 "NAME" =>
"Catalog XML_ID",
1688 "CODE" =>
"CATALOG.XML_ID",
1689 "VALUE" => $strIBlockXmlID
1693 if (!empty($arProductParams) && is_array($arProductParams))
1695 foreach ($arProductParams as &$arOneProductParams)
1698 "NAME" => $arOneProductParams[
"NAME"],
1699 "CODE" => $arOneProductParams[
"CODE"],
1700 "VALUE" => $arOneProductParams[
"VALUE"],
1701 "SORT" => $arOneProductParams[
"SORT"],
1704 unset($arOneProductParams);
1708 "NAME" =>
"Product XML_ID",
1709 "CODE" =>
"PRODUCT.XML_ID",
1710 "VALUE" => $arProduct[
"XML_ID"]
1714 "PRODUCT_ID" => $intProductID,
1715 "PRODUCT_PRICE_ID" => $arPrice[
'PRODUCT_PRICE_ID'],
1716 "BASE_PRICE" => $arPrice[
'BASE_PRICE'],
1717 "PRICE" => $arPrice[
'PRICE'],
1718 "DISCOUNT_PRICE" => $arPrice[
'DISCOUNT_PRICE'],
1719 "CURRENCY" => $arPrice[
'CURRENCY'],
1720 "VAT_RATE" => $arPrice[
'VAT_RATE'],
1721 "WEIGHT" => $arCatalogProduct[
"WEIGHT"],
1722 "DIMENSIONS" => serialize(
array(
1723 "WIDTH" => $arCatalogProduct[
"WIDTH"],
1724 "HEIGHT" => $arCatalogProduct[
"HEIGHT"],
1725 "LENGTH" => $arCatalogProduct[
"LENGTH"]
1732 "NAME" => $arProduct[
"~NAME"],
1733 "MODULE" =>
"catalog",
1734 "PRODUCT_PROVIDER_CLASS" =>
"CCatalogProductProvider",
1735 "NOTES" => $arPrice[
"CATALOG_GROUP_NAME"],
1736 "DETAIL_PAGE_URL" => $arProduct[
"~DETAIL_PAGE_URL"],
1737 "CATALOG_XML_ID" => $strIBlockXmlID,
1738 "PRODUCT_XML_ID" => $arProduct[
"~XML_ID"],
1739 "PROPS" => $arProps,
1741 "MEASURE_NAME" => $arCatalogProduct[
'MEASURE_NAME'],
1742 "MEASURE_CODE" => $arCatalogProduct[
'MEASURE_CODE'],
1743 'IGNORE_CALLBACK_FUNC' =>
'Y'
1746 if (!empty($arRewriteFields) && is_array($arRewriteFields))
1748 if (array_key_exists(
'SUBSCRIBE', $arRewriteFields))
1749 unset($arRewriteFields[
'SUBSCRIBE']);
1750 if (array_key_exists(
'CAN_BUY', $arRewriteFields))
1751 unset($arRewriteFields[
'CAN_BUY']);
1752 if (array_key_exists(
'DELAY', $arRewriteFields))
1753 unset($arRewriteFields[
'DELAY']);
1754 if (!empty($arRewriteFields))
1758 $mxBasketID = CSaleBasket::Add(
$arFields);
1761 if (!isset($_SESSION[
'NOTIFY_PRODUCT']))
1763 $_SESSION[
'NOTIFY_PRODUCT'] =
array(
1764 $intUserID =>
array(),
1767 elseif (!isset($_SESSION[
'NOTIFY_PRODUCT'][$intUserID]))
1769 $_SESSION[
'NOTIFY_PRODUCT'][$intUserID] =
array();
1771 $_SESSION[
"NOTIFY_PRODUCT"][$intUserID][$intProductID] = $intProductID;
1773 if (Loader::includeModule(
"statistic"))
1774 CStatistic::Set_Event(
"sale2basket",
"subscribe", $intProductID);
1793 static $arPriceTypes =
array();
1799 $filterQauntity = (int)$filterQauntity;
1801 if (!is_array($arFilterType))
1802 $arFilterType =
array($arFilterType);
1804 $boolConvert =
false;
1805 $strCurrencyID =
'';
1806 $arCurrencyList =
array();
1807 if (!empty($arCurrencyParams) && is_array($arCurrencyParams) && !empty($arCurrencyParams[
'CURRENCY_ID']))
1809 $boolConvert =
true;
1810 $strCurrencyID = $arCurrencyParams[
'CURRENCY_ID'];
1820 $arUserGroups =
$USER->GetUserGroupArray();
1822 $strCacheID =
'UG_'.implode(
'_', $arUserGroups);
1824 if (isset($arPriceTypes[$strCacheID]))
1826 $arPriceGroups = $arPriceTypes[$strCacheID];
1831 $arPriceTypes[$strCacheID] = $arPriceGroups;
1834 if (empty($arPriceGroups[
"view"]))
1837 $currentQuantity = -1;
1841 if ($filterQauntity > 0)
1843 $arFilter[
"+<=QUANTITY_FROM"] = $filterQauntity;
1844 $arFilter[
"+>=QUANTITY_TO"] = $filterQauntity;
1846 if (!empty($arFilterType))
1849 foreach ($arPriceGroups[
"view"] as &$intOneGroup)
1851 if (in_array($intOneGroup, $arFilterType))
1854 if (isset($intOneGroup))
1855 unset($intOneGroup);
1864 $arFilter[
"CATALOG_GROUP_ID"] = $arPriceGroups[
"view"];
1868 if ($arVatInfo =
$dbRes->Fetch())
1870 $fVatRate = floatval($arVatInfo[
'RATE'] * 0.01);
1871 $bVatIncluded = $arVatInfo[
'VAT_INCLUDED'] ==
'Y';
1876 $bVatIncluded =
false;
1891 if ($arProduct = $rsProducts->Fetch())
1893 $intIBlockID = CIBlockElement::GetIBlockByID($arProduct[
'ID']);
1904 array(
"QUANTITY_FROM" =>
"ASC",
"QUANTITY_TO" =>
"ASC"),
1908 array(
"ID",
"CATALOG_GROUP_ID",
"PRICE",
"CURRENCY",
"QUANTITY_FROM",
"QUANTITY_TO")
1911 while ($arPrice = $dbPrice->Fetch())
1913 if ($VAT_INCLUDE ==
'N')
1916 $arPrice[
'PRICE'] /= (1 + $fVatRate);
1921 $arPrice[
'PRICE'] *= (1 + $fVatRate);
1923 $arPrice[
'CATALOG_GROUP_ID'] = (int)$arPrice[
'CATALOG_GROUP_ID'];
1925 $arPrice[
'VAT_RATE'] = $fVatRate;
1928 $arDiscounts = CCatalogDiscount::GetDiscount(
$ID, $arProduct[
"IBLOCK_ID"],
array($arPrice[
"CATALOG_GROUP_ID"]), $arUserGroups,
"N",
SITE_ID,
array());
1932 $arPrice[
"DISCOUNT_PRICE"] = $discountPrice;
1934 $arPrice[
"QUANTITY_FROM"] = doubleval($arPrice[
"QUANTITY_FROM"]);
1935 if ($currentQuantity != $arPrice[
"QUANTITY_FROM"])
1939 $arResult[
"ROWS"][
$rowsCnt][
"QUANTITY_TO"] = doubleval($arPrice[
"QUANTITY_TO"]);
1940 $currentQuantity = $arPrice[
"QUANTITY_FROM"];
1943 if ($boolConvert && $strCurrencyID != $arPrice[
"CURRENCY"])
1947 $discountPrice = Catalog\Product\Price::roundPrice(
1948 $arPrice[
"CATALOG_GROUP_ID"],
1949 $unroundDiscountPrice,
1952 if ($discountPrice > $price)
1953 $price = $discountPrice;
1955 "ID" => $arPrice[
"ID"],
1956 "ORIG_PRICE" => $arPrice[
"PRICE"],
1957 "ORIG_DISCOUNT_PRICE" => $arPrice[
"DISCOUNT_PRICE"],
1958 "ORIG_CURRENCY" => $arPrice[
"CURRENCY"],
1959 "ORIG_VAT_RATE" => $arPrice[
"VAT_RATE"],
1961 'DISCOUNT_PRICE' => $discountPrice,
1962 'UNROUND_DISCOUNT_PRICE' => $unroundDiscountPrice,
1963 'CURRENCY' => $strCurrencyID,
1964 'VAT_RATE' => $arPrice[
"VAT_RATE"],
1966 $arCurrencyList[$arPrice[
'CURRENCY']] = $arPrice[
'CURRENCY'];
1970 $arPrice[
'UNROUND_DISCOUNT_PRICE'] = $arPrice[
'DISCOUNT_PRICE'];
1971 $arPrice[
'DISCOUNT_PRICE'] = Catalog\Product\Price::roundPrice(
1972 $arPrice[
"CATALOG_GROUP_ID"],
1973 $arPrice[
'DISCOUNT_PRICE'],
1974 $arPrice[
"CURRENCY"]
1976 if ($arPrice[
"DISCOUNT_PRICE"] > $arPrice[
"PRICE"])
1977 $arPrice[
"PRICE"] = $arPrice[
"DISCOUNT_PRICE"];
1979 "ID" => $arPrice[
"ID"],
1980 "PRICE" => $arPrice[
"PRICE"],
1981 "DISCOUNT_PRICE" => $arPrice[
"DISCOUNT_PRICE"],
1982 "UNROUND_DISCOUNT_PRICE" => $arPrice[
'UNROUND_DISCOUNT_PRICE'],
1983 "CURRENCY" => $arPrice[
"CURRENCY"],
1984 "VAT_RATE" => $arPrice[
"VAT_RATE"]
1990 foreach ($arCatalogGroups as
$key => $value)
1993 $arResult[
"COLS"][$value[
"ID"]] = $value;
1996 $arResult[
"CAN_BUY"] = $arPriceGroups[
"buy"];
1997 $arResult[
"AVAILABLE"] = (0 >= $arProduct[
'QUANTITY'] &&
'Y' == $arProduct[
'QUANTITY_TRACE'] &&
'N' == $arProduct[
'CAN_BUY_ZERO'] ?
'N' :
'Y');
2001 if (!empty($arCurrencyList))
2002 $arCurrencyList[$strCurrencyID] = $strCurrencyID;
2003 $arResult[
'CURRENCY_LIST'] = $arCurrencyList;
2019 $arPriceGroups =
array();
2020 $cacheKey = LANGUAGE_ID.
"_".(
$USER->GetGroups());
2021 if (isset(
$GLOBALS[
"CATALOG_PRICE_GROUPS_CACHE"])
2022 && is_array(
$GLOBALS[
"CATALOG_PRICE_GROUPS_CACHE"])
2023 && isset(
$GLOBALS[
"CATALOG_PRICE_GROUPS_CACHE"][$cacheKey])
2024 && is_array(
$GLOBALS[
"CATALOG_PRICE_GROUPS_CACHE"][$cacheKey]))
2026 $arPriceGroups =
$GLOBALS[
"CATALOG_PRICE_GROUPS_CACHE"][$cacheKey];
2031 array(
"SORT" =>
"ASC"),
2033 "CAN_ACCESS" =>
"Y",
2034 "LID" => LANGUAGE_ID
2036 array(
"ID",
"NAME_LANG",
"SORT"),
2038 array(
"ID",
"NAME_LANG",
"CAN_BUY",
"SORT")
2040 while ($arPriceGroupsList = $dbPriceGroupsList->Fetch())
2042 $arPriceGroups[] = $arPriceGroupsList;
2043 $GLOBALS[
"CATALOG_PRICE_GROUPS_CACHE"][$cacheKey][] = $arPriceGroupsList;
2047 if (empty($arPriceGroups))
2050 $arBorderMap =
array();
2051 $bMultiQuantity = False;
2054 array(
"QUANTITY_FROM" =>
"ASC",
"QUANTITY_TO" =>
"ASC",
"SORT" =>
"ASC"),
2058 array(
"ID",
"CATALOG_GROUP_ID",
"PRICE",
"CURRENCY",
"QUANTITY_FROM",
"QUANTITY_TO",
"ELEMENT_IBLOCK_ID",
"SORT")
2060 while ($arPrice = $dbPrice->Fetch())
2063 $arDiscounts = CCatalogDiscount::GetDiscount(
$ID, $arPrice[
"ELEMENT_IBLOCK_ID"],
array($arPrice[
"CATALOG_GROUP_ID"]),
$USER->GetUserGroupArray(),
"N",
SITE_ID,
array());
2067 $arPrice[
"DISCOUNT_PRICE"] = $discountPrice;
2069 if (array_key_exists($arPrice[
"QUANTITY_FROM"].
"-".$arPrice[
"QUANTITY_TO"], $arBorderMap))
2070 $jnd = $arBorderMap[$arPrice[
"QUANTITY_FROM"].
"-".$arPrice[
"QUANTITY_TO"]];
2073 $jnd =
count($arBorderMap);
2074 $arBorderMap[$arPrice[
"QUANTITY_FROM"].
"-".$arPrice[
"QUANTITY_TO"]] = $jnd;
2077 $arResult[$jnd][
"QUANTITY_FROM"] = (float)$arPrice[
"QUANTITY_FROM"];
2078 $arResult[$jnd][
"QUANTITY_TO"] = (float)$arPrice[
"QUANTITY_TO"];
2079 if ((
float)$arPrice[
"QUANTITY_FROM"] > 0 || (
float)$arPrice[
"QUANTITY_TO"] > 0)
2080 $bMultiQuantity =
true;
2082 $arResult[$jnd][
"PRICE"][$arPrice[
"CATALOG_GROUP_ID"]] = $arPrice;
2085 $numGroups =
count($arPriceGroups);
2086 for (
$i = 0;
$i < $numGroups;
$i++)
2091 if (!array_key_exists($arPriceGroups[
$i][
"ID"],
$arResult[$j][
"PRICE"]))
2092 $arResult[$j][
"PRICE"][$arPriceGroups[
$i][
"ID"]] = False;
2094 if (
$arResult[$j][
"PRICE"][$arPriceGroups[
$i][
"ID"]] !=
false)
2101 unset(
$arResult[$j][
"PRICE"][$arPriceGroups[
$i][
"ID"]]);
2103 unset($arPriceGroups[
$i]);
2108 "COLS" => $arPriceGroups,
2110 "MULTI_QUANTITY" => ($bMultiQuantity ?
"Y" :
"N")
2116 list($usec, $sec) = explode(
" ", microtime());
2117 return ((
float)$usec + (
float)$sec);
2122 global $__catalogTimeMarkTo, $__catalogTimeMarkFrom, $__catalogTimeMarkGlobalFrom;
2124 if (mb_strtoupper($startStop) ==
"START")
2126 $hFile = fopen(
$_SERVER[
"DOCUMENT_ROOT"].
"/__catalog_debug.txt",
"a");
2127 fwrite($hFile, date(
"H:i:s").
" - ".
$text.
"\n");
2133 elseif (mb_strtoupper($startStop) ==
"STOP")
2137 $hFile = fopen(
$_SERVER[
"DOCUMENT_ROOT"].
"/__catalog_debug.txt",
"a");
2138 fwrite($hFile, date(
"H:i:s").
" - ".round($__catalogTimeMarkTo - $__catalogTimeMarkFrom, 3).
" s - ".
$text.
"\n");
2139 fwrite($hFile, date(
"H:i:s").
" - ".round($__catalogTimeMarkTo - $__catalogTimeMarkGlobalFrom, 3).
" s\n\n");
2146 $hFile = fopen(
$_SERVER[
"DOCUMENT_ROOT"].
"/__catalog_debug.txt",
"a");
2147 fwrite($hFile, date(
"H:i:s").
" - ".round($__catalogTimeMarkTo - $__catalogTimeMarkFrom, 3).
" s - ".
$text.
"\n");
2156 $bInsertEmptyLine = ($bInsertEmptyLine ===
true);
2164 if ($bInsertEmptyLine)
2165 $arList =
array(
'REFERENCE' =>
array(0 => Loc::getMessage(
'CAT_VAT_REF_NOT_SELECTED')),
'REFERENCE_ID' =>
array(0 =>
''));
2173 $arList[
'REFERENCE'][] =
$arRes[
'NAME'];
2174 $arList[
'REFERENCE_ID'][] =
$arRes[
'ID'];
2177 if ($bEmpty && !$bInsertEmptyLine)
2186 $APPLICATION->ThrowException(Loc::getMessage(
"CAT_INCLUDE_CURRENCY"),
"CAT_DEPENDS_CURRENCY");
2192 foreach (
GetModuleEvents(
"catalog",
"OnGenerateCoupon",
true) as $arEvent)
2197 $allchars =
'ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789';
2198 $charsLen = mb_strlen($allchars) - 1;
2201 for (
$i = 0;
$i < 5;
$i++)
2202 $string1 .= mb_substr($allchars, rand(0, $charsLen), 1);
2204 for (
$i = 0;
$i < 7;
$i++)
2205 $string2 .= mb_substr($allchars, rand(0, $charsLen), 1);
2207 return 'CP-'.$string1.
'-'.$string2;
2216 if (!is_array($MessID))
2217 $MessID =
array($MessID);
2218 if (!is_array($arLangList))
2219 $arLangList =
array($arLangList);
2221 if (empty($arLangList))
2224 while ($arLang = $rsLangs->Fetch())
2226 $arLangList[] = $arLang[
'LID'];
2229 foreach ($arLangList as &$strLID)
2232 if (!empty($arMess))
2234 foreach ($MessID as &$strMessID)
2236 if (empty($strMessID))
2238 $arResult[$strMessID][$strLID] = $arMess[$strMessID] ?? $strDefMess;
2240 if (isset($strMessID))
CatalogGetVATArray($arFilter=array(), $bInsertEmptyLine=false)
const CATALOG_PATH2EXPORTS_DEF
const CATALOG_VALUE_PRECISION
const YANDEX_SKU_EXPORT_PROP
const CATALOG_PATH2EXPORTS
CatalogViewedProductCallback($productID, $UserID, $strSiteID=SITE_ID)
const CATALOG_DISCOUNT_OLD_VERSION
const CATALOG_CONTAINER_PATH
CurrencyModuleUnInstallCatalog()
FormatCurrency($fSum, $strCurrency)
CatalogGetPriceTable($ID)
const CATALOG_VALUE_EPSILON
const YANDEX_SKU_TEMPLATE_OFFERS
CatalogBasketCallback($productID, $quantity=0, $renewal="N", $intUserID=0, $strSiteID=false)
GetCatalogProductEx($PRODUCT_ID, $boolAllValues=false)
const CATALOG_CACHE_DEFAULT_TIME
const YANDEX_SKU_TEMPLATE_CUSTOM
if(!Loader::includeModule( 'iblock')) if(!Loader::includeModule('currency')) $arTreeDescr
CatalogDeactivateOneTimeCoupons($intOrderID=0)
GetCatalogProductTable($IBLOCK, $SECT_ID=false, $arOrder=array("sort"=>"asc"), $cnt=0)
CatalogPayOrderCallback($productID, $userID, $bPaid, $orderID)
const CONTRACTOR_INDIVIDUAL
if(defined( 'CATALOG_GLOBAL_VARS') &&CATALOG_GLOBAL_VARS=='Y') GetCatalogGroups($by="SORT", $order="ASC")
__GetCatLangMessages($strBefore, $strAfter, $MessID, $strDefMess=false, $arLangList=array())
const YANDEX_SKU_EXPORT_ALL
GetCatalogProduct($PRODUCT_ID)
const CATALOG_DISCOUNT_NEW_VERSION
const CATALOG_PATH2IMPORTS
CatalogBasketOrderCallback($productID, $quantity, $renewal="N", $intUserID=0, $strSiteID=false)
const BX_CATALOG_FILENAME_REG
Add2Basket($PRICE_ID, $QUANTITY=1, $arRewriteFields=array(), $arProductParams=array())
GetCatalogGroupName($CATALOG_GROUP_ID)
CatalogBasketCancelCallback($PRODUCT_ID, $QUANTITY, $bCancel)
CatalogGetPriceTableEx($ID, $filterQauntity=0, $arFilterType=array(), $VAT_INCLUDE='Y', $arCurrencyParams=array())
const YANDEX_SKU_EXPORT_MIN_PRICE
SubscribeProduct($intProductID, $arRewriteFields=array(), $arProductParams=array())
CatalogRecurringCallback($productID, $userID)
CatalogClearArray(&$arMap, $boolSort=true)
GetCatalogProductPrice($PRODUCT_ID, $CATALOG_GROUP_ID)
GetCatalogProductPriceList($PRODUCT_ID, $by="SORT", $order="ASC")
const YANDEX_SKU_TEMPLATE_PRODUCT
const CATALOG_DEFAULT_EXPORT_PATH
const CATALOG_PATH2IMPORTS_DEF
__CatalogSetTimeMark($text, $startStop="")
GetCatalogGroup($CATALOG_GROUP_ID)
const CONTRACTOR_JURIDICAL
const DISCOUNT_TYPE_STANDART
static normalizeArrayValuesByInt(&$map, $sorted=true)
static getInstance($type)
static ClearDiscountUserID()
static SetDiscountUserID($intUserID)
static GetGroupsPerms($arUserGroups=array(), $arCatalogGroupsFilter=array())
static GetByID($ID, $lang=LANGUAGE_ID)
static GetByIDEx($ID, $boolAllValues=false)
const TIME_PERIOD_SEMIYEAR
static GetNearestQuantityPrice($productID, $quantity=1, $arUserGroups=array())
const TIME_PERIOD_DOUBLE_YEAR
static GetOptimalPrice($intProductID, $quantity=1, $arUserGroups=array(), $renewal="N", $priceList=array(), $siteID=false, $arDiscountCoupons=false)
static QuantityTracer($ProductID, $DeltaQuantity)
static CountPriceWithDiscount($price, $currency, $discounts)
static GetTimePeriodTypes($boolFull=false)
static ConvertCurrency($valSum, $curFrom, $curTo, $valDate="")
static GetList($by="sort", $order="asc", $arFilter=[])
static getDefaultSettings($type, $extFormat=false)
static getSettingsFields($type, $extFormat=false)
static CouponOneOrderDisable($intOrderID=0)
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetListEx($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
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 GetVATInfo($PRODUCT_ID)
static GetProductData($arParams)
static OrderProduct($arParams)
static getAllSetsByProduct($intProductID, $intSetType)
static GetListEx($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static RegisterExt($name, $arPaths)
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetListEx($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetLangCurrency($siteId)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
global $arCatalogAvailPriceFields
global $defCatalogAvailValueFields
global $arCatalogAvailQuantityFields
global $defCatalogAvailProdFields
global $defCatalogAvailQuantityFields
global $arCatalogAvailProdFields
global $defCatalogAvailCurrencies
global $arCatalogAvailGroupFields
global $arCatalogAvailValueFields
global $defCatalogAvailPriceFields
global $defCatalogAvailGroupFields
ExecuteModuleEventEx($arEvent, $arParams=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
if(intval($iTestTransaction) > 0) $arTmp
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( $arBasket=$dbBasket->Fetch()) if($vat > 0) $rowsCnt
$GLOBALS['_____370096793']
if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_CATALOG_EXPORT_EDIT)) if((!isset($_REQUEST['IBLOCK_ID']))||($_REQUEST['IBLOCK_ID']=='')) $intIBlockID