Skip to content

Commit abcbaf9

Browse files
committed
ACP2E-2215: Order having downloadable & physical product, downloadable link is not available until physical product ships.
1 parent e0792f1 commit abcbaf9

File tree

2 files changed

+119
-7
lines changed

2 files changed

+119
-7
lines changed

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,8 @@ public function execute(\Magento\Framework\Event\Observer $observer)
9898
if ($purchasedLink->getId()) {
9999
return $this;
100100
}
101-
$storeId = $orderItem->getOrder()->getStoreId();
102-
$orderStatusToEnableItem = $this->_scopeConfig->getValue(
103-
\Magento\Downloadable\Model\Link\Purchased\Item::XML_PATH_ORDER_ITEM_STATUS,
104-
ScopeInterface::SCOPE_STORE,
105-
$storeId
106-
);
101+
$storeId = $orderItem->getOrder()->getStoreId() !== null ? (int)$orderItem->getOrder()->getStoreId() : null;
102+
$orderItemStatusToEnableDownload = $this->getEnableDownloadStatus($storeId);
107103
if (!$product) {
108104
$product = $this->_createProductModel()->setStoreId(
109105
$storeId
@@ -136,8 +132,9 @@ public function execute(\Magento\Framework\Event\Observer $observer)
136132
);
137133
$linkPurchased->setLinkSectionTitle($linkSectionTitle)->save();
138134
$linkStatus = \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PENDING;
139-
if ($orderStatusToEnableItem == \Magento\Sales\Model\Order\Item::STATUS_PENDING
135+
if ($orderItemStatusToEnableDownload === \Magento\Sales\Model\Order\Item::STATUS_PENDING
140136
|| $orderItem->getOrder()->getState() == \Magento\Sales\Model\Order::STATE_COMPLETE
137+
|| $orderItem->getStatusId() === $orderItemStatusToEnableDownload
141138
) {
142139
$linkStatus = \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_AVAILABLE;
143140
}
@@ -211,6 +208,21 @@ protected function _createPurchasedItemModel()
211208
return $this->_itemFactory->create();
212209
}
213210

211+
/**
212+
* Returns order item status to enable download.
213+
*
214+
* @param int|null $storeId
215+
* @return int
216+
*/
217+
private function getEnableDownloadStatus(?int $storeId): int
218+
{
219+
return (int)$this->_scopeConfig->getValue(
220+
\Magento\Downloadable\Model\Link\Purchased\Item::XML_PATH_ORDER_ITEM_STATUS,
221+
ScopeInterface::SCOPE_STORE,
222+
$storeId
223+
);
224+
}
225+
214226
/**
215227
* Create items collection.
216228
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Downloadable\Model\Observer;
7+
8+
use Magento\Downloadable\Model\Link\Purchased\Item;
9+
use Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\Collection;
10+
use Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\CollectionFactory;
11+
use Magento\Framework\App\Config\ScopeConfigInterface;
12+
use Magento\Sales\Model\Order;
13+
use Magento\Sales\Model\Order\Item as OrderItem;
14+
use Magento\Sales\Model\Order\ItemRepository;
15+
use Magento\Store\Model\ScopeInterface;
16+
use Magento\TestFramework\Downloadable\Model\RemoveLinkPurchasedByOrderIncrementId;
17+
use Magento\TestFramework\Helper\Bootstrap;
18+
19+
/**
20+
* Test for case, when customer is able to download downloadable product.
21+
*/
22+
class SaveDownloadableOrderItemObserverTest extends \PHPUnit\Framework\TestCase
23+
{
24+
/**
25+
* @var \Magento\Framework\ObjectManagerInterface
26+
*/
27+
private $objectManager;
28+
29+
/**
30+
* Initialization of dependencies
31+
*/
32+
protected function setUp(): void
33+
{
34+
$this->objectManager = Bootstrap::getObjectManager();
35+
}
36+
37+
/**
38+
* Asserting, that links status is 'Available' when order is in processing state,
39+
* and 'Order Item Status to Enable Downloads' is 'Invoiced'.
40+
*
41+
* @magentoDataFixture Magento/Downloadable/_files/order_with_customer_and_downloadable_product.php
42+
* @magentoDataFixture Magento/Downloadable/_files/customer_order_with_invoice_downloadable_product.php
43+
*/
44+
public function testOrderStateIsProcessingAndInvoicedOrderItemLinkIsDownloadable()
45+
{
46+
$orderIncremetId = '100000001';
47+
/** @var Order $order */
48+
$order = $this->objectManager->create(Order::class);
49+
$order->loadByIncrementId($orderIncremetId);
50+
/** @var OrderItem $orderItem */
51+
$orderItem = current($order->getAllItems());
52+
$config = $this->objectManager->get(ScopeConfigInterface::class);
53+
$orderItemStatusToEnableDownload = $config->getValue(
54+
\Magento\Downloadable\Model\Link\Purchased\Item::XML_PATH_ORDER_ITEM_STATUS,
55+
ScopeInterface::SCOPE_STORE,
56+
$orderItem->getStoreId()
57+
);
58+
59+
/** Remove downloadable links from order item to create them from scratch */
60+
$removeLinkPurchasedByOrderIncrementId = $this->objectManager->get(
61+
RemoveLinkPurchasedByOrderIncrementId::class
62+
);
63+
$removeLinkPurchasedByOrderIncrementId->execute($orderIncremetId);
64+
65+
$this->assertEquals(Order::STATE_PROCESSING, $order->getState());
66+
$this->assertEquals(OrderItem::STATUS_INVOICED, $orderItem->getStatusId());
67+
$this->assertEquals(OrderItem::STATUS_INVOICED, $orderItemStatusToEnableDownload);
68+
69+
/** Save order item to trigger observers */
70+
$orderItemRepository = $this->objectManager->get(ItemRepository::class);
71+
$orderItemRepository->save($orderItem);
72+
73+
$this->assertOrderItemLinkStatus((int)$orderItem->getId(), Item::LINK_STATUS_AVAILABLE);
74+
}
75+
76+
/**
77+
* Assert that order item link status is expected.
78+
*
79+
* @param int $orderItemId
80+
* @param string $linkStatus
81+
* @return void
82+
*/
83+
public function assertOrderItemLinkStatus(int $orderItemId, string $linkStatus): void
84+
{
85+
/** @var Collection $linkCollection */
86+
$linkCollection = $this->objectManager->create(CollectionFactory::class)->create();
87+
$linkCollection->addFieldToFilter('order_item_id', $orderItemId);
88+
89+
/** Assert there are items in linkCollection to avoid false-positive test result. */
90+
$this->assertGreaterThan(0, $linkCollection->count());
91+
92+
/** @var Item $linkItem */
93+
foreach ($linkCollection->getItems() as $linkItem) {
94+
$this->assertEquals(
95+
$linkStatus,
96+
$linkItem->getStatus()
97+
);
98+
}
99+
}
100+
}

0 commit comments

Comments
 (0)