Разные города-отправители для одного заказа
При работе с разными складами может возникнуть ситуация, когда товары могут базироваться в разных городах. Тогда стоимость и сроки доставки должны учитывать доставку товаров с разных направлений. В этом случае можно воспользоваться функционалом разбиения на города-отправители.
Если задано разбиение на города-отправители - товары в заказе будут разбиты по указанному правилу по нескольким городам-отправителям. Тогда стоимость доставки будет равна суммарной стоимости доставки распределенных по городам-отправителям товаров до города доставки. Срок же будет выведен максимальный.
Пример: в заказе два товара, один находится на складе в Москве, второй - в Санкт-Петербурге. Их нужно доставить в Екатеринбург. По умолчанию стоимость и срок доставки будет рассчитываться до Екатеринбурга от города-отправителя, указанного в настройках. Если задать же распределение, стоимость доставки будет равна (Доставка I товара из Москвы в Екатеринбург) + (Доставка II товара из Санкт-Петербурга в Екатеринбург); срок доставки: максимум(Доставка из Москвы в Екатеринбург, Доставка из Санкт-Петербурга в Екатеринбург).
Обратите внимание, что функционал манипулирует только со стоимостями и сроками доставки! Он НЕ разбивает заявки на несколько отправлений, а заказ - на отгрузки. Все это возлагается на менеджера.
Чтобы задать распределение необходимо во-первых поставить флаг “Включить разбиение на города-отправители”, а во-вторых задать функцию-распределитель товаров, подписанную на событие onBeforeShipment. Функция принимает массив распределения (пустой по умолчанию) и массив с товарами, которые необходимо распределить. В теле функции в массив распределения необходимо задать распределение товаров. Те товары, которые не были распределены функцией, будут определены в отдельную отгрузку с базовым городом-отправителем!
Задание функции возлагается на пользователей модуля. Для этого необходимо вмешательство стороннего программиста. Разработчики модуля могут помочь с этим, но только в рамках платной техподдержки.
Если у вас используются кастомизированные шаблоны виджетов выбора ПВЗ или инфовиджета - их расчет может отличаться от оформления заказа при задании распределения, так как они считают доставку по старой схеме. Адаптируйте шаблоны согласно стандартным.
В заявке у заказов, подверженных разбиению, может казаться неадекватным свойство “Рассчитанный тариф СДЭК”, так как там хранится информация по всем тарифам отгрузок. В самом окне можно вызвать справку, которая выдаст эти сведения в удобочитаемом формате (“Задано разбиение”).
AddEventHandler('ipol.sdek', 'onBeforeShipment', 'SDEK_shipment'); // подписываемся на событие
function SDEK_shipment(&$order,$items){ // получаем массив с товарами
/*
Вид входящего массива:
array(
array(
'ID' => ID записи в корзине покупателя
'PRODUCT_ID' => ID товара
'PRICE' => цена
'QUANTITY' => количество
'DIMENSIONS' => Array габариты в милиметрах
(
'WIDTH' => 0
'HEIGHT' => 0
'LENGTH' => 0
)
'WEIGHT' => вес в граммах
'SET_PARENT_ID' => признак комплекта
'LID' => принадлежность сайту
)
)
Вид выходного массива
array(
array(
'SENDER' => ID Города-отправителя ПО БАЗЕ СДЭКа,
'ITEMS' => array(
'ID записи в корзине покупателя' => количество
)
)
)
!Не забудьте, что $order - указатель на массив
Пример: допустим, что у всех товаров есть некое свойство, где записан город-отправитель в текстовом виде, и это свойство будет иметь код SENDER
*/
cmodule::includeModule('iblock');
cmodule::includeModule('sale');
$arOrder = array();
foreach($items as $item){
// получаем значение свойства
$propValue = CIBlockElement::GetList(
array(),
array(
'ID'=>$item['PRODUCT_ID'],
'LID'=>$item['LID']
),
false,
false,
array('ID','PROPERTY_SENDER')
)->Fetch();
if($propValue && $propValue['PROPERTY_SENDER_VALUE']){
// получаем местоположение
$city = CSaleLocation::getList(array(),array('CITY_NAME'=>$propValue['PROPERTY_SENDER_VALUE']))->Fetch();
if($city){
// ищем город в таблице СДЭКа и молимся, чтобы все прошло хорошо
$SDEKcity = sqlSdekCity::getByBId($city['ID']);
if($SDEKcity){
if(!array_key_exists($SDEKcity['SDEK_ID'],$arOrder))
$arOrder[$SDEKcity['SDEK_ID']] = array();
$arOrder[$SDEKcity['SDEK_ID']][$item['ID']] = $item['QUANTITY'];
}
}
}
}
foreach($arOrder as $city => $items)
$order[]= array(
'SENDER' => $city,
'ITEMS' => $items
);
}