Исправляем информацию о резервах и количестве доступных товаров.
По ряду причин в интернет-магазине информация о резерве и доступном количестве, может искажаться.
Ниже решение которое исправляет данные поля.
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: вынес выборку товаров с цикла выборки заказов