Разные города-отправители для одного заказа

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

Если задано разбиение на города-отправители - товары в заказе будут разбиты по указанному правилу по нескольким городам-отправителям. Тогда стоимость доставки будет равна суммарной стоимости доставки распределенных по городам-отправителям товаров до города доставки. Срок же будет выведен максимальный.

Пример: в заказе два товара, один находится на складе в Москве, второй - в Санкт-Петербурге. Их нужно доставить в Екатеринбург. По умолчанию стоимость и срок доставки будет рассчитываться до Екатеринбурга от города-отправителя, указанного в настройках. Если задать же распределение, стоимость доставки будет равна (Доставка 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
		);
}

Обратитесь за платной консультацией, если не можете решить проблему или ваши технические специалисты заняты.
Нашли ошибку?
Или знаете как дополнить? Выделите фрагмент текста и нажмите CTRL+Enter или просто напишите сюда

Другие решения и услуги

cover
Интеграционное обслуживание
Услуги по комплексной интеграции и поддержке ваших клиентов
Об обслуживании cover
cover
Техническая поддержка
Для готового сайта, приложения и других систем любой сложности и готовности
О поддержке cover
cover
Готовое мобильное приложение
Для интернет-магазинов, доставки еды и продуктов
О приложении Mobile Shop cover
cover
Модуль КЛАДР
Подсказки и автозаполнение адреса в корзине вашего интернет-магазина
О модуле Кладр cover
cover
Модуль ASEO
Профессиональный инструмент для СЕО-оптимизации сайта
О модуле Aseo cover