Files
magento2/app/code/Magento/Downloadable/Observer/SaveDownloadableOrderItemObserver.php

236 lines
8.4 KiB
PHP

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Downloadable\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Store\Model\ScopeInterface;
/**
* Saves data from order to purchased links.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class SaveDownloadableOrderItemObserver implements ObserverInterface
{
/**
* Core store config
*
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $_scopeConfig;
/**
* @var \Magento\Downloadable\Model\Link\PurchasedFactory
*/
protected $_purchasedFactory;
/**
* @var \Magento\Catalog\Model\ProductFactory
*/
protected $_productFactory;
/**
* @var \Magento\Downloadable\Model\Link\Purchased\ItemFactory
*/
protected $_itemFactory;
/**
* @var \Magento\Framework\DataObject\Copy
*/
protected $_objectCopyService;
/**
* @var \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory
*/
protected $_itemsFactory;
/**
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Downloadable\Model\Link\PurchasedFactory $purchasedFactory
* @param \Magento\Catalog\Model\ProductFactory $productFactory
* @param \Magento\Downloadable\Model\Link\Purchased\ItemFactory $itemFactory
* @param \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory $itemsFactory
* @param \Magento\Framework\DataObject\Copy $objectCopyService
*/
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Downloadable\Model\Link\PurchasedFactory $purchasedFactory,
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Downloadable\Model\Link\Purchased\ItemFactory $itemFactory,
\Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory $itemsFactory,
\Magento\Framework\DataObject\Copy $objectCopyService
) {
$this->_scopeConfig = $scopeConfig;
$this->_purchasedFactory = $purchasedFactory;
$this->_productFactory = $productFactory;
$this->_itemFactory = $itemFactory;
$this->_itemsFactory = $itemsFactory;
$this->_objectCopyService = $objectCopyService;
}
/**
* Save data from order to purchased links
*
* @param \Magento\Framework\DataObject $observer
* @return $this
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
/** @var \Magento\Sales\Model\Order\Item $orderItem */
$orderItem = $observer->getEvent()->getItem();
if (!$orderItem->getId()) {
//order not saved in the database
return $this;
}
$productType = $orderItem->getRealProductType() ?: $orderItem->getProductType();
if ($productType !== \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) {
return $this;
}
$product = $orderItem->getProduct();
$purchasedLink = $this->_createPurchasedModel()->load($orderItem->getId(), 'order_item_id');
if ($purchasedLink->getId()) {
return $this;
}
$storeId = $orderItem->getOrder()->getStoreId() !== null ? (int)$orderItem->getOrder()->getStoreId() : null;
$orderItemStatusToEnableDownload = $this->getEnableDownloadStatus($storeId);
if (!$product) {
$product = $this->_createProductModel()->setStoreId(
$storeId
)->load(
$orderItem->getProductId()
);
}
if ($product->getTypeId() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) {
$links = $product->getTypeInstance()->getLinks($product);
if ($linkIds = $orderItem->getProductOptionByCode('links')) {
$linkPurchased = $this->_createPurchasedModel();
$this->_objectCopyService->copyFieldsetToTarget(
'downloadable_sales_copy_order',
'to_downloadable',
$orderItem->getOrder(),
$linkPurchased
);
$this->_objectCopyService->copyFieldsetToTarget(
'downloadable_sales_copy_order_item',
'to_downloadable',
$orderItem,
$linkPurchased
);
$linkSectionTitle = $product->getLinksTitle() ? $product
->getLinksTitle() : $this
->_scopeConfig
->getValue(
\Magento\Downloadable\Model\Link::XML_PATH_LINKS_TITLE,
ScopeInterface::SCOPE_STORE
);
$linkPurchased->setLinkSectionTitle($linkSectionTitle)->save();
$linkStatus = \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PENDING;
if ($orderItemStatusToEnableDownload === \Magento\Sales\Model\Order\Item::STATUS_PENDING
|| $orderItem->getOrder()->getState() == \Magento\Sales\Model\Order::STATE_COMPLETE
|| $orderItem->getStatusId() === $orderItemStatusToEnableDownload
) {
$linkStatus = \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_AVAILABLE;
}
foreach ($linkIds as $linkId) {
if (isset($links[$linkId])) {
$linkPurchasedItem = $this->_createPurchasedItemModel()->setPurchasedId(
$linkPurchased->getId()
)->setOrderItemId(
$orderItem->getId()
);
$this->_objectCopyService->copyFieldsetToTarget(
'downloadable_sales_copy_link',
'to_purchased',
$links[$linkId],
$linkPurchasedItem
);
$linkHash = strtr(
base64_encode(
microtime() . $linkPurchased->getId() . $orderItem->getId() . $product->getId()
),
'+/=',
'-_,'
);
$numberOfDownloads = $links[$linkId]->getNumberOfDownloads() * $orderItem->getQtyOrdered();
$linkPurchasedItem->setLinkHash(
$linkHash
)->setNumberOfDownloadsBought(
$numberOfDownloads
)->setStatus(
$linkStatus
)->setCreatedAt(
$orderItem->getCreatedAt()
)->setUpdatedAt(
$orderItem->getUpdatedAt()
)->save();
}
}
}
}
return $this;
}
/**
* Create purchased model.
*
* @return \Magento\Downloadable\Model\Link\Purchased
*/
protected function _createPurchasedModel()
{
return $this->_purchasedFactory->create();
}
/**
* Create product model.
*
* @return \Magento\Catalog\Model\Product
*/
protected function _createProductModel()
{
return $this->_productFactory->create();
}
/**
* Create purchased item model.
*
* @return \Magento\Downloadable\Model\Link\Purchased\Item
*/
protected function _createPurchasedItemModel()
{
return $this->_itemFactory->create();
}
/**
* Returns order item status to enable download.
*
* @param int|null $storeId
* @return int
*/
private function getEnableDownloadStatus(?int $storeId): int
{
return (int)$this->_scopeConfig->getValue(
\Magento\Downloadable\Model\Link\Purchased\Item::XML_PATH_ORDER_ITEM_STATUS,
ScopeInterface::SCOPE_STORE,
$storeId
);
}
/**
* Create items collection.
*
* @return \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\Collection
*/
protected function _createItemsCollection()
{
return $this->_itemsFactory->create();
}
}