reserve
\Bitrix\Sale\Result public \Bitrix\Catalog\Product\CatalogProvider::reserve( array $products );
Метод резервирует или снимает резерв товара. Положительное количество создает резерв, отрицательное — уменьшает его. Способ изменения общего и складского количества зависит от настроек резервирования и складского учета. Нестатический метод.
Параметры
| Параметр | Описание |
|---|---|
$products | Массив товаров с идентификаторами товаров в ключах. Передайте PRODUCT_ID и QUANTITY_LIST в формате код позиции корзины => количество. Для складского резерва дополнительно передайте QUANTITY_LIST_BY_STORE в формате код позиции корзины => [идентификатор склада => количество]. Суммы количеств каждой позиции должны совпадать. Одиночное QUANTITY учитывается в общем количестве, но не задает количество для складского резерва |
Возвращаемое значение
Метод возвращает объект \Bitrix\Sale\Result.
Ключ RESERVED_PRODUCTS_LIST содержит данные операции или false по обработанным товарам. Товары без данных каталога в него не попадают.
При частичном резервировании величина QUANTITY_NOT_RESERVED находится в RESERVED_PRODUCTS_LIST[идентификатор товара].
Предупреждения внутреннего расчета метод не переносит в итоговый объект. Проверяйте также IS_UPDATED, если этот ключ присутствует в данных операции.
Особенности
При включенном резервировании метод изменяет общий остаток и резерв товара, а при складском учете — также резерв на складе. Если резервирование выключено или не используется для типа товара, метод изменяет количество без создания резерва при включенном количественном учете. Для отмены резерва передавайте отрицательное количество, которое соответствует ранее созданному резерву.
Пример
<?php
use Bitrix\Catalog\Product\CatalogProvider;
use Bitrix\Main\Loader;
if (!Loader::includeModule('catalog') || !Loader::includeModule('sale'))
{
throw new RuntimeException('Не удалось подключить модули catalog и sale');
}
// Существующий товар с количественным учетом и активный склад
// Вызов изменит количество и резерв согласно настройкам учета
$productId = 123;
$storeId = 1;
$provider = new CatalogProvider(['SITE_ID' => SITE_ID]);
$result = $provider->reserve([
$productId => [
'PRODUCT_ID' => $productId,
'BASKET_CODE' => 'basket-item-1',
'QUANTITY_LIST' => ['basket-item-1' => 1],
'QUANTITY_LIST_BY_STORE' => [
'basket-item-1' => [$storeId => 1],
],
],
]);
if (!$result->isSuccess())
{
echo implode(PHP_EOL, $result->getErrorMessages());
return;
}
$operation = $result->getData()['RESERVED_PRODUCTS_LIST'][$productId] ?? false;
if ($operation === false)
{
echo 'Данные операции отсутствуют; резервирование не подтверждено';
return;
}
if (isset($operation['IS_UPDATED']) && !$operation['IS_UPDATED'])
{
echo 'Данные товара не обновлены';
return;
}
if (!empty($operation['QUANTITY_NOT_RESERVED']))
{
echo 'Не зарезервировано: ' . $operation['QUANTITY_NOT_RESERVED'] . PHP_EOL;
}
print_r($operation);