Advertisement
Guest User

init.php

a guest
Oct 31st, 2017
2,009
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 94.35 KB | None | 0 0
  1. <?
  2. /**
  3.  * Подключаем константы и настройки
  4.  */
  5. require_once 'config.php';
  6.  
  7. use Bitrix\Iblock\InheritedProperty;
  8.  
  9. require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
  10.  
  11. /**
  12.  * Подключаем автозагрузчик по стандарту PSR-0
  13.  */
  14. require_once $_SERVER['DOCUMENT_ROOT'] . '/local/lib/Studiobit/CAutoloader.php';
  15.  
  16. use Studiobit\CAutoloader as SBAutoloader;
  17.  
  18. $autoloader = new SBAutoloader();
  19.  
  20. // ГЛОБАЛЬНЫЕ КОНСТАНТЫ
  21. global $globalBonusBuyPercent;
  22. global $globalBonusRegister;
  23. global $globalMaximalBonusOnBuy;
  24.  
  25. /**
  26.  * Массив идентификаторов онлайн оплат
  27.  */
  28. global $online_paysystem;
  29.  
  30. $online_paysystem = array('2', '4', '10', '13', '14', '21', '24');
  31.  
  32.  
  33. global $arMaximumBonusOnBuy;
  34. global $arStatusGroup;
  35.  
  36. $arMaximumBonusOnBuy = [
  37.     'vanilla' => 0.03,
  38.     'orange' => 0.04,
  39.     'bordo' => 0.06,
  40.     '0' => 0.02
  41. ];
  42.  
  43. $arStatusGroup = [
  44.     'vanilla' => 9,
  45.     'orange' => 10,
  46.     'bordo' => 11
  47. ];
  48. $globalBonusBuyPercent = 0.03; // Бонус при покупке. Какой процент от стоимости товара зачисляется при покупке товара. Измеряется в десятичных числах. 1 = 100%, 0.02 = 2%.
  49. $globalBonusRegister = 500; // Бонус при регистрации.
  50.  
  51. use Fact;
  52. use Bitrix\Highloadblock as HL;
  53. use Bitrix\Main;
  54. use Bitrix\Main\Entity;
  55.  
  56. CModule::IncludeModule('iblock');
  57. CModule::IncludeModule('highloadblock');
  58. CModule::IncludeModule("sale");
  59.  
  60.  
  61. AddEventHandler("iblock", "OnAfterIBlockSectionAdd", array("flitTranslit", "OnBeforeIBlockSectionAddHandler"));
  62. AddEventHandler("sale", "OnSaleStatusOrder", array("bonus", "OnSaleStatusOrder_mail"));
  63. AddEventHandler("iblock", "OnAfterIBlockElementUpdate", array("up", "OnAfterIBlockElementUpdateHandler"));
  64. AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("up", "OnAfterIBlockElementUpdateHandler"));
  65. AddEventHandler("main", "OnAfterUserAdd", array("regmail", "OnAfterUserAddHandler"));
  66. AddEventHandler("search", "BeforeIndex", array("MyClass2", "BeforeIndexHandler"));
  67. AddEventHandler("sale", "OnOrderPaySendEmail", array("Order", "OnAfterOrderPaid"));
  68. AddEventHandler("sale", "OnOrderNewSendEmail", array("Order", "OnAfterOrderPaid"));
  69. AddEventHandler("main", "OnAfterUserAdd", array("MyClass", "OnAfterUserAddHandler"));
  70. AddEventHandler("sale", "OnBeforeOrderAdd", "SetMultiShipDeliveryCost");
  71.  
  72. /*studiofact*/
  73.  
  74. AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("studiofact", "OnAfterIBlockElementAddHandler"));
  75. AddEventHandler("catalog", "OnPriceAdd", array("studiofact", "OnAfterIBlockElementAction2"));
  76. AddEventHandler("catalog", "OnPriceUpdate", array("studiofact", "OnAfterIBlockElementAction2"));
  77. AddEventHandler("sale", "OnSalePayOrder", array("studiofact", "OnOrderAddHandler"));
  78. AddEventHandler("sale", "OnSaleBeforeCancelOrder", array("studiofact", "BackBonus"));
  79. AddEventHandler("sale", "OnBeforeOrderAdd", array("studiofact", "ChangeFreeDelivery"));
  80. AddEventHandler("sale", "OnOrderAdd", array("studiofact", "RemoveUserFromGroup2000"));
  81. AddEventHandler("sale", "OnSaleCalculateOrder", array("studiofact", "OnOrderUpdateBonuses"));
  82. AddEventHandler("sale", "OnOrderUpdate", array("studiofact", "updateSumPaidAfterUpdate"));
  83.  
  84. AddEventHandler("sale", "OnBeforeBasketUpdate", array("studiofact", "ddOnBeforeBasketUpdate"));
  85. AddEventHandler("main", "OnBeforeUserAdd", array("studiofact", "OnBeforeUserAddHandler"));
  86. AddEventHandler("iblock", "OnBeforeIBlockElementAdd", array("studiofact", "OnBeforeIBlockElementAdd"));
  87. AddEventHandler('main', 'OnEpilog', 'onEpilogHandler');
  88. AddEventHandler("iblock", "OnBeforeIBlockSectionUpdate", array('Fact\Update', "OnBeforeIBlockSectionUpdateHandler"));
  89. AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("Arg", "OnAfterIBlockElementAddHandlerOtz"));
  90.  
  91. AddEventHandler('main', 'OnBuildGlobalMenu', 'StudiofactMailOnBuildGlobalMenu');
  92. AddEventHandler("iblock", "OnAfterIBlockSectionAdd", array("OnAfterIBlockSectionAdd", "OnAfterIBlockSectionAddHandler"));
  93. AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("OnAfterIBlockElementAdd", "OnAfterIBlockElementAddHandler"));
  94. AddEventHandler("search", "BeforeIndex", "BeforeIndexHandler");
  95. AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", array("OnBeforeIBlockElement", "OnBeforeIBlockElementUpdateHandler"));
  96. AddEventHandler("sale", "OnSalePayOrder", array("SaleHandler", "payOrder"));
  97. AddEventHandler("sale", "OnSalePayOrder", "OnSaleStatusOrder_mail1");
  98. AddEventHandler("sale", "OnSaleComponentOrderOneStepFinal", "UCHOrderADDHandler");
  99. AddEventHandler('main', 'OnAdminContextMenuShow', 'OrderDetailAdminContextMenuShow');
  100. AddEventHandler('sale', 'OnBeforeBasketAdd', 'OnBeforeBasketAddHandler');
  101. AddEventHandler("main", "OnBeforeUserLogin", array("AuthorizeHandler", "OnBeforeUserLoginHandler"));
  102. AddEventHandler('main', 'OnEventLogGetAuditTypes', 'OnEventLogGetAuditTypesHandler');
  103.  
  104. $eventManager = Main\EventManager::getInstance();
  105. $eventManager->addEventHandler("", "FilterProfileOnAfterUpdate", "FilterProfileOnAfterUpdate");
  106. $eventManager->addEventHandler("sale", "OnSaleOrderSaved", "admitRefer");
  107. $eventManager->addEventHandler("sale", "OnSaleOrderSaved", "orderBonusPrepay");
  108.  
  109. $eventManager->addEventHandler("sale", "OnSaleComponentOrderShowAjaxAnswer", "OnSaleComponentOrderShowAjaxAnswerHandler");
  110. $eventManager->addEventHandler("sale", "OnSaleComponentOrderJsData", "OnSaleComponentOrderJsDataHandler");
  111.  
  112. /**
  113.  * Подключаем обработчики логирования
  114.  */
  115. require_once 'logs.php';
  116.  
  117. function update_purchases()
  118. {
  119.     CModule::IncludeModule("iblock");
  120.     CModule::IncludeModule("sale");
  121.     CModule::IncludeModule("catalog");
  122.     global $DB;
  123.     $arFilter = array(
  124.         "!ORDER_ID" => false,
  125.         ">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), time() - 7776000)
  126.     );
  127.     $products = array();
  128.     $rsSales = CSaleBasket::GetList(array("DATE_INSERT" => "ASC"), $arFilter);
  129.     while ($arSales = $rsSales->Fetch()) {
  130.         $mxResult = CCatalogSku::GetProductInfo($arSales['PRODUCT_ID']);
  131.         if (is_array($mxResult)) {
  132.             $id = $mxResult["ID"];
  133.             $ib_id = CATALOG_ID;
  134.         } else {
  135.             $id = $arSales['PRODUCT_ID'];
  136.             $ib_id = SKU_IBLOCK_ID;
  137.         }
  138.         if (isset($products[$id])) {
  139.             $products[$id]["CNT"]++;
  140.         } else {
  141.             $products[$id] = array(
  142.                 "CNT" => 1,
  143.                 "IBLOCK" => $ib_id,
  144.                 "ID" => $id,
  145.             );
  146.         }
  147.     }
  148.     $arSelect = array("ID");
  149.     $arFilter = array("IBLOCK_ID" => CATALOG_ID);
  150.     $res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 150000), $arSelect);
  151.     while ($arFields = $res->Fetch()) {
  152.         $props = array();
  153.         if (isset($products[$arFields["ID"]])) {
  154.             $iblock = $products[$arFields["ID"]]["IBLOCK"];
  155.             $props['PURCHASE_COUNT'] = $products[$arFields["ID"]]["CNT"];
  156.         } else {
  157.             $iblock = CATALOG_ID;
  158.             $props['PURCHASE_COUNT'] = 0;
  159.         }
  160.         CIBlockElement::SetPropertyValuesEx($arFields["ID"], $iblock, $props);
  161.     }
  162.  
  163.     return "update_purchases();";
  164. }
  165.  
  166. function update_brand_purchases()
  167. {
  168.     CModule::IncludeModule("iblock");
  169.     CModule::IncludeModule("sale");
  170.     CModule::IncludeModule("catalog");
  171.     global $DB;
  172.     $arFilter = array(
  173.         "!ORDER_ID" => false,
  174.         ">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), time() - 7776000)
  175.     );
  176.     $products = array();
  177.     $rsSales = CSaleBasket::GetList(array("DATE_INSERT" => "ASC"), $arFilter);
  178.     $ids = array();
  179.     while ($arSales = $rsSales->Fetch()) {
  180.         $mxResult = CCatalogSku::GetProductInfo($arSales['PRODUCT_ID']);
  181.         if (is_array($mxResult)) {
  182.             $id = $mxResult["ID"];
  183.             $ib_id = CATALOG_ID;
  184.         } else {
  185.             $id = (int)$arSales['PRODUCT_ID'];
  186.             $ib_id = SKU_IBLOCK_ID;
  187.         }
  188.         $ids[] = $id;
  189.         if (isset($products[$id])) {
  190.             $products[$id]["CNT"]++;
  191.         } else {
  192.             $products[$id] = array(
  193.                 "CNT" => 1,
  194.                 "IBLOCK" => $ib_id,
  195.                 "ID" => $id,
  196.             );
  197.         }
  198.     }
  199.     $arParams = array("replace_space" => "-", "replace_other" => "");
  200.     $arr = array();
  201.  
  202.     $arSelect = array("ID", "PROPERTY_ATT_BRAND_LIST");
  203.     $arFilter = array("IBLOCK_ID" => CATALOG_ID, "ID" => $ids);
  204.     $res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 150000), $arSelect);
  205.  
  206.     while ($arFields = $res->Fetch()) {
  207.         $arr[$arFields["PROPERTY_ATT_BRAND_LIST_VALUE"]] += $products[$arFields["ID"]]["CNT"];
  208.     }
  209.     $arFilter = array("IBLOCK_ID" => CATALOG_ID, "SECTION_ID" => BRANDS_SECTION);
  210.     $arSelect = array("ID", "CODE", "NAME");
  211.     $res = CIBlockSection::GetList(array(), $arFilter, false, $arSelect, array("nPageSize" => 150000));
  212.     while ($ob = $res->GetNext()) {
  213.         if (isset($arr[$ob["NAME"]])) {
  214.             $arFields = array("UF_BRAND_PURCHASES" => $arr[$ob["NAME"]]);
  215.         } else {
  216.             $arFields = array("UF_BRAND_PURCHASES" => 0);
  217.         }
  218.         $bs = new CIBlockSection;
  219.  
  220.         var_dump($bs->Update($ob["ID"], $arFields));
  221.     }
  222.  
  223.     return "update_brand_purchases();";
  224. }
  225.  
  226. class Arg
  227. {
  228.     function OnAfterIBlockElementAddHandlerOtz(&$arFields)
  229.     {
  230.         $arSelect = array("ID", "IBLOCK_ID", "NAME", "DATE_CREATE", "PROPERTY_DATE");
  231.         $arFilter = array("IBLOCK_ID" => 7, "ID" => $arFields['ID']);
  232.         $res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
  233.         while ($arFieldss = $res->Fetch()) {
  234.             CIBlockElement::SetPropertyValueCode($arFieldss['ID'], "DATE", date($arFieldss['DATE_CREATE']));
  235.         }
  236.     }
  237. }
  238.  
  239.  
  240. function ChangeGracyStatus()
  241. {
  242.     /*global $USER;
  243.     global $DB;
  244.     CModule::IncludeModule("sale");
  245.     CModule::IncludeModule("catalog");
  246.     $phpdate = date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n") - 3, date("d"), date("Y")));
  247.     $arFilter = Array("PAYED" => "Y",
  248.                       ">=DATE_PAYED" => $phpdate
  249.     );
  250.     $arOrder = array();
  251.     $arOrderStatus = array();
  252.     $ids = array();
  253.     $idsStatus = array();
  254.     $sum = array();
  255.     $db_sales = CSaleOrder::GetList(array("DATE_PAYED" => "ASC"), $arFilter, array('USER_ID', 'SUM' => 'PRICE',"DATE_PAYED"));
  256.     while ($ar_sales = $db_sales->Fetch())
  257.     {
  258.         $sum[$ar_sales["USER_ID"]] += $ar_sales["PRICE"];
  259.         $arOrder[$ar_sales["USER_ID"]] = array("USER_ID" => $ar_sales["USER_ID"],
  260.                                                "PRICE" => $sum[$ar_sales["USER_ID"]],
  261.                                                "CNT" => $ar_sales["CNT"],
  262.                                                "DATE_PAYED" => $ar_sales["DATE_PAYED"],
  263.         );
  264.         $ids[] = $ar_sales["USER_ID"];
  265.     }
  266.     $arFilter = Array("ACTIVE" => "Y",
  267.     );
  268.     $db_user = CUser::GetList($by = 'NAME', $order = 'ASC', $arFilter, array("SELECT" => array("UF_*")));
  269.     while ($ar_user = $db_user->Fetch())
  270.     {
  271.         if (in_array($ar_user["ID"], $ids))
  272.         {
  273.             $arOrder[$ar_user["ID"]]["UF_GRACY_STATUS"] = $ar_user["UF_GRACY_STATUS"];
  274.             $arOrder[$ar_user["ID"]]["NAME"] = $ar_user["NAME"];
  275.             $arOrder[$ar_user["ID"]]["EMAIL"] = $ar_user["EMAIL"];
  276.             $arOrder[$ar_user["ID"]]["UF_FREESHIPPING"] = $ar_user["UF_FREESHIPPING"];
  277.             $arOrder[$ar_user["ID"]]["UF_STATUS_UPDATE"] = $ar_user["UF_STATUS_UPDATE"];
  278.             $arOrder[$ar_user["ID"]]["DATE_REGISTER"] = $ar_user["DATE_REGISTER"];
  279.             $arOrderStatus[$ar_user["ID"]] = $arOrder[$ar_user["ID"]];
  280.             $idsStatus[] = $ar_user["ID"];
  281.         }
  282.     }
  283.  
  284.     foreach ($arOrderStatus as $ID => $arOrd)
  285.     {
  286.         if ($arOrd["UF_STATUS_UPDATE"] != "")
  287.         {
  288.             if (MakeTimeStamp($arOrd["UF_STATUS_UPDATE"]) < MakeTimeStamp(date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n") - 3, date("d"), date("Y")))))
  289.             {
  290.                 $arGroups = CUser::GetUserGroup($ID);
  291.                 $new_status = "";
  292.                 $free_shipping = 0;
  293.                 if ($arOrd["PRICE"] >= 50000)
  294.                 {
  295.                     $new_status = "bordo";
  296.                     $free_shipping = 4;
  297.                     $coupon = "";
  298.                     if(($key = array_search(9,$arGroups)) !== FALSE){
  299.                          unset($arGroups[$key]);
  300.                          }
  301.                      if(($key = array_search(10,$arGroups)) !== FALSE){
  302.                          unset($arGroups[$key]);
  303.                      }
  304.                     $arGroups[] = 11;
  305.                     do
  306.                     {
  307.                         $allchars = 'ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789';
  308.                         $string1 = '';
  309.                         $string2 = '';
  310.                         for ($i = 0; $i < 5; $i++)
  311.                         {
  312.                             $string1 .= substr($allchars, round((rand(0, 10) * 0.1) * (strlen($allchars) - 1)), 1);
  313.                         }
  314.                         for ($i = 0; $i < 7; $i++)
  315.                             $string2 .= substr($allchars, round((rand(0, 10) * 0.1) * (strlen($allchars) - 1)), 1);
  316.                         $newCoupon = "CP-" . $string1 . "-" . $string2;
  317.  
  318.                         $dbCouponCheck = CCatalogDiscountCoupon::GetList(array(), array("COUPON" => $oCoupon), false, false, array());
  319.                     } while (intval($dbCouponCheck->SelectedRowsCount()) > 0);
  320.  
  321.                     $cu = array("DISCOUNT_ID" => 4, "ACTIVE" => "Y", "ONE_TIME" => "Y", "DATE_APPLY" => "");
  322.                     $cu['COUPON'] = $newCoupon;
  323.                     $newCouponId = CCatalogDiscountCoupon::Add($cu);
  324.                     $coupon = "<br /><br />Вам доступна скидка. Введите купон при следующем оформлении заказа " . $newCoupon;
  325.  
  326.                 }
  327.                 else if ($arOrd["PRICE"] > 30000)
  328.                 {
  329.                     $new_status = "orange";
  330.                     $free_shipping = 2;
  331.                     if(($key = array_search(9,$arGroups)) !== FALSE){
  332.                          unset($arGroups[$key]);
  333.                          }
  334.                      if(($key = array_search(11,$arGroups)) !== FALSE){
  335.                          unset($arGroups[$key]);
  336.                      }
  337.                     $arGroups[] = 10;
  338.                     $coupon = "";
  339.                     do
  340.                     {
  341.                         $allchars = 'ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789';
  342.                         $string1 = '';
  343.                         $string2 = '';
  344.                         for ($i = 0; $i < 5; $i++)
  345.                         {
  346.                             $string1 .= substr($allchars, round((rand(0, 10) * 0.1) * (strlen($allchars) - 1)), 1);
  347.                         }
  348.                         for ($i = 0; $i < 7; $i++)
  349.                             $string2 .= substr($allchars, round((rand(0, 10) * 0.1) * (strlen($allchars) - 1)), 1);
  350.                         $newCoupon = "CP-" . $string1 . "-" . $string2;
  351.  
  352.                         $dbCouponCheck = CCatalogDiscountCoupon::GetList(array(), array("COUPON" => $oCoupon), false, false, array());
  353.                     } while (intval($dbCouponCheck->SelectedRowsCount()) > 0);
  354.  
  355.                     $cu = array("DISCOUNT_ID" => 5, "ACTIVE" => "Y", "ONE_TIME" => "Y", "DATE_APPLY" => "");
  356.                     $cu['COUPON'] = $newCoupon;
  357.                     $newCouponId = CCatalogDiscountCoupon::Add($cu);
  358.                     $coupon = "<br /><br />Вам доступна скидка. Введите купон при следующем оформлении заказа " . $newCoupon;
  359.                 }
  360.                 else if ($arOrd["PRICE"] > 15000)
  361.                 {
  362.                     $new_status = "vanilla";
  363.                     if(($key = array_search(11,$arGroups)) !== FALSE){
  364.                          unset($arGroups[$key]);
  365.                          }
  366.                      if(($key = array_search(10,$arGroups)) !== FALSE){
  367.                          unset($arGroups[$key]);
  368.                      }
  369.                     $arGroups[] = 9;
  370.                 } else {
  371.                     $new_status = "";
  372.                     if(($key = array_search(9,$arGroups)) !== FALSE){
  373.                          unset($arGroups[$key]);
  374.                      }
  375.                      if(($key = array_search(10,$arGroups)) !== FALSE){
  376.                          unset($arGroups[$key]);
  377.                      }
  378.                      if(($key = array_search(11,$arGroups)) !== FALSE){
  379.                          unset($arGroups[$key]);
  380.                      }
  381.  
  382.                 }
  383.  
  384.                 CUser::SetUserGroup($ID, $arGroups);
  385.  
  386.                 if ($new_status != "")
  387.                 {
  388.                     $user = new CUser;
  389.                     $fields = Array("UF_STATUS_UPDATE" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n"), date("d"), date("Y"))),
  390.                                     "UF_GRACY_STATUS" => $new_status,
  391.                                     //"UF_FREESHIPPING" => $arOrd["UF_FREESHIPPING"]+$free_shipping,
  392.                     );
  393.                     $user->Update($ID, $fields);
  394.  
  395.                     $mail_fiedl = Array("EMAIL" => $arOrd["EMAIL"],
  396.                                         "NAME" => $arOrd["NAME"],
  397.                                         "STATUS" => strtoupper($new_status),
  398.                                         "COUPON" => $coupon,
  399.                     );
  400.  
  401.                         //ob_start();
  402.                         //var_dump($arOrderStatus);
  403.                         //var_dump($cu);
  404.                         //var_dump($mail_fiedl);
  405.                         //$String = ob_get_contents();
  406.                         //ob_end_clean();
  407.                         //AddMessage2Log($String, "my");
  408.                     CEvent::Send('CHANGE_GRACY_STATUS', s1, $mail_fiedl, "N", 57);
  409.                 }
  410.             }
  411.         }
  412.         else
  413.         {
  414.             $user = new CUser;
  415.             $fields = Array("UF_STATUS_UPDATE" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n"), date("d"), date("Y"))),
  416.             );
  417.             $user->Update($ID, $fields);
  418.         }
  419.     }
  420.  
  421. */
  422.     return "ChangeGracyStatus();";
  423. }
  424.  
  425.  
  426. class MyClass2
  427. {
  428.     // создаем обработчик события "BeforeIndex"
  429.     function BeforeIndexHandler($arFields)
  430.     {
  431.         // элемент инфоблока 180 (не раздел)
  432.         if ($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == 3 && substr($arFields["ITEM_ID"], 0, 1) != "S") {
  433.             $arFields["PARAMS"]["iblock_section"] = array();
  434.             //Получаем разделы привязки элемента (их может быть несколько)
  435.             if (!CModule::IncludeModule("iblock")) {
  436.                 return;
  437.             }
  438.             $res = CIBlockElement::GetList(array(), array("ID" => $arFields["ITEM_ID"]), false, false, array("IBLOCK_SECTION_ID"));
  439.             if ($ar_res = $res->GetNext()) {
  440.                 $rsPath = GetIBlockSectionPath(CATALOG_ID, $ar_res["IBLOCK_SECTION_ID"]);
  441.                 while ($arPath = $rsPath->GetNext()) {
  442.                     if ($arPath['DEPTH_LEVEL'] == 1) {
  443.                         $arFields["PARAMS"]["iblock_section"][] = $arPath["ID"];
  444.                     }
  445.                 }
  446.             }
  447.  
  448.             return $arFields;
  449.         }
  450.  
  451.         if ($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == 3 && substr($arFields["ITEM_ID"], 0, 1) == "S") {
  452.             $arFields["PARAMS"]["iblock_section"] = array();
  453.             //Получаем разделы привязки элемента (их может быть несколько)
  454.             if (!CModule::IncludeModule("iblock")) {
  455.                 return;
  456.             }
  457.  
  458.             $rsPath = GetIBlockSectionPath(CATALOG_ID, substr($arFields["ITEM_ID"], 1));
  459.             while ($arPath = $rsPath->GetNext()) {
  460.                 if ($arPath['DEPTH_LEVEL'] == 1) {
  461.                     $arFields["PARAMS"]["iblock_section"][] = $arPath["ID"];
  462.                 }
  463.             }
  464.  
  465.             return $arFields;
  466.         }
  467.     }
  468. }
  469.  
  470. class regmail
  471. {
  472.     function OnAfterUserAddHandler(&$arFields)
  473.     {
  474.         if (($arFields["ID"] > 0) && $arFields["NOT_REG"] != "Y") {
  475.             $arSend = array(
  476.                 'LOGIN' => $arFields['EMAIL'],
  477.                 'EMAIL' => $arFields['EMAIL'],
  478.                 'PASSWORD' => $arFields['CONFIRM_PASSWORD']
  479.             );
  480.             CEvent::Send('NEW_USER_CONFIRM', SITE_ID, $arSend);
  481.         }
  482.     }
  483. }
  484.  
  485. class up
  486. {
  487.     function OnAfterIBlockElementUpdateHandler(&$arFields)
  488.     {
  489.         global $upd;
  490.         if (!isset($upd) || $upd == false) {//для избежания рекурсии при апдейте символьного кода
  491.             if ($arFields["IBLOCK_ID"] == 7) {
  492.                 if ($arFields['ACTIVE'] == 'Y') {
  493.                     if (!CModule::IncludeModule("iblock")) {
  494.                         return;
  495.                     }
  496.                     BXClearCache(true, "/s1/bitrix/catalog.element/");
  497.                 }
  498.             } elseif ($arFields['IBLOCK_ID'] == CATALOG_ID) {
  499.                 global $current_brand;
  500.                 $current_brand = false;
  501.                 if (!empty($arFields["IBLOCK_SECTION"])) {
  502.                     foreach ($arFields["IBLOCK_SECTION"] as $section) {
  503.                         GetFirstLevelSection($section);
  504.                     }
  505.                 } else {
  506.                     $db_old_groups = CIBlockElement::GetElementGroups($arFields["ID"], true);
  507.                     while ($ar_group = $db_old_groups->Fetch()) {
  508.                         GetFirstLevelSection($ar_group["ID"]);
  509.                     }
  510.                 }
  511.  
  512.  
  513.                 if ($current_brand) {
  514.                     $arParams = array("replace_space" => "_", "replace_other" => "");
  515.                     $trans = Cutil::translit($current_brand["BRAND_NAME"], "ru", $arParams);
  516.                     $property_enums = CIBlockPropertyEnum::GetList(
  517.                         array("SORT" => "ASC"),
  518.                         array("IBLOCK_ID" => CATALOG_ID, "VALUE" => $current_brand["BRAND_NAME"], "CODE" => "ATT_BRAND_LIST")
  519.                     );
  520.                     if ($enum_fields = $property_enums->GetNext()) {
  521.                         $current_brand["BRAND_LIST_ID"] = $enum_fields["ID"];
  522.                     } else {
  523.                         $ibpenum = new CIBlockPropertyEnum;
  524.                         if ($PropID = $ibpenum->Add(array('PROPERTY_ID' => NEW_BRAND_PROP_ID, 'SORT' => '50000', 'XML_ID' => $trans, 'VALUE' => $current_brand["BRAND_NAME"]))) {
  525.                             $current_brand["BRAND_LIST_ID"] = $PropID;
  526.                         }
  527.                     }
  528.                     $arFilter = array('IBLOCK_ID' => BRANDS_IBLOCK_ID, 'NAME' => $current_brand["BRAND_NAME"]);
  529.                     $db_list = CIBlockSection::GetList(array("SORT" => "ASC"), $arFilter, true);
  530.                     if ($ar_result = $db_list->GetNext()) {
  531.                         $current_brand["BRAND_IBLOCK_SECTION"] = $ar_result['ID'];
  532.                     } else {
  533.                         $bs = new CIBlockSection;
  534.                         $arF = array(
  535.                             "NAME" => $current_brand["BRAND_NAME"],
  536.                             "CODE" => $current_brand["BRAND_LIST_ID"],
  537.                             'IBLOCK_ID' => BRANDS_IBLOCK_ID,
  538.                             "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"] . "/bitrix/templates/eshop_gracy/images/logo.png"),
  539.                             "PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"] . "/bitrix/templates/eshop_gracy/images/logo.png"),
  540.                             "DESCRIPTION" => $current_brand["BRAND_NAME"],
  541.                             "IBLOCK_SECTION_ID" => 0,
  542.                         );
  543.                         $ID = $bs->Add($arF);
  544.                         $current_brand["BRAND_IBLOCK_SECTION"] = $ID;
  545.                     }
  546.  
  547.                     $db_props = CIBlockElement::GetProperty(CATALOG_ID, $arFields["ID"], array("sort" => "asc"), array("CODE" => "ARTNUMBER"));
  548.                     if ($ar_props = $db_props->Fetch()) {
  549.                         $upd = true;
  550.                         $arcustom_code = CIBlockElement::GetProperty(CATALOG_ID, $arFields["ID"], array("sort" => "asc"), array("CODE" => "CUSTOM_SIMCODE"));
  551.                         if ($custom_code = $arcustom_code->Fetch()) {
  552.                             if ($custom_code["VALUE"] == 12502) {
  553.                             } else {
  554.                                 $arParams = array("replace_space" => "-", "replace_other" => "-");
  555.                                 $trans = Cutil::translit($current_brand["BRAND_NAME"], "ru", $arParams);
  556.                                 $filds = array("CODE" => $trans . "-" . $ar_props["VALUE"]);
  557.                                 $set_codes = new CIBlockElement;
  558.                                 $res = $set_codes->Update($arFields["ID"], $filds);
  559.                                 file_put_contents($_SERVER["DOCUMENT_ROOT"] . '/upload/log.txt', print_r($set_codes->LAST_ERROR, true), FILE_APPEND);
  560.                                 file_put_contents($_SERVER["DOCUMENT_ROOT"] . '/upload/log.txt', $res, FILE_APPEND);
  561.                                 file_put_contents($_SERVER["DOCUMENT_ROOT"] . '/upload/log.txt', $filds["CODE"], FILE_APPEND);
  562.                             }
  563.                         }
  564.                     }
  565.  
  566.                     CIBlockElement::SetPropertyValuesEx($arFields["ID"], false, array("ATT_BRAND_LIST" => $current_brand["BRAND_LIST_ID"]));
  567.                     CIBlockElement::SetPropertyValuesEx($arFields["ID"], false, array("ATT_BRAND" => $current_brand["BRAND_NAME"]));
  568.                     CIBlockElement::SetPropertyValuesEx($arFields["ID"], false, array("MANUFACTURER" => $current_brand["BRAND_IBLOCK_SECTION"]));
  569.                 }
  570.             } elseif ($arFields['IBLOCK_ID'] == SKU_IBLOCK_ID) {
  571.                 if (isset($arFields["PROPERTY_VALUES"][52]) && !empty($arFields["PROPERTY_VALUES"][52])) {
  572.                     foreach ($arFields["PROPERTY_VALUES"][52] as $item) {
  573.                         if ($item["VALUE"] != "") {
  574.                             $arSelect = array("ID", "NAME", "IBLOCK_ID", "PROPERTY_ATT_AVAILABLE");
  575.                             $arFilter = array("IBLOCK_ID" => SKU_IBLOCK_ID, "PROPERTY_PRODUCT" => $item["VALUE"], "ACTIVE" => "Y");
  576.                             $res = CIBlockElement::GetList(array(), $arFilter, false, array(), $arSelect);
  577.                             $avail = false;
  578.                             while ($arF = $res->Fetch()) {
  579.                                 if ($arF["PROPERTY_ATT_AVAILABLE_VALUE"] != "N") {
  580.                                     $avail = true;
  581.                                 }
  582.                             }
  583.                             $props = array();
  584.                             if ($avail) {
  585.                                 $props['ATT_AVAILABLE'] = 1;
  586.                                 CIBlockElement::SetPropertyValuesEx($item["VALUE"], CATALOG_ID, $props);
  587.                             } else {
  588.                                 $props['ATT_AVAILABLE'] = 0;
  589.                                 CIBlockElement::SetPropertyValuesEx($item["VALUE"], CATALOG_ID, $props);
  590.                             }
  591.                         }
  592.                     }
  593.                 }
  594.             }
  595.         } else {
  596.             $upd = false;
  597.         }
  598.     }
  599. }
  600.  
  601.  
  602. function clearSmartFilterCache()
  603. {
  604.  
  605.     BXClearCache(true, "/filter_combo_items/");
  606.  
  607.     BXClearCache(true, "/s1/citfact/catalog.smart.filter/");
  608.  
  609.     return 'clearSmartFilterCache();';
  610. }
  611.  
  612. class bonus
  613. {
  614.  
  615.     function OnSaleStatusOrder_mail($ID, $val)
  616.     {
  617.         global $DB, $globalBonusBuyPercent;
  618.  
  619.  
  620.         $res = CSaleUserTransact::GetList(array("TRANSACT_DATE" => "DESC"), array("ORDER_ID" => $ID));
  621.         while ($arFields = $res->Fetch()) {
  622.             $arTrans[] = $arFields;
  623.         }
  624.         if ($val == 'F' or $val == 'P' and $arTrans[0]["NOTES"] != 'bonusplus') {
  625.             if (($arOrder = CSaleOrder::GetByID($ID))) {
  626.                 if (CModule::IncludeModule('sale')) {
  627.                     $bon = getBonus($arOrder['PRICE'], $arOrder['PRICE_DELIVERY'], $globalBonusBuyPercent);
  628.  
  629.                     CSaleUserAccount::UpdateAccount($arOrder['USER_ID'], $bon, 'RUB', 'Бонус за заказ #' . $arOrder['ID'], '', 'bonusplus');
  630.                 }
  631.             }
  632.         } elseif ($val == 'Z' and $arTrans[0]["NOTES"] == 'bonusplus') {
  633.             if ($arOrder = CSaleOrder::GetByID($ID)) {
  634.                 if (CModule::IncludeModule('sale')) {
  635.                     $bon = getBonus($arOrder['PRICE'], $arOrder['PRICE_DELIVERY'], $globalBonusBuyPercent);
  636.  
  637.                     CSaleUserAccount::UpdateAccount($arOrder['USER_ID'], '-' . $bon, 'RUB', 'Списание бонусных бонусов за отмену заказа #' . $arOrder['ID'], '', 'bonusminus');
  638.                 }
  639.             }
  640.         }
  641.         if ($val == 'Z') {
  642.             $arFields = "Y";
  643.             $factObject = new studiofact();
  644.             $factObject->BackBonus($ID, $arFields);
  645.         }
  646.     }
  647. }
  648.  
  649.  
  650. class flitTranslit
  651. {
  652.     function OnBeforeIBlockSectionAddHandler(&$arFields)
  653.     {
  654.         if ($arFields["IBLOCK_ID"] == CATALOG_ID) {
  655.             if ($arFields["NAME"] != 'Бренды') {
  656.                 if ($arFields["ID"] != 107) {
  657.                     if ($arFields["IBLOCK_SECTION_ID"] != BRANDS_SECTION) {
  658.                         if ($arFields["ID"]) {
  659.                             $arFields["CODE"] = 'c' . $arFields["ID"];
  660.                             if (!CModule::IncludeModule("iblock")) {
  661.                                 return;
  662.                             }
  663.                             $bs = new CIBlockSection;
  664.                             $arFields3 = array("CODE" => 'c' . $arFields["ID"]);
  665.                             $bs->Update($arFields["ID"], $arFields3);
  666.                         }
  667.                     }
  668.                 }
  669.             }
  670.         }
  671.     }
  672. }
  673.  
  674.  
  675. class MyClass
  676. {
  677.     // создаем обработчик события "OnAfterUserAdd"
  678.     function OnAfterUserAddHandler(&$arFields)
  679.     {
  680.         if (CModule::IncludeModule('sale')) {
  681.             CSaleUserAccount::UpdateAccount($arFields['ID'], "500", 'RUB', 'Бонус за регистрацию', '', 'bonusplus');
  682.         }
  683.     }
  684. }
  685.  
  686.  
  687. function payBonusOrderUpdate($arOrder)
  688. {
  689.     AddMessage2Log(print_r($arOrder, 1));
  690. }
  691.  
  692.  
  693. function onEpilogHandler()
  694. {
  695.     global $APPLICATION;
  696.     $path = getenv('DOCUMENT_ROOT');
  697.     if ((defined('ERROR_404') && ERROR_404 == 'Y' && !isset($_GET['params_brand_stop_404']))
  698.         || (defined('ERROR_404_BRAND') && ERROR_404_BRAND == 'Y')) {
  699.         $APPLICATION->RestartBuffer();
  700.         require sprintf('%s/%s/header.php', $path, SITE_TEMPLATE_PATH);
  701.         require $path . '/404.php';
  702.         require sprintf('%s/%s/footer.php', $path, SITE_TEMPLATE_PATH);
  703.     }
  704. }
  705.  
  706. /*studiofact*/
  707.  
  708. class studiofact
  709. {
  710.  
  711.     private static $orderLock = false;
  712.  
  713.     function OnBeforeIBlockElementAdd(&$arFields)
  714.     {
  715.         /*if (CModule::IncludeModule("iblock"))
  716.         {
  717.             file_put_contents($_SERVER["DOCUMENT_ROOT"] . '/upload/log.txt', print_r($arFields, true), FILE_APPEND);
  718.  
  719.             $arFields["PROPERTY_VALUES"][1]; //artnumber
  720.             $res = CIBlockSection::GetByID($arFields["PROPERTY_VALUES"][2][0]["VALUE"]);
  721.             if ($ar_res = $res->GetNext())
  722.             {
  723.                 $arBrandName = $ar_res["NAME"];
  724.             }
  725.             $el = new CIBlockElement;
  726.  
  727.             $arParams = array("replace_space" => "-", "replace_other" => "-");
  728.             $vowel = array("'", ".");
  729.             $arBrandName = str_replace($vowel, "", $arBrandName);
  730.             $arBrandName = Cutil::translit(trim($arBrandName), "ru", $arParams);
  731.             $arFields["CODE"] = $arBrandName . "-" . $arFields["PROPERTY_VALUES"][1]["n0"]["VALUE"];
  732.             foreach ($arFields["PROPERTY_VALUES"][130] as $key => &$value)
  733.             {
  734.                 $value = $arFields['IBLOCK_SECTION'][0];
  735.             }
  736.         }*/
  737.     }
  738.  
  739.     function OnBeforeUserAddHandler(&$arFields)
  740.     {
  741.         ob_start();
  742.         var_dump($arFields);
  743.         $String = ob_get_contents();
  744.         ob_end_clean();
  745.  
  746.         AddMessage2Log($String, "my");
  747.     }
  748.  
  749.     function ddOnBeforeBasketUpdate($iId, $aFields)
  750.     {
  751.         global $USER;
  752.         if ($aFields["DISCOUNT_COUPON"] != "") {
  753.             $cu = $aFields["DISCOUNT_COUPON"];
  754.             $ob = CCatalogDiscountCoupon::GetList(array("COUPON", "asc"), array("COUPON" => $cu), false, false, array("*"));
  755.             if ($res = $ob->GetNext()) {
  756.                 /*if ($res["DISCOUNT_ID"] == 4)
  757.                 {
  758.                     $arGroups = CUser::GetUserGroup($USER->GetID());
  759.                     $arGroups[] = 13;
  760.                     CUser::SetUserGroup($USER->GetID(), $arGroups);
  761.                 }*/
  762.                 if ($res["DISCOUNT_ID"] == 5) {
  763.                     $arGroups = CUser::GetUserGroup($USER->GetID());
  764.                     $arGroups[] = 14;
  765.                     CUser::SetUserGroup($USER->GetID(), $arGroups);
  766.                 }
  767.             }
  768.         }
  769.  
  770.         return true;
  771.     }
  772.  
  773.     function RemoveUserFromGroup2000($ID, $arFields)
  774.     {
  775.         global $USER;
  776.         $arGroups = CUser::GetUserGroup($USER->GetID());
  777.         foreach ($arGroups as $key => $group) {
  778.             /*if ($group == 13)
  779.             {
  780.                 unset($arGroups[$key]);
  781.             }*/
  782.             if ($group == 14) {
  783.                 unset($arGroups[$key]);
  784.             }
  785.         }
  786.         CUser::SetUserGroup($USER->GetID(), $arGroups);
  787.     }
  788.  
  789.     function ChangeFreeDelivery($arFields)
  790.     {
  791.         if ($arFields["DELIVERY_ID"] == 18) {
  792.             $arFilter = array("ID" => $arFields["USER_ID"]);
  793.             $db_user = CUser::GetList($by = 'NAME', $order = 'ASC', $arFilter, array("SELECT" => array("UF_*")));
  794.             while ($ar_user = $db_user->Fetch()) {
  795.                 $UF_PROP = $ar_user;
  796.             }
  797.             $countFreeShipping = $UF_PROP["UF_FREESHIPPING"];
  798.             $user = new CUser;
  799.             $fields = array("UF_FREESHIPPING" => $countFreeShipping - 1,
  800.             );
  801.             $user->Update($arFields["USER_ID"], $fields);
  802.         }
  803.     }
  804.  
  805.     function BackBonus($ID, $arFields)
  806.     {
  807.         global $globalMaximalBonusOnBuy;
  808.         $arBeforeOrder = array();
  809.  
  810.  
  811.         if (CModule::IncludeModule("sale")) {
  812.             $arOrder = CSaleOrder::GetByID($ID);
  813.             $BonusUser = new Fact\CUser($arOrder['USER_ID']);
  814.  
  815.             $globalBonusBuyPercent = $BonusUser->getRatio();
  816.  
  817.  
  818.             if ($arOrder["DELIVERY_ID"] == 18 && $arFields == "Y") {
  819.                 $arFilter = array("ID" => $arOrder["USER_ID"]);
  820.                 $db_user = CUser::GetList($by = 'NAME', $order = 'ASC', $arFilter, array("SELECT" => array("UF_*")));
  821.                 while ($ar_user = $db_user->Fetch()) {
  822.                     $UF_PROP = $ar_user;
  823.                 }
  824.                 //AddMessage2Log('$arFields = ' . print_r($UF_PROP, true), 'OnSaleBeforeCancelOrder');
  825.                 $countFreeShipping = $UF_PROP["UF_FREESHIPPING"];
  826.                 //AddMessage2Log('$arFields = ' . print_r($countFreeShipping, true), 'OnSaleBeforeCancelOrder');
  827.                 $user = new CUser;
  828.                 $fields = array("UF_FREESHIPPING" => $countFreeShipping + 1);
  829.                 $user->Update($arOrder["USER_ID"], $fields);
  830.             }
  831.             if ($arOrder["PAYED"] == "Y" && $arFields == "Y") {
  832.                 //$UpdateMoney = round(($arOrder['PRICE'] - $arOrder['PRICE_DELIVERY']) * $globalMaximalBonusOnBuy);
  833.  
  834.                 $BackPayBonus = round(($arOrder["PRICE"] - $arOrder['PRICE_DELIVERY']) * $globalBonusBuyPercent);
  835.  
  836.                 //CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], -$arOrder["PRICE"], $arOrder["CURRENCY"], 'Снимаем всю стоимость заказа', $ID, '-orderprice');
  837.  
  838.  
  839.                 $res = CSaleUserTransact::GetList(array("ID" => "ASC"), array('USER_ID' => $arOrder['USER_ID'], 'DESCRIPTION' => "Бонус за заказ #" . $ID), false, array('nTopCount' => 1));
  840.  
  841.                 if ($bonusForOrder = $res->Fetch()) {
  842.                     CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], -$bonusForOrder['AMOUNT'], $arOrder["CURRENCY"], 'Снятие бонусов за заказ', '', '-BackPayBonus#' . $arOrder['ID']);
  843.                 }
  844.  
  845.  
  846.                 // Bonus back.
  847.  
  848.                 $res = CSaleUserTransact::GetList(array("ID" => "ASC"), array('ORDER_ID' => $arOrder['ID']), false, array('nTopCount' => 1));
  849.  
  850.                 if ($firstTransaction = $res->Fetch()) {
  851.                     if (($firstTransaction['DEBIT'] == 'N') && ($firstTransaction['DESCRIPTION'] == 'ORDER_PAY')) {
  852.                         //$bonusBack = $firstTransaction['AMOUNT'];
  853.  
  854.                         $firstTransaction['result'] = CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $firstTransaction['AMOUNT'], $firstTransaction["CURRENCY"], 'Возврат бонусов за заказ', '', 'bonusback#' . $firstTransaction['ID']);
  855.  
  856.  
  857.                         AddMessage2Log(print_r($firstTransaction, 1));
  858.                     }
  859.                 }
  860.             }
  861.         }
  862.     }
  863.  
  864.     function OnOrderAddHandler($ID, $arFields)
  865.     {
  866.         $ids = array();
  867.         $idsQuant = array();
  868.         CModule::IncludeModule("sale");
  869.         CModule::IncludeModule("iblock");
  870.         if ($arFields != false) {
  871.             $dbOrder = CSaleOrder::GetList(array('ID' => 'DESC'), array('ID' => $ID), false, false, array("USER_ID"));
  872.             if ($arOrder = $dbOrder->Fetch()) {
  873.                 $USER_ID = $arOrder["USER_ID"];
  874.             }
  875.             $dbBasketItems = CSaleBasket::GetList(
  876.                 array("NAME" => "ASC", "ID" => "ASC"),
  877.                 array("USER_ID" => $USER_ID,
  878.                     "LID" => "s1",
  879.                     "ORDER_ID" => $ID
  880.                 ),
  881.                 false,
  882.                 false,
  883.                 array("ID",
  884.                     "CALLBACK_FUNC",
  885.                     "MODULE",
  886.                     "PRODUCT_ID",
  887.                     "QUANTITY",
  888.                     "PRODUCT_PROVIDER_CLASS"
  889.                 )
  890.             );
  891.  
  892.             while ($arItems = $dbBasketItems->Fetch()) {
  893.                 $arFilter = array("ID" => $arItems["PRODUCT_ID"], "IBLOCK_ID" => SKU_IBLOCK_ID);
  894.                 $arSelect = array("ID", "NAME", "PROPERTY_PRODUCT");
  895.                 $res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
  896.                 if ($arField = $res->Fetch()) {
  897.                     $ids[] = $arField["PROPERTY_PRODUCT_VALUE"];
  898.                     $idsQuant[$arField["PROPERTY_PRODUCT_VALUE"]]["QUANT"] = $arItems["QUANTITY"];
  899.                 } else {
  900.                     $ids[] = $arItems["PRODUCT_ID"];
  901.                     $idsQuant[$arField["PROPERTY_PRODUCT_VALUE"]]["QUANT"] = $arItems["QUANTITY"];
  902.                 }
  903.             }
  904.             $arFilter = array("ID" => $ids, "IBLOCK_ID" => CATALOG_ID);
  905.             $arSelect = array("PROPERTY_NUM_PURCHASE", "ID");
  906.             $res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
  907.             while ($arFields = $res->Fetch()) {
  908.                 $idsQuant[$arFields["ID"]]["OLD_QUANT"] = $arFields["PROPERTY_NUM_PURCHASE_VALUE"];
  909.             }
  910.  
  911.             foreach ($ids as $i) {
  912.                 CIBlockElement::SetPropertyValuesEx($i, 3, array("NUM_PURCHASE" => intval($idsQuant[$i]["QUANT"]) + intval($idsQuant[$i]["OLD_QUANT"])));
  913.             }
  914.             BXClearCache(true, "/s1/bitrix/catalog.section/");
  915.             BXClearCache(true, "/s1/bitrix/catalog.section.list/");
  916.         }
  917.     }
  918.  
  919.     function OnAfterIBlockElementAddHandler(&$arFields)
  920.     {
  921.         if ($arFields["IBLOCK_ID"] == 7) {
  922.             $text = "";
  923.             if ($arFields["PROPERTY_VALUES"]["44"] != "") {
  924.                 $text .= '<b>Имя: </b>' . $arFields["PROPERTY_VALUES"]["44"] . '<br/>';
  925.             }
  926.             if ($arFields["PROPERTY_VALUES"]["45"] != "") {
  927.                 $text .= '<b>Город: </b>' . $arFields["PROPERTY_VALUES"]["45"] . '<br/>';
  928.             }
  929.             if ($arFields["PROPERTY_VALUES"]["49"] != "") {
  930.                 $text .= '<b>Тема: </b>' . $arFields["PROPERTY_VALUES"]["49"] . '<br/>';
  931.             }
  932.             if ($arFields["PROPERTY_VALUES"]["46"] != "") {
  933.                 $db_props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields["ID"], array("sort" => "asc"), array("ID" => "46"));
  934.                 if ($ar_props = $db_props->Fetch()) {
  935.                     $PROP_VALUE_NAME = $ar_props["VALUE_ENUM"];
  936.                     $text .= '<b>Категория: </b>' . $PROP_VALUE_NAME . '<br/>';
  937.                 }
  938.             }
  939.             if ($arFields["PROPERTY_VALUES"]["75"] != "") {
  940.                 $arIBlockElement = GetIBlockElement($arFields["PROPERTY_VALUES"]["75"]);
  941.                 if ($arFields["ACTIVE"] == "Y") {
  942.                     $text .= 'Ответить на отзыв можно на странице товара: ' . $arIBlockElement['NAME'] . '<br />';
  943.                     $text .= '<a href="' . $_SERVER["SERVER_NAME"] . $arIBlockElement['DETAIL_PAGE_URL'] . '">' . $_SERVER["SERVER_NAME"] . $arIBlockElement['DETAIL_PAGE_URL'] . '</a><br />';
  944.                 } else {
  945.                     $text .= 'Отзыв требует премодерации <a href="' . $_SERVER["SERVER_NAME"] . '/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=' . $arFields["IBLOCK_ID"] . '&type=feedback&ID=' . $arFields["ID"] . '">' . $_SERVER["SERVER_NAME"] . '/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=' . $arFields["IBLOCK_ID"] . '&type=feedback&ID=' . $arFields["ID"] . '</a>,';
  946.                     $text .= 'после которой он будет доступен на этой странице <a href="' . $_SERVER["SERVER_NAME"] . $arIBlockElement['DETAIL_PAGE_URL'] . '">' . $_SERVER["SERVER_NAME"] . $arIBlockElement['DETAIL_PAGE_URL'] . '</a><br />';
  947.                 }
  948.             } elseif ($arFields["PROPERTY_VALUES"]["109"] != "") {
  949.                 $arIBlockElement = GetIBlockSection($arFields["PROPERTY_VALUES"]["109"]);
  950.                 if ($arFields["ACTIVE"] == "Y") {
  951.                     $text .= 'Ответить на отзыв можно на странице бренда: ' . $arIBlockElement['NAME'] . '<br />';
  952.                     $text .= '<a href="' . $_SERVER["SERVER_NAME"] . $arIBlockElement['SECTION_PAGE_URL'] . '">' . $_SERVER["SERVER_NAME"] . $arIBlockElement['SECTION_PAGE_URL'] . '</a><br />';
  953.                 } else {
  954.                     $text .= 'Отзыв требует премодерации <a href="' . $_SERVER["SERVER_NAME"] . '/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=' . $arFields["IBLOCK_ID"] . '&type=feedback&ID=' . $arFields["ID"] . '">' . $_SERVER["SERVER_NAME"] . '/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=' . $arFields["IBLOCK_ID"] . '&type=feedback&ID=' . $arFields["ID"] . '</a>,';
  955.                     $text .= 'после которой он будет доступен на этой странице <a href="' . $_SERVER["SERVER_NAME"] . $arIBlockElement['SECTION_PAGE_URL'] . '">' . $_SERVER["SERVER_NAME"] . $arIBlockElement['SECTION_PAGE_URL'] . '</a><br />';
  956.                 }
  957.             } else {
  958.                 if ($arFields["ACTIVE"] == "Y") {
  959.                     $text .= 'Ответить на отзыв можно на этой странице <a href="' . $_SERVER["SERVER_NAME"] . '/obratnaya_svyaz/">' . $_SERVER["SERVER_NAME"] . '/obratnaya_svyaz/</a><br />';
  960.                 } else {
  961.                     $text .= 'Отзыв требует премодерации <a href="' . $_SERVER["SERVER_NAME"] . '/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=' . $arFields["IBLOCK_ID"] . '&type=feedback&ID=' . $arFields["ID"] . '">' . $_SERVER["SERVER_NAME"] . '/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=' . $arFields["IBLOCK_ID"] . '&type=feedback&ID=' . $arFields["ID"] . '</a>, после которой он будет доступен на этой странице <a href="' . $_SERVER["SERVER_NAME"] . '/obratnaya_svyaz/">' . $_SERVER["SERVER_NAME"] . '/obratnaya_svyaz/</a><br />';
  962.                 }
  963.             }
  964.             if ($arFields["PREVIEW_TEXT"] != "") {
  965.                 $text .= '<b>Сообщение: </b><br />' . $arFields["PREVIEW_TEXT"] . '<br/>';
  966.             }
  967.             $arIBlockElement = GetIBlockElement($arFields["ID"]);
  968.             $arSend = array('TEXT' => $text);
  969.             CEvent::Send('NEW_FEEDBACK', SITE_ID, $arSend, "N", 51);
  970.         }
  971.     }
  972.  
  973.     function OnAfterIBlockElementAction2($ID, $arFields)
  974.     {
  975.         $arFields["PRODUCT_ID"];
  976.         CModule::IncludeModule("catalog");
  977.         $mxResult = CCatalogSKU::GetInfoByProductIBlock(CATALOG_ID);
  978.  
  979.         if ($mxResult) {
  980.             $arSelect = array("PROPERTY_PRODUCT");
  981.             $arFilter = array("ID" => $arFields["PRODUCT_ID"]);
  982.             $res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
  983.             if ($ob = $res->Fetch()) {
  984.                 $tovar_id = $ob["PROPERTY_PRODUCT_VALUE"];
  985.             }
  986.         } else {
  987.             $tovar_id = $arFields["PRODUCT_ID"];
  988.         }
  989.  
  990.         $priceOffers = array();
  991.         if (is_array($mxResult)) {
  992.             $rsOffers = CIBlockElement::GetList(array("CATALOG_PRICE_1" => "ASC"), array('IBLOCK_ID' => $mxResult['IBLOCK_ID'], '>CATALOG_PRICE_1' => 0, 'PROPERTY_' . $mxResult['SKU_PROPERTY_ID'] => $tovar_id), false, false, array("ID"));
  993.             $check = false;
  994.             while ($arOffer = $rsOffers->Fetch()) {
  995.                 $priceOffers[]["PRICE"] = $arOffer["CATALOG_PRICE_1"];
  996.             }
  997.         }
  998.  
  999.         if (!$priceOffers) {
  1000.             $priceOffers[] = (CPrice::GetBasePrice($tovar_id));
  1001.         }
  1002.  
  1003.         CIBlockElement::SetPropertyValuesEx($tovar_id, CATALOG_ID, array("MINIMUM_PRICE" => floatVal($priceOffers[0]["PRICE"])));
  1004.     }
  1005.  
  1006.     public static function OnOrderUpdateBonuses(&$arFields)
  1007.     {
  1008.         global $APPLICATION;
  1009.  
  1010.  
  1011.         if (($APPLICATION->GetCurPage() == '/bitrix/admin/sale_order_new.php')) {
  1012.             if (isset($_GET["ID"]) && ($arFields['PRICE'] > 0)) {
  1013.                 $t = Fact\CSaleOrder::getOrderInfo($_GET["ID"], 0, 1, 0);
  1014.  
  1015.                 if (($_GET["ID"] == $t['ID']) && ($t['PAYED'] == 'N')) {
  1016.                     $newSum = 0;
  1017.                     foreach ($arFields['BASKET_ITEMS'] as $item) {
  1018.                         $newSum += $item['PRICE'] * $item['QUANTITY'];
  1019.                     }
  1020.  
  1021.                     $oldSum = 0;
  1022.                     foreach ($t['ITEMS'] as $item) {
  1023.                         $oldSum += $item['PRICE'] * $item['QUANTITY'];
  1024.                     }
  1025.  
  1026.                     if ($oldSum != $newSum) {
  1027.                         $transactions = CSaleUserTransact::GetList(
  1028.                             array("ID" => "DESC"),
  1029.                             array("ORDER_ID" => $_GET["ID"])
  1030.                         );
  1031.                         while ($tran = $transactions->GetNext()) {
  1032.                             $temp[] = $tran;
  1033.                         }
  1034.                         $n = array_pop($temp);
  1035.  
  1036.                         if ($n['DEBIT'] == 'N' && !in_array($t['USER_ID'], array(59474, 59475, 59477))) {
  1037.                             $BonusUser = new Fact\CUser($t['USER_ID']);
  1038.                             $globalBonusBuyPercent = $BonusUser->getRatio();
  1039.                             $bonus = round($globalBonusBuyPercent * $newSum);
  1040.  
  1041.  
  1042.                             $currentBudget = CSaleUserAccount::GetByUserID($n['USER_ID'], $n['CURRENCY']);
  1043.                             $currentSum = $currentBudget['CURRENT_BUDGET'] + $n['AMOUNT'];
  1044.                             CSaleUserTransact::Delete($n['ID']);
  1045.  
  1046.                             CSaleUserAccount::UpdateAccount(
  1047.                                 $n['USER_ID'],
  1048.                                 $n['AMOUNT'],
  1049.                                 $n['CURRENCY'],
  1050.                                 'Change items in order #' . $n['ORDER_ID']
  1051.                             );
  1052.  
  1053.                             CSaleUserAccount::Withdraw($n['USER_ID'], $bonus, $n['CURRENCY'], $_GET['ID']);
  1054.  
  1055.                             if (isset($_GET["DEBUG"])) {
  1056.                                 echo '<pre>';
  1057.                                 print_r($arFields);
  1058.                                 echo '$bonus: ' . $bonus . "\n";
  1059.                                 print_r($currentBudget);
  1060.                                 echo '$currentSum: ' . $currentSum . "\n";
  1061.                                 echo 'AMOUNT: ' . $n['AMOUNT'] . "\n";
  1062.                                 print_r($n);
  1063.                                 echo '</pre>';
  1064.  
  1065.                                 die();
  1066.                             }
  1067.                         }
  1068.                     }
  1069.                 }
  1070.             }
  1071.         }
  1072.     }
  1073.  
  1074.     /**
  1075.      * Order bonus
  1076.      */
  1077.  
  1078.     public static function updateSumPaidAfterUpdate($ID, $arFields)
  1079.     {
  1080.  
  1081.         global $APPLICATION;
  1082.         $t = Fact\CSaleOrder::getOrderInfo($ID, 0, 1, 0);
  1083.         if (!self::$orderLock) {
  1084.             if (($t['PAYED'] == 'N')) {
  1085.                 $transactions = CSaleUserTransact::GetList(array("ID" => "ASC"), array("ORDER_ID" => $ID));
  1086.  
  1087.                 while ($tran = $transactions->GetNext()) {
  1088.                     $temp[] = $tran;
  1089.                 }
  1090.  
  1091.                 $n = array_shift($temp);
  1092.  
  1093.                 if ($n['DEBIT'] == 'N') {
  1094.                     /*$ar_fields = array(
  1095.                         "SUM_PAID" => $n['AMOUNT']
  1096.                     );
  1097.                     self::$orderLock = true;
  1098.                     $f = CSaleOrder::Update($ID, $ar_fields);
  1099. */
  1100.                 }
  1101.             }
  1102.         }
  1103.     }
  1104. }
  1105.  
  1106.  
  1107. if (!function_exists('getProductInfoFromOffer')) {
  1108.     function getProductInfoFromOffer($offerId)
  1109.     {
  1110.         if (!CModule::IncludeModule("iblock")) {
  1111.             return;
  1112.         }
  1113.  
  1114.         $res = CIBlockElement::GetByID($offerId);
  1115.         if ($ar_res = $res->GetNextElement()) {
  1116.             $props = $ar_res->GetProperties();
  1117.             $arSelect = array();
  1118.             $arFilter = array("IBLOCK_ID" => $props["PRODUCT"]["LINK_IBLOCK_ID"],
  1119.                 "ACTIVE_DATE" => "Y",
  1120.                 "ACTIVE" => "Y",
  1121.                 "ID" => $props["PRODUCT"]["VALUE"],
  1122.             );
  1123.             $res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 50), $arSelect);
  1124.             while ($ob = $res->GetNextElement()) {
  1125.                 $arFields = $ob->GetFields();
  1126.             }
  1127.  
  1128.             return $arFields;
  1129.         }
  1130.     }
  1131. }
  1132.  
  1133. if (!function_exists('ShowTitleOrHeader')) {
  1134.     function ShowTitleOrHeader()
  1135.     {
  1136.         global $APPLICATION;
  1137.         if ($APPLICATION->GetPageProperty("ADDITIONAL_TITLE")) {
  1138.             return $APPLICATION->GetPageProperty("ADDITIONAL_TITLE");
  1139.         } else {
  1140.             return $APPLICATION->GetTitle(false);
  1141.         }
  1142.     }
  1143. }
  1144. if (!function_exists('GetUserField')) {
  1145.     function GetUserField($entity_id, $value_id, $property_id)
  1146.     {
  1147.         $arUF = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields($entity_id, $value_id);
  1148.  
  1149.         return $arUF[$property_id]["VALUE"];
  1150.     }
  1151. }
  1152.  
  1153. function FilterProfileOnAfterUpdate(Entity\Event $event)
  1154. {
  1155.     $primary = $event->getParameter("fields");
  1156.  
  1157.     if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/include/arrFilters.php')) {
  1158.         $arr = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/include/arrFilters.php'));
  1159.     } else {
  1160.         $arr = array();
  1161.     }
  1162.  
  1163.  
  1164.     $arr[$primary['UF_NAME']] = $primary;
  1165.     $content = serialize($arr);
  1166.     //file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/include/arrFilters.php', $content);
  1167. }
  1168.  
  1169. /**
  1170.  * @param Main\Event $event
  1171.  *
  1172.  * Отправляем даные о товарах для заказов по партнерским ссылкам
  1173.  */
  1174. function admitRefer(Main\Event $event)
  1175. {
  1176.  
  1177.     # Игнорируемые IP
  1178.     $arIgnoredIP = [
  1179.         "95.26.233.126",
  1180.         "78.107.50.194",
  1181.         "78.107.232.188",
  1182.         "91.122.198.141"
  1183.     ];
  1184.  
  1185.     global $APPLICATION;
  1186.     $admitad_uid = $APPLICATION->get_cookie("admitad_uid");
  1187.  
  1188.     if (!in_array($_SERVER["REMOTE_ADDR"], $arIgnoredIP) && $admitad_uid) {
  1189.         $order = $event->getParameter("ENTITY");
  1190.         $basket = $order->getBasket();
  1191.         $orderId = $order->getId();
  1192.         $userId = $order->getUserId();
  1193.         $basketItems = $basket->getBasketItems();
  1194.  
  1195.         $order_goods = [];
  1196.         foreach ($basketItems as $item) {
  1197.             $order_goods[] = array(
  1198.                 "ID" => $item->getField("ID"),
  1199.                 "ORDER_ID" => $item->getField("ORDER_ID"),
  1200.                 "PRODUCT_ID" => $item->getField("PRODUCT_ID"),
  1201.                 "PRICE" => $item->getField("PRICE"),
  1202.                 "CURRENCY" => $item->getField("CURRENCY"),
  1203.                 "QUANTITY" => (int)$item->getField("QUANTITY"),
  1204.                 "USER_ID" => $userId
  1205.             );
  1206.         }
  1207.  
  1208.         AddMessage2Log('Поля заказа: ' . print_r($order_goods, true), 'studioleeft');
  1209.         if (count($order_goods) > 1) {
  1210.             AddMessage2Log('Отправляем больше одного товара', 'studioleeft');
  1211.             file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/log_admitad.txt', print_r($order_goods, true));
  1212.             foreach ($order_goods as $goodKey => $oneGood) {
  1213.                 AddMessage2Log('Оформляем запрос для товара ' . $oneGood['NAME'], 'studioleeft');
  1214.                 if ($ch = curl_init()) {
  1215.                     $link = 'https://ad.admitad.com/r?campaign_code=bf139bb810&postback=1&postback_key=8567F9B3d53ACC7335713187C182433a&action_code=1&uid=' . $admitad_uid . '&order_id=' . $orderId . '&tariff_code=1&currency_code=' . $oneGood['CURRENCY'] . '&price=' . $oneGood['PRICE'] . '&quantity=' . $oneGood['QUANTITY'] . '&position_id=' . ++$goodKey . '&position_count=' . count($order_goods) . '&product_id=' . $oneGood['PRODUCT_ID'] . '&client_id=' . $oneGood['USER_ID'] . '&payment_type=sale';
  1216.                     AddMessage2Log($link, 'studioleeft');
  1217.                     // Устанавливаем URL запроса
  1218.                     curl_setopt($ch, CURLOPT_URL, $link);
  1219.                     // Куда помещать результат выполнения запроса:
  1220.                     //  false - в стандартный поток вывода,
  1221.                     //  true - в виде возвращаемого значения функции curl_exec.
  1222.                     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  1223.                     // Выполнение запроса
  1224.                     $data = curl_exec($ch);
  1225.                     if ($data === false) {
  1226.                         AddMessage2Log("Error Number:" . curl_errno($ch) . " " . "Error String:" . curl_error($ch), 'studioleeft');
  1227.                     } else {
  1228.                         AddMessage2Log("Error Number:" . curl_errno($ch) . " " . "Error String:" . curl_error($ch) . " " . print_r($data), 'studioleeft');
  1229.                     }
  1230.  
  1231.                     // Особождение ресурса
  1232.                     curl_close($ch);
  1233.                 }
  1234.             }
  1235.         } else {
  1236.             AddMessage2Log('отправлен заказ с 1 товаром', 'studioleeft');
  1237.             // Иницализация библиотеки curl
  1238.             if ($ch = curl_init()) {
  1239.                 $link = 'https://ad.admitad.com/r?campaign_code=bf139bb810&postback=1&postback_key=8567F9B3d53ACC7335713187C182433a&action_code=1&uid=' . $admitad_uid . '&order_id=' . $orderId . '&tariff_code=1&currency_code=' . $order_goods[0]['CURRENCY'] . '&price=' . $order_goods[0]['PRICE'] . '&quantity=' . $order_goods[0]['QUANTITY'] . '&position_id=1&position_count=1&product_id=' . $order_goods[0]['PRODUCT_ID'] . '&client_id=' . $order_goods[0]['USER_ID'] . '&payment_type=sale';
  1240.                 AddMessage2Log($link, 'studioleeft');
  1241.                 // Устанавливаем URL запроса
  1242.                 curl_setopt($ch, CURLOPT_URL, $link);
  1243.  
  1244.                 // Куда помещать результат выполнения запроса:
  1245.                 //  false - в стандартный поток вывода,
  1246.                 //  true - в виде возвращаемого значения функции curl_exec.
  1247.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  1248.  
  1249.                 // Выполнение запроса
  1250.                 $data = curl_exec($ch);
  1251.                 if ($data === false) {
  1252.                     AddMessage2Log("Error Number:" . curl_errno($ch) . " " . "Error String:" . curl_error($ch), 'studioleeft');
  1253.                 }
  1254.                 // Особождение ресурса
  1255.                 curl_close($ch);
  1256.             }
  1257.         }
  1258.     }
  1259. }
  1260.  
  1261.  
  1262. function groupCompare($var1, $var2)
  1263. {
  1264.     if ($var1 == $var2) {
  1265.         return 0;
  1266.     } elseif ($var1 > $var2) {
  1267.         return 1;
  1268.     } else {
  1269.         return -1;
  1270.     }
  1271. }
  1272.  
  1273. /**
  1274.  * @param $userId
  1275.  *
  1276.  * @return mixed
  1277.  *
  1278.  * Определяем максимальную скидку бонусами, по группе пользователя
  1279.  */
  1280. function getUserBonus($userId)
  1281. {
  1282.     global $arStatusGroup;
  1283.     global $arMaximumBonusOnBuy;
  1284.  
  1285.     $arGroups = CUser::GetUserGroup($userId);
  1286.     $group = array_pop(array_uintersect($arStatusGroup, $arGroups, 'groupCompare'));
  1287.     $group = $group ? array_search($group, $arStatusGroup) : '0';
  1288.     $maximalBonusOnBuy = $arMaximumBonusOnBuy[$group];
  1289.  
  1290.     return $maximalBonusOnBuy;
  1291. }
  1292.  
  1293.  
  1294. /**
  1295.  * @param $userID
  1296.  * @param $bonusDiscount
  1297.  *
  1298.  * @return int
  1299.  *
  1300.  * Возвращаем количесво бонусов, которые можно применить как скидку
  1301.  */
  1302. function getBonusDiscountValue($userID, $bonusDiscount)
  1303. {
  1304.     $bonusCount = 0;
  1305.     if (CModule::IncludeModule("sale")) {
  1306.         if ($ar = CSaleUserAccount::GetByUserID($userID, "RUB")) {
  1307.             $bonusCount = $ar['CURRENT_BUDGET'];
  1308.         }
  1309.     }
  1310.  
  1311.     return $bonusDiscount > $bonusCount ? $bonusCount : $bonusDiscount;
  1312. }
  1313.  
  1314.  
  1315. /**
  1316.  * @param $arResult
  1317.  *
  1318.  * Обрабатываем даные из заказа при визите на старницу заказа
  1319.  */
  1320. function OnSaleComponentOrderJsDataHandler(&$arResult)
  1321. {
  1322.     if ($_REQUEST['action'] != 'refreshOrderAjax') {
  1323.         prepareOrderBasket($arResult['JS_DATA']);
  1324.     }
  1325. }
  1326.  
  1327. /**
  1328.  * @param $arResult
  1329.  *
  1330.  * Обрабатываем даные из заказа перед отравкой ajax ответа
  1331.  */
  1332. function OnSaleComponentOrderShowAjaxAnswerHandler(&$arResult)
  1333. {
  1334.     prepareOrderBasket($arResult['order']);
  1335. }
  1336.  
  1337.  
  1338. /**
  1339.  * @param $data
  1340.  *
  1341.  * Рассчитываем скидку баллами для товаров, без скидок
  1342.  */
  1343. function prepareOrderBasket(&$data)
  1344. {
  1345.     global $USER;
  1346.  
  1347.     $userID = $USER->GetId();
  1348.  
  1349.     $discount = getPersonalDiscount($userID);
  1350.     $additionDiscount = $bonusCount = $userBudget = 0;
  1351.  
  1352.     $activePaySystem = 0;
  1353.     foreach ($data["PAY_SYSTEM"] as $paySystem) {
  1354.         if ($paySystem["CHECKED"] == "Y") {
  1355.             $activePaySystem = $paySystem["ID"];
  1356.         }
  1357.     }
  1358.     if (discountIsAllowed($activePaySystem, $userID)) {
  1359.         # Определяем количество бонусов на счете пользователя
  1360.         if (CModule::IncludeModule("sale")) {
  1361.             if ($ar = CSaleUserAccount::GetByUserID($USER->GetId(), "RUB")) {
  1362.                 $bonusCount = $ar['CURRENT_BUDGET'];
  1363.             }
  1364.         }
  1365.  
  1366.         if ($bonusCount) {
  1367.             foreach ($data['GRID']['ROWS'] as &$item) {
  1368.                 if ($item['data']['DISCOUNT_PRICE'] == 0) {
  1369.                     $stepDiscount = $item['data']['PRICE'] * $discount * $item['data']['QUANTITY'];
  1370.                     if ($stepDiscount > $bonusCount) {
  1371.                         $stepDiscount = $bonusCount;
  1372.                     }
  1373.                     $item['data']['SUM_NUM'] -= $stepDiscount;
  1374.                     $item['data']['PRICE'] -= $stepDiscount / $item['data']['QUANTITY'] * $discount;
  1375.                     $item['data']['SUM'] = CCurrencyLang::CurrencyFormat($item['data']['SUM_NUM'], 'RUB');
  1376.                     $item['data']['DISCOUNT_PRICE'] = $item['data']['BASE_PRICE'] - $item['data']['PRICE'];
  1377.                     $item['data']['DISCOUNT_PRICE_PERCENT'] = round(100 - ($item['data']['PRICE'] / $item['data']['BASE_PRICE']));
  1378.                     $item['data']['DISCOUNT_PRICE_PERCENT_FORMATED'] = $item['data']['DISCOUNT_PRICE_PERCENT'] . '%';
  1379.                     $additionDiscount += $stepDiscount;
  1380.  
  1381.                     $bonusCount -= $stepDiscount;
  1382.                     if ($bonusCount < 0) {
  1383.                         $bonusCount = 0;
  1384.                     }
  1385.                 }
  1386.             }
  1387.  
  1388.             $additionDiscount = getBonusDiscountValue($userID, $additionDiscount);
  1389.  
  1390.             $data['TOTAL']['ORDER_PRICE'] -= $additionDiscount;
  1391.             $data['TOTAL']['ORDER_PRICE_FORMATED'] = CCurrencyLang::CurrencyFormat(
  1392.                 $data['TOTAL']['ORDER_PRICE'],
  1393.                 'RUB'
  1394.             );
  1395.             $data['TOTAL']['ORDER_TOTAL_PRICE'] -= $additionDiscount;
  1396.             $data['TOTAL']['ORDER_TOTAL_PRICE_FORMATED'] = CCurrencyLang::CurrencyFormat(
  1397.                 $data['TOTAL']['ORDER_TOTAL_PRICE'],
  1398.                 'RUB'
  1399.             );
  1400.             $data['TOTAL']['DISCOUNT_PRICE'] += $additionDiscount;
  1401.             $data['TOTAL']['DISCOUNT_PRICE_FORMATED'] = CCurrencyLang::CurrencyFormat(
  1402.                 $data['TOTAL']['DISCOUNT_PRICE'],
  1403.                 'RUB'
  1404.             );
  1405.         }
  1406.     }
  1407. }
  1408.  
  1409.  
  1410. /**
  1411.  * @param $paySystemID
  1412.  * @param $userID
  1413.  *
  1414.  * @return bool
  1415.  *
  1416.  * Проверяем, разрешена ли пользователю скидка
  1417.  */
  1418. function discountIsAllowed($paySystemID, $userID)
  1419. {
  1420.     global $online_paysystem;
  1421.     if (in_array($paySystemID, $online_paysystem)) {
  1422.         return false;
  1423.     }
  1424.  
  1425.     if (isset($userID)) {
  1426.         $arGroups = CUser::GetUserGroup($userID);
  1427.     } else {
  1428.         global $USER;
  1429.         $arGroups = $USER->GetUserGroupArray();
  1430.     }
  1431.  
  1432.     $managerGroups = array(1, 6, 20);
  1433.     $resultGroups = array_intersect($arGroups, $managerGroups);
  1434.  
  1435.     if (count($resultGroups) > 0) {
  1436.         return false;
  1437.     }
  1438.  
  1439.     return true;
  1440. }
  1441.  
  1442. function dump($var, $break = false)
  1443. {
  1444.     echo '<pre>';
  1445.     print_r($var);
  1446.     echo '</pre>';
  1447.     if ($break) {
  1448. die();
  1449.     }
  1450. }
  1451.  
  1452.  
  1453. class Order
  1454. {
  1455.     public function OnAfterOrderPaid($orderID = 0, &$eventName, &$arFields)
  1456.     {
  1457.  
  1458.  
  1459.         $arOrder = CSaleOrder::GetByID($orderID);
  1460.         $arPaySystem = CSalePaySystem::GetByID($arOrder["PAY_SYSTEM_ID"]);
  1461.  
  1462.         if ($arPaySystem["ID"] == 1 && $eventName == "SALE_ORDER_PAID") {
  1463.             die();
  1464.         } else {
  1465.             $ORDER_ID = $orderID;
  1466.             $rows = 'Номер заказа: ' . $ORDER_ID . '<br/>';
  1467.             if (!empty($arOrder)) {
  1468.                 # Рассчитываем скидку бонусами, так как на момент отправки письма она еще не записана в заказ
  1469.                 if (discountIsAllowed($arOrder['PAY_SYSTEM_ID'], $arOrder['USER_ID'])) {
  1470.                     global $USER;
  1471.                     $userId = $USER->GetId();
  1472.  
  1473.                     $basketItems = Bitrix\Sale\Order::load($orderID)->getBasket()->getBasketItems();
  1474.  
  1475.                     $personalDiscount = getPersonalDiscount($userId);
  1476.  
  1477.                     # Выбираем из корзины товары без скидки и считаем величину скидки бонусами по этим товарам
  1478.                     $bonusDiscount = $bonusCount = 0;
  1479.                     foreach ($basketItems as $basketItem) {
  1480.                         if ($basketItem->getField('DISCOUNT_PRICE') == 0) {
  1481.                             $bonusDiscount += ($basketItem->getPrice() * $basketItem->getQuantity()) * $personalDiscount;
  1482.                         }
  1483.                     }
  1484.  
  1485.                     # Получаем количество бонусов, которые можно списать со счета пользователя
  1486.                     $bonusDiscount = getBonusDiscountValue($userId, $bonusDiscount);
  1487.  
  1488.                     $arOrder['SUM_PAID'] = round($bonusDiscount);
  1489.                 }
  1490.  
  1491.                 $db_props = CSaleOrderPropsValue::GetOrderProps($ORDER_ID);
  1492.                 while ($arProps = $db_props->Fetch()) {
  1493.                     $rows .= '';
  1494.                     $val = '';
  1495.                     switch ($arProps['CODE']) {
  1496.                         case 'FIO':
  1497.                             $val = $arProps['VALUE'];
  1498.                             $label = 'Получатель';
  1499.                             break;
  1500.                         case 'LOCATION':
  1501.                             $loc = CSaleLocation::GetByID($arProps['VALUE']);
  1502.                             $val = $loc['CITY_NAME_ORIG'];
  1503.                             $label = 'Город';
  1504.                             break;
  1505.                         case 'EMAIL':
  1506.                             $val = $arProps['VALUE'];
  1507.                             $label = $arProps['PROPERTY_NAME'];
  1508.                             break;
  1509.                         case 'ADDRESS':
  1510.                             $val = $arProps['VALUE'];
  1511.                             $label = $arProps['PROPERTY_NAME'];
  1512.                             break;
  1513.                     }
  1514.  
  1515.                     if (!empty($val)) {
  1516.                         $rows .= '' . $label . ': ';
  1517.                         $rows .= '' . $val . '';
  1518.                         $rows .= '<br/>';
  1519.                     }
  1520.                 }
  1521.                 if (!empty($arOrder['PS_STATUS_DESCRIPTION'])) {
  1522.                     $rows .= 'Платежная система' . $arOrder['PS_STATUS_DESCRIPTION'] . '<br/>';
  1523.                 }
  1524.  
  1525.  
  1526.                 if (!empty($arOrder['USER_DESCRIPTION'])) {
  1527.                     $rows .= 'Доп.инфо: ' . $arOrder['USER_DESCRIPTION'] . ' <br/>';
  1528.                 }
  1529.  
  1530.                 $arDeliv = CSaleDelivery::GetByID($arOrder['DELIVERY_ID']);
  1531.                 if ($arDeliv) {
  1532.                     $arOrderInfo['DELIVERY'] = $arDeliv['NAME'];
  1533.                     $rows .= 'Способ доставки:  ' . $arDeliv['NAME'] . ' <br/>';
  1534.                 }
  1535.  
  1536.                 $dbBasketItems = CSaleBasket::GetList(
  1537.                     array(
  1538.                         "NAME" => "ASC",
  1539.                         "ID" => "ASC"
  1540.                     ),
  1541.                     array(
  1542.                         "ORDER_ID" => $ORDER_ID
  1543.                     ),
  1544.                     false,
  1545.                     false,
  1546.                     array(
  1547.                         "ID",
  1548.                         "NAME",
  1549.                         "PRODUCT_ID",
  1550.                         "QUANTITY",
  1551.                         "PRICE",
  1552.                         "PROPERTY_PRODUCT"
  1553.                     )
  1554.                 );
  1555.                 $itemProps = array('ART', 'NAME', 'QUANTITY', 'PRICE');
  1556.                 $i = 1;
  1557.                 $total = 0;
  1558.                 $rows .= '<br/><b>Список товаров</b>: <br/>';
  1559.                 while ($arItems = $dbBasketItems->Fetch()) {
  1560.                     $n = getProps($arItems['PRODUCT_ID']);
  1561.                     $arItems['DPU'] = $n['DETAIL_PAGE_URL'];
  1562.                     $arItems['ART'] = $n['PROPERTY_ARTNUMBER_VALUE'];
  1563.  
  1564.                     $total += floatval($arItems['PRICE']) * floatval($arItems['QUANTITY']);
  1565.                     //$t[] = $arItems;
  1566.                     $rows .= '<a href="http://' . SITE_SERVER_NAME . $arItems['DPU'] . '">' . '[' . $arItems['ART'] . '] ' . $arItems['NAME'] . '</a>' . ' ' . $arItems['QUANTITY'] . ' ' . round($arItems['PRICE'], 2, PHP_ROUND_HALF_UP) . ' руб. <br/>';
  1567.                 }
  1568.                 $rows .= '<br/>Стоимость заказа:' . round($total, 0, PHP_ROUND_HALF_UP) . ' руб. <br/>';
  1569.                 $rows .= 'Доставка:  ' . round($arOrder['PRICE_DELIVERY'], 0, PHP_ROUND_HALF_UP) . ' руб. <br/>';
  1570.  
  1571.                 if ($arOrder['PAYED'] == 'N') {
  1572.                     $bonus = isset($arOrder['SUM_PAID']) ? $arOrder['SUM_PAID'] : 0;
  1573.                     if ($bonus > 0) {
  1574. $rows .= 'Бонусная скидка: ' . round($bonus, 0, PHP_ROUND_HALF_UP) . ' руб. <br/>';
  1575.                     }
  1576.                     $rows .= 'Сумма к оплате: ' . round(floatval($arOrder['PRICE']) - floatval($bonus), 0, PHP_ROUND_HALF_UP) . ' руб.  <br/>';
  1577.                 } elseif ($arOrder['PAYED'] == 'Y') {
  1578.                     if (($arOrder['PRICE'] != $arOrder['SUM_PAID']) && (isset($arOrder['SUM_PAID']) > 0)) {
  1579.                         $bonus = isset($arOrder['SUM_PAID']) ? $arOrder['SUM_PAID'] : 0;
  1580.                         $rows .= 'Бонусная скидка : ' . round(($arOrder['PRICE']) - floatval($bonus), 0, PHP_ROUND_HALF_UP) . ' руб.  <br/>';
  1581.                     }
  1582.  
  1583.                     $rows .= 'Оплачено: ' . round($arOrder['SUM_PAID'], 0, PHP_ROUND_HALF_UP) . ' руб. ';
  1584.                 }
  1585.  
  1586.                 $table = '<p class="table">' . $rows . '</p>';
  1587.  
  1588.                 $arFields['TABLE_INFO'] = $table;
  1589.             }
  1590.             /*echo '<pre>';
  1591.             print_r($t);
  1592.             echo '</pre>';*/
  1593.  
  1594.             /*$res = CSaleUserTransact::GetList(Array("ID" => "DESC"), array("ORDER_ID" => $arOrder['ID']));
  1595.             while ($arFields = $res->Fetch()){
  1596.  
  1597.                 echo '<pre>';
  1598.                 print_r($arOrder);
  1599.                 echo '</pre>';
  1600.             }*/
  1601.         }
  1602.     }
  1603.  
  1604.     public function helloworld($arr)
  1605.     {
  1606.         file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/dump.json', json_encode($arr));
  1607.     }
  1608.  
  1609.     public function test($id)
  1610.     {
  1611.         $dbUserAccount = CSaleUserAccount::GetList(
  1612.             array(),
  1613.             array(
  1614.                 "USER_ID" => 1,
  1615.             )
  1616.         );
  1617.  
  1618.         if ($arUserAccount = $dbUserAccount->GetNext()) {
  1619.             echo '<pre>';
  1620.             print_r($arUserAccount);
  1621.             echo '</pre>';
  1622.         }
  1623.     }
  1624. }
  1625.  
  1626. function getProps($prodID)
  1627. {
  1628.     $mxResult = CCatalogSku::GetProductInfo($prodID);
  1629.  
  1630.     $arOrder = array("SORT" => "ASC");
  1631.     $arFilter = array('ID' => $mxResult['ID'], 'IBLOCK_ID' => $mxResult['IBLOCK_ID']);
  1632.     $arSelectFields = array("ID", "ACTIVE", "NAME", 'PROPERTY_ARTNUMBER', 'DETAIL_PAGE_URL');
  1633.     $rsElements = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelectFields);
  1634.     while ($arElement = $rsElements->GetNext()) {
  1635.         return $arElement;
  1636.     }
  1637.  
  1638.     return false;
  1639. }
  1640.  
  1641.  
  1642. /*if (isset($_REQUEST['order_id']) && ($_REQUEST['order_id'] > 0))
  1643. {
  1644.     Fact_CSaleOrder::getOrderInfo($_REQUEST['order_id'],1);
  1645. }
  1646.  
  1647. use Fact;
  1648.  
  1649. //Fact\CSaleOrder::getOrderInfo(887,1);
  1650.  
  1651. Fact\CSaleUserTransact::getTransactionsByOrder(882);
  1652.  
  1653. */
  1654. function delete_basket()
  1655. {
  1656.     global $DB;
  1657.     $nDays = 30;
  1658.     $nDays = IntVal($nDays);
  1659.     $strSql =
  1660.         "SELECT ID " .
  1661.         "FROM b_sale_fuser " .
  1662.         "WHERE TO_DAYS(DATE_UPDATE)<(TO_DAYS(NOW())-" . $nDays . ") LIMIT 380";
  1663.     $db_res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
  1664.     while ($ar_res = $db_res->Fetch()) {
  1665.         CSaleBasket::DeleteAll($ar_res["ID"], false);
  1666.         CSaleUser::Delete($ar_res["ID"]);
  1667.     }
  1668.  
  1669.     return "delete_basket();";
  1670. }
  1671.  
  1672.  
  1673. function getDelivery($offers)
  1674. {
  1675.     $sum = 0;
  1676.     $None = 0;
  1677.     foreach ($offers as $offer) {
  1678.         if ($offer['DISPLAY_PROPERTIES']['ATT_AVAILABLE']['VALUE'] == 'N') {
  1679.             $None++;
  1680.         } else {
  1681.             $sum = $sum + intval($offer['CATALOG_QUANTITY']);
  1682.         }
  1683.     }
  1684.     if (($None > 0) && ($None == (count($offers)))) {
  1685.         return -1;
  1686.     }
  1687.  
  1688.     if ($sum > 0) {
  1689.         return 1;
  1690.     } else {
  1691.         return 0;
  1692.     }
  1693. }
  1694.  
  1695.  
  1696. function StudiofactMailOnBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu)
  1697. {
  1698.     $aModuleMenu[] = array(
  1699.         'parent_menu' => 'global_menu_store',
  1700.         'text' => 'Импорт/Экспорт каталога',
  1701.         'url' => '/bitrix/admin/import_to_csv.php',
  1702.         'title' => 'Импорт/Экспорт каталога/',
  1703.         'icon' => 'studiofact_mail_icon',
  1704.     );
  1705. }
  1706.  
  1707. function setMetaTagsTemplates()
  1708. {
  1709.  
  1710.     CModule::IncludeModule("iblock");
  1711.     $arF = array('IBLOCK_ID' => CATALOG_ID, "SECTION_ID" => 0);
  1712.     $db_l = CIBlockSection::GetList(array("NAME" => "DESC"), $arF, false, array(), false);
  1713.     while ($ar_res = $db_l->GetNext()) {
  1714.         echo $ar_res['NAME'] . '<br>';
  1715.         if ($ar_res["ID"] == BRANDS_SECTION) {
  1716.             $arFilter = array('IBLOCK_ID' => CATALOG_ID, "SECTION_ID" => $ar_res["ID"]);
  1717.             $db_list = CIBlockSection::GetList(array("NAME" => "ASC"), $arFilter, false, array(), false);
  1718.             while ($ar_result = $db_list->GetNext()) {
  1719.                 //----------------------
  1720.                 $ipropTemplates = new InheritedProperty\SectionTemplates(3, $ar_result['ID']);
  1721.                 $ipropTemplates->set(array(
  1722.                     "SECTION_META_TITLE" => "{=this.Name} купить по лучшим ценам. Только оригинальная продукция на официальном сайте Gracy.ru",
  1723.                     "SECTION_META_DESCRIPTION" => "{=this.Name}. Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1724.                 ));
  1725.                 $ipropValues = new InheritedProperty\SectionValues(3, $ar_result['ID']);
  1726.                 $values = $ipropValues->getValues();
  1727.                 echo $values ["SECTION_META_TITLE"] . "<br/>";
  1728.                 echo $values ["SECTION_META_DESCRIPTION"] . "<br/>";
  1729.                 $ipropValues->clearValues();
  1730.                 //----------------------
  1731.                 $arFilter2 = array('IBLOCK_ID' => CATALOG_ID, "SECTION_ID" => $ar_result['ID']);
  1732.                 $db_list2 = CIBlockSection::GetList(array("NAME" => "ASC"), $arFilter2, false, array(), false);
  1733.                 while ($ar_result2 = $db_list2->GetNext()) {
  1734.                     echo "&nbsp;&nbsp;&nbsp;" . $ar_result2['ID'] . ' ' . $ar_result2['NAME'] . ': ' . $ar_result2['DEPTH_LEVEL'] . '<br>';
  1735.                     //----------------------
  1736.                     $ipropTemplates = new InheritedProperty\SectionTemplates(3, $ar_result2['ID']);
  1737.                     $ipropTemplates->set(array(
  1738.                         "SECTION_META_TITLE" => "{=parent.Name} {=this.Name} купить по лучшим ценам. Только оригинальная продукция на официальном сайте Gracy.ru",
  1739.                         "SECTION_META_DESCRIPTION" => "{=parent.Name} {=this.Name}. Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1740.                     ));
  1741.                     $ipropValues = new InheritedProperty\SectionValues(3, $ar_result2['ID']);
  1742.                     $values = $ipropValues->getValues();
  1743.                     echo $values ["SECTION_META_TITLE"] . "<br/>";
  1744.                     echo $values ["SECTION_META_DESCRIPTION"] . "<br/>";
  1745.                     $ipropValues->clearValues();
  1746.                     //----------------------
  1747.                 }
  1748.             }
  1749.         } else {
  1750.             echo $ar_res['DEPTH_LEVEL'] . "&nbsp;" . $ar_res['ID'] . ' ' . $ar_res['NAME'] . ': <br>';
  1751.             $arFilter = array('IBLOCK_ID' => CATALOG_ID, "SECTION_ID" => $ar_res["ID"]);
  1752.             $db_list = CIBlockSection::GetList(array("NAME" => "DESC"), $arFilter, false, array(), false);
  1753.             //----------------------
  1754.             $ipropTemplates = new InheritedProperty\SectionTemplates(3, $ar_res['ID']);
  1755.             $ipropTemplates->set(array(
  1756.                 "SECTION_META_TITLE" => " ",
  1757.                 "SECTION_META_DESCRIPTION" => "{=this.Name}. Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1758.             ));
  1759.             $ipropValues = new InheritedProperty\SectionValues(3, $ar_res['ID']);
  1760.             $values = $ipropValues->getValues();
  1761.             echo "t1: " . $values ["SECTION_META_TITLE"] . "<br/>";
  1762.             echo "d1: " . $values ["SECTION_META_DESCRIPTION"] . "<br/>";
  1763.             $ipropValues->clearValues();
  1764.             //----------------------
  1765.             while ($ar_result = $db_list->GetNext()) {
  1766.                 echo $ar_result['DEPTH_LEVEL'] . "&nbsp;" . $ar_result['ID'] . ' ' . $ar_result['NAME'] . ': <br>';
  1767.                 //----------------------
  1768.                 $ipropTemplates = new InheritedProperty\SectionTemplates(3, $ar_result['ID']);
  1769.                 $ipropTemplates->set(array(
  1770.                     "SECTION_META_TITLE" => "{=this.Name}. Купить профессиональную косметику и аксессуары по самым выгодным ценам.",
  1771.                     "SECTION_META_DESCRIPTION" => "{=this.Name}. Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1772.                 ));
  1773.                 $ipropValues = new InheritedProperty\SectionValues(3, $ar_result['ID']);
  1774.                 $values = $ipropValues->getValues();
  1775.                 echo "t2: " . $values ["SECTION_META_TITLE"] . "<br/>";
  1776.                 echo "d2: " . $values ["SECTION_META_DESCRIPTION"] . "<br/>";
  1777.                 $ipropValues->clearValues();
  1778.                 //----------------------
  1779.                 $arFilter2 = array('IBLOCK_ID' => CATALOG_ID, "SECTION_ID" => $ar_result['ID']);
  1780.                 $db_list2 = CIBlockSection::GetList(array("NAME" => "ASC"), $arFilter2, false, array(), false);
  1781.                 while ($ar_result2 = $db_list2->GetNext()) {
  1782.                     echo $ar_result2['DEPTH_LEVEL'] . "&nbsp;&nbsp;&nbsp;" . $ar_result2['ID'] . ' ' . $ar_result2['NAME'] . ': <br>';
  1783.                     //----------------------
  1784.                     $ipropTemplates = new InheritedProperty\SectionTemplates(3, $ar_result2['ID']);
  1785.                     $ipropTemplates->set(array(
  1786.                         "SECTION_META_TITLE" => "{=parent.Name} - {=this.Name}. Купить профессиональную косметику и аксессуары по самым выгодным ценам.",
  1787.                         "SECTION_META_DESCRIPTION" => "{=parent.Name} - {=this.Name}. Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1788.                     ));
  1789.                     $ipropValues = new InheritedProperty\SectionValues(3, $ar_result2['ID']);
  1790.                     $values = $ipropValues->getValues();
  1791.                     echo "t3: " . $values ["SECTION_META_TITLE"] . "<br/>";
  1792.                     echo "d3: " . $values ["SECTION_META_DESCRIPTION"] . "<br/>";
  1793.                     $ipropValues->clearValues();
  1794.                 }
  1795.             }
  1796.         }
  1797.     }
  1798. }
  1799.  
  1800. function checkMetaTags($n = 10)
  1801. {
  1802.     include("parse.php");
  1803.  
  1804.     $dir = $_SERVER["DOCUMENT_ROOT"] . '/upload/pages/';
  1805.     $files1 = scandir($dir);
  1806.  
  1807.     foreach ($files1 as $file) {
  1808.         if ($file != "." || $file != "..") {
  1809.             $arr = array("id" => explode(".", $file));
  1810.             $html = file_get_contents($_SERVER["DOCUMENT_ROOT"] . '/upload/pages/' . $file);
  1811.             $saw = new nokogiri($html);
  1812.  
  1813.             $str = $saw->get('h1')->toArray();
  1814.             $arr["h1"] = $str["#text"];
  1815.  
  1816.             $str = $saw->get('title')->toArray();
  1817.             $arr["title"] = $str["#text"];
  1818.  
  1819.             $str = $saw->get('meta')->toArray();
  1820.             foreach ($str as $descr) {
  1821.                 if ($descr["name"] == "description") {
  1822.                     $arr["description"] = $descr["content"];
  1823.                 }
  1824.             }
  1825.         }
  1826.         var_dump($arr);
  1827.     }
  1828. }
  1829.  
  1830.  
  1831. class OnAfterIBlockSectionAdd
  1832. {
  1833.     // создаем обработчик события "OnAfterIBlockSectionAdd"
  1834.     function OnAfterIBlockSectionAddHandler(&$arFields)
  1835.     {
  1836.         $arFilter = array("ID" => $arFields['ID']);
  1837.         $arSelect = array("ID", "CODE", "NAME", "IBLOCK_SECTION_ID");
  1838.         $res = CIBlockSection::GetList(array(), $arFilter, false, $arSelect, array("nPageSize" => 50));
  1839.         while ($ar_props = $res->GetNext()) {
  1840.             $PROPS = $ar_props['IBLOCK_SECTION_ID'];
  1841.         }
  1842.  
  1843.         $res = CIBlockSection::GetList(array(), array("ID" => $PROPS), false, $arSelect, array("nPageSize" => 50));
  1844.         while ($ar_props = $res->GetNext()) {
  1845.             $SECTION_NAME = $ar_props['NAME'] . " ";
  1846.         }
  1847.         if ($arFields["IBLOCK_SECTION_ID"] == BRANDS_SECTION) {
  1848.             $SECTION_NAME = "";
  1849.         }
  1850.         if ($arFields["IBLOCK_ID"] == CATALOG_ID) {
  1851.             $ipropTemplates = new InheritedProperty\SectionTemplates(3, $arFields['ID']);
  1852.             $ipropTemplates->set(array(
  1853.                 "SECTION_META_TITLE" => $SECTION_NAME . $arFields['NAME'] . " купить по лучшим ценам. Только оригинальная продукция на официальном сайте Gracy.ru",
  1854.                 "SECTION_META_DESCRIPTION" => $SECTION_NAME . $arFields['NAME'] . " Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1855.             ));
  1856.         }
  1857.     }
  1858. }
  1859.  
  1860.  
  1861. class OnAfterIBlockElementAdd
  1862. {
  1863.  
  1864.     function OnAfterIBlockElementAddHandler(&$arFields)
  1865.     {
  1866.         $BRAND = "";
  1867.         $db_old_groups = CIBlockElement::GetElementGroups($arFields["ID"], true);
  1868.         while ($ar_group = $db_old_groups->Fetch()) {
  1869.             $ar_new_groups[] = $ar_group["IBLOCK_SECTION_ID"];
  1870.             $ar_codes[] = $ar_group["ID"];
  1871.             $need = BRANDS_SECTION;
  1872.         }
  1873.         if (in_array($need, $ar_new_groups)) {
  1874.             foreach ($ar_codes as $key => $group) {
  1875.                 $product_name = CIBlockSection::GetById($group);
  1876.                 if ($product = $product_name->GetNext()) {
  1877.                     if ($product["IBLOCK_SECTION_ID"] == BRANDS_SECTION) {
  1878.                         $arCode = $ar_codes[$key];
  1879.                         $BRAND = $product["NAME"];
  1880.                     }
  1881.                 }
  1882.             }
  1883.         } else {
  1884.             foreach ($ar_new_groups as $key => $group) {
  1885.                 $product_name = CIBlockSection::GetById($group);
  1886.                 if ($product = $product_name->GetNext()) {
  1887.                     if ($product["IBLOCK_SECTION_ID"] == BRANDS_SECTION) {
  1888.                         $arCode = $ar_codes[$key];
  1889.                         $BRAND = $product["NAME"];
  1890.                     }
  1891.                 }
  1892.             }
  1893.         }
  1894.  
  1895.         if ($arFields["IBLOCK_ID"] == CATALOG_ID) {
  1896.             $ipropTemplates = new InheritedProperty\ElementTemplates(3, $arFields['ID']);
  1897.             $ipropTemplates->set(array(
  1898.                 "ELEMENT_META_TITLE" => $BRAND . " " . $arFields['NAME'] . " купить по выгодной цене на официальном сайте Gracy.ru",
  1899.                 "ELEMENT_META_DESCRIPTION" => $BRAND . " " . $arFields['NAME'] . " Интернет-магазин Gracy предлагает выгодные цены, бесплатную доставку в любую точку России при сумме заказа от 3000 руб., подарки в каждом заказе, разнообразные скидки и бонусы. Сотрудничаем только с официальными поставщиками!",
  1900.             ));
  1901.         }
  1902.     }
  1903. }
  1904.  
  1905. function BeforeIndexHandler($arFields)
  1906. {
  1907.     $arrIblock = array(CATALOG_ID);    //ID инфоблоков, для которых производить модификацию
  1908.     $arDelFields = array("DETAIL_TEXT" /*, "PREVIEW_TEXT"*/);    //стандартные поля, которые нужно исключить
  1909.     if (CModule::IncludeModule('iblock') && $arFields["MODULE_ID"] == 'iblock' && in_array($arFields["PARAM2"], $arrIblock) && intval($arFields["ITEM_ID"]) > 0) {
  1910.         $dbElement = CIBlockElement::GetList(array(), array("ID" => $arFields["ITEM_ID"]), false, array(), $arDelFields);
  1911.         if ($arElement = $dbElement->Fetch()) {
  1912.             foreach ($arDelFields as $value) {
  1913.                 if (isset($arElement[$value]) && strlen($arElement[$value]) > 0) {
  1914.                     $arFields["BODY"] = str_replace(CSearch::KillTags($arElement[$value]), "", $arFields["BODY"]);
  1915.                 }
  1916.             }
  1917.         }
  1918.  
  1919.         return $arFields;
  1920.     }
  1921. }
  1922.  
  1923.  
  1924. class OnBeforeIBlockElement
  1925. {
  1926.     // создаем обработчик события "OnBeforeIBlockElementUpdate"
  1927.     function OnBeforeIBlockElementUpdateHandler(&$arFields)
  1928.     {
  1929.         if ($arFields["IBLOCK_ID"] == CATALOG_ID) {
  1930.             CModule::IncludeModule("iblock");
  1931.             CModule::IncludeModule("catalog");
  1932.             $mxResult = CCatalogSKU::GetInfoByProductIBlock(CATALOG_ID);
  1933.             if (is_array($mxResult)) {
  1934.                 $rsOffers = CIBlockElement::GetList(array(), array('IBLOCK_ID' => $mxResult['IBLOCK_ID'], 'PROPERTY_' . $mxResult['SKU_PROPERTY_ID'] => $arFields["ID"]));
  1935.                 while ($arOffer = $rsOffers->GetNext()) {
  1936.                     $link = $offers_id[] = $arOffer["ID"];
  1937.                 }
  1938.                 foreach ($offers_id as $key => $offer_id) {
  1939.                     $db_props = CIBlockElement::GetProperty(SKU_IBLOCK_ID, $offer_id, array("sort" => "asc"), array("CODE" => "ATT_AVAILABLE"));
  1940.                     //$available = false;
  1941.                     while ($ar_props = $db_props->Fetch()) {
  1942.                         if (IntVal($ar_props["VALUE"]) == 12085) {
  1943.                             $available[] = IntVal($ar_props["VALUE"]);
  1944.                         } else {
  1945.                             $db_props1 = CIBlockElement::GetProperty(SKU_IBLOCK_ID, $offer_id, array("sort" => "asc"), array("CODE" => "REPORT"));
  1946.                             while ($ar_props1 = $db_props1->Fetch()) {
  1947.                                 if (IntVal($ar_props1["VALUE"]) == 12509) {
  1948.                                     $ids[] = $offer_id;
  1949.                                     $available[] = 1;
  1950.                                     CIBlockElement::SetPropertyValuesEx($offer_id, SKU_IBLOCK_ID, array("REPORT" => 12510));
  1951.                                 }
  1952.                             }
  1953.                         }
  1954.                     }
  1955.                 }
  1956.                 array_push($ids, $arFields["ID"]);
  1957.             }
  1958.  
  1959.             if (in_array(1, $available)) {
  1960.                 $subscr = CIBlockElement::GetList(array(), array("IBLOCK_ID" => 15, "PROPERTY_PRODUCT" => $ids), false, array("nPageSize" => 100), array("NAME", "DETAIL_PAGE_URL", "PROPERTY_EMAIL", "PROPERTY_NAME", "PROPERTY_LINK", "PROPERTY_BRAND"));
  1961.                 while ($subscribers = $subscr->GetNext()) {
  1962.                     $toSend = array();
  1963.                     $toSend["EMAIL_TO"] = $subscribers['PROPERTY_EMAIL_VALUE'];
  1964.                     $toSend["NAME"] = $subscribers['PROPERTY_NAME_VALUE'];
  1965.                     $toSend["PRODUCT_LINK"] = $subscribers['PROPERTY_LINK_VALUE'];
  1966.                     $toSend["PRODUCT_NAME"] = $arFields["NAME"];
  1967.                     $toSend["PRODUCT_BRAND"] = $subscribers['PROPERTY_BRAND_VALUE'];
  1968.                     CEvent::SendImmediate("SALE_SUBSCRIBE_PRODUCT", s1, $toSend);
  1969.                 }
  1970.             }
  1971.         }
  1972.     }
  1973. }
  1974.  
  1975.  
  1976. class SaleHandler
  1977. {
  1978.     function payOrder($id, $val)
  1979.     {
  1980.  
  1981.         global $USER;
  1982.         global $DB;
  1983.         CModule::IncludeModule("sale");
  1984.         CModule::IncludeModule("catalog");
  1985.  
  1986.         if (isset($id) && $id != '' && $val = "Y") {
  1987.             $dbOrder = CSaleOrder::GetList(array('ID' => 'DESC'), array('ID' => $id), false, false, array("USER_ID"));
  1988.             if ($arOrder = $dbOrder->Fetch()) {
  1989.                 $USER_ID = $arOrder["USER_ID"];
  1990.             }
  1991.  
  1992.             $arGroups = CUser::GetUserGroup($USER_ID);
  1993.  
  1994.             if (!in_array(1, $arGroups) && !in_array(6, $arGroups) && !in_array(20, $arGroups)) {
  1995.                 $rsUser = CUser::GetByID($USER_ID);
  1996.                 $arUser = $rsUser->Fetch();
  1997.                 $current_status = $arUser["UF_GRACY_STATUS"];
  1998.  
  1999.                 $arOrders = array();
  2000.                 $sum = 0;
  2001.  
  2002.                 $new_status = "";
  2003.                 $current_status = "";
  2004.                 $coupon_send_cnt = $arUser["UF_GRACY_COUPON_CNT"];
  2005.  
  2006.                 $arFilter = array("PAYED" => "Y", "USER_ID" => $USER_ID);
  2007.                 $db_sales = CSaleOrder::GetList(array("DATE_PAYED" => "ASC"), $arFilter, array('USER_ID', 'PRICE', 'DATE_PAYED', 'ID'));
  2008.  
  2009.                 while ($ar_sales = $db_sales->Fetch()) {
  2010.                     $dbAccountCurrency = CSaleUserTransact::GetList(
  2011.                         array(),
  2012.                         array("ORDER_ID" => $ar_sales["ID"]),
  2013.                         false,
  2014.                         false,
  2015.                         array()
  2016.                     );
  2017.  
  2018.                     $sum_bonus = 0;
  2019.                     while ($arAccountCurrency = $dbAccountCurrency->Fetch()) {
  2020.                         if ($arAccountCurrency["DEBIT"] == "N") {
  2021.                             $sum_bonus += $arAccountCurrency["AMOUNT"];
  2022.                         } else {
  2023.                             $sum_bonus -= $arAccountCurrency["AMOUNT"];
  2024.                         }
  2025.                     }
  2026.  
  2027.                     $sum += $ar_sales["PRICE"] - $sum_bonus;
  2028.  
  2029.                     $arOrders = array("USER_ID" => $ar_sales["USER_ID"],
  2030.                         "EMAIL" => $arUser["EMAIL"],
  2031.                         "NAME" => $arUser["NAME"],
  2032.                         "PRICE" => $sum,
  2033.                         "DATE_PAYED" => $ar_sales["DATE_PAYED"],
  2034.                     );
  2035.                 }
  2036.  
  2037.                 $arGroups = CUser::GetUserGroup($USER_ID);
  2038.  
  2039.                 if ($arOrders["PRICE"] >= 50000) {
  2040.                     $new_status = "bordo";
  2041.                     $sale_for_status = 3;
  2042.                     if (($key = array_search(9, $arGroups)) !== false) {
  2043.                         unset($arGroups[$key]);
  2044.                     }
  2045.                     if (($key = array_search(10, $arGroups)) !== false) {
  2046.                         unset($arGroups[$key]);
  2047.                     }
  2048.                     $arGroups[] = 11;
  2049.                     $for_next_status = "";
  2050.                 } elseif ($arOrders["PRICE"] > 30000) {
  2051.                     $new_status = "orange";
  2052.                     $sale_for_status = 2;
  2053.                     $rest_for_bordo = floor(50000 - $arOrders["PRICE"]);
  2054.                     $for_next_status = "До получения статуса <b>BORDO</b> осталось совершить покупок на сумму <b>" . $rest_for_bordo . " руб.</b>";
  2055.                     if (($key = array_search(9, $arGroups)) !== false) {
  2056.                         unset($arGroups[$key]);
  2057.                     }
  2058.                     if (($key = array_search(11, $arGroups)) !== false) {
  2059.                         unset($arGroups[$key]);
  2060.                     }
  2061.                     $arGroups[] = 10;
  2062.                 } elseif ($arOrders["PRICE"] > 20000) {
  2063.                     $new_status = "vanilla";
  2064.                     $sale_for_status = 1.5;
  2065.                     $rest_for_orange = floor(30000 - $arOrders["PRICE"]);
  2066.                     $for_next_status = "До получения статуса <b>ORANGE</b> осталось совершить покупок на сумму <b>" . $rest_for_orange . " руб.</b>";
  2067.                     if (($key = array_search(11, $arGroups)) !== false) {
  2068.                         unset($arGroups[$key]);
  2069.                     }
  2070.                     if (($key = array_search(10, $arGroups)) !== false) {
  2071.                         unset($arGroups[$key]);
  2072.                     }
  2073.                     $arGroups[] = 9;
  2074.                 } else {
  2075.                     $new_status = "";
  2076.                     if (($key = array_search(9, $arGroups)) !== false) {
  2077.                         unset($arGroups[$key]);
  2078.                     }
  2079.                     if (($key = array_search(10, $arGroups)) !== false) {
  2080.                         unset($arGroups[$key]);
  2081.                     }
  2082.                     if (($key = array_search(11, $arGroups)) !== false) {
  2083.                         unset($arGroups[$key]);
  2084.                     }
  2085.                 }
  2086.  
  2087.                 $coupon_could_send = floor($arOrders["PRICE"] / 15000);
  2088.                 $rest_for_coupon = 15000 - ($arOrders["PRICE"] % 15000);
  2089.                 if ($coupon_could_send > 0 && $coupon_could_send > $coupon_send_cnt) {
  2090.                     $coupon = "";
  2091.                     do {
  2092.                         $allchars = 'ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789';
  2093.                         $string1 = '';
  2094.                         $string2 = '';
  2095.                         for ($i = 0; $i < 5; $i++) {
  2096.                             $string1 .= substr($allchars, round((rand(0, 10) * 0.1) * (strlen($allchars) - 1)), 1);
  2097.                         }
  2098.                         for ($i = 0; $i < 7; $i++) {
  2099.                             $string2 .= substr($allchars, round((rand(0, 10) * 0.1) * (strlen($allchars) - 1)), 1);
  2100.                         }
  2101.                         $newCoupon = "CP-" . $string1 . "-" . $string2;
  2102.  
  2103.                         $dbCouponCheck1 = CCatalogDiscountCoupon::GetList(array(), array("COUPON" => $newCoupon), false, false, array());
  2104.                     } while (intval($dbCouponCheck1->SelectedRowsCount()) > 0);
  2105.  
  2106.                     $cu1 = array("DISCOUNT_ID" => 4, "ACTIVE" => "Y", "ONE_TIME" => "O", "DATE_APPLY" => "");
  2107.                     $cu1['COUPON'] = $newCoupon;
  2108.                     $newCouponId1 = CCatalogDiscountCoupon::Add($cu1);
  2109.                     $coupon = "<br /><br />Купон на скидку: <b style='font-size:24px;'> " . $newCoupon . "</b>";
  2110.  
  2111.                     $user = new CUser;
  2112.                     $coupon_fields = array("UF_GRACY_COUPON_CNT" => $coupon_could_send);
  2113.                     $user->Update($USER_ID, $coupon_fields);
  2114.  
  2115.                     $mail_fiedl = array("COUPON" => $coupon,
  2116.                         "EMAIL" => $arOrders["EMAIL"],
  2117.                         "NAME" => $arOrders["NAME"],
  2118.                         "REST_FOR_COUPON" => $rest_for_coupon
  2119.                     );
  2120.                     CEvent::Send('NEW_GRACY_COUPON', s1, $mail_fiedl, "N", 71);
  2121.                 }
  2122.  
  2123.                 if ($new_status != "" && $current_status != $new_status) {
  2124.                     CUser::SetUserGroup($USER_ID, $arGroups);
  2125.                     $user = new CUser;
  2126.                     $fields = array("UF_STATUS_UPDATE" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n"), date("d"), date("Y"))),
  2127.                         "UF_GRACY_STATUS" => $new_status,
  2128.                         "UF_GRACY_COUPON_CNT" => $coupon_could_send
  2129.                     );
  2130.                     $user->Update($USER_ID, $fields);
  2131.  
  2132.                     $mail_fiedl = array("EMAIL" => $arOrders["EMAIL"],
  2133.                         "NAME" => $arOrders["NAME"],
  2134.                         "STATUS" => strtoupper($new_status),
  2135.                         "SALE_FOR_STATUS" => $sale_for_status,
  2136.                         "FOR_NEXT_STATUS" => $for_next_status
  2137.                     );
  2138.                     CEvent::Send('CHANGE_GRACY_STATUS', s1, $mail_fiedl, "N", 57);
  2139.                 }
  2140.             }
  2141.         }
  2142.     }
  2143. }
  2144.  
  2145.  
  2146. function OnSaleStatusOrder_mail1($ID, $val)
  2147. {
  2148.     $dbOrder = CSaleOrder::GetList(array('ID' => 'DESC'), array('ID' => $ID), false, false, array("PAY_SYSTEM_ID"));
  2149.     if ($arOrder = $dbOrder->Fetch()) {
  2150.         $paySystem = $arOrder["PAY_SYSTEM_ID"];
  2151.     }
  2152.     AddMessage2Log('$arOrder = ' . print_r($ID, true), '');
  2153.     if ($paySystem == 2) {
  2154.         $pay = 'Онлайн оплата банковскими картами Visa, Visa Electron, Master Card, Maestro';
  2155.     } elseif ($paySystem == 4) {
  2156.         $pay = 'Онлайн оплата в платежной системе Яндекс.Деньги';
  2157.     } elseif ($paySystem == 5) {
  2158.         $pay = 'Оплата по квитанции в банке';
  2159.     } elseif ($paySystem == 9) {
  2160.         $pay = 'Оплата в платежной системе QIWI';
  2161.     } elseif ($paySystem == 10) {
  2162.         $pay = 'Оплата наличными через терминалы и кассы';
  2163.     } elseif ($paySystem == 12) {
  2164.         $pay = 'Оплата по счету';
  2165.     }
  2166.  
  2167.     $arEventFields = array(
  2168.         "ORDER_ID" => $ID,
  2169.         "PAYMENT" => $pay,
  2170.     );
  2171.  
  2172.     if (($paySystem != 1) && ($paySystem != 8) && ($val == "Y")) {
  2173.         CEvent::Send("SALE_ORDER_PAID", s1, $arEventFields, "N", 72);
  2174.     }
  2175. }
  2176.  
  2177. function UCHOrderADDHandler($id, $arFields)
  2178. {
  2179.     $file = $_SERVER["DOCUMENT_ROOT"] . '/number_bill.txt';
  2180.     $current = file_get_contents($file);
  2181.  
  2182.  
  2183.     if ($arFields['PERSON_TYPE_ID'] == 2) {
  2184.         $arFieldss = array(
  2185.             "ORDER_ID" => $id,
  2186.             "ORDER_PROPS_ID" => 51,
  2187.             "NAME" => 'Номер счета',
  2188.             "CODE" => 'NUMBER_SCH_UR',
  2189.             "VALUE" => $current
  2190.         );
  2191.         CSaleOrderPropsValue::Add($arFieldss);
  2192.         $current = $current + 1;
  2193.         file_put_contents($file, $current);
  2194.     }
  2195.     if ($arFields['PERSON_TYPE_ID'] == 3) {
  2196.         $arFieldss = array(
  2197.             "ORDER_ID" => $id,
  2198.             "ORDER_PROPS_ID" => 52,
  2199.             "NAME" => 'Номер счета',
  2200.             "CODE" => 'NUMBER_SCH_IP',
  2201.             "VALUE" => $current
  2202.         );
  2203.         CSaleOrderPropsValue::Add($arFieldss);
  2204.         $current = $current + 1;
  2205.         file_put_contents($file, $current);
  2206.     }
  2207.     $dbOrderProps = CSaleOrderPropsValue::GetList(
  2208.         array("SORT" => "ASC"),
  2209.         array("ORDER_ID" => $id)
  2210.     );
  2211.     while ($arOrderProps = $dbOrderProps->GetNext()) :
  2212.         if ($arOrderProps['NAME'] == 'Телефон') {
  2213.             $user = new CUser;
  2214.             $fieldss = array(
  2215.                 "PERSONAL_PHONE" => $arOrderProps['VALUE'],
  2216.             );
  2217.             $user->Update($arFields['USER_ID'], $fieldss);
  2218.         }
  2219.         //file_put_contents($_SERVER["DOCUMENT_ROOT"] . '/log_lk.txt',print_r($arOrderProps, true), FILE_APPEND);
  2220.     endwhile;
  2221.     ?>
  2222.     <script>
  2223.         var date = new Date(new Date().getTime() + 31536000 * 1000);
  2224.     </script><?
  2225.     $user = new CUser;
  2226.     if ($arFields['PERSON_TYPE_ID'] == 1) {
  2227.         $fields = array(
  2228.             "UF_TIP_POKUP" => 'физическое'
  2229.  
  2230.         ); ?>
  2231.         <script>document.cookie = "tip=fiz;path=/; expires=" + date.toUTCString();</script>
  2232.         <?
  2233.         $user->Update($arFields['USER_ID'], $fields);
  2234.     }
  2235.     if ($arFields['PERSON_TYPE_ID'] == 2) {
  2236.         $fields = array(
  2237.             "UF_TIP_POKUP" => 'юридическое'
  2238.         );
  2239.         ?>
  2240.         <script>document.cookie = "tip=ur;path=/; expires=" + date.toUTCString();</script>
  2241.         <?
  2242.         $user->Update($arFields['USER_ID'], $fields);
  2243.     }
  2244.     if ($arFields['PERSON_TYPE_ID'] == 3) {
  2245.         $fields = array(
  2246.             "UF_TIP_POKUP" => 'ип'
  2247.         );
  2248.         ?>
  2249.         <script>document.cookie = "tip=ip;path=/; expires=" + date.toUTCString();</script>
  2250.         <?
  2251.         $user->Update($arFields['USER_ID'], $fields);
  2252.     }
  2253. }
  2254.  
  2255. if (!function_exists('__userGroups')) {
  2256.  
  2257.     function __userGroups($group = 0)
  2258.     {
  2259.         global $USER;
  2260.         $arGroups = $USER->GetUserGroupArray();
  2261.         foreach ($arGroups as $k => $arG) {
  2262.             if (($arG == 16 || $arG == 17 || $arG == 18 || $arG == 19 || $arG == 15)) {
  2263.                 unset($arGroups[$k]);
  2264.             }
  2265.         }
  2266.         if (intval($group) > 0) {
  2267.             $arGroups[] = $group;
  2268.         }
  2269.  
  2270.         $USER->SetUserGroupArray($arGroups);
  2271.     }
  2272.  
  2273. }
  2274.  
  2275. // SDEK
  2276.  
  2277.  
  2278. class studioleeft
  2279. {
  2280.  
  2281.     function admitRef($ID, $arFields)
  2282.     {
  2283.         file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/studioleeft.log', date("H:i:s", time()) . " " . print_r(__FUNCTION__, 1) . "\r\n", FILE_APPEND);
  2284.         //AddMessage2Log("Отправляем curl-запрос!", 'studioleeft');
  2285.  
  2286.         if (!isSiteManager()) {
  2287.             //AddMessage2Log("Прошла проверка айпишников!", 'studioleeft');
  2288.             global $APPLICATION;
  2289.             //$basket_id = CSaleBasket::GetBasketUserID();
  2290.             $admitad_uid = $APPLICATION->get_cookie("admitad_uid");
  2291.             if ($admitad_uid) {
  2292.                 $order_goods = array();
  2293.                 $dbBasketItems = CSaleBasket::GetList(
  2294.                     array(
  2295.                         "NAME" => "ASC",
  2296.                         "ID" => "ASC"
  2297.                     ),
  2298.                     array(
  2299.                         "ORDER_ID" => $ID
  2300.                     ),
  2301.                     false,
  2302.                     false,
  2303.                     array("ID", "ORDER_ID", "PRODUCT_ID", "PRICE", "CURRENCY", "QUANTITY", "USER_ID")
  2304.                 );
  2305.                 while ($arItem = $dbBasketItems->Fetch()) {
  2306.                     $arItem['QUANTITY'] = intval($arItem['QUANTITY']);
  2307.                     $order_goods[] = $arItem;
  2308.                 }
  2309.                 AddMessage2Log('Поля заказа: ' . print_r($order_goods, true), 'studioleeft');
  2310.                 if (count($order_goods) > 1) {
  2311.                     AddMessage2Log('Отправляем больше одного товара', 'studioleeft');
  2312.                     file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/log_admitad.txt', print_r($order_goods, true));
  2313.                     foreach ($order_goods as $goodKey => $oneGood) {
  2314.                         AddMessage2Log('Оформляем запрос для товара ' . $oneGood['NAME'], 'studioleeft');
  2315.                         if ($ch = curl_init()) {
  2316.                             $link = 'https://ad.admitad.com/r?campaign_code=bf139bb810&postback=1&postback_key=8567F9B3d53ACC7335713187C182433a&action_code=1&uid=' . $admitad_uid . '&order_id=' . $ID . '&tariff_code=1&currency_code=' . $oneGood['CURRENCY'] . '&price=' . $oneGood['PRICE'] . '&quantity=' . $oneGood['QUANTITY'] . '&position_id=' . ++$goodKey . '&position_count=' . count($order_goods) . '&product_id=' . $oneGood['PRODUCT_ID'] . '&client_id=' . $oneGood['USER_ID'] . '&payment_type=sale';
  2317.                             AddMessage2Log($link, 'studioleeft');
  2318.                             // Устанавливаем URL запроса
  2319.                             curl_setopt($ch, CURLOPT_URL, $link);
  2320.                             // При значении true CURL включает в вывод заголовки
  2321.                             //curl_setopt($ch, CURLOPT_HEADER, false);
  2322.                             // Куда помещать результат выполнения запроса:
  2323.                             //  false - в стандартный поток вывода,
  2324.                             //  true - в виде возвращаемого значения функции curl_exec.
  2325.                             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  2326.                             // Максимальное время ожидания в секундах
  2327.                             //curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  2328.                             // Установим значение поля User-agent
  2329.                             //curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot');
  2330.                             // Выполнение запроса
  2331.                             $data = curl_exec($ch);
  2332.                             if ($data === false) {
  2333.                                 AddMessage2Log("Error Number:" . curl_errno($ch) . " " . "Error String:" . curl_error($ch), 'studioleeft');
  2334.                             } else {
  2335.                                 AddMessage2Log("Error Number:" . curl_errno($ch) . " " . "Error String:" . curl_error($ch) . " " . print_r($data), 'studioleeft');
  2336.                             }
  2337.                             // Вывести полученные данные
  2338.                             //echo '<pre style="display:none;">'; print_r($data); echo '</pre>';
  2339.                             // Особождение ресурса
  2340.                             curl_close($ch);
  2341.                         }
  2342.                     }
  2343.                 } else {
  2344.                     AddMessage2Log('отправлен заказ с 1 товаром', 'studioleeft');
  2345.                     //AddMessage2Log('Оформляем запрос для товара '.$order_goods[0]['NAME'], 'studioleeft');
  2346.                     // Иницализация библиотеки curl
  2347.                     if ($ch = curl_init()) {
  2348.                         $link = 'https://ad.admitad.com/r?campaign_code=bf139bb810&postback=1&postback_key=8567F9B3d53ACC7335713187C182433a&action_code=1&uid=' . $admitad_uid . '&order_id=' . $ID . '&tariff_code=1&currency_code=' . $order_goods[0]['CURRENCY'] . '&price=' . $order_goods[0]['PRICE'] . '&quantity=' . $order_goods[0]['QUANTITY'] . '&position_id=1&position_count=1&product_id=' . $order_goods[0]['PRODUCT_ID'] . '&client_id=' . $order_goods[0]['USER_ID'] . '&payment_type=sale';
  2349.                         AddMessage2Log($link, 'studioleeft');
  2350.                         // Устанавливаем URL запроса
  2351.                         curl_setopt($ch, CURLOPT_URL, $link);
  2352.                         // При значении true CURL включает в вывод заголовки
  2353.                         //curl_setopt($ch, CURLOPT_HEADER, false);
  2354.                         // Куда помещать результат выполнения запроса:
  2355.                         //  false - в стандартный поток вывода,
  2356.                         //  true - в виде возвращаемого значения функции curl_exec.
  2357.                         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  2358.                         // Максимальное время ожидания в секундах
  2359.                         //curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  2360.                         // Установим значение поля User-agent
  2361.                         //curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot');
  2362.                         // Выполнение запроса
  2363.                         $data = curl_exec($ch);
  2364.                         if ($data === false) {
  2365.                             AddMessage2Log("Error Number:" . curl_errno($ch) . " " . "Error String:" . curl_error($ch), 'studioleeft');
  2366.                         }
  2367.                         // Вывести полученные данные
  2368.                         //echo '<pre style="display:none;">'; print_r($data); echo '</pre>';
  2369.                         // Особождение ресурса
  2370.                         curl_close($ch);
  2371.                     }
  2372.                 }
  2373.             }
  2374.         }
  2375.     }
  2376. }
  2377.  
  2378.  
  2379. function OrderDetailAdminContextMenuShow(&$items)
  2380. {
  2381.     global $APPLICATION;
  2382.     if ($_SERVER['REQUEST_METHOD'] == 'GET'
  2383.         && $_REQUEST['ID'] > 0
  2384.         && $APPLICATION->GetCurPage() == '/bitrix/admin/sale_order_edit.php'
  2385.         || $APPLICATION->GetCurPage() == '/bitrix/admin/sale_order_view.php'
  2386.     ) {
  2387.         $items[] = array(
  2388.             "TEXT" => "Отправить в Grastin",
  2389.             "LINK" => "grastin_order.php?ORDER_ID=" . $_REQUEST['ID'],
  2390.             "TITLE" => "Отправить в Grastin",
  2391.             //"ICON"=>"btn_new",
  2392.         );
  2393.     }
  2394. }
  2395.  
  2396.  
  2397. # При добавлении товара в корзину, добавляем название бренда
  2398.  
  2399. function OnBeforeBasketAddHandler(&$arFields)
  2400. {
  2401.     if (!empty($arFields['PRODUCT_ID'])) {
  2402.         $picture = '/bitrix/components/bitrix/sale.basket.basket/templates/.default/images/no_photo.png';
  2403.  
  2404.         $res = CIBlockElement::GetList(
  2405.             array(),
  2406.             array("ID" => $arFields['PRODUCT_ID']),
  2407.             false,
  2408.             false,
  2409.             array('ID', 'IBLOCK_ID', 'PROPERTY_PRODUCT.PROPERTY_ATT_BRAND_LIST', 'PREVIEW_PICTURE', 'PROPERTY_PRODUCT.PREVIEW_PICTURE')
  2410.         )->Fetch();
  2411.  
  2412.         if ($res) {
  2413.  
  2414.             /**
  2415.              * После установки одного из обновлений, появилсась ошибка связанная с добавлением дополнительных свойтв к товарам в корзине.
  2416.              * Если в корзину уже было полжен товар, и к записе в корзине было добавлено свойтво,
  2417.              * то при повторном добавлении этого товара вместо изменения количества товаров,
  2418.              * происходит их дублирование.
  2419.              * Следующий код проверяет наличие товара в корзине, и изменяет количество вновь добавляемых товаров,
  2420.              * удаляя добавленные ранее.
  2421.              *
  2422.              * ToDo: Если текущая ошибка в поведении корзины будет исправлена, то этот код можно будет удалить.
  2423.              */
  2424.             $basket = Bitrix\Sale\Basket::loadItemsForFUser(
  2425.                 Bitrix\Sale\Fuser::getId(),
  2426.                 Bitrix\Main\Context::getCurrent()->getSite()
  2427.             );
  2428.             $basketItems = $basket->getBasketItems();
  2429.             foreach ($basketItems as $basketItem) {
  2430.                 if ($basketItem->getField('PRODUCT_ID') == $arFields['PRODUCT_ID']) {
  2431.                     $arFields['QUANTITY'] += $basketItem->getQuantity();
  2432.                     $basketItem->delete();
  2433.                 }
  2434.             }
  2435.             $basket->save();
  2436.  
  2437.  
  2438.             $arFields['PROPS']['BRAND'] = [
  2439.                 'CODE' => 'BRAND',
  2440.                 'ID' => '',
  2441.                 'VALUE' => $res["PROPERTY_PRODUCT_PROPERTY_ATT_BRAND_LIST_VALUE"],
  2442.                 'SORT' => '1',
  2443.                 'NAME' => 'Бренд'
  2444.             ];
  2445.  
  2446.             if (!empty($res["PREVIEW_PICTURE"])) {
  2447.                 $picture = CFile::GetPath($res["PREVIEW_PICTURE"]);
  2448.             } elseif (!empty($res["PROPERTY_PRODUCT_PREVIEW_PICTURE"])) {
  2449.                 $picture = CFile::GetPath($res["PROPERTY_PRODUCT_PREVIEW_PICTURE"]);
  2450.             }
  2451.         }
  2452.  
  2453.         CAgent::AddAgent("send_carrotquest('" . $_COOKIE['PHPSESSID'] . "', '" . $_COOKIE['carrotquest_uid'] . "', '" . $arFields["NAME"] . "', '" . $arFields["DETAIL_PAGE_URL"] . "', '" . $arFields["QUANTITY"] . "', '" . $picture . "');");
  2454.     }
  2455. }
  2456.  
  2457. function send_carrotquest($cookie, $carrot_uid, $name, $detail_url, $quantity, $picture)
  2458. {
  2459.     $url = 'https://api.carrotquest.io/v1/users/' . $carrot_uid . '/events';
  2460.  
  2461.     $result = file_get_contents($url, false, stream_context_create(array(
  2462.         'http' => array(
  2463.             'method' => 'POST',
  2464.             'header' => 'Content-type: application/x-www-form-urlencoded',
  2465.             'content' => http_build_query(array('event' => '$cart_added',
  2466.                 'params' => '{
  2467.                 "$name": "' . $name . '",
  2468.                 "$url": "' . $detail_url . '",
  2469.                 "$amount": "' . $quantity . '",
  2470.                 "$img": "' . $picture . '",
  2471.             }',
  2472.                 'auth_token' => 'app.192.d9cbbe9c6e18072216f4ad7f08f059342628d12d8fd2c4f0'
  2473.             )),
  2474.  
  2475.  
  2476.         )
  2477.     )));
  2478.  
  2479.     return "";
  2480. }
  2481.  
  2482.  
  2483. class AuthorizeHandler
  2484. {
  2485.     /**
  2486.      * @param $arFields
  2487.      *
  2488.      * Авторизуем пользователя по e-mail, если он ввел его вместо логина
  2489.      */
  2490.     function OnBeforeUserLoginHandler(&$arFields)
  2491.     {
  2492.         if (strpos($arFields['LOGIN'], "@") > 0) {
  2493.             $by = "id";
  2494.             $order = "desc";
  2495.             $rsUsers = CUser::GetList(
  2496.                 $by,
  2497.                 $order,
  2498.                 array(
  2499.                     "ACTIVE" => "Y",
  2500.                     "EMAIL" => $arFields['LOGIN'],
  2501.                 )
  2502.             );
  2503.             $arUsers = [];
  2504.             while ($arUser = $rsUsers->Fetch()) {
  2505.                 $arUsers[] = $arUser['LOGIN'];
  2506.             }
  2507.             # Подставляем логин вместо email только в том случае, если на сайте только один пользователь с таким e-mail
  2508.             if (count($arUsers) == 1) {
  2509.                 $arFields['LOGIN'] = end($arUsers);
  2510.             }
  2511.         }
  2512.     }
  2513. }
  2514.  
  2515.  
  2516. function OnEventLogGetAuditTypesHandler()
  2517. {
  2518.     return array(
  2519.         'PAYSYSTEM_EDIT' => '[PAYSYSTEM_EDIT] Изменение платежной системы',
  2520.         'DELIVERY_EDIT' => '[DELIVERY_EDIT] Изменение службы доставки',
  2521.         'PROPERS_ORDER_EDIT' => '[PROPERS_ORDER_EDIT] Изменение свойств заказа',
  2522.         'STATUS_EDIT' => '[STATUS_EDIT] Изменение статусов',
  2523.         'LOCATIONS_EDIT' => '[LOCATIONS_EDIT] Изменение местоположений',
  2524.         'PRINT_FORMS_EDIT' => '[PRINT_FORMS_EDIT] Изменение настроек печатных форм',
  2525.         'DISCOUT_EDIT' => '[DISCOUT_EDIT] Изменение скидок'
  2526.     );
  2527. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement