Задать вопрос
@pantaleone48

1C Bitrix. Почему не работает изменение цены по событию?

Необходимо менять базовую цену, в зависимости других типов цен. Пытаюсь реализовать обновление цены через событие OnBeforePriceUpdate. Если сохраняешь товар через форму, то она обновляется после второго сохранения, при выгрузках базовая цена не меняется.

AddEventHandler("catalog", "OnBeforePriceUpdate", Array("UpdateProduct", "newPrice"));

class UpdateProduct{

    protected static $handlerDisallow = 0;

    public static function disableHandler()
    {
        self::$handlerDisallow--;
    }

    public static function enableHandler()
    {
        self::$handlerDisallow++;
    }

    public static function isEnabledHandler()
    {
        return (self::$handlerDisallow >= 0);
    }

    public static function newPrice($ID, &$arFields){
        /* проверяем, что обработчик уже запущен */
        if (!self::isEnabledHandler())
            return;
        /* взводим флаг запуска */
        self::disableHandler();

        \Bitrix\Main\Loader::includeModule("catalog");

        $allProductPrices = \Bitrix\Catalog\PriceTable::getList([
            "select" => [
                "ID",
                "PRICE",
                "CATALOG_GROUP_ID"
            ],
            "filter" => [
                "PRODUCT_ID" => $arFields["PRODUCT_ID"],
            ]
        ])->fetchAll();

        $addProps = CIBlockElement::GetList(
            Array(),
            Array("ID" => $arFields["PRODUCT_ID"]),
            false,
            false,
            Array(
                'ID', "NAME", "PROPERTY_NO_UPDATE_PRICE", "PURCHASING_PRICE"
            )
        );
        if($ar_res = $addProps->GetNext()){
            foreach($allProductPrices as $key => $value){
                if($allProductPrices[$key]["CATALOG_GROUP_ID"] == 1){
                    $arPrice["BASE_ID"] = $allProductPrices[$key]["ID"];
                    $arPrice["BASE_PRICE"] = $allProductPrices[$key]["PRICE"];
                } elseif($allProductPrices[$key]["CATALOG_GROUP_ID"] == 2){
                    $arPrice["MERLION_PRICE"] = $allProductPrices[$key]["PRICE"];
                } elseif($allProductPrices[$key]["CATALOG_GROUP_ID"] == 3){
                    $arPrice["MONITORING_PRICE"] = $allProductPrices[$key]["PRICE"];
                } elseif($allProductPrices[$key]["CATALOG_GROUP_ID"] == 4){
                    $arPrice["TEHNO_PRICE"] = $allProductPrices[$key]["PRICE"];
                }
            }

            if($ar_res["PROPERTY_NO_UPDATE_PRICE_VALUE"] == "Y"){
                if(isset($arPrice["TEHNO_PRICE"]) and $arPrice["TEHNO_PRICE"] != 0){
                    $newPrice["PRICE"] = $arPrice["TEHNO_PRICE"];
                }
            } else{
                if(isset($arPrice["MONITORING_PRICE"]) and $arPrice["MONITORING_PRICE"] != 0){
                    if(((($arPrice["MONITORING_PRICE"] - $ar_res["PURCHASING_PRICE"]) * 100) / $arPrice["MONITORING_PRICE"]) <= -5){
                        $newPrice["PRICE"] = 0;
                        $update = new CIBlockElement();
                        $res2 = $update->Update($ar_res["ID"], array("ACTIVE" => "N"));
                        if ($res2->isSuccess()){
                            AddMessage2Log(date("d.m.Y H:i:s") . " | Закупочная цена меньше розничной на 5 и более процентов - ".$arFields["PRODUCT_ID"], "");
                        }
                    } else{
                        $newPrice["PRICE"] = $arPrice["MONITORING_PRICE"];
                    }
                } elseif(isset($arPrice["TEHNO_PRICE"]) and $arPrice["TEHNO_PRICE"] != 0){
                    $newPrice["PRICE"] = $arPrice["TEHNO_PRICE"];
                } elseif(isset($arPrice["MERLION_PRICE"]) and $arPrice["MERLION_PRICE"] != 0){
                    $newPrice["PRICE"] = $arPrice["MERLION_PRICE"];
                }
            }
            if($arPrice["BASE_PRICE"] != $newPrice["PRICE"] and $newPrice["PRICE"] > 0){
                $arFields["PRICE"] = $newPrice["PRICE"];
                AddMessage2Log(date("d.m.Y H:i:s") . " | Изменение цены на ".$arFields["PRICE"]." для ".$ar_res["NAME"]." ".$arFields["PRODUCT_ID"], "");

            }

            /* вновь разрешаем запускать обработчик */
            self::enableHandler();
        }
    }
}
  • Вопрос задан
  • 439 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы