registry = $registry; $this->invoiceSender = $invoiceSender; $this->shipmentSender = $shipmentSender; $this->shipmentFactory = $shipmentFactory; $this->invoiceService = $invoiceService; parent::__construct($context); } /** * Prepare shipment * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return \Magento\Sales\Model\Order\Shipment|false */ protected function _prepareShipment($invoice) { $invoiceData = $this->getRequest()->getParam('invoice'); $shipment = $this->shipmentFactory->create( $invoice->getOrder(), isset($invoiceData['items']) ? $invoiceData['items'] : [], $this->getRequest()->getPost('tracking') ); if (!$shipment->getTotalQty()) { return false; } return $shipment->register(); } /** * Save invoice * * We can save only new invoice. Existing invoices are not editable * * @return \Magento\Framework\Controller\ResultInterface * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function execute() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); $formKeyIsValid = $this->_formKeyValidator->validate($this->getRequest()); $isPost = $this->getRequest()->isPost(); if (!$formKeyIsValid || !$isPost) { $this->messageManager ->addErrorMessage(__("The invoice can't be saved at this time. Please try again later.")); return $resultRedirect->setPath('sales/order/index'); } $data = $this->getRequest()->getPost('invoice'); $orderId = $this->getRequest()->getParam('order_id'); if (!empty($data['comment_text'])) { $this->_objectManager->get(\Magento\Backend\Model\Session::class)->setCommentText($data['comment_text']); } try { $invoiceData = $this->getRequest()->getParam('invoice', []); $invoiceItems = isset($invoiceData['items']) ? $invoiceData['items'] : []; /** @var \Magento\Sales\Model\Order $order */ $order = $this->_objectManager->create(\Magento\Sales\Model\Order::class)->load($orderId); if (!$order->getId()) { throw new \Magento\Framework\Exception\LocalizedException(__('The order no longer exists.')); } if (!$order->canInvoice()) { throw new \Magento\Framework\Exception\LocalizedException( __('The order does not allow an invoice to be created.') ); } $invoice = $this->invoiceService->prepareInvoice($order, $invoiceItems); if (!$invoice) { throw new LocalizedException(__("The invoice can't be saved at this time. Please try again later.")); } if (!$invoice->getTotalQty()) { throw new \Magento\Framework\Exception\LocalizedException( __("The invoice can't be created without products. Add products and try again.") ); } $this->registry->register('current_invoice', $invoice); if (!empty($data['capture_case'])) { $invoice->setRequestedCaptureCase($data['capture_case']); } if (!empty($data['comment_text'])) { $invoice->addComment( $data['comment_text'], isset($data['comment_customer_notify']), isset($data['is_visible_on_front']) ); $invoice->setCustomerNote($data['comment_text']); $invoice->setCustomerNoteNotify(isset($data['comment_customer_notify'])); } $invoice->register(); $invoice->getOrder()->setCustomerNoteNotify(!empty($data['send_email'])); $invoice->getOrder()->setIsInProcess(true); $transactionSave = $this->_objectManager->create( \Magento\Framework\DB\Transaction::class )->addObject( $invoice )->addObject( $invoice->getOrder() ); $shipment = false; if (!empty($data['do_shipment']) || (int)$invoice->getOrder()->getForcedShipmentWithInvoice()) { $shipment = $this->_prepareShipment($invoice); if ($shipment) { $transactionSave->addObject($shipment); } } $transactionSave->save(); // send invoice/shipment emails try { if (!empty($data['send_email'])) { $this->invoiceSender->send($invoice); } } catch (\Exception $e) { $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e); $this->messageManager->addErrorMessage(__('We can\'t send the invoice email right now.')); } if ($shipment) { try { if (!empty($data['send_email'])) { $this->shipmentSender->send($shipment); } } catch (\Exception $e) { $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e); $this->messageManager->addErrorMessage(__('We can\'t send the shipment right now.')); } } if (!empty($data['do_shipment'])) { $this->messageManager->addSuccessMessage(__('You created the invoice and shipment.')); } else { $this->messageManager->addSuccessMessage(__('The invoice has been created.')); } $this->_objectManager->get(\Magento\Backend\Model\Session::class)->getCommentText(true); return $resultRedirect->setPath('sales/order/view', ['order_id' => $orderId]); } catch (LocalizedException $e) { $this->messageManager->addErrorMessage($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addErrorMessage( __("The invoice can't be saved at this time. Please try again later.") ); $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e); } return $resultRedirect->setPath('sales/*/new', ['order_id' => $orderId]); } }