| Current Path : /home/rtorresani/www/vendor/magento/module-shipping/Controller/Adminhtml/Order/Shipment/ |
| Current File : //home/rtorresani/www/vendor/magento/module-shipping/Controller/Adminhtml/Order/Shipment/Save.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Shipping\Controller\Adminhtml\Order\Shipment;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\Controller\ResultFactory;
use Magento\Sales\Helper\Data as SalesData;
use Magento\Sales\Model\Order\Shipment\Validation\QuantityValidator;
/**
* Controller for generation of new Shipments from Backend
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Save extends \Magento\Backend\App\Action implements HttpPostActionInterface
{
/**
* Authorization level of a basic admin session
*
* @see _isAllowed()
*/
const ADMIN_RESOURCE = 'Magento_Sales::shipment';
/**
* @var \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader
*/
protected $shipmentLoader;
/**
* @var \Magento\Shipping\Model\Shipping\LabelGenerator
*/
protected $labelGenerator;
/**
* @var \Magento\Sales\Model\Order\Email\Sender\ShipmentSender
*/
protected $shipmentSender;
/**
* @var \Magento\Sales\Model\Order\Shipment\ShipmentValidatorInterface
*/
private $shipmentValidator;
/**
* @var SalesData
*/
private $salesData;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader
* @param \Magento\Shipping\Model\Shipping\LabelGenerator $labelGenerator
* @param \Magento\Sales\Model\Order\Email\Sender\ShipmentSender $shipmentSender
* @param \Magento\Sales\Model\Order\Shipment\ShipmentValidatorInterface|null $shipmentValidator
* @param SalesData $salesData
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader,
\Magento\Shipping\Model\Shipping\LabelGenerator $labelGenerator,
\Magento\Sales\Model\Order\Email\Sender\ShipmentSender $shipmentSender,
\Magento\Sales\Model\Order\Shipment\ShipmentValidatorInterface $shipmentValidator = null,
SalesData $salesData = null
) {
parent::__construct($context);
$this->shipmentLoader = $shipmentLoader;
$this->labelGenerator = $labelGenerator;
$this->shipmentSender = $shipmentSender;
$this->shipmentValidator = $shipmentValidator ?: \Magento\Framework\App\ObjectManager::getInstance()
->get(\Magento\Sales\Model\Order\Shipment\ShipmentValidatorInterface::class);
$this->salesData = $salesData ?: \Magento\Framework\App\ObjectManager::getInstance()
->get(SalesData::class);
}
/**
* Save shipment and order in one transaction
*
* @param \Magento\Sales\Model\Order\Shipment $shipment
* @return $this
*/
protected function _saveShipment($shipment)
{
$shipment->getOrder()->setIsInProcess(true);
$transaction = $this->_objectManager->create(
\Magento\Framework\DB\Transaction::class
);
$transaction->addObject(
$shipment
)->addObject(
$shipment->getOrder()
)->save();
return $this;
}
/**
* Save shipment
*
* We can save only new shipment. Existing shipments are not editable
*
* @return \Magento\Framework\Controller\ResultInterface
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
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(__('We can\'t save the shipment right now.'));
return $resultRedirect->setPath('sales/order/index');
}
$data = $this->getRequest()->getParam('shipment');
$orderId = $this->getRequest()->getParam('order_id');
if (!empty($data['comment_text'])) {
$this->_objectManager->get(\Magento\Backend\Model\Session::class)->setCommentText($data['comment_text']);
}
$isNeedCreateLabel = isset($data['create_shipping_label']) && $data['create_shipping_label'];
$responseAjax = new \Magento\Framework\DataObject();
try {
$this->shipmentLoader->setOrderId($orderId);
$this->shipmentLoader->setShipmentId($this->getRequest()->getParam('shipment_id'));
$this->shipmentLoader->setShipment($data);
$this->shipmentLoader->setTracking($this->getRequest()->getParam('tracking'));
$shipment = $this->shipmentLoader->load();
if (!$shipment) {
return $this->resultFactory->create(ResultFactory::TYPE_FORWARD)->forward('noroute');
}
if (!empty($data['comment_text'])) {
$shipment->addComment(
$data['comment_text'],
isset($data['comment_customer_notify']),
isset($data['is_visible_on_front'])
);
$shipment->setCustomerNote($data['comment_text']);
$shipment->setCustomerNoteNotify(isset($data['comment_customer_notify']));
}
$validationResult = $this->shipmentValidator->validate($shipment, [QuantityValidator::class]);
if ($validationResult->hasMessages()) {
$this->messageManager->addErrorMessage(
__("Shipment Document Validation Error(s):\n" . implode("\n", $validationResult->getMessages()))
);
return $resultRedirect->setPath('*/*/new', ['order_id' => $orderId]);
}
$shipment->register();
$shipment->getOrder()->setCustomerNoteNotify(!empty($data['send_email']));
if ($isNeedCreateLabel) {
$this->labelGenerator->create($shipment, $this->_request);
$responseAjax->setOk(true);
}
$this->_saveShipment($shipment);
if (!empty($data['send_email']) && $this->salesData->canSendNewShipmentEmail()) {
$this->shipmentSender->send($shipment);
}
$shipmentCreatedMessage = __('The shipment has been created.');
$labelCreatedMessage = __('You created the shipping label.');
$this->messageManager->addSuccessMessage(
$isNeedCreateLabel ? $shipmentCreatedMessage . ' ' . $labelCreatedMessage : $shipmentCreatedMessage
);
$this->_objectManager->get(\Magento\Backend\Model\Session::class)->getCommentText(true);
} catch (\Magento\Framework\Exception\LocalizedException $e) {
if ($isNeedCreateLabel) {
$responseAjax->setError(true);
$responseAjax->setMessage($e->getMessage());
} else {
$this->messageManager->addErrorMessage($e->getMessage());
return $resultRedirect->setPath('*/*/new', ['order_id' => $orderId]);
}
} catch (\Exception $e) {
$this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
if ($isNeedCreateLabel) {
$responseAjax->setError(true);
$responseAjax->setMessage(__('An error occurred while creating shipping label.'));
} else {
$this->messageManager->addErrorMessage(__('Cannot save shipment.'));
return $resultRedirect->setPath('*/*/new', ['order_id' => $orderId]);
}
}
if ($isNeedCreateLabel) {
return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setJsonData($responseAjax->toJson());
}
return $resultRedirect->setPath('sales/order/view', ['order_id' => $orderId]);
}
}