Skip to content

Commit 581b7ef

Browse files
Merge pull request #9284 from adobe-commerce-tier-4/PR-10-01-2024
[Support Tier-4 chittima] 10-01-2024 Regular delivery of bugfixes and improvements
2 parents 5ebdfb5 + 1cf8d03 commit 581b7ef

File tree

15 files changed

+710
-69
lines changed

15 files changed

+710
-69
lines changed

app/code/Magento/CustomerGraphQl/Model/Context/AddUserInfoToContext.php

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99

1010
use Magento\Authorization\Model\UserContextInterface;
1111
use Magento\Customer\Api\Data\CustomerInterface;
12+
use Magento\Customer\Model\Config\Share;
1213
use Magento\Customer\Model\ResourceModel\CustomerRepository;
1314
use Magento\Customer\Model\Session;
1415
use Magento\Framework\ObjectManager\ResetAfterRequestInterface;
1516
use Magento\GraphQl\Model\Query\ContextParametersInterface;
1617
use Magento\GraphQl\Model\Query\UserContextParametersProcessorInterface;
18+
use Magento\Store\Model\StoreManagerInterface;
1719

1820
/**
1921
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
@@ -40,20 +42,35 @@ class AddUserInfoToContext implements UserContextParametersProcessorInterface, R
4042
*/
4143
private $customerRepository;
4244

45+
/**
46+
* @var Share
47+
*/
48+
private $configShare;
49+
50+
/**
51+
* @var StoreManagerInterface
52+
*/
53+
private $storeManager;
4354
/**
4455
* @param UserContextInterface $userContext
4556
* @param Session $session
4657
* @param CustomerRepository $customerRepository
58+
* @param Share $configShare
59+
* @param StoreManagerInterface $storeManager
4760
*/
4861
public function __construct(
4962
UserContextInterface $userContext,
5063
Session $session,
51-
CustomerRepository $customerRepository
64+
CustomerRepository $customerRepository,
65+
Share $configShare,
66+
StoreManagerInterface $storeManager
5267
) {
5368
$this->userContext = $userContext;
5469
$this->userContextFromConstructor = $userContext;
5570
$this->session = $session;
5671
$this->customerRepository = $customerRepository;
72+
$this->configShare = $configShare;
73+
$this->storeManager = $storeManager;
5774
}
5875

5976
/**
@@ -119,8 +136,14 @@ public function getLoggedInCustomerData(): ?CustomerInterface
119136
*/
120137
private function isCustomer(?int $customerId, ?int $customerType): bool
121138
{
122-
return !empty($customerId)
139+
$result = !empty($customerId)
123140
&& !empty($customerType)
124141
&& $customerType === UserContextInterface::USER_TYPE_CUSTOMER;
142+
143+
if ($result && $this->configShare->isWebsiteScope()) {
144+
$customer = $this->customerRepository->getById($customerId);
145+
return (int)$customer->getWebsiteId() === (int)$this->storeManager->getStore()->getWebsiteId();
146+
}
147+
return $result;
125148
}
126149
}

app/code/Magento/Sales/Model/ResourceModel/Collection/ExpiredQuotesCollection.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
use Magento\Store\Api\Data\StoreInterface;
1515
use Magento\Store\Model\ScopeInterface;
1616

17-
/**
18-
* Class ExpiredQuotesCollection
19-
*/
2017
class ExpiredQuotesCollection
2118
{
2219
/**
@@ -71,8 +68,8 @@ public function getExpiredQuotes(StoreInterface $store): AbstractCollection
7168

7269
/** @var $quotes Collection */
7370
$quotes = $this->quoteCollectionFactory->create();
74-
$quotes->addFieldToFilter('store_id', $store->getId());
75-
$quotes->addFieldToFilter('updated_at', ['to' => date("Y-m-d", time() - $lifetime)]);
71+
$quotes->addFieldToFilter('main_table.store_id', $store->getId());
72+
$quotes->addFieldToFilter('main_table.updated_at', ['to' => date("Y-m-d", time() - $lifetime)]);
7673

7774
return $quotes;
7875
}

app/code/Magento/Sales/view/adminhtml/web/order/create/scripts.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,12 +326,26 @@
326326

327327
if (this.isBillingField(fieldName)) {
328328
syncName = fieldName.replace('billing', 'shipping');
329+
330+
if (fieldName.indexOf('country')) {
331+
jQuery('#order-shipping_address_region').css(
332+
'display',
333+
jQuery('#order-billing_address_region').css('display')
334+
);
335+
jQuery('#order-shipping_address_region_id').css(
336+
'display',
337+
jQuery('#order-billing_address_region_id').css('display')
338+
);
339+
}
329340
}
330341

