Skip to content

Commit

Permalink
Merge pull request #9284 from adobe-commerce-tier-4/PR-10-01-2024
Browse files Browse the repository at this point in the history
[Support Tier-4 chittima] 10-01-2024 Regular delivery of bugfixes and improvements
  • Loading branch information
2 parents 5ebdfb5 + 1cf8d03 commit 581b7ef
Show file tree
Hide file tree
Showing 15 changed files with 710 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@

use Magento\Authorization\Model\UserContextInterface;
use Magento\Customer\Api\Data\CustomerInterface;
use Magento\Customer\Model\Config\Share;
use Magento\Customer\Model\ResourceModel\CustomerRepository;
use Magento\Customer\Model\Session;
use Magento\Framework\ObjectManager\ResetAfterRequestInterface;
use Magento\GraphQl\Model\Query\ContextParametersInterface;
use Magento\GraphQl\Model\Query\UserContextParametersProcessorInterface;
use Magento\Store\Model\StoreManagerInterface;

/**
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
Expand All @@ -40,20 +42,35 @@ class AddUserInfoToContext implements UserContextParametersProcessorInterface, R
*/
private $customerRepository;

/**
* @var Share
*/
private $configShare;

/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @param UserContextInterface $userContext
* @param Session $session
* @param CustomerRepository $customerRepository
* @param Share $configShare
* @param StoreManagerInterface $storeManager
*/
public function __construct(
UserContextInterface $userContext,
Session $session,
CustomerRepository $customerRepository
CustomerRepository $customerRepository,
Share $configShare,
StoreManagerInterface $storeManager
) {
$this->userContext = $userContext;
$this->userContextFromConstructor = $userContext;
$this->session = $session;
$this->customerRepository = $customerRepository;
$this->configShare = $configShare;
$this->storeManager = $storeManager;
}

