Я тестирую 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();
тогда заказ будет обработан с продуктами, помеченными как выставленные счета-фактуры, но счет-фактура фактически не создается и не сохраняется в заказе.
Есть идеи, чего мне не хватать?
Ответ на это заключается в том, что я использовал неправильное событие. С событием sales_order_save_after
заказ еще не был передан в базу данных.
Я изменил свое событие, чтобы стрелять checkout_submit_all_after
и мой наблюдатель сейчас работает.
Других решений пока нет …