SaveDownloadableOrderItemObserver.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. /**
  10. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  11. */
  12. class SaveDownloadableOrderItemObserver implements ObserverInterface
  13. {
  14. /**
  15. * Core store config
  16. *
  17. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  18. */
  19. protected $_scopeConfig;
  20. /**
  21. * @var \Magento\Downloadable\Model\Link\PurchasedFactory
  22. */
  23. protected $_purchasedFactory;
  24. /**
  25. * @var \Magento\Catalog\Model\ProductFactory
  26. */
  27. protected $_productFactory;
  28. /**
  29. * @var \Magento\Downloadable\Model\Link\Purchased\ItemFactory
  30. */
  31. protected $_itemFactory;
  32. /**
  33. * @var \Magento\Framework\DataObject\Copy
  34. */
  35. protected $_objectCopyService;
  36. /**
  37. * @var \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory
  38. */
  39. protected $_itemsFactory;
  40. /**
  41. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  42. * @param \Magento\Downloadable\Model\Link\PurchasedFactory $purchasedFactory
  43. * @param \Magento\Catalog\Model\ProductFactory $productFactory
  44. * @param \Magento\Downloadable\Model\Link\Purchased\ItemFactory $itemFactory
  45. * @param \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory $itemsFactory
  46. * @param \Magento\Framework\DataObject\Copy $objectCopyService
  47. */
  48. public function __construct(
  49. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  50. \Magento\Downloadable\Model\Link\PurchasedFactory $purchasedFactory,
  51. \Magento\Catalog\Model\ProductFactory $productFactory,
  52. \Magento\Downloadable\Model\Link\Purchased\ItemFactory $itemFactory,
  53. \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory $itemsFactory,
  54. \Magento\Framework\DataObject\Copy $objectCopyService
  55. ) {
  56. $this->_scopeConfig = $scopeConfig;
  57. $this->_purchasedFactory = $purchasedFactory;
  58. $this->_productFactory = $productFactory;
  59. $this->_itemFactory = $itemFactory;
  60. $this->_itemsFactory = $itemsFactory;
  61. $this->_objectCopyService = $objectCopyService;
  62. }
  63. /**
  64. * Save data from order to purchased links
  65. *
  66. * @param \Magento\Framework\DataObject $observer
  67. * @return $this
  68. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  69. * @SuppressWarnings(PHPMD.NPathComplexity)
  70. */
  71. public function execute(\Magento\Framework\Event\Observer $observer)
  72. {
  73. $orderItem = $observer->getEvent()->getItem();
  74. if (!$orderItem->getId()) {
  75. //order not saved in the database
  76. return $this;
  77. }
  78. if ($orderItem->getProductType() != \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) {
  79. return $this;
  80. }
  81. $product = $orderItem->getProduct();
  82. $purchasedLink = $this->_createPurchasedModel()->load($orderItem->getId(), 'order_item_id');
  83. if ($purchasedLink->getId()) {
  84. return $this;
  85. }
  86. if (!$product) {
  87. $product = $this->_createProductModel()->setStoreId(
  88. $orderItem->getOrder()->getStoreId()
  89. )->load(
  90. $orderItem->getProductId()
  91. );
  92. }
  93. if ($product->getTypeId() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) {
  94. $links = $product->getTypeInstance()->getLinks($product);
  95. if ($linkIds = $orderItem->getProductOptionByCode('links')) {
  96. $linkPurchased = $this->_createPurchasedModel();
  97. $this->_objectCopyService->copyFieldsetToTarget(
  98. \downloadable_sales_copy_order::class,
  99. 'to_downloadable',
  100. $orderItem->getOrder(),
  101. $linkPurchased
  102. );
  103. $this->_objectCopyService->copyFieldsetToTarget(
  104. \downloadable_sales_copy_order_item::class,
  105. 'to_downloadable',
  106. $orderItem,
  107. $linkPurchased
  108. );
  109. $linkSectionTitle = $product->getLinksTitle() ? $product
  110. ->getLinksTitle() : $this
  111. ->_scopeConfig
  112. ->getValue(
  113. \Magento\Downloadable\Model\Link::XML_PATH_LINKS_TITLE,
  114. ScopeInterface::SCOPE_STORE
  115. );
  116. $linkPurchased->setLinkSectionTitle($linkSectionTitle)->save();
  117. foreach ($linkIds as $linkId) {
  118. if (isset($links[$linkId])) {
  119. $linkPurchasedItem = $this->_createPurchasedItemModel()->setPurchasedId(
  120. $linkPurchased->getId()
  121. )->setOrderItemId(
  122. $orderItem->getId()
  123. );
  124. $this->_objectCopyService->copyFieldsetToTarget(
  125. \downloadable_sales_copy_link::class,
  126. 'to_purchased',
  127. $links[$linkId],
  128. $linkPurchasedItem
  129. );
  130. $linkHash = strtr(
  131. base64_encode(
  132. microtime() . $linkPurchased->getId() . $orderItem->getId() . $product->getId()
  133. ),
  134. '+/=',
  135. '-_,'
  136. );
  137. $numberOfDownloads = $links[$linkId]->getNumberOfDownloads() * $orderItem->getQtyOrdered();
  138. $linkPurchasedItem->setLinkHash(
  139. $linkHash
  140. )->setNumberOfDownloadsBought(
  141. $numberOfDownloads
  142. )->setStatus(
  143. \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PENDING
  144. )->setCreatedAt(
  145. $orderItem->getCreatedAt()
  146. )->setUpdatedAt(
  147. $orderItem->getUpdatedAt()
  148. )->save();
  149. }
  150. }
  151. }
  152. }
  153. return $this;
  154. }
  155. /**
  156. * @return \Magento\Downloadable\Model\Link\Purchased
  157. */
  158. protected function _createPurchasedModel()
  159. {
  160. return $this->_purchasedFactory->create();
  161. }
  162. /**
  163. * @return \Magento\Catalog\Model\Product
  164. */
  165. protected function _createProductModel()
  166. {
  167. return $this->_productFactory->create();
  168. }
  169. /**
  170. * @return \Magento\Downloadable\Model\Link\Purchased\Item
  171. */
  172. protected function _createPurchasedItemModel()
  173. {
  174. return $this->_itemFactory->create();
  175. }
  176. /**
  177. * @return \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\Collection
  178. */
  179. protected function _createItemsCollection()
  180. {
  181. return $this->_itemsFactory->create();
  182. }
  183. }