CreditmemoLoader.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Sales\Controller\Adminhtml\Order;
  8. use Magento\Framework\DataObject;
  9. use Magento\Sales\Api\CreditmemoRepositoryInterface;
  10. use \Magento\Sales\Model\Order\CreditmemoFactory;
  11. /**
  12. * Class CreditmemoLoader
  13. *
  14. * @package Magento\Sales\Controller\Adminhtml\Order
  15. * @method CreditmemoLoader setCreditmemoId($id)
  16. * @method CreditmemoLoader setCreditmemo($creditMemo)
  17. * @method CreditmemoLoader setInvoiceId($id)
  18. * @method CreditmemoLoader setOrderId($id)
  19. * @method int getCreditmemoId()
  20. * @method string getCreditmemo()
  21. * @method int getInvoiceId()
  22. * @method int getOrderId()
  23. */
  24. class CreditmemoLoader extends DataObject
  25. {
  26. /**
  27. * @var CreditmemoRepositoryInterface;
  28. */
  29. protected $creditmemoRepository;
  30. /**
  31. * @var CreditmemoFactory;
  32. */
  33. protected $creditmemoFactory;
  34. /**
  35. * @var \Magento\Sales\Model\OrderFactory
  36. */
  37. protected $orderFactory;
  38. /**
  39. * @var \Magento\Sales\Api\InvoiceRepositoryInterface
  40. */
  41. protected $invoiceRepository;
  42. /**
  43. * @var \Magento\Framework\Event\ManagerInterface
  44. */
  45. protected $eventManager;
  46. /**
  47. * @var \Magento\Backend\Model\Session
  48. */
  49. protected $backendSession;
  50. /**
  51. * @var \Magento\Framework\Message\ManagerInterface
  52. */
  53. protected $messageManager;
  54. /**
  55. * @var \Magento\Framework\Registry
  56. */
  57. protected $registry;
  58. /**
  59. * @var \Magento\CatalogInventory\Api\StockConfigurationInterface
  60. */
  61. protected $stockConfiguration;
  62. /**
  63. * @param CreditmemoRepositoryInterface $creditmemoRepository
  64. * @param CreditmemoFactory $creditmemoFactory
  65. * @param \Magento\Sales\Model\OrderFactory $orderFactory
  66. * @param \Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository
  67. * @param \Magento\Framework\Event\ManagerInterface $eventManager
  68. * @param \Magento\Backend\Model\Session $backendSession
  69. * @param \Magento\Framework\Message\ManagerInterface $messageManager
  70. * @param \Magento\Framework\Registry $registry
  71. * @param \Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration
  72. * @param array $data
  73. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  74. */
  75. public function __construct(
  76. CreditmemoRepositoryInterface $creditmemoRepository,
  77. CreditmemoFactory $creditmemoFactory,
  78. \Magento\Sales\Model\OrderFactory $orderFactory,
  79. \Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository,
  80. \Magento\Framework\Event\ManagerInterface $eventManager,
  81. \Magento\Backend\Model\Session $backendSession,
  82. \Magento\Framework\Message\ManagerInterface $messageManager,
  83. \Magento\Framework\Registry $registry,
  84. \Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration,
  85. array $data = []
  86. ) {
  87. $this->creditmemoRepository = $creditmemoRepository;
  88. $this->creditmemoFactory = $creditmemoFactory;
  89. $this->orderFactory = $orderFactory;
  90. $this->invoiceRepository = $invoiceRepository;
  91. $this->eventManager = $eventManager;
  92. $this->backendSession = $backendSession;
  93. $this->messageManager = $messageManager;
  94. $this->registry = $registry;
  95. $this->stockConfiguration = $stockConfiguration;
  96. parent::__construct($data);
  97. }
  98. /**
  99. * Get requested items qtys and return to stock flags
  100. *
  101. * @return array
  102. */
  103. protected function _getItemData()
  104. {
  105. $data = $this->getCreditmemo();
  106. if (!$data) {
  107. $data = $this->backendSession->getFormData(true);
  108. }
  109. if (isset($data['items'])) {
  110. $qtys = $data['items'];
  111. } else {
  112. $qtys = [];
  113. }
  114. return $qtys;
  115. }
  116. /**
  117. * Check if creditmeno can be created for order
  118. * @param \Magento\Sales\Model\Order $order
  119. * @return bool
  120. */
  121. protected function _canCreditmemo($order)
  122. {
  123. /**
  124. * Check order existing
  125. */
  126. if (!$order->getId()) {
  127. $this->messageManager->addErrorMessage(__('The order no longer exists.'));
  128. return false;
  129. }
  130. /**
  131. * Check creditmemo create availability
  132. */
  133. if (!$order->canCreditmemo()) {
  134. $this->messageManager->addErrorMessage(__('We can\'t create credit memo for the order.'));
  135. return false;
  136. }
  137. return true;
  138. }
  139. /**
  140. * @param \Magento\Sales\Model\Order $order
  141. * @return $this|bool
  142. */
  143. protected function _initInvoice($order)
  144. {
  145. $invoiceId = $this->getInvoiceId();
  146. if ($invoiceId) {
  147. $invoice = $this->invoiceRepository->get($invoiceId);
  148. $invoice->setOrder($order);
  149. if ($invoice->getId()) {
  150. return $invoice;
  151. }
  152. }
  153. return false;
  154. }
  155. /**
  156. * Initialize creditmemo model instance
  157. *
  158. * @return \Magento\Sales\Model\Order\Creditmemo|false
  159. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  160. */
  161. public function load()
  162. {
  163. $creditmemo = false;
  164. $creditmemoId = $this->getCreditmemoId();
  165. $orderId = $this->getOrderId();
  166. if ($creditmemoId) {
  167. $creditmemo = $this->creditmemoRepository->get($creditmemoId);
  168. } elseif ($orderId) {
  169. $data = $this->getCreditmemo();
  170. $order = $this->orderFactory->create()->load($orderId);
  171. $invoice = $this->_initInvoice($order);
  172. if (!$this->_canCreditmemo($order)) {
  173. return false;
  174. }
  175. $savedData = $this->_getItemData();
  176. $qtys = [];
  177. $backToStock = [];
  178. foreach ($savedData as $orderItemId => $itemData) {
  179. if (isset($itemData['qty'])) {
  180. $qtys[$orderItemId] = $itemData['qty'];
  181. }
  182. if (isset($itemData['back_to_stock'])) {
  183. $backToStock[$orderItemId] = true;
  184. }
  185. }
  186. $data['qtys'] = $qtys;
  187. if ($invoice) {
  188. $creditmemo = $this->creditmemoFactory->createByInvoice($invoice, $data);
  189. } else {
  190. $creditmemo = $this->creditmemoFactory->createByOrder($order, $data);
  191. }
  192. /**
  193. * Process back to stock flags
  194. */
  195. foreach ($creditmemo->getAllItems() as $creditmemoItem) {
  196. $orderItem = $creditmemoItem->getOrderItem();
  197. $parentId = $orderItem->getParentItemId();
  198. if ($parentId && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
  199. $creditmemoItem->setBackToStock(true);
  200. } elseif (isset($backToStock[$orderItem->getId()])) {
  201. $creditmemoItem->setBackToStock(true);
  202. } elseif (empty($savedData)) {
  203. $creditmemoItem->setBackToStock(
  204. $this->stockConfiguration->isAutoReturnEnabled()
  205. );
  206. } else {
  207. $creditmemoItem->setBackToStock(false);
  208. }
  209. }
  210. }
  211. $this->eventManager->dispatch(
  212. 'adminhtml_sales_order_creditmemo_register_before',
  213. ['creditmemo' => $creditmemo, 'input' => $this->getCreditmemo()]
  214. );
  215. $this->registry->register('current_creditmemo', $creditmemo);
  216. return $creditmemo;
  217. }
  218. }