При валидации купона проверять уникальность в пределах SITE_ID

Рейтинг: 3.6398  
На голосовании
Предложил Пользователь 32610 05.09.2014 12:04:22

При валидации купона проверять уникальность в пределах SITE_ID

Столкнулся с ситуацией когда необходимо запустить несколько акций с одинаковыми купонами на разных сайтах. Т.к. акция привязывается к SITE_ID, то имеет смысл проверять уникальность купона в пределах выбранного SITE_ID.
[spoiler]
Примерный код решения проблемы:
/bitrix/modules/catalog/general/discount_coupon.php
public function CheckFields($ACTION, &$arFields, $ID = 0)
   {
      global $DB;
      global $APPLICATION;

      if ((is_set($arFields, "DISCOUNT_ID") || $ACTION=="ADD") && intval($arFields["DISCOUNT_ID"]) <= 0)
      {
         $APPLICATION->ThrowException(GetMessage("KGDC_EMPTY_DISCOUNT"), "EMPTY_DISCOUNT_ID");
         return false;
      }

      if ((is_set($arFields, "COUPON") || $ACTION=="ADD") && strlen($arFields["COUPON"]) <= 0)
      {
         $APPLICATION->ThrowException(GetMessage("KGDC_EMPTY_COUPON"), "EMPTY_COUPON");
         return false;
      }
      elseif(is_set($arFields, "COUPON"))
      {
         $arFilter = array("COUPON" => substr($arFields["COUPON"], 0, 32));
         if ($ID > 0)
            $arFilter["!ID"] = $ID;

         /**
          * Получить поля акции
          */
         $arBaseDiscount = CCatalogDiscount::GetByID($arFields["DISCOUNT_ID"]);

         /**
          * Получить все купоны с названием
          */
         $arSelect = array("ID", "DISCOUNT_ID", "COUPON");
         $rsCoupon = CCatalogDiscountCoupon::GetList(array(),$arFilter, false, false, $arSelect);
         while ($arCoupon = $rsCoupon->Fetch())
         {
            /**
             * Для каждого купона получить поля акции и сверить SITE_ID с SITE_ID акции сохраняемого купона
             */
            $arDiscount = CCatalogDiscount::GetByID($arCoupon["DISCOUNT_ID"]);
            if ($arDiscount["SITE_ID"] == $arBaseDiscount["SITE_ID"]) {
               $APPLICATION->ThrowException(GetMessage("KGDC_DUPLICATE_COUPON"), "DUPLICATE_COUPON");
               return false;
            }
         }
      }

      if ((is_set($arFields, "ACTIVE") || $ACTION=="ADD") && $arFields["ACTIVE"] != "N")
         $arFields["ACTIVE"] = "Y";
      if ((is_set($arFields, "ONE_TIME") || $ACTION=="ADD") && !in_array($arFields["ONE_TIME"], self::GetCoupontTypes()))
         $arFields["ONE_TIME"] = self::TYPE_ONE_TIME;

      if ((is_set($arFields, "DATE_APPLY") || $ACTION=="ADD") && (!$DB->IsDate($arFields["DATE_APPLY"], false, SITE_ID, "FULL")))
         $arFields["DATE_APPLY"] = false;

      return true;
   }

Рейтинг: 0  
Пользователь 247941 04.09.2022 13:31:51
Лучше вообще не привязывать купон к SITE_ID, а вынести "Сайт" в настройки правил для корзины. Нужно ограничить тебе правило сайтом — добавил такое условие. А по умолчанию правила/купоны работали бы для всех сайтов.