331342
$(container).select('[name="' + syncName + '"]').each(function (element) {
332343
if (~['input', 'textarea', 'select'].indexOf(element.tagName.toLowerCase())) {
333344
if (element.type === "checkbox") {
334345
element.checked = fieldValue.checked;
346+
} else if (element.type === "select" || element.type === "select-one") {
347+
element.innerHTML = fieldValue.innerHTML;
348+
element.value = fieldValue.value;
335349
} else {
336350
element.value = fieldValue.value;
337351
}

app/code/Magento/SalesRule/Model/Quote/Discount.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public function collect(
188188
$items = $this->calculator->sortItemsByPriority($items, $address);
189189
$itemsToApplyRules = $items;
190190
$rules = $this->calculator->getRules($address);
191-
$totalDiscount = 0;
191+
$totalDiscount = [];
192192
$address->setBaseDiscountAmount(0);
193193
/** @var Rule $rule */
194194
foreach ($rules as $rule) {
@@ -221,9 +221,9 @@ public function collect(
221221
unset($itemsToApplyRules[$key]);
222222
}
223223

224-
$totalDiscount += $item->getBaseDiscountAmount();
224+
$totalDiscount[$item->getId()] = $item->getBaseDiscountAmount();
225225
}
226-
$address->setBaseDiscountAmount($totalDiscount);
226+
$address->setBaseDiscountAmount(array_sum(array_values($totalDiscount)));
227227
}
228228
$this->calculator->initTotals($items, $address);
229229
foreach ($items as $item) {

app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByFixed.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ public function calculate($rule, $item, $qty)
2727
$itemPrice = $this->validator->getItemPrice($item);
2828
$baseItemPrice = $this->validator->getItemBasePrice($item);
2929

30-
$discountAmountMin = min(($itemPrice * $qty) - $itemDiscountAmount, $discountAmount * $qty);
31-
$baseDiscountAmountMin = min(($baseItemPrice * $qty) - $itemBaseDiscountAmount, $baseDiscountAmount * $qty);
30+
$discountAmountMin = min(($itemPrice * $item->getQty()) - $itemDiscountAmount, $discountAmount * $qty);
31+
$baseDiscountAmountMin =
32+
min(($baseItemPrice * $item->getQty()) - $itemBaseDiscountAmount, $baseDiscountAmount * $qty);
3233

3334
$discountData->setAmount($discountAmountMin);
3435
$discountData->setBaseAmount($baseDiscountAmountMin);

app/code/Magento/SalesRule/Model/Utility.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
use Magento\SalesRule\Model\ResourceModel\Coupon\UsageFactory;
1414
use Magento\SalesRule\Model\Rule\CustomerFactory;
1515

16+
/**
17+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
18+
*/
1619
class Utility
1720
{
1821
/**
@@ -133,22 +136,21 @@ public function canProcessRule(Rule $rule, Address $address): bool
133136
*
134137
* @param \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData
135138
* @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
136-
* @param float $qty
137139
* @return void
138140
*/
139141
public function minFix(
140142
\Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData,
141-
\Magento\Quote\Model\Quote\Item\AbstractItem $item,
142-
$qty
143+
\Magento\Quote\Model\Quote\Item\AbstractItem $item
143144
) {
144145
$itemPrice = $this->getItemPrice($item);
145146
$baseItemPrice = $this->getItemBasePrice($item);
146147

147148
$itemDiscountAmount = $item->getDiscountAmount();
148149
$itemBaseDiscountAmount = $item->getBaseDiscountAmount();
149150

150-
$discountAmount = min($itemDiscountAmount + $discountData->getAmount(), $itemPrice * $qty);
151-
$baseDiscountAmount = min($itemBaseDiscountAmount + $discountData->getBaseAmount(), $baseItemPrice * $qty);
151+
$discountAmount = min($itemDiscountAmount + $discountData->getAmount(), $itemPrice * $item->getQty());
152+
$baseDiscountAmount =
153+
min($itemBaseDiscountAmount + $discountData->getBaseAmount(), $baseItemPrice * $item->getQty());
152154

153155
$discountData->setAmount($discountAmount);
154156
$discountData->setBaseAmount($baseDiscountAmount);

app/code/Magento/SalesRule/Test/Unit/Model/Quote/DiscountTest.php

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class DiscountTest extends TestCase
9090
*/
9191
private $rulesApplierMock;
9292

93+
/**
94+
* @return void
95+
* @throws \PHPUnit\Framework\MockObject\Exception
96+
*/
9397
protected function setUp(): void
9498
{
9599
$this->storeManagerMock = $this->getMockForAbstractClass(StoreManagerInterface::class);
@@ -176,6 +180,9 @@ function ($argument) {
176180
->willReturn($discountData);
177181
}
178182

183+
/**
184+
* @return void
185+
*/
179186
public function testCollectItemNoDiscount()
180187
{
181188
$itemNoDiscount = $this->getMockBuilder(Item::class)
@@ -234,6 +241,9 @@ public function testCollectItemNoDiscount()
234241
);
235242
}
236243

244+
/**
245+
* @return void
246+
*/
237247
public function testCollectItemHasParent()
238248
{
239249
$itemWithParentId = $this->getMockBuilder(Item::class)
@@ -290,6 +300,9 @@ public function testCollectItemHasParent()
290300
);
291301
}
292302

303+
/**
304+
* @return void
305+
*/
293306
public function testCollectItemHasNoChildren()
294307
{
295308
$itemWithChildren = $this->getMockBuilder(Item::class)
@@ -370,6 +383,10 @@ public function testCollectItemHasNoChildren()
370383
);
371384
}
372385

386+
/**
387+
* @return void
388+
* @throws \PHPUnit\Framework\MockObject\Exception
389+
*/
373390
public function testFetch()
374391
{
375392
$discountAmount = 100;
@@ -391,4 +408,71 @@ public function testFetch()
391408
$totalMock->expects($this->once())->method('getDiscountDescription')->willReturn($discountDescription);
392409
$this->assertEquals($expectedResult, $this->discount->fetch($quoteMock, $totalMock));
393410
}
411+
412+
/**
413+
* @return void
414+
* @throws \PHPUnit\Framework\MockObject\Exception
415+
*/
416+
public function testCollectAddressBaseDiscountAmount(): void
417+
{
418+
$storeId = 1;
419+
$quote = $this->createMock(Quote::class);
420+
$quote->expects($this->once())->method('getStoreId')->willReturn($storeId);
421+
$total = $this->getMockBuilder(Total::class)
422+
->addMethods(
423+
[
424+
'getBaseDiscountAmount'
425+
]
426+
)
427+
->disableOriginalConstructor()
428+
->getMock();
429+
$total->expects($this->any())->method('getBaseDiscountAmount')->willReturn(20.00);
430+
431+
$store = $this->createMock(Store::class);
432+
$this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId)->willReturn($store);
433+
434+
$rule1 = $this->createMock(Rule::class);
435+
$rule1->expects($this->any())->method('getSimpleAction')
436+
->willReturn(null);
437+
$rule2 = $this->createMock(Rule::class);
438+
$rule2->expects($this->any())->method('getSimpleAction')
439+
->willReturn(null);
440+
$this->validatorMock->expects($this->once())->method('getRules')
441+
->with($this->addressMock)
442+
->willReturn([$rule1, $rule2]);
443+
$item = $this->getMockBuilder(Item::class)
444+
->addMethods(['getNoDiscount', 'getBaseDiscountAmount'])
445+
->onlyMethods(['getParentItem', 'getId', 'getExtensionAttributes', 'getAddress'])
446+
->disableOriginalConstructor()
447+
->getMock();
448+
$item->expects($this->any())->method('getNoDiscount')->willReturn(false);
449+
$item->expects($this->any())->method('getId')->willReturn(1);
450+
$item->expects($this->any())->method('getParentItem')->willReturn(false);
451+
$item->expects($this->any())->method('getExtensionAttributes')->willReturn(false);
452+
$item->expects($this->once())->method('getAddress')->willReturn($this->addressMock);
453+
$index = 1;
454+
$item->expects($this->any())->method('getBaseDiscountAmount')->willReturnCallback(function () use (&$index) {
455+
$value = $index * 10;
456+
$index++;
457+
return $value;
458+
});
459+
$this->addressMock->expects($this->any())->method('getAllItems')->willReturn([$item]);
460+
$this->shippingAssignmentMock->expects($this->any())->method('getItems')->willReturn([$item]);
461+
$quote->expects($this->any())->method('getAllAddresses')->willReturn([$this->addressMock]);
462+
$this->validatorMock->expects($this->any())->method('sortItemsByPriority')
463+
->with([$item], $this->addressMock)
464+
->willReturnArgument(0);
465+
466+
$this->addressMock->expects($this->exactly(5))
467+
->method('setBaseDiscountAmount')
468+
->with($this->logicalOr(
469+
$this->equalTo(0),
470+
$this->equalTo(10),
471+
$this->equalTo(20),
472+
$this->equalTo(20),
473+
$this->equalTo(20.00)
474+
));
475+
476+
$this->discount->collect($quote, $this->shippingAssignmentMock, $total);
477+
}
394478
}

0 commit comments

Comments
 (0)