Ранее обсуждался вопрос в теме, но пришло время модернизировать систему.
На форуме Битрикса обсуждалось решение, где предлагалось использовать свойство товара «доступен под заказ», что было бы очень удобный и наглядный вариант, но остается сложность с заливкой массива данных. У нашего поставщика в прайсе 7500 наименований. Обновление происходит ежедневно. Тогда нужен целый отдел для обновления свойства заказа, или обработчик.
Я же решил оставить старый алгоритм, когда в отдельном ИБ линейным списком лежит вся номенклатура поставщика в виде двух сущностей: наименование = артикул товара и свойство наличие на складе.
Тогда в списке перечисляются все артикулы и все статусы наличия, если 0, то товара нет.
В данном варианте мы можем воспользоваться функциями импорта данных в инфоблок в формате CSV (Контент — Инфоблоки — Импорт — CSV). Т.е. нужно в Excel подправить колонки прайса и импортировать. На все дело уходит 10-15 минут работы.
Теперь осталось прикрутить остатки в шаблонах магазина.
Для определения остатка по поставщикам я добавил свой компонент «spl:instock»:
<? if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); if (!empty($arParams['SKU'])){//есть товары, где нет артикула, тогда их наличие у поставщика можно получить только по наименованию товара. В нашем случае, мы не фиксируем наименование товара и будем отдавать такие операции менеджерам... if(CModule::IncludeModule("iblock")) { $search_in=array(3);//список ИБ, где искать наличие $arSelect = Array("PROPERTY_INSTOK");//выбираем свойство наличие на складе $arFilter = Array("IBLOCK_ID"=>$search_in,"NAME"=>$arParams['SKU'],"ACTIVE"=>"Y"); $arCargo = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); if ($ob = $arCargo->GetNextElement()) { $arFields = $ob->GetFields(); } return $arFields['PROPERTY_INSTOK_VALUE'];//возвращаем наличие } }else{ return 1;//всегда в наличии под заказ, если нет артикула товара } ?>
В настройках торгового каталога включаем количественный учет и разрешаем покупку товара при нулевом остатке (от поставщика).
Самым простым и чистым способом оказалось добавить модификатор к данным для каждого компонента магазина. Хотя, было бы удобнее все внести в код модуля магазина, но при обновлении решения все потеряется.
Поэтому все изменения я буду вносить в копию шаблона магазина.
Открываем папку шаблон компонента catalog.element.
Файл result_modifier.php:
После
switch ($arResult['CATALOG_TYPE']) { case CCatalogProduct::TYPE_SET: $arResult['OFFERS'] = array(); $arResult['CHECK_QUANTITY'] = ('Y' == $arResult['CATALOG_QUANTITY_TRACE'] && 'N' == $arResult['CATALOG_CAN_BUY_ZERO']); break; case CCatalogProduct::TYPE_SKU: break; case CCatalogProduct::TYPE_PRODUCT: default: $arResult['CHECK_QUANTITY'] = ('Y' == $arResult['CATALOG_QUANTITY_TRACE'] && 'N' == $arResult['CATALOG_CAN_BUY_ZERO']); break; }
добавляем код
$arResult['CAN_BUY']=false;//запрещаем покупку для всех товаров, даже если есть в наличии. $arResult['CAN_ORDER']=$APPLICATION->IncludeComponent("spl:instock","",Array("SKU" => $arResult["PROPERTIES"]["CML2_ARTICLE"]["VALUE"]));//получаем остатки на складах поставщиков if ($arResult['CATALOG_QUANTITY']){$arResult['CAN_BUY']="Y";$arResult['MAX_QUANTITY']=$arResult['CATALOG_QUANTITY'];$arResult['CHECK_QUANTITY']="Y";}//если товар на нашем складе, то разрешаем покупку и ограничиваем максимальное количество укладываемого товара в корзину его наличием if ($arResult['CAN_ORDER']){$arResult['CAN_BUY']="Y";$arResult['MAX_QUANTITY']=null;}//если товар есть у поставщика, то снов разрешаем покупку и снимаем ограничение на количество товара в корзине.
Теперь в файл шаблона template.php добавляем в нужном месте информацию о возможности заказа товара:
if ($arResult["CAN_ORDER"]):?> <p>Товар доступен к заказу у поставщика<?if ($arResult["CAN_ORDER"]>1):?>: много<?endif?><br> Средний срок поставки 2-5 дней.</p> <?elseif($arResult['CATALOG_QUANTITY']==0 && $arResult["CAN_ORDER"]==0):?> <p>Товара нет на складах поставщика.</p> <?endif;?>
Итого карточка товара «под заказ» выглядит так:
Карточка товара из наличия:
И смешанный:
В шаблон компонента catalog.section также вносим изменения.
Файл result_modifier.php:
После
switch ($arItem['CATALOG_TYPE']) { case CCatalogProduct::TYPE_SET: $arItem['OFFERS'] = array(); $arItem['CHECK_QUANTITY'] = ('Y' == $arItem['CATALOG_QUANTITY_TRACE'] && 'N' == $arItem['CATALOG_CAN_BUY_ZERO']); break; case CCatalogProduct::TYPE_SKU: break; case CCatalogProduct::TYPE_PRODUCT: default: $arItem['CHECK_QUANTITY'] = ('Y' == $arItem['CATALOG_QUANTITY_TRACE'] && 'N' == $arItem['CATALOG_CAN_BUY_ZERO']); break; }
Добавляем свой чуть модифицированный код, т.к. сейчас в рамках foreach мы работает с набором элементов arResult, и как следствие, arItem, как одиночный элемент:
$arItem['CAN_BUY']=false; $arItem['CAN_ORDER']=$APPLICATION->IncludeComponent("spl:instock","",Array("SKU" => $arItem["PROPERTIES"]["CML2_ARTICLE"]["VALUE"])); if ($arItem['CATALOG_QUANTITY']){$arItem['CAN_BUY']="Y";$arItem['MAX_QUANTITY']=$arItem['CATALOG_QUANTITY'];$arItem['CHECK_QUANTITY']="Y";} if ($arItem['CAN_ORDER']){$arItem['CAN_BUY']="Y";$arItem['MAX_QUANTITY']=null;}
И, конечно, чтобы включить ограничение товара в корзину по остаткам на складе или безлимитно под заказ (хотя тут уже сами придумаете свои условия) в
$arJSParams = array(
опцию
'MAX_QUANTITY' => $arItem['CATALOG_QUANTITY'],
во всех компонентах нужно заменить на
'MAX_QUANTITY' => $arItem['MAX_QUANTITY'],
Далее нужно кастомизировать и другие компоненты каталога, но это будет чуть позже.. сейчас нужно развернуть сервер 1С у клиента. До скорого!
Один комментарий к “Учет наличия товаров на складах поставщиков — обновление”