Исправляем информацию о резервах и количестве доступных товаров.
По ряду причин в интернет-магазине информация о резерве и доступном количестве, может искажаться.
Ниже решение которое исправляет данные поля.
upd: вынес выборку товаров с цикла выборки заказов
По ряду причин в интернет-магазине информация о резерве и доступном количестве, может искажаться.
Ниже решение которое исправляет данные поля.
$dirPath = '/bitrix/cron'; if(!$_SERVER["DOCUMENT_ROOT"]) $_SERVER["DOCUMENT_ROOT"] = str_replace($dirPath, '', dirname(__FILE__)); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); //require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/nf_pp.php"); // для отладки массивов функцией pp(); //if (!$USER->IsAdmin()) // exit('for admin only'); CModule::IncludeModule("sale"); CModule::IncludeModule("catalog"); /* вытаскиваем все заказы по фильтру (неотгруженные + неотмененные) '>ID' => '1400' чтобы отсечь тестовые заказы */ $arFilter = array('DEDUCTED' => 'N', '!CANCELED'=>'Y', '>ID' => '1400'); $db = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter); while ($arRes = $db->Fetch()){ $arOrdersId = $arRes['ID']; } /* Вытаскиваем товары из заказов */ //$arOrders[] = $arRes['ID']; $dbBasket = CSaleBasket::GetList( array("NAME" => "ASC"), array("ORDER_ID" => $arOrdersId), false, false, array("QUANTITY", "PRODUCT_ID") ); while ($arBasket = $dbBasket->Fetch()) { /* Считаем товары в заказах, они пойдут в зарезервированные */ if(!$arItemsQ[$arBasket['PRODUCT_ID']]) $arItemsQ[$arBasket['PRODUCT_ID']] = round($arBasket['QUANTITY']); else $arItemsQ[$arBasket['PRODUCT_ID']] += $arBasket['QUANTITY']; //$aritemsIds[$arBasket['PRODUCT_ID']] = $arBasket['PRODUCT_ID']; } /**/ /**/ /* Вытаскиваем количества товаров на складах */ $db = CCatalogStoreProduct::GetList(array()/*, array("PRODUCT_ID" => $aritemsIds) */); while ($arRes = $db->Fetch()) { if(!$arStoresAmount[$arRes['PRODUCT_ID']]) $arStoresAmount[$arRes['PRODUCT_ID']] = $arRes['AMOUNT']; else $arStoresAmount[$arRes['PRODUCT_ID']] += $arRes['AMOUNT']; } /* Проставляем товарам доступное количество и резерв */ foreach ($arStoresAmount as $itemId => $v){ $quantity = $arStoresAmount[$itemId] - round($arItemsQ[$itemId]); $arFields = array( 'QUANTITY' => $quantity, 'QUANTITY_RESERVED' => round($arItemsQ[$itemId]), ); CCatalogProduct::Update($itemId, $arFields); //if($itemId == '8429') // pp($arFields,true); } |
upd: вынес выборку товаров с цикла выборки заказов