Учет наличия товаров на складах поставщиков — обновление

Ранее обсуждался вопрос в теме, но пришло время модернизировать систему.

На форуме Битрикса обсуждалось решение, где предлагалось использовать свойство товара «доступен под заказ», что было бы очень удобный и наглядный вариант, но остается сложность с заливкой массива данных. У нашего поставщика в прайсе 7500 наименований. Обновление происходит ежедневно. Тогда нужен целый отдел для обновления свойства заказа, или обработчик.

Я же решил оставить старый алгоритм, когда в отдельном ИБ линейным списком лежит вся номенклатура поставщика в виде двух сущностей: наименование = артикул товара и свойство наличие на складе.

capture_002_11112016_115224

Тогда в списке перечисляются все артикулы и все статусы наличия, если 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;?>

Итого карточка товара «под заказ» выглядит так:

capture_003_11112016_130009

Карточка товара из наличия:

capture_004_11112016_131147

И смешанный:

capture_005_11112016_131249

В шаблон компонента 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С у клиента. До скорого!

Комментарии:

Учет наличия товаров на складах поставщиков — обновление: 1 комментарий

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *