@bichukov

Почему может не передаваться сумма в раздробленный заказ?

Доброго дня.
пытаюсь разобраться как можно разбить конкретный заказ на несколько.
т.е. каждую позицию перенести в новый заказ.
<?php
use Bitrix\Main\EventManager;

// Регистрируем обработчик события
EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleComponentOrderOneStepComplete',
    'createSeparateOrders'
);

function createSeparateOrders($orderId)
{
    if (intval($orderId) <= 0) {
        // Если ID заказа не передан или некорректен, выходим из функции
        return;
    }

    \Bitrix\Main\Loader::includeModule("sale");

    $order = \Bitrix\Sale\Order::load($orderId); // Загружаем оформленный заказ по его ID

    if (!$order) {
        // Если заказ не найден, выходим из функции
        return;
    }

    $basket = $order->getBasket();

    if (!$basket) {
        // Если корзина заказа не найдена, выходим из функции
        return;
    }

    $basketItems = $basket->getBasketItems();

    // Проверяем количество позиций в корзине
    $numItems = count($basketItems);

    // Если в корзине есть более одной позиции, разбиваем заказ
    if ($numItems > 1) {
        // Создаем новый заказ для каждой позиции
        foreach ($basketItems as $basketItem) {
            // Получаем цену и количество товара из текущей позиции корзины
            $price = $basketItem->getPrice();
            $quantity = $basketItem->getQuantity();

            // Если цена или количество не заданы, пропускаем эту позицию
            if ($price <= 0 || $quantity <= 0) {
                continue;
            }

            // Создаем новый заказ
            $newOrder = \Bitrix\Sale\Order::create($order->getSiteId(), $order->getUserId());

            // Создаем новую корзину для нового заказа и добавляем в нее текущую позицию
            $newBasket = \Bitrix\Sale\Basket::create($order->getSiteId());
            $newBasketItem = $newBasket->createItem('catalog', $basketItem->getProductId());

            // Устанавливаем цену и количество для новой позиции корзины
            $newBasketItem->setField('PRICE', $price);
            $newBasketItem->setField('QUANTITY', $quantity);

            // Устанавливаем остальные параметры позиции заказа, если они известны
            $newBasketItem->setField('NAME', $basketItem->getField('NAME'));
            $newBasketItem->setField('CURRENCY', $basketItem->getCurrency());

            $newOrder->setBasket($newBasket);

            // Попытка сохранить новый заказ
            $result = $newOrder->save();

            if ($result->isSuccess()) {
                echo 'Новый заказ успешно создан.<br>';
            } else {
                echo 'Ошибка при создании нового заказа: ' . implode(', ', $result->getErrorMessages()) . '<br>';
            }
        }
    } else {
        // Если в корзине была только одна позиция или вообще не было позиций,
        // сохраняем заказ вне зависимости от условия
        $order->save();
    }
}
?>


я это делаю все под админом и у меня создается отдельные товары со значением суммы 0. хотя сумму в коде передаю на запись
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
PeterLS
@PeterLS
Руководитель веб-студии
Судя по коду, вы используете правильный подход для создания отдельных заказов для каждой позиции. Однако, есть несколько моментов, на которые стоит обратить внимание:

  1. Проверьте, что метод $basketItem->getPrice() действительно возвращает корректную цену товара, и она больше нуля. Если цена возвращается нулевая, возможно, нужно использовать другой метод или смотреть дополнительные параметры товара.
  2. Убедитесь, что товары в корзине имеют установленную цену и количество. Вы можете проверить эти параметры, прежде чем создавать новые позиции.
  3. Проверьте, не влияют ли скидки или налоги на итоговую цену товара. Возможно, при создании нового заказа данные параметры не учитываются, и поэтому сумма получается нулевая.
  4. Убедитесь, что вы передаете правильный ID товара в метод createItem. Ошибка здесь может привести к некорректному формированию цены.
  5. В вашем коде нет учета налогов и скидок. Это может быть причиной того, что итоговая сумма получается нулевой. Убедитесь в том, что вы корректно копируете все необходимые параметры из оригинальной корзины в новую, включая налоги, скидки и т.д.
  6. После создания нового заказа вам также может потребоваться установить его свойства, такие как адрес доставки, способ оплаты и т.д., аналогичные тем, что были в оригинальном заказе.

Если проблема сохраняется, рекомендую вам подробнее проанализировать объект $result, который возвращается после сохранения заказа, чтобы увидеть, не идут ли там какие-либо ошибки, которые могут указывать на причину проблемы.
Ответ написан
Ваш ответ на вопрос

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

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