v_i_rus
@v_i_rus

Bitrix: почему не сохраняются товары в отгрузках?

Задача в том, чтобы при получении заказа создавать две отгрузки, в каждой по 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());
        }
    }
}


С отгрузками только познакомился, так что скорее всего не вижу очевидную ошибку.
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
v_i_rus
@v_i_rus Автор вопроса
Почему-то не добавлялись товары, если заказ уже создан. Если те же самые действия выполнить в момент создания заказа, то всё работает как надо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы