Меню

Не дать купить товара больше, чем находится на определенных складах

Просмотров: 652

Задача: в магазине 20 складов, на всех есть остатки но нужно ограничить покупку товара только остатками на двух складах, не меняя параметр "Доступное количество" и не включая складской учет.

находится на определенных складах

Получить остаток товара на определенных складах API Битрикс

Для начала ограничим ввод количества товара в карточке товара. Для этого в result_modifier.php шаблона добавляем:

$arResult['HAS_QANTITY'] = 0;
$storeRes = CCatalogStoreProduct::GetList(
    false,
    array(
        "PRODUCT_ID" => $arResult['ID'],
        'STORE_ID' => array(
            6,
            13
        )
    ),
    false,
    false,
    array(
        "AMOUNT"
    )
);
while ($arStoreParam = $storeRes->Fetch()) {
    $arResult['HAS_QANTITY'] += (int)$arStoreParam['AMOUNT'];
}

Создали ключ $arResult['HAS_QANTITY'] с нулевым значением и с помощью метода CCatalogStoreProduct::GetList получили количество товара на складах с ID 6 и 13 и суммировали его в $arResult['HAS_QANTITY']

В template.php, там где планируем выводить кнопки добавления в корзину или показа остатков используем этот ключ. Простой пример, подгоняйте под себя:

<?if ($arResult['HAS_QANTITY'] > 0) { ?>
     <input type="number" max="<?=$arResult['HAS_QANTITY']?>">
     <button>в корзину</button>
<? } else {?>
     Нет в наличии
<?}?>

Изменить максимальное количество для покупки в корзине

Теперь, нужно сделать серверную проверку количества в корзине. Так чтобы не получилось что пользователь закинет товаров, в нее, больше чем разрешено.

В result_modifier.php шаблона корзины добавляем:

foreach ($arResult['BASKET_ITEM_RENDER_DATA'] as $item) {
    $itemCanBye = 0;
    $storeRes = CCatalogStoreProduct::GetList(
        false,
        array(
            "PRODUCT_ID" => $item['PRODUCT_ID'],
            'STORE_ID' => array(6, 13)
        ),
        false, false,
        array("AMOUNT")
    );
    while ($arStoreParam = $storeRes->Fetch()) {
        $itemCanBye += $arStoreParam['AMOUNT'];
    }
    if ($item['QUANTITY'] > $itemCanBye) {
        $arFields = array(
            "QUANTITY" => $itemCanBye,
        );
        $ID = CSaleBasket::Update(
                $item['ID'],
                $arFields
        );
    }
}

Методом CCatalogStoreProduct::GetList получаем остатки каждого товара, находящегося в корзине, на определенных складах.

Если в корзине оказалось товаров больше чем доступно на разрешенных складах- методом CSaleBasket::Update обновляем количество на максимально разрешенное, при загрузке страницы с корзиной.

Меняем AVAILABLE_QUANTITY в корзине

В корзине все еще можно увеличивать количество товара сверх "лимита" доступных складов. Для этого нужно перебить параметр AVAILABLE_QUANTITY каждого товара- который отвечает за максимально возможное количество.

В mutator.php шаблона корзины, в обходе цикла каждого товара, добавляем (обязательно до формирования массива $rowData):

$row['AVAILABLE_QUANTITY'] = 0;
$storeRes = CCatalogStoreProduct::GetList(
    array(
        "SORT" => "ASC"
    ),
    array(
        "PRODUCT_ID" => $row['PRODUCT_ID'],
        'STORE_ID' => array(
            6,
            13
        )
    ),
    false,
    false,
    array(
        "AMOUNT"
    )
);
while ($arStoreParam = $storeRes->Fetch()) {
    $row['AVAILABLE_QUANTITY'] += (int)$arStoreParam['AMOUNT'];
}

Теперь не получится увеличить количество товара больше чем есть на остатках складов 6 и 13.

Михаил Базаров 28.09.2024
Аналог CCatalogStoreProduct::GetList на D7 это \Bitrix\Catalog\StoreProductTable
Код
use Bitrix\Catalog\StoreProductTable;
use Bitrix\Main\Entity\Query;

// ID товара и ID складов
$productId = $arResult['ID'];
$storeIds = [6, 13];

// Инициализация результата
$arResult['HAS_QUANTITY'] = 0;

// Выполняем запрос с использованием ORM
$storeRes = StoreProductTable::getList([
    'filter' => [
        'PRODUCT_ID' => $productId,
        'STORE_ID' => $storeIds,
    ],
    'select' => ['AMOUNT'],
]);

// Обрабатываем результат
while ($arStoreParam = $storeRes->fetch()) {
    $arResult['HAS_QUANTITY'] += (int)$arStoreParam['AMOUNT'];
}

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 400 000 руб.
от 5-ти недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

Готовое решение — вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Запускается на одном из 200-та (на ваш выбор) готовых решений.

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.