Разработка на 1С-Битрикс Михаил Базаров
Блог-note

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

Просмотров: 3032
Задача: в магазине 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С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

Финальная стоимость и сроки разработки обговариваются на этапе обсуждения. Скачайте опросник на разработку, заполните как можно подробнее и вышлите удобным способом. После ознакомления смогу задать уточняющие вопросы и оценить проект.

Включено в стоимость разработки

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

Заметки по 1С-Битрикс