Magento 2: Программное создание счета из Order Observer

Я тестирую Magento 2.2.3 и создал наблюдателя для события sales_order_save_after, который использую для автоматического создания счета.

Вот текущая ошибка, которую я получаю после размещения заказа:

Order saving error: Rolled back transaction has not been completed correctly.

И мой MyCompany/MyModule/Observer/SalesOrderSaveAfter.php

<?php
namespace MyCompany\MyModule\Observer;

use Magento\Framework\Event\ObserverInterface;

class SalesOrderSaveAfter implements ObserverInterface
{
    protected $_invoiceService;
    protected $_transactionFactory;

    public function __construct(
      \Magento\Sales\Model\Service\InvoiceService $invoiceService,
      \Magento\Framework\DB\TransactionFactory $transactionFactory
    ) {
       $this->_invoiceService = $invoiceService;
       $this->_transactionFactory = $transactionFactory;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $order = $observer->getEvent()->getOrder();

        try {
            if(!$order->canInvoice()) {
                return null;
            }
            if(!$order->getState() == 'new') {
                return null;
            }

            $invoice = $this->_invoiceService->prepareInvoice($order);
            $invoice->setRequestedCaptureCase(\Magento\Sales\Model\Order\Invoice::CAPTURE_ONLINE);
            $invoice->register();

            $transaction = $this->_transactionFactory->create()
              ->addObject($invoice)
              ->addObject($invoice->getOrder());

            $transaction->save();

        } catch (\Exception $e) {
            $order->addStatusHistoryComment('Exception message: '.$e->getMessage(), false);
            $order->save();
            return null;
        }
    }
}

Если я удалю транзакционную часть кода, например:

$transaction = $this->_transactionFactory->create()
    ->addObject($invoice)
    ->addObject($invoice->getOrder());

    $transaction->save();

тогда заказ будет проходить с продуктами, помеченными как выставленные счета, но на самом деле счет не создается и не сохраняется в заказе.

Любые идеи, что я мог пропустить?


person AJK    schedule 09.03.2018    source источник
comment
Эй, вы нашли какое-нибудь решение проблемы с созданием счета? Я также сталкиваюсь с подобной проблемой. Пожалуйста, помогите, если вы уже нашли какое-либо решение. Заранее спасибо!   -  person Hemant paliwal    schedule 30.03.2018
comment
@Hemantpaliwal да, я сделал! Извините, я обновлю ответ   -  person AJK    schedule 30.03.2018


Ответы (1)


https://magento.stackexchange.com/questions/217045/magento-2-how-to-automatically-create-invoice-from-order-observer

Ответ на это заключается в том, что я использовал неправильное событие. С событием sales_order_save_after заказ еще не был зафиксирован в базе данных.

Я изменил свое событие, чтобы оно срабатывало на checkout_submit_all_after, и теперь мой наблюдатель работает.

person AJK    schedule 30.03.2018