Skip to content

Commit 41b2faf

Browse files
committed
MC-35779: Downloadable product links does not displays in a the new order email in case downloadable product is part of configurable
- Fix order emails with configurable downloadable product do not include links
1 parent 49d4a2f commit 41b2faf

28 files changed

+1029
-87
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ConfigurableProductSales\Test\Unit\ViewModel;
9+
10+
use Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver;
11+
use Magento\Framework\DataObject;
12+
use Magento\Sales\Model\Order\Item;
13+
use PHPUnit\Framework\TestCase;
14+
15+
/**
16+
* Test configurable order item renderer type resolver
17+
*/
18+
class ItemRendererTypeResolverTest extends TestCase
19+
{
20+
/**
21+
* @var ItemRendererTypeResolver
22+
*/
23+
private $model;
24+
25+
/**
26+
* @inheritDoc
27+
*/
28+
protected function setUp(): void
29+
{
30+
parent::setUp();
31+
$this->model = new ItemRendererTypeResolver();
32+
}
33+
34+
/**
35+
* @param string|null $realProductType
36+
* @param string $expectedProductType
37+
* @dataProvider resolveConfigurableOrderItemDataProvider
38+
*/
39+
public function testResolveConfigurableOrderItem(?string $realProductType, string $expectedProductType): void
40+
{
41+
$orderItem = $this->getOrderItemMock();
42+
$orderItem->setProductType('configurable');
43+
$childOrderItem = $this->getOrderItemMock();
44+
$childOrderItem->setProductOptions(['real_product_type' => $realProductType]);
45+
$orderItem->addChildItem($childOrderItem);
46+
$this->assertEquals($expectedProductType, $this->model->resolve($orderItem));
47+
$this->assertEquals($expectedProductType, $this->model->resolve(new DataObject(['order_item' => $orderItem])));
48+
}
49+
50+
/**
51+
* @return array
52+
*/
53+
public function resolveConfigurableOrderItemDataProvider(): array
54+
{
55+
return [
56+
['simple', 'simple'],
57+
[null, 'configurable'],
58+
];
59+
}
60+
61+
/**
62+
* @return void
63+
*/
64+
public function testResolveSimpleOrderItem(): void
65+
{
66+
$orderItem = $this->getOrderItemMock();
67+
$orderItem->setProductType('virtual');
68+
$this->assertEquals('virtual', $this->model->resolve($orderItem));
69+
$this->assertEquals('virtual', $this->model->resolve(new DataObject(['order_item' => $orderItem])));
70+
}
71+
72+
/**
73+
* @return Item
74+
*/
75+
private function getOrderItemMock(): Item
76+
{
77+
return $this->getMockBuilder(Item::class)
78+
->disableOriginalConstructor()
79+
->getMockForAbstractClass();
80+
}
81+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ConfigurableProductSales\ViewModel;
9+
10+
use Magento\ConfigurableProduct\Model\Product\Type\Configurable as ProductType;
11+
use Magento\Framework\DataObject;
12+
use Magento\Framework\View\Element\Block\ArgumentInterface;
13+
use Magento\Sales\Model\Order\Item;
14+
use Magento\Sales\ViewModel\ItemRendererTypeResolverInterface;
15+
16+
/**
17+
* Configurable order item renderer type resolver
18+
*/
19+
class ItemRendererTypeResolver implements ItemRendererTypeResolverInterface, ArgumentInterface
20+
{
21+
/**
22+
* @inheritdoc
23+
*/
24+
public function resolve(DataObject $item): ?string
25+
{
26+
$orderItem = $item->getOrderItem() ? $item->getOrderItem() : $item;
27+
if ($orderItem->getProductType() === ProductType::TYPE_CODE) {
28+
$childItem = $this->getChildOrderItem($orderItem);
29+
if ($childItem->getRealProductType() && $childItem->getRealProductType() !== ProductType::TYPE_CODE) {
30+
return $childItem->getRealProductType();
31+
}
32+
}
33+
return $orderItem->getProductType();
34+
}
35+
36+
/**
37+
* Get child product order item
38+
*
39+
* @param Item $orderItem
40+
* @return Item
41+
*/
42+
private function getChildOrderItem(Item $orderItem): Item
43+
{
44+
$childrenItems = $orderItem->getChildrenItems() ?: [];
45+
if (count($childrenItems) === 1) {
46+
$orderItem = reset($childrenItems);
47+
}
48+
49+
return $orderItem;
50+
}
51+
}

app/code/Magento/ConfigurableProductSales/composer.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
"magento/framework": "*",
1010
"magento/module-catalog": "*",
1111
"magento/module-sales": "*",
12-
"magento/module-store": "*"
13-
},
14-
"suggest": {
12+
"magento/module-store": "*",
1513
"magento/module-configurable-product": "*"
1614
},
1715
"type": "magento2-module",
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="items">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="items">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="items">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="creditmemo_items">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="invoice_items">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="order_items">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceBlock name="sales.order.print.creditmemo">
11+
<arguments>
12+
<argument name="configurable_renderer_type_resolver" xsi:type="object">
13+
Magento\ConfigurableProductSales\ViewModel\ItemRendererTypeResolver
14+
</argument>
15+
</arguments>
16+
</referenceBlock>
17+
</body>
18+
</page>

0 commit comments

Comments
 (0)