![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-sales/Controller/Adminhtml/Order/Invoice/ |
<?php /** * * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Sales\Controller\Adminhtml\Order\Invoice; use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface; use Magento\Backend\App\Action; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Registry; use Magento\Sales\Model\Order\Email\Sender\InvoiceSender; use Magento\Sales\Model\Order\Email\Sender\ShipmentSender; use Magento\Sales\Model\Order\ShipmentFactory; use Magento\Sales\Model\Order\Invoice; use Magento\Sales\Model\Service\InvoiceService; use Magento\Sales\Helper\Data as SalesData; /** * Save invoice controller. * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Save extends \Magento\Backend\App\Action implements HttpPostActionInterface { /** * Authorization level of a basic admin session * * @see _isAllowed() */ public const ADMIN_RESOURCE = 'Magento_Sales::sales_invoice'; /** * @var InvoiceSender */ protected $invoiceSender; /** * @var ShipmentSender */ protected $shipmentSender; /** * @var ShipmentFactory */ protected $shipmentFactory; /** * @var Registry */ protected $registry; /** * @var InvoiceService */ private $invoiceService; /** * @var SalesData */ private $salesData; /** * @param Action\Context $context * @param Registry $registry * @param InvoiceSender $invoiceSender * @param ShipmentSender $shipmentSender * @param ShipmentFactory $shipmentFactory * @param InvoiceService $invoiceService * @param SalesData $salesData */ public function __construct( Action\Context $context, Registry $registry, InvoiceSender $invoiceSender, ShipmentSender $shipmentSender, ShipmentFactory $shipmentFactory, InvoiceService $invoiceService, SalesData $salesData = null ) { $this->registry = $registry; $this->invoiceSender = $invoiceSender; $this->shipmentSender = $shipmentSender; $this->shipmentFactory = $shipmentFactory; $this->invoiceService = $invoiceService; parent::__construct($context); $this->salesData = $salesData ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(SalesData::class); } /** * 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'); $itemArr = []; if (!isset($invoiceData['items']) || empty($invoiceData['items'])) { $orderItems = $invoice->getOrder()->getItems(); foreach ($orderItems as $item) { $itemArr[$item->getId()] = (int)$item->getQtyOrdered(); } } $shipment = $this->shipmentFactory->create( $invoice->getOrder(), isset($invoiceData['items']) ? $invoiceData['items'] : $itemArr, $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) * @codeCoverageIgnore */ 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 LocalizedException(__('The order no longer exists.')); } if (!$order->canInvoice()) { throw new LocalizedException( __('The order does not allow an invoice to be created.') ); } $invoice = $this->invoiceService->prepareInvoice($order, $invoiceItems); if (!$invoice->getTotalQty()) { throw new 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->salesData->canSendNewInvoiceEmail()) { $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->salesData->canSendNewShipmentEmail()) { $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]); } }