Перейти к содержимому

Самовывоз и пункты выдачи - склады, список на оформлении, заказ

Настраиваем выдачу заказа в точке: заводим пункты, показываем их на оформлении и следим, чтобы покупатель не выбрал магазин, где товара нет.

Решение

Смотрим склады, которые станут пунктами выдачи:

$res = \Bitrix\Catalog\StoreTable::getList([
'select' => ['ID', 'TITLE', 'ADDRESS', 'ACTIVE', 'ISSUING_CENTER'],
'filter' => ['=ACTIVE' => 'Y'],
]);
while ($store = $res->fetch()) {
printf("%d %-24s выдача=%s %s\n", $store['ID'], $store['TITLE'],
$store['ISSUING_CENTER'], $store['ADDRESS']);
}

Пункты выдачи - это склады с отдельным признаком. Один и тот же склад может хранить остатки и выдавать заказы, а может только хранить, и решает это именно признак, а не название точки.

Показываем список на оформлении:

$service = \Bitrix\Sale\Delivery\Services\Manager::getObjectById($deliveryId);
$stores = $service->getStoreIds(); // список точек этой службы
printf("точек в службе: %d\n", count($stores));
// пустой список означает, что склады к службе не привязаны

Список точек приходит вместе со службой доставки, а не отдельным компонентом. Пустой список на оформлении почти всегда означает, что склады к службе самовывоза не привязаны в её настройках.

Записываем выбранный пункт в заказ:

$shipment = $order->getShipmentCollection()->getNotSystemItems()->current();
$shipment->setStoreId($storeId); // точка выдачи хранится у отгрузки
$order->save();

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

Скрываем точки, где товара нет:

$rows = \Bitrix\Catalog\StoreProductTable::getList([
'select' => ['STORE_ID', 'AMOUNT'],
'filter' => ['=PRODUCT_ID' => $productId, '>AMOUNT' => 0],
])->fetchAll();
// показываем только те точки, где остаток положительный
// список пунктов чужого сервиса забирают его API, а не заводят руками

Пункт без товара в списке - прямой путь к отменённому заказу. Остатки по складам считаются отдельно от общего количества, и фильтровать список точек надо именно по ним.

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

Самовывоз с резервом требует договорённости со складом. Заказ, лежащий сутки без подтверждения, либо занимает товар, либо теряет его, и выбор между этими вариантами делается до запуска, а не после первых жалоб.

Типичные проблемы

На оформлении нет ни одной точки.

Склады не привязаны к службе самовывоза в её настройках. Список точек приходит от службы, а не сам по себе.

В списке есть склады, куда покупателя не пускают.

У склада не снят признак пункта выдачи. Хранение и выдача - разные роли одного склада.

Покупатель выбрал точку, а в заказе её нет.

Выбор записан свойством заказа вместо отгрузки. Точка выдачи хранится именно у отгрузки.

Заказ отменяют из-за отсутствия товара в точке.

Список точек не отфильтрован по остаткам. Остаток по складу считается отдельно от общего количества.

Часы работы устарели на всех точках сразу.

Расписание записано в шаблоне вместо карточки склада. Правка требует выкладки кода вместо правки данных.

Частые вопросы

Чем пункт выдачи отличается от склада?

Признаком выдачи в карточке склада. Без него склад участвует только в учёте остатков.

Можно ли показывать точки на карте?

Да, координаты хранят в карточке склада или в своём поле. Карта берёт их оттуда и не требует отдельного справочника.

Как считать наличие, если точек много?

Одним запросом по остаткам всех точек для нужного товара. Запрос на каждую точку по очереди заметно медленнее.

Нужен ли резерв при самовывозе?

Зависит от договорённости со складом: либо заказ держит товар, либо покупатель едет на свой риск. Схему выбирают заранее.

Смежное

Первоисточник