- Модуль: catalog
- Путь к файлу: ~/bitrix/modules/catalog/lib/InventoryManagement/Helpers/Doctor.php
- Класс: BitrixCatalogInventoryManagementHelpersDoctor
- Вызов: Doctor::fixReservesFromStores
public function fixReservesFromStores(int ...$productIds): void
{
if (empty($productIds))
{
throw new ArgumentNullException('productIds');
}
$result = [];
$productIdsSql = join(',', $productIds);
$sql = "
SELECT
PRODUCT_ID,
SUM(QUANTITY_RESERVED) as QUANTITY_RESERVED
FROM
b_catalog_store_product
INNER JOIN b_catalog_store ON b_catalog_store.ID = b_catalog_store_product.STORE_ID AND b_catalog_store.ACTIVE = 'Y'
WHERE
PRODUCT_ID IN ({$productIdsSql})
GROUP BY
PRODUCT_ID
";
$rows = Application::getConnection()->query($sql);
foreach ($rows as $row)
{
$productId = (int)$row['PRODUCT_ID'];
$result[$productId] = [
'PRODUCT_ID' => $productId,
'NEW_QUANTITY_RESERVED' => (float)$row['QUANTITY_RESERVED'],
];
}
// fill products without store quantities
foreach ($productIds as $productId)
{
$result[$productId] ??= [
'PRODUCT_ID' => $productId,
'NEW_QUANTITY_RESERVED' => 0.0,
];
}
// update products
foreach ($result as $productId => &$item)
{
// or BitrixCatalogModelProduct::update ?
$saveResult = ProductTable::update($productId, [
'QUANTITY_RESERVED' => $item['NEW_QUANTITY_RESERVED'],
]);
$item['SAVE_RESULT'] =
$saveResult->isSuccess()
? 'ok'
: join(', ', $saveResult->getErrorMessages())
;
}
$this->printTable($result);
}