SetLinkStatusObserver.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Downloadable\Observer;
  7. use Magento\Framework\Event\ObserverInterface;
  8. use Magento\Store\Model\ScopeInterface;
  9. class SetLinkStatusObserver implements ObserverInterface
  10. {
  11. /**
  12. * Core store config
  13. *
  14. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  15. */
  16. protected $_scopeConfig;
  17. /**
  18. * @var \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory
  19. */
  20. protected $_itemsFactory;
  21. /**
  22. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  23. * @param \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory $itemsFactory
  24. */
  25. public function __construct(
  26. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  27. \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory $itemsFactory
  28. ) {
  29. $this->_scopeConfig = $scopeConfig;
  30. $this->_itemsFactory = $itemsFactory;
  31. }
  32. /**
  33. * Set status of link
  34. *
  35. * @param \Magento\Framework\Event\Observer $observer
  36. * @return $this
  37. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  38. * @SuppressWarnings(PHPMD.NPathComplexity)
  39. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  40. */
  41. public function execute(\Magento\Framework\Event\Observer $observer)
  42. {
  43. $order = $observer->getEvent()->getOrder();
  44. if (!$order->getId()) {
  45. //order not saved in the database
  46. return $this;
  47. }
  48. /* @var $order \Magento\Sales\Model\Order */
  49. $status = '';
  50. $linkStatuses = [
  51. 'pending' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PENDING,
  52. 'expired' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_EXPIRED,
  53. 'avail' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_AVAILABLE,
  54. 'payment_pending' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PENDING_PAYMENT,
  55. 'payment_review' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PAYMENT_REVIEW,
  56. ];
  57. $downloadableItemsStatuses = [];
  58. $orderItemStatusToEnable = $this->_scopeConfig->getValue(
  59. \Magento\Downloadable\Model\Link\Purchased\Item::XML_PATH_ORDER_ITEM_STATUS,
  60. ScopeInterface::SCOPE_STORE,
  61. $order->getStoreId()
  62. );
  63. if ($order->getState() == \Magento\Sales\Model\Order::STATE_HOLDED) {
  64. $status = $linkStatuses['pending'];
  65. } elseif ($order->isCanceled()
  66. || $order->getState() == \Magento\Sales\Model\Order::STATE_CLOSED
  67. || $order->getState() == \Magento\Sales\Model\Order::STATE_COMPLETE
  68. ) {
  69. $expiredStatuses = [
  70. \Magento\Sales\Model\Order\Item::STATUS_CANCELED,
  71. \Magento\Sales\Model\Order\Item::STATUS_REFUNDED,
  72. ];
  73. foreach ($order->getAllItems() as $item) {
  74. if ($item->getProductType() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
  75. || $item->getRealProductType() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
  76. ) {
  77. if ($order->isCanceled() || in_array($item->getStatusId(), $expiredStatuses)) {
  78. $downloadableItemsStatuses[$item->getId()] = $linkStatuses['expired'];
  79. } else {
  80. $downloadableItemsStatuses[$item->getId()] = $linkStatuses['avail'];
  81. }
  82. }
  83. }
  84. } elseif ($order->getState() == \Magento\Sales\Model\Order::STATE_PENDING_PAYMENT) {
  85. $status = $linkStatuses['payment_pending'];
  86. } elseif ($order->getState() == \Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW) {
  87. $status = $linkStatuses['payment_review'];
  88. } else {
  89. $availableStatuses = [$orderItemStatusToEnable, \Magento\Sales\Model\Order\Item::STATUS_INVOICED];
  90. foreach ($order->getAllItems() as $item) {
  91. if ($item->getProductType() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
  92. || $item->getRealProductType() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
  93. ) {
  94. if ($item->getStatusId() == \Magento\Sales\Model\Order\Item::STATUS_BACKORDERED
  95. && $orderItemStatusToEnable == \Magento\Sales\Model\Order\Item::STATUS_PENDING
  96. && !in_array(
  97. \Magento\Sales\Model\Order\Item::STATUS_BACKORDERED,
  98. $availableStatuses,
  99. true
  100. )
  101. ) {
  102. $availableStatuses[] = \Magento\Sales\Model\Order\Item::STATUS_BACKORDERED;
  103. }
  104. if (in_array($item->getStatusId(), $availableStatuses)) {
  105. $downloadableItemsStatuses[$item->getId()] = $linkStatuses['avail'];
  106. }
  107. }
  108. }
  109. }
  110. if (!$downloadableItemsStatuses && $status) {
  111. foreach ($order->getAllItems() as $item) {
  112. if ($item->getProductType() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
  113. || $item->getRealProductType() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
  114. ) {
  115. $downloadableItemsStatuses[$item->getId()] = $status;
  116. }
  117. }
  118. }
  119. if ($downloadableItemsStatuses) {
  120. $linkPurchased = $this->_createItemsCollection()->addFieldToFilter(
  121. 'order_item_id',
  122. ['in' => array_keys($downloadableItemsStatuses)]
  123. );
  124. foreach ($linkPurchased as $link) {
  125. if ($link->getStatus() != $linkStatuses['expired']
  126. && !empty($downloadableItemsStatuses[$link->getOrderItemId()])
  127. ) {
  128. $link->setStatus($downloadableItemsStatuses[$link->getOrderItemId()])->save();
  129. }
  130. }
  131. }
  132. return $this;
  133. }
  134. /**
  135. * @return \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\Collection
  136. */
  137. protected function _createItemsCollection()
  138. {
  139. return $this->_itemsFactory->create();
  140. }
  141. }