Skip to content

Commit 537f6c9

Browse files
authored
MDEE-455: Catalog Rule price is not propagated to SaaS when price indexer is disabled (#266)
* MDEE-455: Catalog Rule price is not propagated to SaaS when price indexer is disabled
1 parent d16b3b9 commit 537f6c9

File tree

5 files changed

+109
-23
lines changed

5 files changed

+109
-23
lines changed

CatalogInventoryDataExporter/composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,18 @@
1717
"suggest": {
1818
"magento/module-inventory-indexer": "*",
1919
"magento/module-inventory-api": ">=1.2.3",
20-
"magento/module-indexer": ">=100.4.4",
2120
"magento/module-inventory-multi-dimensional-indexer-api": ">=1.2.1",
2221
"magento/module-inventory-sales": ">=1.3.0"
2322
},
2423
"require": {
2524
"php": "~8.1.0||~8.2.0",
2625
"magento/framework": ">=103.0.4",
2726
"magento/module-catalog-inventory": ">=100.4.4",
27+
"magento/module-indexer": ">=100.4.4",
2828
"magento/module-store": ">=101.1.4",
2929
"magento/module-catalog": ">=104.0.4",
3030
"magento/module-data-exporter": "self.version",
3131
"magento/module-catalog-data-exporter": "self.version"
32-
}
32+
},
33+
"version": "102.2.100"
3334
}

ProductPriceDataExporter/Model/Query/CatalogRulePricesQuery.php

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,25 @@
99

1010
use Magento\Framework\App\ResourceConnection;
1111
use Magento\Framework\DB\Select;
12-
use Magento\Framework\EntityManager\MetadataPool;
1312

1413
/**
1514
* Get catalog rule prices
1615
*/
1716
class CatalogRulePricesQuery
1817
{
19-
/**
20-
* @var MetadataPool
21-
*/
22-
private $metadataPool;
18+
private ResourceConnection $resourceConnection;
2319

24-
/**
25-
* @var ResourceConnection
26-
*/
27-
private $resourceConnection;
20+
private DateWebsiteProvider $dateWebsiteProvider;
2821

2922
/**
3023
* @param ResourceConnection $resourceConnection
31-
* @param MetadataPool $metadataPool
3224
*/
3325
public function __construct(
3426
ResourceConnection $resourceConnection,
35-
MetadataPool $metadataPool
27+
DateWebsiteProvider $dateWebsiteProvider
3628
) {
3729
$this->resourceConnection = $resourceConnection;
38-
$this->metadataPool = $metadataPool;
30+
$this->dateWebsiteProvider = $dateWebsiteProvider;
3931
}
4032

4133
/**
@@ -45,24 +37,17 @@ public function __construct(
4537
public function getQuery(array $productIds): Select
4638
{
4739
$connection = $this->resourceConnection->getConnection();
48-
/** @var \Magento\Framework\EntityManager\EntityMetadataInterface $metadata */
49-
$metadata = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
5040

5141
return $connection->select()
5242
->joinInner(
5343
['product_website' => $this->resourceConnection->getTableName('catalog_product_website')],
5444
'product_website.product_id = product.entity_id',
5545
['website_id']
5646
)
57-
->joinInner(
58-
['pwi' => $this->resourceConnection->getTableName('catalog_product_index_website')],
59-
'pwi.website_id = product_website.website_id',
60-
[]
61-
)
6247
->joinInner(
6348
['rule' => $this->resourceConnection->getTableName('catalogrule_product_price')],
6449
'product.entity_id = rule.product_id' .
65-
' AND rule.website_id = product_website.website_id AND rule.rule_date = pwi.website_date',
50+
' AND rule.website_id = product_website.website_id AND rule.rule_date = ' . $this->getWebsiteDate(),
6651
[
6752
'rule_price AS value',
6853
'customer_group_id',
@@ -78,4 +63,17 @@ public function getQuery(array $productIds): Select
7863
)
7964
->where('product.entity_id IN (?)', $productIds);
8065
}
66+
67+
private function getWebsiteDate(): \Zend_Db_Expr
68+
{
69+
$caseResults = [];
70+
foreach ($this->dateWebsiteProvider->getWebsitesDate() as $websiteId => $date) {
71+
$caseResults["product_website.website_id = '$websiteId'"] = "'$date'";
72+
}
73+
return $this->resourceConnection->getConnection()->getCaseSql(
74+
'',
75+
$caseResults,
76+
'CURRENT_DATE'
77+
);
78+
}
8179
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\ProductPriceDataExporter\Model\Query;
10+
11+
use Magento\DataExporter\Model\Logging\CommerceDataExportLoggerInterface;
12+
use Magento\Framework\App\ResourceConnection;
13+
use Magento\Framework\Stdlib\DateTime;
14+
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
15+
16+
/**
17+
* Get _current_ date in website timezone in format [website_id => website_date, ...]
18+
*/
19+
class DateWebsiteProvider
20+
{
21+
protected TimezoneInterface $localeDate;
22+
private ResourceConnection $resourceConnection;
23+
private CommerceDataExportLoggerInterface $logger;
24+
private DateTime $dateTime;
25+
private array $data = [];
26+
27+
/**
28+
* @param ResourceConnection $resourceConnection
29+
* @param DateTime $dateTime
30+
* @param TimezoneInterface $localeDate
31+
* @param CommerceDataExportLoggerInterface $logger
32+
*/
33+
public function __construct(
34+
ResourceConnection $resourceConnection,
35+
DateTime $dateTime,
36+
TimezoneInterface $localeDate,
37+
CommerceDataExportLoggerInterface $logger
38+
) {
39+
$this->resourceConnection = $resourceConnection;
40+
$this->logger = $logger;
41+
$this->dateTime = $dateTime;
42+
$this->localeDate = $localeDate;
43+
}
44+
45+
/**
46+
* @return array
47+
*/
48+
public function getWebsitesDate(): array
49+
{
50+
if (!empty($this->data)) {
51+
return $this->data;
52+
}
53+
$connection = $this->resourceConnection->getConnection();
54+
$select = $connection->select()->from(
55+
['cw' => $this->resourceConnection->getTableName('store_website')],
56+
['website_id']
57+
)->join(
58+
['csg' => $this->resourceConnection->getTableName('store_group')],
59+
'cw.default_group_id = csg.group_id',
60+
['store_id' => 'default_store_id']
61+
)->where(
62+
'cw.website_id != 0'
63+
);
64+
65+
foreach ($connection->fetchAll($select) as $item) {
66+
try {
67+
$timestamp = $this->localeDate->scopeTimeStamp($item['store_id']);
68+
} catch (\Throwable $e) {
69+
// use current timestamp
70+
$timestamp = true;
71+
$this->logger->warning("can't obtain website datetime", ['exception' => $e]);
72+
}
73+
74+
$this->data[$item['website_id']] = $this->dateTime->formatDate($timestamp, false);
75+
}
76+
return $this->data;
77+
}
78+
}

ProductPriceDataExporter/composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"magento/module-grouped-product": ">=100.4.2",
2424
"magento/module-downloadable": ">=100.4.4",
2525
"magento/module-catalog-rule": ">=101.2.4",
26-
"magento/module-customer": ">=103.0.4",
2726
"magento/module-catalog": ">=104.0.4",
2827
"magento/module-data-exporter": "self.version"
2928
}

dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/undeclared_dependency/commerce-data-export.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,14 @@
2727
'app/code/Magento/CatalogExport/Model/GenerateDTOs.php' => [
2828
'Magento\DataExporter',
2929
],
30+
'app/code/Magento/CatalogInventoryDataExporter/Model/Provider/Product/InventoryDataProvider.php' => [
31+
'Magento\InventoryIndexer',
32+
],
33+
'app/code/Magento/CatalogInventoryDataExporter/Model/Query/InventoryData.php' => [
34+
'Magento\InventorySales',
35+
],
36+
'app/code/Magento/CatalogInventoryDataExporter/Model/Plugin/StockStatusUpdater.php' => [
37+
'Magento\InventoryApi',
38+
'Magento\InventoryMultiDimensionalIndexerApi',
39+
],
3040
];

0 commit comments

Comments
 (0)