RefundOrder.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Sales\Api\CreditmemoRepositoryInterface;
  9. use Magento\Sales\Api\OrderRepositoryInterface;
  10. use Magento\Sales\Api\RefundOrderInterface;
  11. use Magento\Sales\Model\Order\Config as OrderConfig;
  12. use Magento\Sales\Model\Order\Creditmemo\NotifierInterface;
  13. use Magento\Sales\Model\Order\CreditmemoDocumentFactory;
  14. use Magento\Sales\Model\Order\OrderStateResolverInterface;
  15. use Magento\Sales\Model\Order\RefundAdapterInterface;
  16. use Magento\Sales\Model\Order\Validation\RefundOrderInterface as RefundOrderValidator;
  17. use Psr\Log\LoggerInterface;
  18. /**
  19. * Class RefundOrder
  20. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  21. */
  22. class RefundOrder implements RefundOrderInterface
  23. {
  24. /**
  25. * @var ResourceConnection
  26. */
  27. private $resourceConnection;
  28. /**
  29. * @var OrderStateResolverInterface
  30. */
  31. private $orderStateResolver;
  32. /**
  33. * @var OrderRepositoryInterface
  34. */
  35. private $orderRepository;
  36. /**
  37. * @var CreditmemoRepositoryInterface
  38. */
  39. private $creditmemoRepository;
  40. /**
  41. * @var RefundAdapterInterface
  42. */
  43. private $refundAdapter;
  44. /**
  45. * @var CreditmemoDocumentFactory
  46. */
  47. private $creditmemoDocumentFactory;
  48. /**
  49. * @var RefundOrderValidator
  50. */
  51. private $validator;
  52. /**
  53. * @var NotifierInterface
  54. */
  55. private $notifier;
  56. /**
  57. * @var OrderConfig
  58. */
  59. private $config;
  60. /**
  61. * @var LoggerInterface
  62. */
  63. private $logger;
  64. /**
  65. * RefundOrder constructor.
  66. *
  67. * @param ResourceConnection $resourceConnection
  68. * @param OrderStateResolverInterface $orderStateResolver
  69. * @param OrderRepositoryInterface $orderRepository
  70. * @param CreditmemoRepositoryInterface $creditmemoRepository
  71. * @param RefundAdapterInterface $refundAdapter
  72. * @param CreditmemoDocumentFactory $creditmemoDocumentFactory
  73. * @param RefundOrderValidator $validator
  74. * @param NotifierInterface $notifier
  75. * @param OrderConfig $config
  76. * @param LoggerInterface $logger
  77. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  78. */
  79. public function __construct(
  80. ResourceConnection $resourceConnection,
  81. OrderStateResolverInterface $orderStateResolver,
  82. OrderRepositoryInterface $orderRepository,
  83. CreditmemoRepositoryInterface $creditmemoRepository,
  84. RefundAdapterInterface $refundAdapter,
  85. CreditmemoDocumentFactory $creditmemoDocumentFactory,
  86. RefundOrderValidator $validator,
  87. NotifierInterface $notifier,
  88. OrderConfig $config,
  89. LoggerInterface $logger
  90. ) {
  91. $this->resourceConnection = $resourceConnection;
  92. $this->orderStateResolver = $orderStateResolver;
  93. $this->orderRepository = $orderRepository;
  94. $this->creditmemoRepository = $creditmemoRepository;
  95. $this->refundAdapter = $refundAdapter;
  96. $this->creditmemoDocumentFactory = $creditmemoDocumentFactory;
  97. $this->validator = $validator;
  98. $this->notifier = $notifier;
  99. $this->config = $config;
  100. $this->logger = $logger;
  101. }
  102. /**
  103. * @inheritdoc
  104. */
  105. public function execute(
  106. $orderId,
  107. array $items = [],
  108. $notify = false,
  109. $appendComment = false,
  110. \Magento\Sales\Api\Data\CreditmemoCommentCreationInterface $comment = null,
  111. \Magento\Sales\Api\Data\CreditmemoCreationArgumentsInterface $arguments = null
  112. ) {
  113. $connection = $this->resourceConnection->getConnection('sales');
  114. $order = $this->orderRepository->get($orderId);
  115. $creditmemo = $this->creditmemoDocumentFactory->createFromOrder(
  116. $order,
  117. $items,
  118. $comment,
  119. ($appendComment && $notify),
  120. $arguments
  121. );
  122. $validationMessages = $this->validator->validate(
  123. $order,
  124. $creditmemo,
  125. $items,
  126. $notify,
  127. $appendComment,
  128. $comment,
  129. $arguments
  130. );
  131. if ($validationMessages->hasMessages()) {
  132. throw new \Magento\Sales\Exception\DocumentValidationException(
  133. __("Creditmemo Document Validation Error(s):\n" . implode("\n", $validationMessages->getMessages()))
  134. );
  135. }
  136. $connection->beginTransaction();
  137. try {
  138. $creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_REFUNDED);
  139. $order->setCustomerNoteNotify($notify);
  140. $order = $this->refundAdapter->refund($creditmemo, $order);
  141. $order->setState(
  142. $this->orderStateResolver->getStateForOrder($order, [])
  143. );
  144. $order->setStatus($this->config->getStateDefaultStatus($order->getState()));
  145. $order = $this->orderRepository->save($order);
  146. $creditmemo = $this->creditmemoRepository->save($creditmemo);
  147. $connection->commit();
  148. } catch (\Exception $e) {
  149. $this->logger->critical($e);
  150. $connection->rollBack();
  151. throw new \Magento\Sales\Exception\CouldNotRefundException(
  152. __('Could not save a Creditmemo, see error log for details')
  153. );
  154. }
  155. if ($notify) {
  156. if (!$appendComment) {
  157. $comment = null;
  158. }
  159. $this->notifier->notify($order, $creditmemo, $comment);
  160. }
  161. return $creditmemo->getEntityId();
  162. }
  163. }