Skip to content

Commit 3041f17

Browse files
author
Oleksii Korshenko
committed
Merge remote-tracking branch 'dragons/DRAG-PR' into mainline-develop
2 parents 0cc3120 + 8e51323 commit 3041f17

File tree

7 files changed

+315
-2
lines changed

7 files changed

+315
-2
lines changed

app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public function getAssociatedProducts($product)
202202
$collection = $this->getAssociatedProductCollection(
203203
$product
204204
)->addAttributeToSelect(
205-
['name', 'price']
205+
['name', 'price', 'special_price', 'special_from_date', 'special_to_date']
206206
)->addFilterByRequiredOptions()->setPositionOrder()->addStoreFilter(
207207
$this->getStoreFilter($product)
208208
)->addAttributeToFilter(
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\GroupedProduct\Model\ResourceModel\Product\Link;
8+
9+
use Magento\Catalog\Model\ProductLink\LinkFactory;
10+
use Magento\Catalog\Model\ResourceModel\Product\Link;
11+
use Magento\Catalog\Model\ResourceModel\Product\Relation;
12+
13+
class RelationPersister
14+
{
15+
/**
16+
* @var Relation
17+
*/
18+
private $relationProcessor;
19+
20+
/**
21+
* @var LinkFactory
22+
*/
23+
private $linkFactory;
24+
25+
/**
26+
* RelationPersister constructor.
27+
*
28+
* @param Relation $relationProcessor
29+
* @param LinkFactory $linkFactory
30+
*/
31+
public function __construct(Relation $relationProcessor, LinkFactory $linkFactory)
32+
{
33+
$this->relationProcessor = $relationProcessor;
34+
$this->linkFactory = $linkFactory;
35+
}
36+
37+
/**
38+
* Save grouped products to product relation table
39+
*
40+
* @param Link $subject
41+
* @param \Closure $proceed
42+
* @param int $parentId
43+
* @param array $data
44+
* @param int $typeId
45+
* @return Link
46+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
47+
*/
48+
public function aroundSaveProductLinks(Link $subject, \Closure $proceed, $parentId, $data, $typeId)
49+
{
50+
$result = $proceed($parentId, $data, $typeId);
51+
if ($typeId == \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED) {
52+
foreach ($data as $linkData) {
53+
$this->relationProcessor->addRelation(
54+
$parentId,
55+
$linkData['product_id']
56+
);
57+
}
58+
}
59+
return $result;
60+
}
61+
62+
/**
63+
* Remove grouped products from product relation table
64+
*
65+
* @param Link $subject
66+
* @param \Closure $proceed
67+
* @param int $linkId
68+
* @return Link
69+
*/
70+
public function aroundDeleteProductLink(Link $subject, \Closure $proceed, $linkId)
71+
{
72+
/** @var \Magento\Catalog\Model\ProductLink\Link $link */
73+
$link = $this->linkFactory->create();
74+
$subject->load($link, $linkId, $subject->getIdFieldName());
75+
$result = $proceed($linkId);
76+
if ($link->getLinkTypeId() == \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED) {
77+
$this->relationProcessor->removeRelations(
78+
$link->getProductId(),
79+
$link->getLinkedProductId()
80+
);
81+
}
82+
return $result;
83+
}
84+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\GroupedProduct\Setup;
7+
8+
use Magento\Catalog\Model\ResourceModel\Product\Relation;
9+
use Magento\Framework\DB\Adapter\AdapterInterface;
10+
use Magento\Framework\Setup\ModuleContextInterface;
11+
use Magento\Framework\Setup\ModuleDataSetupInterface;
12+
use Magento\Framework\Setup\UpgradeDataInterface;
13+
use Magento\GroupedProduct\Model\ResourceModel\Product\Link;
14+
15+
class UpgradeData implements UpgradeDataInterface
16+
{
17+
/**
18+
* @var Relation
19+
*/
20+
private $relationProcessor;
21+
22+
/**
23+
* UpgradeData constructor
24+
* @param Relation $relationProcessor
25+
*/
26+
public function __construct(Relation $relationProcessor)
27+
{
28+
$this->relationProcessor = $relationProcessor;
29+
}
30+
31+
/**
32+
* {@inheritdoc}
33+
*/
34+
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
35+
{
36+
$setup->startSetup();
37+
38+
if (version_compare($context->getVersion(), '2.0.1', '<')) {
39+
$connection = $setup->getConnection();
40+
$select = $connection->select()
41+
->from(
42+
$this->relationProcessor->getTable('catalog_product_link'),
43+
['product_id', 'linked_product_id']
44+
)
45+
->where('link_type_id = ?', Link::LINK_TYPE_GROUPED);
46+
47+
$connection->query(
48+
$connection->insertFromSelect(
49+
$select, $this->relationProcessor->getMainTable(),
50+
['parent_id', 'child_id'],
51+
AdapterInterface::INSERT_IGNORE
52+
)
53+
);
54+
}
55+
56+
$setup->endSetup();
57+
}
58+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\GroupedProduct\Test\Unit\Model\ResourceModel\Product\Link;
8+
9+
use Magento\GroupedProduct\Model\ResourceModel\Product\Link\RelationPersister;
10+
use Magento\Catalog\Model\ProductLink\LinkFactory;
11+
use Magento\Catalog\Model\Product\Link;
12+
use Magento\Catalog\Model\ResourceModel\Product\Relation;
13+
14+
class RelationPersisterTest extends \PHPUnit_Framework_TestCase
15+
{
16+
/** @var RelationPersister|PHPUnit_Framework_MockObject_MockObject */
17+
private $object;
18+
19+
/** @var Link */
20+
private $link;
21+
22+
/** @var Relation */
23+
private $relationProcessor;
24+
25+
/**
26+
* @inheritDoc
27+
*/
28+
protected function setUp()
29+
{
30+
$linkFactory = $this->getMockBuilder(LinkFactory::class)
31+
->setMethods(['create'])
32+
->disableOriginalConstructor()
33+
->getMock();
34+
35+
$this->relationProcessor = $this->getMockBuilder(Relation::class)
36+
->disableOriginalConstructor()
37+
->getMock();
38+
39+
$this->link = $this->getMockBuilder(Link::class)
40+
->setMethods(['getLinkTypeId', 'getProductId', 'getLinkedProductId'])
41+
->disableOriginalConstructor()
42+
->getMock();
43+
44+
$linkFactory->expects($this->any())->method('create')->willReturn($this->link);
45+
46+
$this->object = new RelationPersister(
47+
$this->relationProcessor,
48+
$linkFactory
49+
);
50+
}
51+
52+
public function testAroundSaveProductLinks()
53+
{
54+
$subject = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\Link::class)
55+
->disableOriginalConstructor()
56+
->getMock();
57+
$this->relationProcessor->expects($this->once())->method('addRelation')->with(2, 10);
58+
$this->assertEquals($subject, $this->object->aroundSaveProductLinks(
59+
$subject,
60+
function() use ($subject) { return $subject; },
61+
2,
62+
[['product_id' => 10]],
63+
3
64+
));
65+
}
66+
67+
public function testAroundDeleteProductLink()
68+
{
69+
$subject = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\Link::class)
70+
->disableOriginalConstructor()
71+
->getMock();
72+
$subject->expects($this->any())->method('getIdFieldName')->willReturn('id');
73+
$subject->expects($this->once())->method('load')->with($this->link, 155, 'id');
74+
75+
$this->link->expects($this->any())
76+
->method('getLinkTypeId')
77+
->willReturn(\Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED);
78+
$this->link->expects($this->any())
79+
->method('getProductId')
80+
->willReturn(12);
81+
$this->link->expects($this->any())
82+
->method('getLinkedProductId')
83+
->willReturn(13);
84+
85+
$this->relationProcessor->expects($this->once())->method('removeRelations')->with(12, 13);
86+
$this->assertEquals(
87+
$subject,
88+
$this->object->aroundDeleteProductLink(
89+
$subject,
90+
function() use ($subject) { return $subject; },
91+
155
92+
)
93+
);
94+
95+
}
96+
}

app/code/Magento/GroupedProduct/etc/di.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@
7777
<type name="Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks">
7878
<plugin name="GroupedProduct" type="Magento\GroupedProduct\Model\Product\Initialization\Helper\ProductLinks\Plugin\Grouped" />
7979
</type>
80+
<type name="\Magento\Catalog\Model\ResourceModel\Product\Link">
81+
<plugin name="groupedProductLinkProcessor" type="Magento\GroupedProduct\Model\ResourceModel\Product\Link\RelationPersister" />
82+
</type>
8083
<type name="Magento\Catalog\Model\ProductLink\Converter\ConverterPool">
8184
<arguments>
8285
<argument name="converters" xsi:type="array">

app/code/Magento/GroupedProduct/etc/module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9-
<module name="Magento_GroupedProduct" setup_version="2.0.0">
9+
<module name="Magento_GroupedProduct" setup_version="2.0.1">
1010
<sequence>
1111
<module name="Magento_Catalog"/>
1212
<module name="Magento_CatalogInventory"/>
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\GroupedProduct\Pricing\Price;
8+
9+
use Magento\Catalog\Api\Data\ProductTierPriceInterface;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
class FinalPriceTest extends \PHPUnit_Framework_TestCase
13+
{
14+
/**
15+
* @magentoDataFixture Magento/GroupedProduct/_files/product_grouped.php
16+
* @magentoAppIsolation enabled
17+
*/
18+
public function testFinalPrice()
19+
{
20+
$productRepository = Bootstrap::getObjectManager()
21+
->get('\Magento\Catalog\Api\ProductRepositoryInterface');
22+
/** @var $product \Magento\Catalog\Model\Product */
23+
$product = $productRepository->get('grouped-product');
24+
25+
$this->assertEquals(10, $product->getPriceInfo()->getPrice(FinalPrice::PRICE_CODE)->getValue());
26+
}
27+
28+
/**
29+
* @magentoDataFixture Magento/GroupedProduct/_files/product_grouped.php
30+
* @magentoAppIsolation enabled
31+
*/
32+
public function testFinalPriceWithTearPrice()
33+
{
34+
$productRepository = Bootstrap::getObjectManager()
35+
->get('\Magento\Catalog\Api\ProductRepositoryInterface');
36+
/** @var ProductTierPriceInterface $tierPrice */
37+
$tierPrice = Bootstrap::getObjectManager()->create(ProductTierPriceInterface::class);
38+
$tierPrice->setQty(1);
39+
$tierPrice->setCustomerGroupId(\Magento\Customer\Model\GroupManagement::CUST_GROUP_ALL);
40+
$tierPrice->setValue(5);
41+
42+
/** @var $simpleProduct \Magento\Catalog\Api\Data\ProductInterface */
43+
$simpleProduct = $productRepository->get('simple');
44+
$simpleProduct->setTierPrices([
45+
$tierPrice
46+
]);
47+
$productRepository->save($simpleProduct);
48+
49+
/** @var $product \Magento\Catalog\Model\Product */
50+
$product = $productRepository->get('grouped-product');
51+
$this->assertEquals(5, $product->getPriceInfo()->getPrice(FinalPrice::PRICE_CODE)->getValue());
52+
}
53+
54+
/**
55+
* @magentoDataFixture Magento/GroupedProduct/_files/product_grouped.php
56+
* @magentoAppIsolation enabled
57+
*/
58+
public function testFinalPriceWithSpecialPrice()
59+
{
60+
$productRepository = Bootstrap::getObjectManager()
61+
->get('\Magento\Catalog\Api\ProductRepositoryInterface');
62+
63+
/** @var $simpleProduct \Magento\Catalog\Api\Data\ProductInterface */
64+
$simpleProduct = $productRepository->get('simple');
65+
$simpleProduct->setCustomAttribute('special_price', 6);
66+
$productRepository->save($simpleProduct);
67+
68+
/** @var $product \Magento\Catalog\Model\Product */
69+
$product = $productRepository->get('grouped-product');
70+
$this->assertEquals(6, $product->getPriceInfo()->getPrice(FinalPrice::PRICE_CODE)->getValue());
71+
}
72+
}

0 commit comments

Comments
 (0)