Skip to content

Commit d7cbc94

Browse files
author
Magento CICD
authored
merge magento/2.3-develop into magento-arcticfoxes/MAGETWO-88814
2 parents 1cc9e37 + 70c5c51 commit d7cbc94

File tree

663 files changed

+13926
-34985
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

663 files changed

+13926
-34985
lines changed

app/code/Magento/Authorizenet/Model/Directpost.php

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
*/
66
namespace Magento\Authorizenet\Model;
77

8-
use Magento\Framework\HTTP\ZendClientFactory;
8+
use Magento\Framework\App\ObjectManager;
99
use Magento\Payment\Model\Method\ConfigInterface;
1010
use Magento\Payment\Model\Method\TransparentInterface;
11-
use Magento\Sales\Model\Order\Email\Sender\OrderSender;
1211

1312
/**
1413
* Authorize.net DirectPost payment method model.
@@ -102,7 +101,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
102101
protected $response;
103102

104103
/**
105-
* @var OrderSender
104+
* @var \Magento\Sales\Model\Order\Email\Sender\OrderSender
106105
*/
107106
protected $orderSender;
108107

@@ -123,6 +122,16 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
123122
*/
124123
private $psrLogger;
125124

125+
/**
126+
* @var \Magento\Sales\Api\PaymentFailuresInterface
127+
*/
128+
private $paymentFailures;
129+
130+
/**
131+
* @var \Magento\Sales\Model\Order
132+
*/
133+
private $order;
134+
126135
/**
127136
* @param \Magento\Framework\Model\Context $context
128137
* @param \Magento\Framework\Registry $registry
@@ -134,18 +143,19 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
134143
* @param \Magento\Framework\Module\ModuleListInterface $moduleList
135144
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
136145
* @param \Magento\Authorizenet\Helper\Data $dataHelper
137-
* @param Directpost\Request\Factory $requestFactory
138-
* @param Directpost\Response\Factory $responseFactory
146+
* @param \Magento\Authorizenet\Model\Directpost\Request\Factory $requestFactory
147+
* @param \Magento\Authorizenet\Model\Directpost\Response\Factory $responseFactory
139148
* @param \Magento\Authorizenet\Model\TransactionService $transactionService
140149
* @param \Magento\Framework\HTTP\ZendClientFactory $httpClientFactory
141150
* @param \Magento\Sales\Model\OrderFactory $orderFactory
142151
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
143152
* @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
144-
* @param OrderSender $orderSender
153+
* @param \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender
145154
* @param \Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository
146155
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
147156
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
148157
* @param array $data
158+
* @param \Magento\Sales\Api\PaymentFailuresInterface|null $paymentFailures
149159
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
150160
*/
151161
public function __construct(
@@ -161,16 +171,17 @@ public function __construct(
161171
\Magento\Authorizenet\Helper\Data $dataHelper,
162172
\Magento\Authorizenet\Model\Directpost\Request\Factory $requestFactory,
163173
\Magento\Authorizenet\Model\Directpost\Response\Factory $responseFactory,
164-
TransactionService $transactionService,
165-
ZendClientFactory $httpClientFactory,
174+
\Magento\Authorizenet\Model\TransactionService $transactionService,
175+
\Magento\Framework\HTTP\ZendClientFactory $httpClientFactory,
166176
\Magento\Sales\Model\OrderFactory $orderFactory,
167177
\Magento\Store\Model\StoreManagerInterface $storeManager,
168178
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
169179
\Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender,
170180
\Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository,
171181
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
172182
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
173-
array $data = []
183+
array $data = [],
184+
\Magento\Sales\Api\PaymentFailuresInterface $paymentFailures = null
174185
) {
175186
$this->orderFactory = $orderFactory;
176187
$this->storeManager = $storeManager;
@@ -179,6 +190,8 @@ public function __construct(
179190
$this->orderSender = $orderSender;
180191
$this->transactionRepository = $transactionRepository;
181192
$this->_code = static::METHOD_CODE;
193+
$this->paymentFailures = $paymentFailures ? : ObjectManager::getInstance()
194+
->get(\Magento\Sales\Api\PaymentFailuresInterface::class);
182195

183196
parent::__construct(
184197
$context,
@@ -561,13 +574,10 @@ public function process(array $responseData)
561574
$this->validateResponse();
562575

563576
$response = $this->getResponse();
564-
//operate with order
565-
$orderIncrementId = $response->getXInvoiceNum();
566577
$responseText = $this->dataHelper->wrapGatewayError($response->getXResponseReasonText());
567578
$isError = false;
568-
if ($orderIncrementId) {
569-
/* @var $order \Magento\Sales\Model\Order */
570-
$order = $this->orderFactory->create()->loadByIncrementId($orderIncrementId);
579+
if ($this->getOrderIncrementId()) {
580+
$order = $this->getOrderFromResponse();
571581
//check payment method
572582
$payment = $order->getPayment();
573583
if (!$payment || $payment->getMethod() != $this->getCode()) {
@@ -632,9 +642,10 @@ public function checkResponseCode()
632642
return true;
633643
case self::RESPONSE_CODE_DECLINED:
634644
case self::RESPONSE_CODE_ERROR:
635-
throw new \Magento\Framework\Exception\LocalizedException(
636-
$this->dataHelper->wrapGatewayError($this->getResponse()->getXResponseReasonText())
637-
);
645+
$errorMessage = $this->dataHelper->wrapGatewayError($this->getResponse()->getXResponseReasonText());
646+
$order = $this->getOrderFromResponse();
647+
$this->paymentFailures->handle((int)$order->getQuoteId(), $errorMessage);
648+
throw new \Magento\Framework\Exception\LocalizedException($errorMessage);
638649
default:
639650
throw new \Magento\Framework\Exception\LocalizedException(
640651
__('There was a payment authorization error.')
@@ -988,12 +999,40 @@ protected function getTransactionResponse($transactionId)
988999
private function getPsrLogger()
9891000
{
9901001
if (null === $this->psrLogger) {
991-
$this->psrLogger = \Magento\Framework\App\ObjectManager::getInstance()
1002+
$this->psrLogger = ObjectManager::getInstance()
9921003
->get(\Psr\Log\LoggerInterface::class);
9931004
}
9941005
return $this->psrLogger;
9951006
}
9961007

1008+
/**
1009+
* Fetch order by increment id from response.
1010+
*
1011+
* @return \Magento\Sales\Model\Order
1012+
*/
1013+
private function getOrderFromResponse(): \Magento\Sales\Model\Order
1014+
{
1015+
if (!$this->order) {
1016+
$this->order = $this->orderFactory->create();
1017+
1018+
if ($incrementId = $this->getOrderIncrementId()) {
1019+
$this->order = $this->order->loadByIncrementId($incrementId);
1020+
}
1021+
}
1022+
1023+
return $this->order;
1024+
}
1025+
1026+
/**
1027+
* Fetch order increment id from response.
1028+
*
1029+
* @return string
1030+
*/
1031+
private function getOrderIncrementId(): string
1032+
{
1033+
return $this->getResponse()->getXInvoiceNum();
1034+
}
1035+
9971036
/**
9981037
* Checks if filter action is Report Only. Transactions that trigger this filter are processed as normal,
9991038
* but are also reported in the Merchant Interface as triggering this filter.

app/code/Magento/Authorizenet/Test/Unit/Model/DirectpostTest.php

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Authorizenet\Test\Unit\Model;
77

8+
use Magento\Sales\Api\PaymentFailuresInterface;
89
use Magento\Framework\Simplexml\Element;
910
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
1011
use Magento\Authorizenet\Model\Directpost;
@@ -74,6 +75,14 @@ class DirectpostTest extends \PHPUnit\Framework\TestCase
7475
*/
7576
protected $requestFactory;
7677

78+
/**
79+
* @var PaymentFailuresInterface|\PHPUnit_Framework_MockObject_MockObject
80+
*/
81+
private $paymentFailures;
82+
83+
/**
84+
* @inheritdoc
85+
*/
7786
protected function setUp()
7887
{
7988
$this->scopeConfigMock = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class)
@@ -104,6 +113,12 @@ protected function setUp()
104113
->setMethods(['getTransactionDetails'])
105114
->getMock();
106115

116+
$this->paymentFailures = $this->getMockBuilder(
117+
PaymentFailuresInterface::class
118+
)
119+
->disableOriginalConstructor()
120+
->getMock();
121+
107122
$this->requestFactory = $this->getRequestFactoryMock();
108123
$httpClientFactoryMock = $this->getHttpClientFactoryMock();
109124

@@ -117,7 +132,8 @@ protected function setUp()
117132
'responseFactory' => $this->responseFactoryMock,
118133
'transactionRepository' => $this->transactionRepositoryMock,
119134
'transactionService' => $this->transactionServiceMock,
120-
'httpClientFactory' => $httpClientFactoryMock
135+
'httpClientFactory' => $httpClientFactoryMock,
136+
'paymentFailures' => $this->paymentFailures,
121137
]
122138
);
123139
}
@@ -313,12 +329,16 @@ public function checkResponseCodeSuccessDataProvider()
313329
}
314330

315331
/**
316-
* @param bool $responseCode
332+
* Checks response failures behaviour.
333+
*
334+
* @param int $responseCode
335+
* @param int $failuresHandlerCalls
336+
* @return void
317337
*
318338
* @expectedException \Magento\Framework\Exception\LocalizedException
319339
* @dataProvider checkResponseCodeFailureDataProvider
320340
*/
321-
public function testCheckResponseCodeFailure($responseCode)
341+
public function testCheckResponseCodeFailure(int $responseCode, int $failuresHandlerCalls): void
322342
{
323343
$reasonText = 'reason text';
324344

@@ -333,18 +353,35 @@ public function testCheckResponseCodeFailure($responseCode)
333353
->with($reasonText)
334354
->willReturn(__('Gateway error: %1', $reasonText));
335355

356+
$orderMock = $this->getMockBuilder(Order::class)
357+
->disableOriginalConstructor()
358+
->getMock();
359+
360+
$orderMock->expects($this->exactly($failuresHandlerCalls))
361+
->method('getQuoteId')
362+
->willReturn(1);
363+
364+
$this->paymentFailures->expects($this->exactly($failuresHandlerCalls))
365+
->method('handle')
366+
->with(1);
367+
368+
$reflection = new \ReflectionClass($this->directpost);
369+
$order = $reflection->getProperty('order');
370+
$order->setAccessible(true);
371+
$order->setValue($this->directpost, $orderMock);
372+
336373
$this->directpost->checkResponseCode();
337374
}
338375

339376
/**
340377
* @return array
341378
*/
342-
public function checkResponseCodeFailureDataProvider()
379+
public function checkResponseCodeFailureDataProvider(): array
343380
{
344381
return [
345-
['responseCode' => Directpost::RESPONSE_CODE_DECLINED],
346-
['responseCode' => Directpost::RESPONSE_CODE_ERROR],
347-
['responseCode' => 999999]
382+
['responseCode' => Directpost::RESPONSE_CODE_DECLINED, 1],
383+
['responseCode' => Directpost::RESPONSE_CODE_ERROR, 1],
384+
['responseCode' => 999999, 0],
348385
];
349386
}
350387

app/code/Magento/Backend/App/AbstractAction.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ public function dispatch(\Magento\Framework\App\RequestInterface $request)
217217
$this->_view->loadLayout(['default', 'adminhtml_denied'], true, true, false);
218218
$this->_view->renderLayout();
219219
$this->_request->setDispatched(true);
220+
220221
return $this->_response;
221222
}
222223

@@ -226,6 +227,11 @@ public function dispatch(\Magento\Framework\App\RequestInterface $request)
226227

227228
$this->_processLocaleSettings();
228229

230+
// Need to preload isFirstPageAfterLogin (see https://github.com/magento/magento2/issues/15510)
231+
if ($this->_auth->isLoggedIn()) {
232+
$this->_auth->getAuthStorage()->isFirstPageAfterLogin();
233+
}
234+
229235
return parent::dispatch($request);
230236
}
231237

app/code/Magento/Backend/Block/GlobalSearch.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public function getWidgetInitOptions()
3131
'filterProperty' => 'name',
3232
'preventClickPropagation' => false,
3333
'minLength' => 2,
34+
'submitInputOnEnter' => false,
3435
]
3536
];
3637
}

app/code/Magento/Backend/view/adminhtml/templates/widget/button/split.phtml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@
4141
<?php endif; ?>
4242
</div>
4343

44-
<script>
45-
require(['jquery'], function($){
46-
$('.actions-split')
47-
.on('click.splitDefault', '.action-default', function() {
48-
$(this).siblings('.dropdown-menu').find('.item-default').trigger('click');
49-
});
50-
});
44+
<script type="text/x-magento-init">
45+
{
46+
".actions-split": {
47+
"Magento_Ui/js/grid/controls/button/split": {}
48+
}
49+
}
5150
</script>
51+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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\Braintree\Gateway\Response;
9+
10+
use Magento\Braintree\Gateway\SubjectReader;
11+
use Magento\Payment\Gateway\Response\HandlerInterface;
12+
use Magento\Sales\Model\Order\Payment;
13+
14+
/**
15+
* Handles response details for order cancellation request.
16+
*/
17+
class CancelDetailsHandler implements HandlerInterface
18+
{
19+
/**
20+
* @var SubjectReader
21+
*/
22+
private $subjectReader;
23+
24+
/**
25+
* @param SubjectReader $subjectReader
26+
*/
27+
public function __construct(SubjectReader $subjectReader)
28+
{
29+
$this->subjectReader = $subjectReader;
30+
}
31+
32+
/**
33+
* @inheritdoc
34+
*/
35+
public function handle(array $handlingSubject, array $response)
36+
{
37+
$paymentDO = $this->subjectReader->readPayment($handlingSubject);
38+
/** @var Payment $orderPayment */
39+
$orderPayment = $paymentDO->getPayment();
40+
$orderPayment->setIsTransactionClosed(true);
41+
$orderPayment->setShouldCloseParentTransaction(true);
42+
}
43+
}

app/code/Magento/Braintree/Gateway/SubjectReader.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,20 @@ public function readPayment(array $subject)
4343
}
4444

4545
/**
46-
* Reads transaction from subject
46+
* Reads transaction from the subject.
4747
*
4848
* @param array $subject
49-
* @return \Braintree\Transaction
49+
* @return Transaction
50+
* @throws \InvalidArgumentException if the subject doesn't contain transaction details.
5051
*/
5152
public function readTransaction(array $subject)
5253
{
5354
if (!isset($subject['object']) || !is_object($subject['object'])) {
54-
throw new \InvalidArgumentException('Response object does not exist');
55+
throw new \InvalidArgumentException('Response object does not exist.');
5556
}
5657

5758
if (!isset($subject['object']->transaction)
58-
&& !$subject['object']->transaction instanceof Transaction
59+
|| !$subject['object']->transaction instanceof Transaction
5960
) {
6061
throw new \InvalidArgumentException('The object is not a class \Braintree\Transaction.');
6162
}

0 commit comments

Comments
 (0)