ПредисторияКоторый день сижу, но все никак не получается решить задачу. Боюсь без помощи не справлюсь. Итак ближе к делу. У меня на данный момент есть:
1. Базовая цена -цена по которой продаю;
2. Закупочная цена - цена по которой покупаю.
Мне необходимо сделать еще одну цену, которая была бы равна Закупочной + какой-то %.
На чем остановился:
1. В БД есть 2 таблицы:
1-ая b_catalog_price,
2-ая b_catalog_product.
В 1-ой таблице была Базовая цена, во второй Закупочная. Я перенес значения закупочной цены, в таблицу b_catalog_price, предварительно в битриксе создав 2-ой тип цены.
UPD ATE b_catalog_price /*обновить таблицу*/
SE T PRICE = PURCHASING_PRICE /*список обновляемых полей*/
WHERE CATALOG_GROUP_ID=2 /*где CATALOG_GROUP_ID=2 *
Попытки написать триггер ни к чему не привели и было решено полезть в битрикс... Поковырявшись пару деньков в документации, форумах и просторах интеренета я пришел к следующему... В файле product_edit.php (bitrix\modules\catalog\admin\templates\product_edit.php) я прописал следующий код:
Код |
---|
<?$arFields = Array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => 2,
"PRICE" => $str_CAT_PURCHASING_PRICE,
"CURRENCY" => "RUB",
"QUANTITY_FROM" => false,
"QUANTITY_TO" => false
);
$res = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => 2
)
);
if ($arr = $res->Fetch())
{
CPrice::Update($arr["ID"], $arFields);
}
else
{
CPrice::Add($arFields);
}?> |
Он работает, все отлично, если бы не одно но...
ПроблемаКогда я оформляю приход товара на склад и указываю ему новую цену, она применяется к b_catalog_price только в том случае, если я зайду в сам элемент и нажму F5. Т.е. цена обновляется только после обновления страницы элемента товара. Пробовал чуть-чуть модифицированный код вставить в bitrix\modules\catalog\admin\cat_store_document_edit.php вообще ничего не произошло.
Пробовал чуть-чуть по-другому писать и запихивать в init.php, но ситуация не изменилась.
Код |
---|
<?
AddEventHandler('catalog', 'OnBeforePriceUpdate', "OnBeforePriceUpdateHandler");
function OnBeforePriceUpdateHandler($id, &$arFields)
{
CModule::IncludeModule("iblock");
$id_element_arfilds = $arFields["PRODUCT_ID"];
$price_new = $arFields["PRICE"];
if(!empty($id_element_arfilds) && !empty($price_new)){
$arSelect = Array("ID", "PROPERTY_CML2_LINK", "PROPERTY_CML2_LINK.PROPERTY_PRICE_SORT", "PROPERTY_PRICE_SORT");
$arFilter = Array("ID" => $id_element_arfilds);
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
$id_element = -1;
while($ob = $res->GetNext())
{
if(empty($ob["PROPERTY_CML2_LINK_VALUE"])){
if($ob["PROPERTY_PRICE_SORT_VALUE"] > $price_new || empty($ob["PROPERTY_PRICE_SORT_VALUE"])){
$PRODUCT_ID = $ob["PROPERTY_CML2_LINK_VALUE"];
$PRICE_TYPE_ID = 2;
$arFields = Array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
"PRICE" => $price_new,
"CURRENCY" => "RUB",
"QUANTITY_FROM" => false,
"QUANTITY_TO" => false
);
$res = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => 2
)
);
if ($arr = $res->Fetch()){CPrice::Update($arr["ID"], $arFields);}
else{CPrice::Add($arFields);}
}
}elseif($ob["PROPERTY_CML2_LINK_PROPERTY_PRICE_SORT_VALUE"] > $price_new || empty($ob["PROPERTY_CML2_LINK_PROPERTY_PRICE_SORT_VALUE"])){
$PRODUCT_ID = $ob["PROPERTY_CML2_LINK_VALUE"];
$PRICE_TYPE_ID = 1;
$arFields = Array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => 2,
"PRICE" => $price_new,
"CURRENCY" => "RUB",
"QUANTITY_FROM" => false,
"QUANTITY_TO" => false
);
$res = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => 2
)
);
if ($arr = $res->Fetch()){CPrice::Update($arr["ID"], $arFields);}
else{CPrice::Add($arFields);}
}
}
}
}
?>
|
Неужели никто не знает, как можно сделать, что бы второй тип цены = закупочной цене(обновлялся с каждым приходом на склад)?