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

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

Задача: в магазине 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.

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

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

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

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

Мобильное приложение

от 550 000 руб. от 5-ти недель

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

Сайт компании

от 300 000 руб. от 2-х недель

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.