Всем привет!
Итак. У нас магазин одежды товаров с торговыми предложениями.
Включили количественный учет и резервирование при оформлении заказа.
первый недоработка Битрикса в том, что при изменении остатков по торговым предложениям (и доступного количества), не меняются остатки у товара (и доступное количество). ХОТЯ! настройка у комплексного компонента catalog и у catalog:section скрывать товары, у которых нет остатков есть!!
ну да ладно, код я нашла и он заработал. Но вот что обнаружила и никак не могу с этим справится.
Смотрим код, там все просто.
//change ostatki of goods
AddEventHandler("catalog", "OnStoreProductUpdate","MyOnStoreProductSave" ;) ;
AddEventHandler("catalog", "OnStoreProductAdd","MyOnStoreProductSave" ;) ;
function MyOnStoreProductSave($id, $arFields){
$allAmount = $arFields['AMOUNT'];
if(CModule::IncludeModule('catalog') & CModule::IncludeModule('iblock')){
//Получаем информацию о товаре привязанном к данному приложению, вмести с этим проверяем не является ли это товаром.
$arProductInfo = CCatalogSKU::GetProductInfo($arFields['PRODUCT_ID'] ;) ;
if(is_array($arProductInfo)){
//Получаем данные о инфоблоке Торговых предложений
$arOffersInfo = CCatalogSKU::GetInfoByProductIBlock($arProductInfo['IBLOCK_ID'] ;) ;
$arFilter = Array(
'IBLOCK_ID'=>$arOffersInfo['IBLOCK_ID'],
"PROPERTY_".$arOffersInfo['SKU_PROPERTY_ID']=>$arProductInfo['ID'],
"!ID"=>$arFields['PRODUCT_ID']
);
//Получаем список торговых предложений.
$obOffersList = CIBlockElement::GetList(Array("SORT"=>"ASC" ;) ,$arFilter,false,false,array());
$arOffers = array();
while($arOffers = $obOffersList->Fetch()){
//Получаем данные об остатках на складе для торгового предложения.
$obStoreOffer = CCatalogStoreProduct::GetList(array(), array('STORE_ID'=>$arFields['STORE_ID'], 'PRODUCT_ID' =>$arOffers['ID'] ;) , false,false,array());
while($arStore = $obStoreOffer->Fetch()){
$arAllStore[] = $arStore;
$allAmount = $allAmount + $arStore['AMOUNT'];
}
}
//Получаем данные о складе товара и формируем массив для обновления данных.
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array('STORE_ID'=>$arFields['STORE_ID'], 'PRODUCT_ID' =>$arProductInfo['ID'] ;) , false,false,array());
$arFieldsProduct = array (
'PRODUCT_ID' => $arProductInfo['ID'],
'STORE_ID' => $arFields['STORE_ID'],
'AMOUNT' => $allAmount,
);
//Обновляем склады у товара
$result = FALSE;
if($arStoreProduct = $obStoreProduct->Fetch()){
$result = CCatalogStoreProduct::Update($arStoreProduct["ID"],$arFieldsProduct);
}else{
$result = CCatalogStoreProduct::Add($arFieldsProduct);
}
//Если обновились склады, обновляем доступное количество у товара=сумма остатков по всем складам у товара
if($result){
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array('PRODUCT_ID' =>$arProductInfo['ID'] ;) , false,false,array());
while($arStoreProduct = $obStoreProduct->Fetch()){
$allAmountProduct = $allAmountProduct + $arStoreProduct['AMOUNT'];
}
$arFieldsProduct = array(
"QUANTITY" => $allAmountProduct,
);
$arr= CCatalogProduct::GetByIDEx( $arProductInfo['ID'] ;) ;
AddMessage2Log($arr);
$res=CCatalogProduct::Update ($arProductInfo['ID'],$arFieldsProduct);
AddMessage2Log("res-".$res."id - ".$arProductInfo['ID']." count - ".$allAmountProduct);
}
}
}
}
Смотрим самый конец $res=CCatalogProduct::Update ($arProductInfo['ID'],$arFieldsProduct);
Эта штука не корректно работает или я никак не пойму почему так происходит.
Поведение.
Если у товара пусто в поле доступное количество, то эта функция не работает. Если я руками через админку пишу доступное количество, то после этого момента функция начинает работать.
Ищу дальше.
Вызвала
$arr= CCatalogProduct::GetByIDEx( $arProductInfo['ID'] ;) ;
AddMessage2Log($arr);
чтобы проверить, что же там такое и все раскрылось.
В первый раз когда пусто в доступном количестве и функция не срабатывает, педшые среди прочих возвращает 'PRODUCT' => false
Когда я руками вставила, и после этого все начало работать в параметре я уже вижу
'PRODUCT' =>
array (
'ID' => 32884,
'QUANTITY' => '196',
'QUANTITY_RESERVED' => '0',
'QUANTITY_TRACE' => 'Y',
'QUANTITY_TRACE_ORIG' => 'D',
'WEIGHT' => '0',
'WIDTH' => '0',
'LENGTH' => '0',
'HEIGHT' => '0',
'MEASURE' => '5',
'VAT_ID' => '0',
'VAT_INCLUDED' => 'N',
'CAN_BUY_ZERO' => 'N',
'CAN_BUY_ZERO_ORIG' => 'D',
'NEGATIVE_AMOUNT_TRACE' => 'N',
'NEGATIVE_AMOUNT_TRACE_ORIG' => 'D',
'PRICE_TYPE' => 'S',
'RECUR_SCHEME_TYPE' => 'D',
'RECUR_SCHEME_LENGTH' => '0',
'TRIAL_PRICE_ID' => NULL,
'WITHOUT_ORDER' => 'N',
'SELECT_BEST_PRICE' => 'Y',
'TMP_ID' => NULL,
'PURCHASING_PRICE' => '0.00',
'PURCHASING_CURRENCY' => 'RUB',
'BARCODE_MULTI' => 'N',
'TIMESTAMP_X' => '23.09.2014 11:18:14',
'SUBSCRIBE' => 'Y',
'SUBSCRIBE_ORIG' => 'D',
'TYPE' => '1',
),
)
и $res=CCatalogProduct::Update конечно уже срабатывает!!!
Прошу объяснить и подсказать, как сделать чтобы всегда product стоял.