OrderCancellationService.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Braintree\Model\Paypal;
  8. use Magento\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\Sales\Api\Data\OrderInterface;
  10. use Magento\Sales\Api\OrderRepositoryInterface;
  11. /**
  12. * The service to cancel an order and void authorization transaction.
  13. */
  14. class OrderCancellationService
  15. {
  16. /**
  17. * @var OrderRepositoryInterface
  18. */
  19. private $orderRepository;
  20. /**
  21. * @var SearchCriteriaBuilder
  22. */
  23. private $searchCriteriaBuilder;
  24. /**
  25. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  26. * @param OrderRepositoryInterface $orderRepository
  27. */
  28. public function __construct(
  29. SearchCriteriaBuilder $searchCriteriaBuilder,
  30. OrderRepositoryInterface $orderRepository
  31. ) {
  32. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  33. $this->orderRepository = $orderRepository;
  34. }
  35. /**
  36. * Cancels an order and authorization transaction.
  37. *
  38. * @param string $incrementId
  39. * @return bool
  40. */
  41. public function execute(string $incrementId): bool
  42. {
  43. $order = $this->getOrder($incrementId);
  44. if ($order === null) {
  45. return false;
  46. }
  47. // `\Magento\Sales\Model\Service\OrderService::cancel` cannot be used for cancellation as the service uses
  48. // the order repository with outdated payment method instance (ex. contains Vault instead of Braintree)
  49. $order->cancel();
  50. $this->orderRepository->save($order);
  51. return true;
  52. }
  53. /**
  54. * Gets order by increment ID.
  55. *
  56. * @param string $incrementId
  57. * @return OrderInterface|null
  58. */
  59. private function getOrder(string $incrementId)
  60. {
  61. $searchCriteria = $this->searchCriteriaBuilder->addFilter(OrderInterface::INCREMENT_ID, $incrementId)
  62. ->create();
  63. $items = $this->orderRepository->getList($searchCriteria)
  64. ->getItems();
  65. return array_pop($items);
  66. }
  67. }