mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
236 lines
8.4 KiB
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();
|
|
}
|
|
}
|