/**
Expand Down Expand Up @@ -119,8 +136,14 @@ public function getLoggedInCustomerData(): ?CustomerInterface
*/
private function isCustomer(?int $customerId, ?int $customerType): bool
{
return !empty($customerId)
$result = !empty($customerId)
&& !empty($customerType)
&& $customerType === UserContextInterface::USER_TYPE_CUSTOMER;

if ($result && $this->configShare->isWebsiteScope()) {
$customer = $this->customerRepository->getById($customerId);
return (int)$customer->getWebsiteId() === (int)$this->storeManager->getStore()->getWebsiteId();
}
return $result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
use Magento\Store\Api\Data\StoreInterface;
use Magento\Store\Model\ScopeInterface;

/**
* Class ExpiredQuotesCollection
*/
class ExpiredQuotesCollection
{
/**
Expand Down Expand Up @@ -71,8 +68,8 @@ public function getExpiredQuotes(StoreInterface $store): AbstractCollection

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

return $quotes;
}
Expand Down
14 changes: 14 additions & 0 deletions app/code/Magento/Sales/view/adminhtml/web/order/create/scripts.js
Original file line number Diff line number Diff line change
Expand Up @@ -326,12 +326,26 @@

if (this.isBillingField(fieldName)) {
syncName = fieldName.replace('billing', 'shipping');

if (fieldName.indexOf('country')) {
jQuery('#order-shipping_address_region').css(
'display',
jQuery('#order-billing_address_region').css('display')
);
jQuery('#order-shipping_address_region_id').css(
'display',
jQuery('#order-billing_address_region_id').css('display')
);
}
}

$(container).select('[name="' + syncName + '"]').each(function (element) {
if (~['input', 'textarea', 'select'].indexOf(element.tagName.toLowerCase())) {
if (element.type === "checkbox") {
element.checked = fieldValue.checked;
} else if (element.type === "select" || element.type === "select-one") {
element.innerHTML = fieldValue.innerHTML;
element.value = fieldValue.value;
} else {
element.value = fieldValue.value;
}
Expand Down
6 changes: 3 additions & 3 deletions app/code/Magento/SalesRule/Model/Quote/Discount.php
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public function collect(
$items = $this->calculator->sortItemsByPriority($items, $address);
$itemsToApplyRules = $items;
$rules = $this->calculator->getRules($address);
$totalDiscount = 0;
$totalDiscount = [];
$address->setBaseDiscountAmount(0);
/** @var Rule $rule */
foreach ($rules as $rule) {
Expand Down Expand Up @@ -221,9 +221,9 @@ public function collect(
unset($itemsToApplyRules[$key]);
}

$totalDiscount += $item->getBaseDiscountAmount();
$totalDiscount[$item->getId()] = $item->getBaseDiscountAmount();
}
$address->setBaseDiscountAmount($totalDiscount);
$address->setBaseDiscountAmount(array_sum(array_values($totalDiscount)));
}
$this->calculator->initTotals($items, $address);
foreach ($items as $item) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ public function calculate($rule, $item, $qty)
$itemPrice = $this->validator->getItemPrice($item);
$baseItemPrice = $this->validator->getItemBasePrice($item);

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

$discountData->setAmount($discountAmountMin);
$discountData->setBaseAmount($baseDiscountAmountMin);
Expand Down
12 changes: 7 additions & 5 deletions app/code/Magento/SalesRule/Model/Utility.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
use Magento\SalesRule\Model\ResourceModel\Coupon\UsageFactory;
use Magento\SalesRule\Model\Rule\CustomerFactory;

/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Utility
{
/**
Expand Down Expand Up @@ -133,22 +136,21 @@ public function canProcessRule(Rule $rule, Address $address): bool
*
* @param \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData
* @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
* @param float $qty
* @return void
*/
public function minFix(
\Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData,
\Magento\Quote\Model\Quote\Item\AbstractItem $item,
$qty
\Magento\Quote\Model\Quote\Item\AbstractItem $item
) {
$itemPrice = $this->getItemPrice($item);
$baseItemPrice = $this->getItemBasePrice($item);

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

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

$discountData->setAmount($discountAmount);
$discountData->setBaseAmount($baseDiscountAmount);
Expand Down
84 changes: 84 additions & 0 deletions app/code/Magento/SalesRule/Test/Unit/Model/Quote/DiscountTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ class DiscountTest extends TestCase
*/
private $rulesApplierMock;

/**
* @return void
* @throws \PHPUnit\Framework\MockObject\Exception
*/
protected function setUp(): void
{
$this->storeManagerMock = $this->getMockForAbstractClass(StoreManagerInterface::class);
Expand Down Expand Up @@ -176,6 +180,9 @@ function ($argument) {
->willReturn($discountData);
}

/**
* @return void
*/
public function testCollectItemNoDiscount()
{
$itemNoDiscount = $this->getMockBuilder(Item::class)
Expand Down Expand Up @@ -234,6 +241,9 @@ public function testCollectItemNoDiscount()
);
}

/**
* @return void
*/
public function testCollectItemHasParent()
{
$itemWithParentId = $this->getMockBuilder(Item::class)
Expand Down Expand Up @@ -290,6 +300,9 @@ public function testCollectItemHasParent()
);
}

/**
* @return void
*/
public function testCollectItemHasNoChildren()
{
$itemWithChildren = $this->getMockBuilder(Item::class)
Expand Down Expand Up @@ -370,6 +383,10 @@ public function testCollectItemHasNoChildren()
);
}

/**
* @return void
* @throws \PHPUnit\Framework\MockObject\Exception
*/
public function testFetch()
{
$discountAmount = 100;
Expand All @@ -391,4 +408,71 @@ public function testFetch()
$totalMock->expects($this->once())->method('getDiscountDescription')->willReturn($discountDescription);
$this->assertEquals($expectedResult, $this->discount->fetch($quoteMock, $totalMock));
}

/**
* @return void
* @throws \PHPUnit\Framework\MockObject\Exception
*/
public function testCollectAddressBaseDiscountAmount(): void
{
$storeId = 1;
$quote = $this->createMock(Quote::class);
$quote->expects($this->once())->method('getStoreId')->willReturn($storeId);
$total = $this->getMockBuilder(Total::class)
->addMethods(
[
'getBaseDiscountAmount'
]
)
->disableOriginalConstructor()
->getMock();
$total->expects($this->any())->method('getBaseDiscountAmount')->willReturn(20.00);

$store = $this->createMock(Store::class);
$this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId)->willReturn($store);

$rule1 = $this->createMock(Rule::class);
$rule1->expects($this->any())->method('getSimpleAction')
->willReturn(null);
$rule2 = $this->createMock(Rule::class);
$rule2->expects($this->any())->method('getSimpleAction')
->willReturn(null);
$this->validatorMock->expects($this->once())->method('getRules')
->with($this->addressMock)
->willReturn([$rule1, $rule2]);
$item = $this->getMockBuilder(Item::class)
->addMethods(['getNoDiscount', 'getBaseDiscountAmount'])
->onlyMethods(['getParentItem', 'getId', 'getExtensionAttributes', 'getAddress'])
->disableOriginalConstructor()
->getMock();
$item->expects($this->any())->method('getNoDiscount')->willReturn(false);
$item->expects($this->any())->method('getId')->willReturn(1);
$item->expects($this->any())->method('getParentItem')->willReturn(false);
$item->expects($this->any())->method('getExtensionAttributes')->willReturn(false);
$item->expects($this->once())->method('getAddress')->willReturn($this->addressMock);
$index = 1;
$item->expects($this->any())->method('getBaseDiscountAmount')->willReturnCallback(function () use (&$index) {
$value = $index * 10;
$index++;
return $value;
});
$this->addressMock->expects($this->any())->method('getAllItems')->willReturn([$item]);
$this->shippingAssignmentMock->expects($this->any())->method('getItems')->willReturn([$item]);
$quote->expects($this->any())->method('getAllAddresses')->willReturn([$this->addressMock]);
$this->validatorMock->expects($this->any())->method('sortItemsByPriority')
->with([$item], $this->addressMock)
->willReturnArgument(0);

$this->addressMock->expects($this->exactly(5))
->method('setBaseDiscountAmount')
->with($this->logicalOr(
$this->equalTo(0),
$this->equalTo(10),
$this->equalTo(20),
$this->equalTo(20),
$this->equalTo(20.00)
));

$this->discount->collect($quote, $this->shippingAssignmentMock, $total);
}
}
Loading

0 comments on commit 581b7ef

Please sign in to comment.