| Current Path : /home/rtorresani/www/vendor/magento/module-sales/Controller/Adminhtml/Order/Invoice/ |
| Current File : //home/rtorresani/www/vendor/magento/module-sales/Controller/Adminhtml/Order/Invoice/Save.php |
<?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]);
}
}