123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model;
- use Magento\Framework\App\ResourceConnection;
- use Magento\Sales\Api\CreditmemoRepositoryInterface;
- use Magento\Sales\Api\OrderRepositoryInterface;
- use Magento\Sales\Api\RefundOrderInterface;
- use Magento\Sales\Model\Order\Config as OrderConfig;
- use Magento\Sales\Model\Order\Creditmemo\NotifierInterface;
- use Magento\Sales\Model\Order\CreditmemoDocumentFactory;
- use Magento\Sales\Model\Order\OrderStateResolverInterface;
- use Magento\Sales\Model\Order\RefundAdapterInterface;
- use Magento\Sales\Model\Order\Validation\RefundOrderInterface as RefundOrderValidator;
- use Psr\Log\LoggerInterface;
- /**
- * Class RefundOrder
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class RefundOrder implements RefundOrderInterface
- {
- /**
- * @var ResourceConnection
- */
- private $resourceConnection;
- /**
- * @var OrderStateResolverInterface
- */
- private $orderStateResolver;
- /**
- * @var OrderRepositoryInterface
- */
- private $orderRepository;
- /**
- * @var CreditmemoRepositoryInterface
- */
- private $creditmemoRepository;
- /**
- * @var RefundAdapterInterface
- */
- private $refundAdapter;
- /**
- * @var CreditmemoDocumentFactory
- */
- private $creditmemoDocumentFactory;
- /**
- * @var RefundOrderValidator
- */
- private $validator;
- /**
- * @var NotifierInterface
- */
- private $notifier;
- /**
- * @var OrderConfig
- */
- private $config;
- /**
- * @var LoggerInterface
- */
- private $logger;
- /**
- * RefundOrder constructor.
- *
- * @param ResourceConnection $resourceConnection
- * @param OrderStateResolverInterface $orderStateResolver
- * @param OrderRepositoryInterface $orderRepository
- * @param CreditmemoRepositoryInterface $creditmemoRepository
- * @param RefundAdapterInterface $refundAdapter
- * @param CreditmemoDocumentFactory $creditmemoDocumentFactory
- * @param RefundOrderValidator $validator
- * @param NotifierInterface $notifier
- * @param OrderConfig $config
- * @param LoggerInterface $logger
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- ResourceConnection $resourceConnection,
- OrderStateResolverInterface $orderStateResolver,
- OrderRepositoryInterface $orderRepository,
- CreditmemoRepositoryInterface $creditmemoRepository,
- RefundAdapterInterface $refundAdapter,
- CreditmemoDocumentFactory $creditmemoDocumentFactory,
- RefundOrderValidator $validator,
- NotifierInterface $notifier,
- OrderConfig $config,
- LoggerInterface $logger
- ) {
- $this->resourceConnection = $resourceConnection;
- $this->orderStateResolver = $orderStateResolver;
- $this->orderRepository = $orderRepository;
- $this->creditmemoRepository = $creditmemoRepository;
- $this->refundAdapter = $refundAdapter;
- $this->creditmemoDocumentFactory = $creditmemoDocumentFactory;
- $this->validator = $validator;
- $this->notifier = $notifier;
- $this->config = $config;
- $this->logger = $logger;
- }
- /**
- * @inheritdoc
- */
- public function execute(
- $orderId,
- array $items = [],
- $notify = false,
- $appendComment = false,
- \Magento\Sales\Api\Data\CreditmemoCommentCreationInterface $comment = null,
- \Magento\Sales\Api\Data\CreditmemoCreationArgumentsInterface $arguments = null
- ) {
- $connection = $this->resourceConnection->getConnection('sales');
- $order = $this->orderRepository->get($orderId);
- $creditmemo = $this->creditmemoDocumentFactory->createFromOrder(
- $order,
- $items,
- $comment,
- ($appendComment && $notify),
- $arguments
- );
- $validationMessages = $this->validator->validate(
- $order,
- $creditmemo,
- $items,
- $notify,
- $appendComment,
- $comment,
- $arguments
- );
- if ($validationMessages->hasMessages()) {
- throw new \Magento\Sales\Exception\DocumentValidationException(
- __("Creditmemo Document Validation Error(s):\n" . implode("\n", $validationMessages->getMessages()))
- );
- }
- $connection->beginTransaction();
- try {
- $creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_REFUNDED);
- $order->setCustomerNoteNotify($notify);
- $order = $this->refundAdapter->refund($creditmemo, $order);
- $order->setState(
- $this->orderStateResolver->getStateForOrder($order, [])
- );
- $order->setStatus($this->config->getStateDefaultStatus($order->getState()));
- $order = $this->orderRepository->save($order);
- $creditmemo = $this->creditmemoRepository->save($creditmemo);
- $connection->commit();
- } catch (\Exception $e) {
- $this->logger->critical($e);
- $connection->rollBack();
- throw new \Magento\Sales\Exception\CouldNotRefundException(
- __('Could not save a Creditmemo, see error log for details')
- );
- }
- if ($notify) {
- if (!$appendComment) {
- $comment = null;
- }
- $this->notifier->notify($order, $creditmemo, $comment);
- }
- return $creditmemo->getEntityId();
- }
- }
|