Magento 2. Создание счета-фактуры программно из наблюдателя заказа

Я тестирую 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();

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

Есть идеи, чего мне не хватать?

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 и мой наблюдатель сейчас работает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]