Задача в том, чтобы при получении заказа создавать две отгрузки, в каждой по 50% товара. Происходит всё в кастомизированном компоненте order.d7. Отгрузки создаются, и, сразу после вызова метода, можно даже вывести товары из них, но после оформления заказа остаются две пустых отгрузки совсем без товаров. В чём может быть проблема?
private function addShipment() {
if (count($this->basketItems) > 1) {
/* @var $shipmentCollection ShipmentCollection */
$shipmentCollection = $this->order->getShipmentCollection();
/* @var $shipment Shipment */
foreach ($shipmentCollection as $key => $shipment) {//убрать системную отгрузку. должна остаться одна.
if ($shipment->isSystem()) {
unset($shipmentCollection[$key]);
}
}
unset($shipment);
//получить данные оставшейся отгрузки, для записи в последующие
$shipmentCollection->rewind();
$sysShipment = $shipmentCollection->current();
/* @var $firstShipment Shipment */
$firstShipment = $shipmentCollection->createItem();
/** @var Bitrix\Sale\ShipmentItemCollection $firstItemCollection */
$firstItemCollection = $firstShipment->getShipmentItemCollection();
//записываем в первую отгрузку половину позиций
$halfCount = ceil($this->basketItems->count() / 2);
$this->basketItems->rewind();
for ($i = 0; $i < $halfCount; $i++) {
if ($i == $halfCount) break;
/** @var \Bitrix\Sale\BasketItem $basketItem */
$basketItem = $this->basketItems->current();
/** @var Bitrix\Sale\ShipmentItem $shipmentItem */
$shipmentItem = $firstItemCollection->createItem($basketItem);
$shipmentItem->setQuantity($basketItem->getQuantity());
$this->basketItems->next();
}
unset($shipmentItem);
$firstShipment->setFields([
'DELIVERY_ID' => !is_null($sysShipment->getDeliveryId()) ? $sysShipment->getDeliveryId() : 0,
'DELIVERY_NAME' => $sysShipment->getDeliveryName(),
'CURRENCY' => $sysShipment->getCurrency(),
]);
try {
$firstShipment->setFields([
'PRICE_DELIVERY' => Manager::calculateDeliveryPrice($firstShipment, (!is_null($sysShipment->getDeliveryId())) ? (int)$sysShipment->getDeliveryId() : 0)
]);
} catch (\Bitrix\Main\ArgumentNullException $e) {}
$secondShipment = $shipmentCollection->createItem();
/** @var Bitrix\Sale\ShipmentItemCollection $secondItemCollection */
$secondItemCollection = $secondShipment->getShipmentItemCollection();
//записываем во вторую отгрузку вторую половину позиций
for ($i = 0; $i < $this->basketItems; $i++) {
/** @var \Bitrix\Sale\BasketItem $basketItem */
$basketItem = $this->basketItems->current();
/** @var Bitrix\Sale\ShipmentItem $shipmentItem */
$shipmentItem = $secondItemCollection->createItem($basketItem);
$shipmentItem->setQuantity($basketItem->getQuantity());
$this->basketItems->next();
}
$secondShipment->setFields([
'DELIVERY_ID' => !is_null($sysShipment->getDeliveryId())?$sysShipment->getDeliveryId(): 0,
'DELIVERY_NAME' => $sysShipment->getDeliveryName(),
'CURRENCY' => $sysShipment->getCurrency(),
]);
try {
$secondShipment->setFields([
'PRICE_DELIVERY' => Manager::calculateDeliveryPrice($secondShipment, (!is_null($sysShipment->getDeliveryId())) ? (int)$sysShipment->getDeliveryId() : 0)
]);
} catch (\Bitrix\Main\ArgumentNullException $e) {}
//оригинальную отгрузку надо убрать
$sysShipment->delete();
}
}
Вывожу товары из отгрузок после вызова метода так
/* @var $shipmentCollection ShipmentCollection */
$shipmentCollection = $this->order->getShipmentCollection();
foreach ($shipmentCollection as $shipment){
/** @var Bitrix\Sale\Shipment $shipment */
if(!$shipment->isSystem()) {
$ItemCollection = $shipment->getShipmentItemCollection()->getSellableItems();
foreach ($ItemCollection as $item) {
/** @var Bitrix\Sale\ShipmentItem $item */
var_dump($item->getProductId());
}
}
}
С отгрузками только познакомился, так что скорее всего не вижу очевидную ошибку.