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(); } }