@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();
        }
    }
}
  • Вопрос задан
  • 412 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы