Skip to content

Commit e5504ea

Browse files
author
Alex Paliarush
committed
MAGETWO-61120: Tax and Order total not correct when discount is applied
2 parents 57d7cbb + 424c113 commit e5504ea

File tree

178 files changed

+7114
-543
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

178 files changed

+7114
-543
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,5 @@ atlassian*
5151
!/var/.htaccess
5252
/vendor/*
5353
!/vendor/.htaccess
54+
/generated/*
55+
!/generated/.htaccess

app/code/Magento/Authorization/Model/Acl/Loader/Role.php

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@
77

88
use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
99
use Magento\Authorization\Model\Acl\Role\User as RoleUser;
10-
use Magento\Framework\App\ResourceConnection;
10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Serialize\Serializer\Json;
1112

1213
class Role implements \Magento\Framework\Acl\LoaderInterface
1314
{
15+
/**
16+
* Cache key for ACL roles cache
17+
*/
18+
const ACL_ROLES_CACHE_KEY = 'authorization_role_cached_data';
19+
1420
/**
1521
* @var \Magento\Framework\App\ResourceConnection
1622
*/
@@ -26,19 +32,45 @@ class Role implements \Magento\Framework\Acl\LoaderInterface
2632
*/
2733
protected $_roleFactory;
2834

35+
/**
36+
* @var \Magento\Framework\Acl\Data\CacheInterface
37+
*/
38+
private $aclDataCache;
39+
40+
/**
41+
* @var Json
42+
*/
43+
private $serializer;
44+
45+
/**
46+
* @var string
47+
*/
48+
private $cacheKey;
49+
2950
/**
3051
* @param \Magento\Authorization\Model\Acl\Role\GroupFactory $groupFactory
3152
* @param \Magento\Authorization\Model\Acl\Role\UserFactory $roleFactory
3253
* @param \Magento\Framework\App\ResourceConnection $resource
54+
* @param \Magento\Framework\Acl\Data\CacheInterface $aclDataCache
55+
* @param Json $serializer
56+
* @param string $cacheKey
3357
*/
3458
public function __construct(
3559
\Magento\Authorization\Model\Acl\Role\GroupFactory $groupFactory,
3660
\Magento\Authorization\Model\Acl\Role\UserFactory $roleFactory,
37-
\Magento\Framework\App\ResourceConnection $resource
61+
\Magento\Framework\App\ResourceConnection $resource,
62+
\Magento\Framework\Acl\Data\CacheInterface $aclDataCache = null,
63+
Json $serializer = null,
64+
$cacheKey = self::ACL_ROLES_CACHE_KEY
3865
) {
3966
$this->_resource = $resource;
4067
$this->_groupFactory = $groupFactory;
4168
$this->_roleFactory = $roleFactory;
69+
$this->aclDataCache = $aclDataCache ?: ObjectManager::getInstance()->get(
70+
\Magento\Framework\Acl\Data\CacheInterface::class
71+
);
72+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
73+
$this->cacheKey = $cacheKey;
4274
}
4375

4476
/**
@@ -49,12 +81,7 @@ public function __construct(
4981
*/
5082
public function populateAcl(\Magento\Framework\Acl $acl)
5183
{
52-
$roleTableName = $this->_resource->getTableName('authorization_role');
53-
$connection = $this->_resource->getConnection();
54-
55-
$select = $connection->select()->from($roleTableName)->order('tree_level');
56-
57-
foreach ($connection->fetchAll($select) as $role) {
84+
foreach ($this->getRolesArray() as $role) {
5885
$parent = $role['parent_id'] > 0 ? $role['parent_id'] : null;
5986
switch ($role['role_type']) {
6087
case RoleGroup::ROLE_TYPE:
@@ -71,4 +98,28 @@ public function populateAcl(\Magento\Framework\Acl $acl)
7198
}
7299
}
73100
}
101+
102+
/**
103+
* Get application ACL roles array
104+
*
105+
* @return array
106+
*/
107+
private function getRolesArray()
108+
{
109+
$rolesCachedData = $this->aclDataCache->load($this->cacheKey);
110+
if ($rolesCachedData) {
111+
return $this->serializer->unserialize($rolesCachedData);
112+
}
113+
114+
$roleTableName = $this->_resource->getTableName('authorization_role');
115+
$connection = $this->_resource->getConnection();
116+
117+
$select = $connection->select()
118+
->from($roleTableName)
119+
->order('tree_level');
120+
121+
$rolesArray = $connection->fetchAll($select);
122+
$this->aclDataCache->save($this->serializer->serialize($rolesArray), $this->cacheKey);
123+
return $rolesArray;
124+
}
74125
}

app/code/Magento/Authorization/Model/Acl/Loader/Rule.php

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,65 @@
55
*/
66
namespace Magento\Authorization\Model\Acl\Loader;
77

8-
use Magento\Framework\App\ResourceConnection;
8+
use Magento\Framework\App\ObjectManager;
9+
use Magento\Framework\Serialize\Serializer\Json;
910

1011
class Rule implements \Magento\Framework\Acl\LoaderInterface
1112
{
13+
/**
14+
* Rules array cache key
15+
*/
16+
const ACL_RULE_CACHE_KEY = 'authorization_rule_cached_data';
17+
1218
/**
1319
* @var \Magento\Framework\App\ResourceConnection
1420
*/
1521
protected $_resource;
1622

23+
/**
24+
* @var \Magento\Framework\Acl\RootResource
25+
*/
26+
private $_rootResource;
27+
28+
/**
29+
* @var \Magento\Framework\Acl\Data\CacheInterface
30+
*/
31+
private $aclDataCache;
32+
33+
/**
34+
* @var Json
35+
*/
36+
private $serializer;
37+
38+
/**
39+
* @var string
40+
*/
41+
private $cacheKey;
42+
1743
/**
1844
* @param \Magento\Framework\Acl\RootResource $rootResource
1945
* @param \Magento\Framework\App\ResourceConnection $resource
2046
* @param array $data
47+
* @param \Magento\Framework\Acl\Data\CacheInterface $aclDataCache
48+
* @param Json $serializer
49+
* @param string $cacheKey
2150
* @SuppressWarnings(PHPMD.UnusedFormalParameter):
2251
*/
2352
public function __construct(
2453
\Magento\Framework\Acl\RootResource $rootResource,
2554
\Magento\Framework\App\ResourceConnection $resource,
26-
array $data = []
55+
array $data = [],
56+
\Magento\Framework\Acl\Data\CacheInterface $aclDataCache = null,
57+
Json $serializer = null,
58+
$cacheKey = self::ACL_RULE_CACHE_KEY
2759
) {
2860
$this->_resource = $resource;
2961
$this->_rootResource = $rootResource;
62+
$this->aclDataCache = $aclDataCache ?: ObjectManager::getInstance()->get(
63+
\Magento\Framework\Acl\Data\CacheInterface::class
64+
);
65+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
66+
$this->cacheKey = $cacheKey;
3067
}
3168

3269
/**
@@ -37,15 +74,7 @@ public function __construct(
3774
*/
3875
public function populateAcl(\Magento\Framework\Acl $acl)
3976
{
40-
$ruleTable = $this->_resource->getTableName("authorization_rule");
41-
42-
$connection = $this->_resource->getConnection();
43-
44-
$select = $connection->select()->from(['r' => $ruleTable]);
45-
46-
$rulesArr = $connection->fetchAll($select);
47-
48-
foreach ($rulesArr as $rule) {
77+
foreach ($this->getRulesArray() as $rule) {
4978
$role = $rule['role_id'];
5079
$resource = $rule['resource_id'];
5180
$privileges = !empty($rule['privileges']) ? explode(',', $rule['privileges']) : null;
@@ -62,4 +91,28 @@ public function populateAcl(\Magento\Framework\Acl $acl)
6291
}
6392
}
6493
}
94+
95+
/**
96+
* Get application ACL rules array.
97+
*
98+
* @return array
99+
*/
100+
private function getRulesArray()
101+
{
102+
$rulesCachedData = $this->aclDataCache->load($this->cacheKey);
103+
if ($rulesCachedData) {
104+
return $this->serializer->unserialize($rulesCachedData);
105+
}
106+
107+
$ruleTable = $this->_resource->getTableName("authorization_rule");
108+
$connection = $this->_resource->getConnection();
109+
$select = $connection->select()
110+
->from(['r' => $ruleTable]);
111+
112+
$rulesArr = $connection->fetchAll($select);
113+
114+
$this->aclDataCache->save($this->serializer->serialize($rulesArr), $this->cacheKey);
115+
116+
return $rulesArr;
117+
}
65118
}

app/code/Magento/Authorization/Model/ResourceModel/Rules.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// @codingStandardsIgnoreFile
88

99
namespace Magento\Authorization\Model\ResourceModel;
10+
use Magento\Framework\App\ObjectManager;
1011

1112
/**
1213
* Admin rule resource model
@@ -24,6 +25,8 @@ class Rules extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
2425
* Acl object cache
2526
*
2627
* @var \Magento\Framework\Acl\CacheInterface
28+
* @deprecated since 2.2 due to native serialization elimination.
29+
* Use data cache \Magento\Framework\Acl\Data\CacheInterface instead.
2730
*/
2831
protected $_aclCache;
2932

@@ -37,27 +40,37 @@ class Rules extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
3740
*/
3841
protected $_logger;
3942

43+
/**
44+
* @var \Magento\Framework\Acl\Data\CacheInterface
45+
*/
46+
private $aclDataCache;
47+
4048
/**
4149
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
4250
* @param \Magento\Framework\Acl\Builder $aclBuilder
4351
* @param \Psr\Log\LoggerInterface $logger
4452
* @param \Magento\Framework\Acl\RootResource $rootResource
4553
* @param \Magento\Framework\Acl\CacheInterface $aclCache
4654
* @param string $connectionName
55+
* @param \Magento\Framework\Acl\Data\CacheInterface $aclDataCache
4756
*/
4857
public function __construct(
4958
\Magento\Framework\Model\ResourceModel\Db\Context $context,
5059
\Magento\Framework\Acl\Builder $aclBuilder,
5160
\Psr\Log\LoggerInterface $logger,
5261
\Magento\Framework\Acl\RootResource $rootResource,
5362
\Magento\Framework\Acl\CacheInterface $aclCache,
54-
$connectionName = null
63+
$connectionName = null,
64+
\Magento\Framework\Acl\Data\CacheInterface $aclDataCache = null
5565
) {
5666
$this->_aclBuilder = $aclBuilder;
5767
parent::__construct($context, $connectionName);
5868
$this->_rootResource = $rootResource;
5969
$this->_aclCache = $aclCache;
6070
$this->_logger = $logger;
71+
$this->aclDataCache = $aclDataCache ?: ObjectManager::getInstance()->get(
72+
\Magento\Framework\Acl\Data\CacheInterface::class
73+
);
6174
}
6275

6376
/**
@@ -79,8 +92,8 @@ protected function _construct()
7992
*/
8093
public function saveRel(\Magento\Authorization\Model\Rules $rule)
8194
{
95+
$connection = $this->getConnection();
8296
try {
83-
$connection = $this->getConnection();
8497
$connection->beginTransaction();
8598
$roleId = $rule->getRoleId();
8699

@@ -118,7 +131,7 @@ public function saveRel(\Magento\Authorization\Model\Rules $rule)
118131
}
119132

120133
$connection->commit();
121-
$this->_aclCache->clean();
134+
$this->aclDataCache->clean();
122135
} catch (\Magento\Framework\Exception\LocalizedException $e) {
123136
$connection->rollBack();
124137
throw $e;

0 commit comments

Comments
 (0)