Skip to content

Commit 735a01b

Browse files
authored
[LYNX] Purchase order graphql delivery
* LYNX-4: Add is_deferred field to AvailablePaymentMethod type to obtain information if payment method is online/offline * LYNX-45: Introducing purchase order rule data fixtures * LYNX-47: Update magento-coding-standard to version 26
1 parent 24a2c46 commit 735a01b

File tree

10 files changed

+275
-31
lines changed

10 files changed

+275
-31
lines changed

app/code/Magento/Config/Model/Config/Structure/Element/Dependency/Field.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
*/
66
namespace Magento\Config\Model\Config\Structure\Element\Dependency;
77

8-
/**
9-
* @api
10-
* @since 100.0.2
11-
*/
12-
138
/**
149
* Class Field
1510
*
1611
* Fields are used to describe possible values for a type/interface.
12+
*
13+
* @api
14+
* @since 100.0.2
1715
*/
1816
class Field
1917
{

app/code/Magento/Customer/Test/Fixture/Customer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
class Customer implements RevertibleDataFixtureInterface
2929
{
3030
private const DEFAULT_DATA = [
31-
'password' => null,
31+
'password' => 'password',
3232
CustomerInterface::ID => null,
3333
CustomerInterface::CONFIRMATION => null,
3434
CustomerInterface::CREATED_AT => null,

app/code/Magento/Payment/Model/Method/Free.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@
2020
*/
2121
class Free extends \Magento\Payment\Model\Method\AbstractMethod
2222
{
23-
const PAYMENT_METHOD_FREE_CODE = 'free';
23+
public const PAYMENT_METHOD_FREE_CODE = 'free';
2424

2525
/**
2626
* XML Paths for configuration constants
2727
*/
28-
const XML_PATH_PAYMENT_FREE_ACTIVE = 'payment/free/active';
28+
public const XML_PATH_PAYMENT_FREE_ACTIVE = 'payment/free/active';
2929

30-
const XML_PATH_PAYMENT_FREE_ORDER_STATUS = 'payment/free/order_status';
30+
public const XML_PATH_PAYMENT_FREE_ORDER_STATUS = 'payment/free/order_status';
3131

32-
const XML_PATH_PAYMENT_FREE_PAYMENT_ACTION = 'payment/free/payment_action';
32+
public const XML_PATH_PAYMENT_FREE_PAYMENT_ACTION = 'payment/free/payment_action';
3333

3434
/**
3535
* Payment Method features
@@ -50,6 +50,11 @@ class Free extends \Magento\Payment\Model\Method\AbstractMethod
5050
*/
5151
protected $priceCurrency;
5252

53+
/**
54+
* @var bool
55+
*/
56+
protected $_isOffline = true;
57+
5358
/**
5459
* @param \Magento\Framework\Model\Context $context
5560
* @param \Magento\Framework\Registry $registry
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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+
namespace Magento\PaymentGraphQl\Model\Resolver;
9+
10+
use Magento\Framework\GraphQl\Query\ResolverInterface;
11+
use Magento\Framework\Exception\LocalizedException;
12+
use Magento\Payment\Helper\Data as PaymentData;
13+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
14+
use Magento\Framework\GraphQl\Config\Element\Field;
15+
16+
/**
17+
* Checks if payment method is deferred (online)
18+
*/
19+
class IsDeferred implements ResolverInterface
20+
{
21+
/**
22+
* @var PaymentData
23+
*/
24+
private $paymentData;
25+
26+
/**
27+
* @var array
28+
*/
29+
private $overrides;
30+
31+
/**
32+
* IsDeferred constructor.
33+
*
34+
* @param PaymentData $paymentData
35+
* @param array $overrides
36+
*/
37+
public function __construct(
38+
PaymentData $paymentData,
39+
array $overrides = []
40+
) {
41+
$this->paymentData = $paymentData;
42+
$this->overrides = $overrides;
43+
}
44+
45+
/**
46+
* @inheritdoc
47+
*/
48+
public function resolve(
49+
Field $field,
50+
$context,
51+
ResolveInfo $info,
52+
array $value = null,
53+
array $args = null
54+
) {
55+
if (!$value['code']) {
56+
throw new LocalizedException(__('"code" value should be specified'));
57+
}
58+
return $this->isDeferredPaymentMethod($value['code']);
59+
}
60+
61+
/**
62+
* Identifies whether the payment method is deferred
63+
*
64+
* @param string $code
65+
*
66+
* @return bool
67+
*/
68+
private function isDeferredPaymentMethod(string $code): bool
69+
{
70+
if (isset($this->overrides['deferred']) &&
71+
is_array($this->overrides['deferred']) &&
72+
in_array($code, $this->overrides['deferred'])
73+
) {
74+
return true;
75+
}
76+
if (isset($this->overrides['undeferred']) &&
77+
is_array($this->overrides['undeferred']) &&
78+
in_array($code, $this->overrides['undeferred'])
79+
) {
80+
return false;
81+
}
82+
return !$this->paymentData->getMethodInstance($code)->isOffline();
83+
}
84+
}

app/code/Magento/PaymentGraphQl/etc/schema.graphqls

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ type StoreConfig {
1919
check_money_order_max_order_total: String @doc(description: "The maximum order amount required to qualify for the Check/Money Order payment method.")
2020
check_money_order_sort_order: Int @doc(description: "A number indicating the position of the Check/Money Order payment method in the list of available payment methods during checkout.")
2121
}
22+
23+
type AvailablePaymentMethod @doc(description: "Describes a payment method that the shopper can use to pay for the order.") {
24+
is_deferred: Boolean! @doc(description: "If the payment method is an online integration") @resolver(class: "\\Magento\\PaymentGraphQl\\Model\\Resolver\\IsDeferred")
25+
}

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ public function __construct(
5050
/**
5151
* @inheritdoc
5252
*/
53-
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
54-
{
53+
public function resolve(
54+
Field $field,
55+
$context,
56+
ResolveInfo $info,
57+
array $value = null,
58+
array $args = null
59+
) {
5560
if (!isset($value['model'])) {
5661
throw new LocalizedException(__('"model" value should be specified'));
5762
}
@@ -79,18 +84,19 @@ private function getPaymentMethodsData(CartInterface $cart): array
7984
/**
8085
* Checking payment method and shipping method for zero price product
8186
*/
82-
if ((int)$grandTotal === 0 && $carrierCode === self::FREE_SHIPPING_METHOD
83-
&& $paymentMethod->getCode() === self::FREE_PAYMENT_METHOD_CODE) {
87+
if ((int)$grandTotal === 0 && $carrierCode === self::FREE_SHIPPING_METHOD &&
88+
$paymentMethod->getCode() === self::FREE_PAYMENT_METHOD_CODE
89+
) {
8490
return [
8591
[
8692
'title' => $paymentMethod->getTitle(),
87-
'code' => $paymentMethod->getCode(),
93+
'code' => $paymentMethod->getCode()
8894
]
8995
];
9096
} elseif ((int)$grandTotal >= 0) {
9197
$paymentMethodsData[] = [
9298
'title' => $paymentMethod->getTitle(),
93-
'code' => $paymentMethod->getCode(),
99+
'code' => $paymentMethod->getCode()
94100
];
95101
}
96102
}

composer.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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+
namespace Magento\GraphQl\PaymentGraphQl;
9+
10+
use Magento\GraphQl\Quote\GetMaskedQuoteIdByReservedOrderId;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\TestCase\GraphQlAbstract;
13+
14+
/**
15+
* Test for getting cart information
16+
*/
17+
class GetIsDeferredPaymentMethodTest extends GraphQlAbstract
18+
{
19+
/**
20+
* @var GetMaskedQuoteIdByReservedOrderId
21+
*/
22+
private $getMaskedQuoteIdByReservedOrderId;
23+
24+
/**
25+
* @inheritdoc
26+
*/
27+
protected function setUp(): void
28+
{
29+
$objectManager = Bootstrap::getObjectManager();
30+
$this->getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class);
31+
}
32+
33+
/**
34+
* @param string $maskedQuoteId
35+
* @return string
36+
*/
37+
private function getQuery(string $maskedQuoteId): string
38+
{
39+
return <<<QUERY
40+
{
41+
cart(cart_id: "$maskedQuoteId") {
42+
available_payment_methods {
43+
code
44+
title
45+
is_deferred
46+
}
47+
}
48+
}
49+
QUERY;
50+
}
51+
52+
/**
53+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
54+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
55+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
56+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
57+
* @magentoConfigFixture default_store payment/checkmo/active 1
58+
* @magentoConfigFixture default_store payment/free/active 0
59+
* @magentoConfigFixture default_store payment/cashondelivery/active 0
60+
* @magentoConfigFixture default_store payment/banktransfer/active 0
61+
*/
62+
public function testIsDeferredPaymentMethod()
63+
{
64+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
65+
$query = $this->getQuery($maskedQuoteId);
66+
$response = $this->graphQlQuery($query);
67+
68+
self::assertArrayHasKey('cart', $response);
69+
self::assertArrayHasKey('available_payment_methods', $response['cart']);
70+
71+
self::assertEquals('checkmo', $response['cart']['available_payment_methods'][0]['code']);
72+
self::assertEquals('Check / Money order', $response['cart']['available_payment_methods'][0]['title']);
73+
self::assertEquals(false, $response['cart']['available_payment_methods'][0]['is_deferred']);
74+
}
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+
namespace Magento\GraphQl\PaypalGraphQl;
9+
10+
use Magento\GraphQl\Quote\GetMaskedQuoteIdByReservedOrderId;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\TestCase\GraphQlAbstract;
13+
14+
/**
15+
* Test for getting cart information
16+
*/
17+
class GetIsPaypalExpressDeferredPaymentMethodTest extends GraphQlAbstract
18+
{
19+
/**
20+
* @var GetMaskedQuoteIdByReservedOrderId
21+
*/
22+
private $getMaskedQuoteIdByReservedOrderId;
23+
24+
/**
25+
* @inheritdoc
26+
*/
27+
protected function setUp(): void
28+
{
29+
$objectManager = Bootstrap::getObjectManager();
30+
$this->getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class);
31+
}
32+
33+
/**
34+
* @param string $maskedQuoteId
35+
* @return string
36+
*/
37+
private function getQuery(string $maskedQuoteId): string
38+
{
39+
return <<<QUERY
40+
{
41+
cart(cart_id: "$maskedQuoteId") {
42+
available_payment_methods {
43+
code
44+
title
45+
is_deferred
46+
}
47+
}
48+
}
49+
QUERY;
50+
}
51+
52+
/**
53+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
54+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
55+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
56+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
57+
* @magentoConfigFixture default_store payment/paypal_billing_agreement/active 0
58+
* @magentoConfigFixture default_store payment/checkmo/active 0
59+
* @magentoConfigFixture default_store payment/cashondelivery/active 0
60+
* @magentoConfigFixture default_store payment/banktransfer/active 0
61+
* @magentoConfigFixture default_store payment/free/active 0
62+
* @magentoConfigFixture default_store payment/paypal_express/active 1
63+
*/
64+
public function testGetIsPaypalExpressDeferredPaymentMethod()
65+
{
66+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
67+
$query = $this->getQuery($maskedQuoteId);
68+
$response = $this->graphQlQuery($query);
69+
70+
self::assertArrayHasKey('cart', $response);
71+
self::assertArrayHasKey('available_payment_methods', $response['cart']);
72+
self::assertEquals('paypal_express', $response['cart']['available_payment_methods'][0]['code']);
73+
self::assertEquals('PayPal Express Checkout', $response['cart']['available_payment_methods'][0]['title']);
74+
self::assertEquals(true, $response['cart']['available_payment_methods'][0]['is_deferred']);
75+
}
76+
}

0 commit comments

Comments
 (0)