MassCancel.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Controller\Adminhtml\Order;
  7. use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
  8. use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
  9. use Magento\Backend\App\Action\Context;
  10. use Magento\Ui\Component\MassAction\Filter;
  11. use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
  12. use Magento\Sales\Api\OrderManagementInterface;
  13. class MassCancel extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction implements HttpPostActionInterface
  14. {
  15. /**
  16. * Authorization level of a basic admin session
  17. */
  18. const ADMIN_RESOURCE = 'Magento_Sales::cancel';
  19. /**
  20. * @var OrderManagementInterface
  21. */
  22. private $orderManagement;
  23. /**
  24. * @param Context $context
  25. * @param Filter $filter
  26. * @param CollectionFactory $collectionFactory
  27. * @param OrderManagementInterface|null $orderManagement
  28. */
  29. public function __construct(
  30. Context $context,
  31. Filter $filter,
  32. CollectionFactory $collectionFactory,
  33. OrderManagementInterface $orderManagement = null
  34. ) {
  35. parent::__construct($context, $filter);
  36. $this->collectionFactory = $collectionFactory;
  37. $this->orderManagement = $orderManagement ?: \Magento\Framework\App\ObjectManager::getInstance()->get(
  38. \Magento\Sales\Api\OrderManagementInterface::class
  39. );
  40. }
  41. /**
  42. * Cancel selected orders
  43. *
  44. * @param AbstractCollection $collection
  45. * @return \Magento\Backend\Model\View\Result\Redirect
  46. */
  47. protected function massAction(AbstractCollection $collection)
  48. {
  49. $countCancelOrder = 0;
  50. foreach ($collection->getItems() as $order) {
  51. $isCanceled = $this->orderManagement->cancel($order->getEntityId());
  52. if ($isCanceled === false) {
  53. continue;
  54. }
  55. $countCancelOrder++;
  56. }
  57. $countNonCancelOrder = $collection->count() - $countCancelOrder;
  58. if ($countNonCancelOrder && $countCancelOrder) {
  59. $this->messageManager->addErrorMessage(__('%1 order(s) cannot be canceled.', $countNonCancelOrder));
  60. } elseif ($countNonCancelOrder) {
  61. $this->messageManager->addErrorMessage(__('You cannot cancel the order(s).'));
  62. }
  63. if ($countCancelOrder) {
  64. $this->messageManager->addSuccessMessage(__('We canceled %1 order(s).', $countCancelOrder));
  65. }
  66. $resultRedirect = $this->resultRedirectFactory->create();
  67. $resultRedirect->setPath($this->getComponentRefererUrl());
  68. return $resultRedirect;
  69. }
  70. }