@MrSancho

Как изменить состав отгрузки в заказе?

как изменить состав отгрузки в заказе ?

используется следующий код


$order = \Bitrix\Sale\Order::load(3007721);

$shipmentCollection = $order->getShipmentCollection();

$basket = $order->getBasket();

/*УДАЛЯЕМ ОТГРУЗКУ, при удалении этим методом отгрузка исчезает*/
foreach ($shipmentCollection as $shipment)
{
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($shipmentItemCollection as $item){
$item->setQuantity(0);
$item->delete();
$item->save();
}

$shipment->delete();

$shipment->save();
}

/*создаем отгрузку для каждого товара
отгрузка создается, но без товаров внутри joxi.ru/KAxzvMBuMqKkXm
также после удаления отгрузки нет возможности больше добавить товар, даже через админку

*/
foreach ($basket as $basketItem) {
$shipment = $shipmentCollection->createItem();
$shipment->setField('CURRENCY', $order->getCurrency());
$shipment->setField('DELIVERY_ID', 1);
$shipmentItemCollection = $shipment->getShipmentItemCollection();
$shipmentItem = $shipmentItemCollection->createItem($basketItem);
$shipmentItem->setQuantity($basketItem->getQuantity());
}

$order->save();

/*но при удалении отгрузки или товара из состава отгрузки из админки, в дальнейшем можно добавить товар отбратно

подскажите метод решения ? в чем проблема?
*/
  • Вопрос задан
  • 3093 просмотра
Пригласить эксперта
Ответы на вопрос 2
AlexeyGfi
@AlexeyGfi
YouTube >>> Битриксоид из Колхоза
Сравните с кодом из ядра
/bitrix/components/bitrix/sale.order.ajax/class.php

/**
	 * Initialization of shipment object. Filling with basket items.
	 *
	 * @param Order $order
	 * @return Shipment
	 * @throws Main\ArgumentTypeException
	 * @throws Main\NotSupportedException
	 */
	public function initShipment(Order $order)
	{
		$shipmentCollection = $order->getShipmentCollection();
		$shipment = $shipmentCollection->createItem();
		$shipmentItemCollection = $shipment->getShipmentItemCollection();
		$shipment->setField('CURRENCY', $order->getCurrency());

		/** @var Sale\BasketItem $item */
		foreach ($order->getBasket() as $item)
		{
			/** @var Sale\ShipmentItem $shipmentItem */
			$shipmentItem = $shipmentItemCollection->createItem($item);
			$shipmentItem->setQuantity($item->getQuantity());
		}

		return $shipment;
	}
Ответ написан
@tgarl
Понимаю что тема старая, но в итоге какое решение?
//собираем id которые нужно снести с корзины
foreach ($basket as $basketItem) {  
$zapjmnimID[] = $basketItem->getField('ID');  
}
//добавляем новый товар
$item = $basket->createItem('catalog', $obEl['ID']); //создаём новый товар в корзине
$item->setFields(array(
   'QUANTITY' => 1,
   'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
   'LID' => 's1',
   'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
   "CATALOG_XML_ID" => $obEl['IBLOCK_EXTERNAL_ID'],
   "PRODUCT_XML_ID" => $obEl['XML_ID'],
   'CUSTOM_PRICE'=>'Y',
   'PRICE' => $PlProductInfo['PRICE'],
   'NAME'=>$arParams['NAME']['VALUE']
));
   
$item->getPropertyCollection()->setProperty($arParams);

//удаляем не нужные товары
foreach($zapjmnimID as $delitem){
   $basket->getItemById($delitem)->delete();
}
//сохраняем корзину
$basket->save();

//отгрузка, доставка
$shipmentCollection = $order->getShipmentCollection();
удаляем текущую отгрузку
foreach ($shipmentCollection as $shipment) {
  $shipment->delete();
}
//добавляем доставку под другой тип               
$shipment = $shipmentCollection->createItem();
$service = \Bitrix\Sale\Delivery\Services\Manager::getById(15);
$shipment->setFields(array(
   'DELIVERY_ID' => $service['ID'],
   'DELIVERY_NAME' => $service['NAME'],
));
$shipmentItemCollection = $shipment->getShipmentItemCollection();
//добавляем товары в отгрузку
foreach ($basket as $basketItem)
{
   $item = $shipmentItemCollection->createItem($basketItem);
   $item->setQuantity($basketItem->getQuantity());
}
//сохраняем заказ
$result = $order->save();


вот мой код, но отгрузка пустая и не могу понять в чем именно проблема
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы