Skip to content

Commit e307571

Browse files
merge magento/2.4-develop into magento-trigger/MC-36428
2 parents fa41aff + a734956 commit e307571

File tree

14 files changed

+554
-109
lines changed

14 files changed

+554
-109
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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\PaypalGraphQl\Model\Plugin\Cart\PayflowPro;
9+
10+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
11+
use Magento\Paypal\Model\Config;
12+
use Magento\Quote\Model\Quote;
13+
use Magento\QuoteGraphQl\Model\Cart\Payment\AdditionalDataProviderPool;
14+
use Magento\Sales\Model\Order\Payment\Repository as PaymentRepository;
15+
use Magento\PaypalGraphQl\Observer\PayflowProSetCcData;
16+
17+
/**
18+
* Set additionalInformation on payment for PayflowPro method
19+
*/
20+
class SetPaymentMethodOnCart
21+
{
22+
/**
23+
* @var PaymentRepository
24+
*/
25+
private $paymentRepository;
26+
27+
/**
28+
* @var AdditionalDataProviderPool
29+
*/
30+
private $additionalDataProviderPool;
31+
32+
/**
33+
* @param PaymentRepository $paymentRepository
34+
* @param AdditionalDataProviderPool $additionalDataProviderPool
35+
*/
36+
public function __construct(
37+
PaymentRepository $paymentRepository,
38+
AdditionalDataProviderPool $additionalDataProviderPool
39+
) {
40+
$this->paymentRepository = $paymentRepository;
41+
$this->additionalDataProviderPool = $additionalDataProviderPool;
42+
}
43+
44+
/**
45+
* Set redirect URL paths on payment additionalInformation
46+
*
47+
* @param \Magento\QuoteGraphQl\Model\Cart\SetPaymentMethodOnCart $subject
48+
* @param mixed $result
49+
* @param Quote $cart
50+
* @param array $paymentData
51+
* @return void
52+
* @throws GraphQlInputException
53+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
54+
*/
55+
public function afterExecute(
56+
\Magento\QuoteGraphQl\Model\Cart\SetPaymentMethodOnCart $subject,
57+
$result,
58+
Quote $cart,
59+
array $paymentData
60+
): void {
61+
$paymentData = $this->additionalDataProviderPool->getData(Config::METHOD_PAYFLOWPRO, $paymentData);
62+
$cartCustomerId = (int)$cart->getCustomerId();
63+
if ($cartCustomerId === 0 &&
64+
array_key_exists(PayflowProSetCcData::IS_ACTIVE_PAYMENT_TOKEN_ENABLER, $paymentData)) {
65+
$payment = $cart->getPayment();
66+
$payment->unsAdditionalInformation(PayflowProSetCcData::IS_ACTIVE_PAYMENT_TOKEN_ENABLER);
67+
$payment->save();
68+
}
69+
}
70+
}

app/code/Magento/PaypalGraphQl/Model/Resolver/PayflowProResponse.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ public function resolve(
126126
$this->parameters->fromString(urldecode($paypalPayload));
127127
$data = $this->parameters->toArray();
128128
try {
129-
$do = $this->dataObjectFactory->create(['data' => array_change_key_case($data, CASE_LOWER)]);
130-
$this->responseValidator->validate($do, $this->transparent);
131-
$this->transaction->savePaymentInQuote($do, $cart->getId());
129+
$response = $this->transaction->getResponseObject($data);
130+
$this->responseValidator->validate($response, $this->transparent);
131+
$this->transaction->savePaymentInQuote($response, $cart->getId());
132132
} catch (LocalizedException $exception) {
133133
$parameters['error'] = true;
134134
$parameters['error_msg'] = $exception->getMessage();
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\PaypalGraphQl\Observer;
10+
11+
use Magento\Framework\App\Config\ScopeConfigInterface;
12+
use Magento\Framework\Event\Observer;
13+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
14+
use Magento\Payment\Observer\AbstractDataAssignObserver;
15+
use Magento\Quote\Api\Data\PaymentInterface;
16+
17+
/**
18+
* Class PayflowProSetCcData set CcData to quote payment
19+
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
20+
*/
21+
class PayflowProSetCcData extends AbstractDataAssignObserver
22+
{
23+
const XML_PATH_PAYMENT_PAYFLOWPRO_CC_VAULT_ACTIVE = "payment/payflowpro_cc_vault/active";
24+
const IS_ACTIVE_PAYMENT_TOKEN_ENABLER = "is_active_payment_token_enabler";
25+
26+
/**
27+
* Core store config
28+
*
29+
* @var ScopeConfigInterface
30+
*/
31+
private $scopeConfig;
32+
33+
/**
34+
* @param ScopeConfigInterface $scopeConfig
35+
*/
36+
public function __construct(
37+
ScopeConfigInterface $scopeConfig
38+
) {
39+
$this->scopeConfig = $scopeConfig;
40+
}
41+
42+
/**
43+
* Set CcData
44+
*
45+
* @param Observer $observer
46+
*
47+
* @throws GraphQlInputException
48+
*/
49+
public function execute(Observer $observer)
50+
{
51+
$dataObject = $this->readDataArgument($observer);
52+
$additionalData = $dataObject->getData(PaymentInterface::KEY_ADDITIONAL_DATA);
53+
$paymentModel = $this->readPaymentModelArgument($observer);
54+
55+
if (!isset($additionalData['cc_details'])) {
56+
return;
57+
}
58+
59+
if ($this->isPayflowProVaultEnable()) {
60+
if (!isset($additionalData[self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER])) {
61+
$paymentModel->setData(self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER, false);
62+
}
63+
64+
$paymentModel->setData(
65+
self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER,
66+
$additionalData[self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER]
67+
);
68+
} else {
69+
$paymentModel->setData(self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER, false);
70+
}
71+
72+
$ccData = $additionalData['cc_details'];
73+
$paymentModel->setCcType($ccData['cc_type']);
74+
$paymentModel->setCcExpYear($ccData['cc_exp_year']);
75+
$paymentModel->setCcExpMonth($ccData['cc_exp_month']);
76+
$paymentModel->setCcLast4($ccData['cc_last_4']);
77+
}
78+
79+
/**
80+
* Check if payflowpro vault is enable
81+
*
82+
* @return bool
83+
*/
84+
private function isPayflowProVaultEnable()
85+
{
86+
return (bool)$this->scopeConfig->getValue(self::XML_PATH_PAYMENT_PAYFLOWPRO_CC_VAULT_ACTIVE);
87+
}
88+
}

app/code/Magento/PaypalGraphQl/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"magento/module-store": "*"
1717
},
1818
"suggest": {
19-
"magento/module-graph-ql": "*"
19+
"magento/module-graph-ql": "*",
20+
"magento/module-store-graph-ql": "*"
2021
},
2122
"type": "magento2-module",
2223
"license": [

app/code/Magento/PaypalGraphQl/etc/graphql/di.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
</type>
1212
<type name="Magento\QuoteGraphQl\Model\Cart\SetPaymentMethodOnCart">
1313
<plugin name="hosted_pro_payment_method" type="Magento\PaypalGraphQl\Model\Plugin\Cart\HostedPro\SetPaymentMethodOnCart"/>
14+
<plugin name="payflowpro_payment_method" type="Magento\PaypalGraphQl\Model\Plugin\Cart\PayflowPro\SetPaymentMethodOnCart"/>
1415
</type>
1516
<type name="Magento\Paypal\Model\Payflowlink">
1617
<plugin name="payflow_link_update_redirect_urls" type="Magento\PaypalGraphQl\Model\Plugin\Payflowlink"/>
@@ -53,4 +54,12 @@
5354
</argument>
5455
</arguments>
5556
</type>
57+
58+
<type name="Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider">
59+
<arguments>
60+
<argument name="extendedConfigData" xsi:type="array">
61+
<item name="payment_payflowpro_cc_vault_active" xsi:type="string">payment/payflowpro_cc_vault/active</item>
62+
</argument>
63+
</arguments>
64+
</type>
5665
</config>

app/code/Magento/PaypalGraphQl/etc/graphql/events.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@
1212
<event name="payment_method_assign_data_payflow_advanced">
1313
<observer name="payflow_advanced_data_assigner" instance="Magento\PaypalGraphQl\Observer\PayflowLinkSetAdditionalData"/>
1414
</event>
15+
<event name="payment_method_assign_data_payflowpro">
16+
<observer name="payflowpro_cc_data_assigner" instance="Magento\PaypalGraphQl\Observer\PayflowProSetCcData" />
17+
</event>
1518
</config>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ input PayflowProTokenInput @doc(description:"Input required to fetch payment tok
102102

103103
input PayflowProInput @doc(description:"Required input for Payflow Pro and Payments Pro payment methods.") {
104104
cc_details: CreditCardDetailsInput! @doc(description: "Required input for credit card related information")
105+
is_active_payment_token_enabler: Boolean @doc(description:"States whether details about the customer's credit/debit card should be tokenized for later usage. Required only if Vault is enabled for PayPal Payflow Pro payment integration.")
105106
}
106107

107108
input CreditCardDetailsInput @doc(description:"Required fields for Payflow Pro and Payments Pro credit card payments") {
@@ -141,3 +142,7 @@ input PayflowProResponseInput @doc(description:"Input required to complete payme
141142
type PayflowProResponseOutput {
142143
cart: Cart!
143144
}
145+
146+
type StoreConfig {
147+
payment_payflowpro_cc_vault_active: String @doc(description: "Payflow Pro vault status.")
148+
}

app/code/Magento/Sales/Test/Mftf/Test/CreateOrderFromEditCustomerPageTest.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
<severity value="BLOCKER"/>
1818
<testCaseId value="MC-16161"/>
1919
<group value="mtf_migrated"/>
20-
<skip>
21-
<issueId value="MC-36044"/>
22-
</skip>
2320
</annotations>
2421

2522
<before>

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ define([
8484
}, 10);
8585
};
8686

87-
if (jQuery('#' + this.getAreaId('items')).is(':visible')) {
87+
jQuery.async('#order-items .admin__page-section-title', (function () {
8888
this.dataArea.onLoad = this.dataArea.onLoad.wrap(function (proceed) {
8989
proceed();
9090
this._parent.itemsArea.setNode($(this._parent.getAreaId('items')));
@@ -99,7 +99,9 @@ define([
9999
});
100100
this.areasLoaded();
101101
this.itemsArea.onLoad();
102-
}
102+
103+
}).bind(this));
104+
103105
}).bind(this));
104106

105107
jQuery('#edit_form')

app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Shipping\Block\Adminhtml\Order;
78

9+
use Magento\Framework\App\ObjectManager;
10+
use Magento\Shipping\Helper\Carrier;
11+
812
/**
913
* Adminhtml shipment packaging
1014
*
@@ -44,19 +48,22 @@ class Packaging extends \Magento\Backend\Block\Template
4448
* @param \Magento\Framework\Registry $coreRegistry
4549
* @param \Magento\Shipping\Model\CarrierFactory $carrierFactory
4650
* @param array $data
51+
* @param Carrier|null $carrierHelper
4752
*/
4853
public function __construct(
4954
\Magento\Backend\Block\Template\Context $context,
5055
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
5156
\Magento\Shipping\Model\Carrier\Source\GenericInterface $sourceSizeModel,
5257
\Magento\Framework\Registry $coreRegistry,
5358
\Magento\Shipping\Model\CarrierFactory $carrierFactory,
54-
array $data = []
59+
array $data = [],
60+
?Carrier $carrierHelper = null
5561
) {
5662
$this->_jsonEncoder = $jsonEncoder;
5763
$this->_coreRegistry = $coreRegistry;
5864
$this->_sourceSizeModel = $sourceSizeModel;
5965
$this->_carrierFactory = $carrierFactory;
66+
$data['carrierHelper'] = $carrierHelper ?? ObjectManager::getInstance()->get(Carrier::class);
6067
parent::__construct($context, $data);
6168
}
6269

0 commit comments

Comments
 (0)