creditmemoRepository = $creditmemoRepository; $this->creditmemoFactory = $creditmemoFactory; $this->orderFactory = $orderFactory; $this->invoiceRepository = $invoiceRepository; $this->eventManager = $eventManager; $this->backendSession = $backendSession; $this->messageManager = $messageManager; $this->registry = $registry; $this->stockConfiguration = $stockConfiguration; parent::__construct($data); } /** * Get requested items qtys and return to stock flags * * @return array */ protected function _getItemData() { $data = $this->getCreditmemo(); if (!$data) { $data = $this->backendSession->getFormData(true); } if (isset($data['items'])) { $qtys = $data['items']; } else { $qtys = []; } return $qtys; } /** * Check if creditmeno can be created for order * @param \Magento\Sales\Model\Order $order * @return bool */ protected function _canCreditmemo($order) { /** * Check order existing */ if (!$order->getId()) { $this->messageManager->addErrorMessage(__('The order no longer exists.')); return false; } /** * Check creditmemo create availability */ if (!$order->canCreditmemo()) { $this->messageManager->addErrorMessage(__('We can\'t create credit memo for the order.')); return false; } return true; } /** * @param \Magento\Sales\Model\Order $order * @return $this|bool */ protected function _initInvoice($order) { $invoiceId = $this->getInvoiceId(); if ($invoiceId) { $invoice = $this->invoiceRepository->get($invoiceId); $invoice->setOrder($order); if ($invoice->getId()) { return $invoice; } } return false; } /** * Initialize creditmemo model instance * * @return \Magento\Sales\Model\Order\Creditmemo|false * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function load() { $creditmemo = false; $creditmemoId = $this->getCreditmemoId(); $orderId = $this->getOrderId(); if ($creditmemoId) { $creditmemo = $this->creditmemoRepository->get($creditmemoId); } elseif ($orderId) { $data = $this->getCreditmemo(); $order = $this->orderFactory->create()->load($orderId); $invoice = $this->_initInvoice($order); if (!$this->_canCreditmemo($order)) { return false; } $savedData = $this->_getItemData(); $qtys = []; $backToStock = []; foreach ($savedData as $orderItemId => $itemData) { if (isset($itemData['qty'])) { $qtys[$orderItemId] = $itemData['qty']; } if (isset($itemData['back_to_stock'])) { $backToStock[$orderItemId] = true; } } $data['qtys'] = $qtys; if ($invoice) { $creditmemo = $this->creditmemoFactory->createByInvoice($invoice, $data); } else { $creditmemo = $this->creditmemoFactory->createByOrder($order, $data); } /** * Process back to stock flags */ foreach ($creditmemo->getAllItems() as $creditmemoItem) { $orderItem = $creditmemoItem->getOrderItem(); $parentId = $orderItem->getParentItemId(); if ($parentId && isset($backToStock[$parentId]) && $backToStock[$parentId]) { $creditmemoItem->setBackToStock(true); } elseif (isset($backToStock[$orderItem->getId()])) { $creditmemoItem->setBackToStock(true); } elseif (empty($savedData)) { $creditmemoItem->setBackToStock( $this->stockConfiguration->isAutoReturnEnabled() ); } else { $creditmemoItem->setBackToStock(false); } } } $this->eventManager->dispatch( 'adminhtml_sales_order_creditmemo_register_before', ['creditmemo' => $creditmemo, 'input' => $this->getCreditmemo()] ); $this->registry->register('current_creditmemo', $creditmemo); return $creditmemo; } }