Skip to content

Commit ab911e5

Browse files
committed
PWA-1303: [M2 Commerce] Gift card incorrectly applied to multiple orders using "free" payment method via graphql
1 parent d3f202a commit ab911e5

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

app/code/Magento/QuoteGraphQl/Model/Resolver/PlaceOrder.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Magento\Framework\GraphQl\Query\ResolverInterface;
1616
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1717
use Magento\Quote\Api\CartManagementInterface;
18+
use Magento\Quote\Api\PaymentMethodManagementInterface;
1819
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
1920
use Magento\Sales\Api\OrderRepositoryInterface;
2021
use Magento\QuoteGraphQl\Model\Cart\CheckCartCheckoutAllowance;
@@ -44,22 +45,30 @@ class PlaceOrder implements ResolverInterface
4445
*/
4546
private $checkCartCheckoutAllowance;
4647

48+
/**
49+
* @var PaymentMethodManagementInterface
50+
*/
51+
private $paymentMethodManagement;
52+
4753
/**
4854
* @param GetCartForUser $getCartForUser
4955
* @param CartManagementInterface $cartManagement
5056
* @param OrderRepositoryInterface $orderRepository
5157
* @param CheckCartCheckoutAllowance $checkCartCheckoutAllowance
58+
* @param PaymentMethodManagementInterface $paymentMethodManagement
5259
*/
5360
public function __construct(
5461
GetCartForUser $getCartForUser,
5562
CartManagementInterface $cartManagement,
5663
OrderRepositoryInterface $orderRepository,
57-
CheckCartCheckoutAllowance $checkCartCheckoutAllowance
64+
CheckCartCheckoutAllowance $checkCartCheckoutAllowance,
65+
PaymentMethodManagementInterface $paymentMethodManagement
5866
) {
5967
$this->getCartForUser = $getCartForUser;
6068
$this->cartManagement = $cartManagement;
6169
$this->orderRepository = $orderRepository;
6270
$this->checkCartCheckoutAllowance = $checkCartCheckoutAllowance;
71+
$this->paymentMethodManagement = $paymentMethodManagement;
6372
}
6473

6574
/**
@@ -84,7 +93,8 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
8493
}
8594

8695
try {
87-
$orderId = $this->cartManagement->placeOrder($cart->getId());
96+
$cartId = $cart->getId();
97+
$orderId = $this->cartManagement->placeOrder($cartId, $this->paymentMethodManagement->get($cartId));
8898
$order = $this->orderRepository->get($orderId);
8999

90100
return [

dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/PlaceOrderTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,28 @@ public function testPlaceOrderWithNoPaymentMethod()
275275
$this->graphQlMutation($query);
276276
}
277277

278+
/**
279+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
280+
* @magentoConfigFixture default_store carriers/flatrate/active 1
281+
* @magentoConfigFixture default_store carriers/tablerate/active 1
282+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
283+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/set_guest_email.php
284+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
285+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_free_payment_method.php
286+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
287+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
288+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_flatrate_shipping_method.php
289+
*/
290+
public function testPlaceOrderWithFreePaymentMethodNonZeroTotal()
291+
{
292+
$reservedOrderId = 'test_quote';
293+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute($reservedOrderId);
294+
$query = $this->getQuery($maskedQuoteId);
295+
296+
self::expectExceptionMessage('Unable to place order: The requested Payment Method is not available');
297+
$this->graphQlMutation($query);
298+
}
299+
278300
/**
279301
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
280302
* @magentoConfigFixture default_store carriers/flatrate/active 1
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Payment\Model\Method\Free;
9+
use Magento\Quote\Api\Data\PaymentInterface;
10+
use Magento\Quote\Api\Data\PaymentInterfaceFactory;
11+
use Magento\Quote\Api\PaymentMethodManagementInterface;
12+
use Magento\Quote\Model\QuoteFactory;
13+
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
14+
use Magento\TestFramework\Helper\Bootstrap;
15+
16+
/** @var QuoteFactory $quoteFactory */
17+
$quoteFactory = Bootstrap::getObjectManager()->get(QuoteFactory::class);
18+
/** @var QuoteResource $quoteResource */
19+
$quoteResource = Bootstrap::getObjectManager()->get(QuoteResource::class);
20+
/** @var PaymentInterfaceFactory $paymentFactory */
21+
$paymentFactory = Bootstrap::getObjectManager()->get(PaymentInterfaceFactory::class);
22+
/** @var PaymentMethodManagementInterface $paymentMethodManagement */
23+
$paymentMethodManagement = Bootstrap::getObjectManager()->get(PaymentMethodManagementInterface::class);
24+
25+
$quote = $quoteFactory->create();
26+
$quoteResource->load($quote, 'test_quote', 'reserved_order_id');
27+
28+
$payment = $paymentFactory->create([
29+
'data' => [
30+
PaymentInterface::KEY_METHOD => Free::PAYMENT_METHOD_FREE_CODE
31+
]
32+
]);
33+
$paymentMethodManagement->set($quote->getId(), $payment);

0 commit comments

Comments
 (0)