Skip to content

Commit 3365516

Browse files
committed
Merge remote-tracking branch 'origin/2.3-develop-pr5' into 2.3-develop-pr2
2 parents 7c71dc8 + 9dd4713 commit 3365516

File tree

61 files changed

+2240
-874
lines changed

Some content is hidden

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

61 files changed

+2240
-874
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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\Request;
9+
10+
use Magento\Braintree\Gateway\Config\Config;
11+
use Magento\Braintree\Gateway\SubjectReader;
12+
use Magento\Payment\Gateway\Request\BuilderInterface;
13+
14+
/**
15+
* Adds Merchant Account ID to the request if it was specified in the configuration.
16+
*/
17+
class MerchantAccountDataBuilder implements BuilderInterface
18+
{
19+
/**
20+
* The merchant account ID used to create a transaction.
21+
* Currency is also determined by merchant account ID.
22+
* If no merchant account ID is specified, Braintree will use your default merchant account.
23+
*/
24+
private static $merchantAccountId = 'merchantAccountId';
25+
26+
/**
27+
* @var Config
28+
*/
29+
private $config;
30+
31+
/**
32+
* @var SubjectReader
33+
*/
34+
private $subjectReader;
35+
36+
/**
37+
* Constructor
38+
*
39+
* @param Config $config
40+
* @param SubjectReader $subjectReader
41+
*/
42+
public function __construct(Config $config, SubjectReader $subjectReader)
43+
{
44+
$this->config = $config;
45+
$this->subjectReader = $subjectReader;
46+
}
47+
48+
/**
49+
* @inheritdoc
50+
*/
51+
public function build(array $buildSubject): array
52+
{
53+
$paymentDO = $this->subjectReader->readPayment($buildSubject);
54+
$order = $paymentDO->getOrder();
55+
56+
$result = [];
57+
$merchantAccountId = $this->config->getMerchantAccountId($order->getStoreId());
58+
if (!empty($merchantAccountId)) {
59+
$result[self::$merchantAccountId] = $merchantAccountId;
60+
}
61+
62+
return $result;
63+
}
64+
}

app/code/Magento/Braintree/Gateway/Request/PaymentDataBuilder.php

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
namespace Magento\Braintree\Gateway\Request;
77

88
use Magento\Braintree\Gateway\Config\Config;
9-
use Magento\Braintree\Observer\DataAssignObserver;
109
use Magento\Braintree\Gateway\SubjectReader;
10+
use Magento\Braintree\Observer\DataAssignObserver;
1111
use Magento\Payment\Gateway\Request\BuilderInterface;
1212
use Magento\Payment\Helper\Formatter;
1313

@@ -36,9 +36,8 @@ class PaymentDataBuilder implements BuilderInterface
3636
const PAYMENT_METHOD_NONCE = 'paymentMethodNonce';
3737

3838
/**
39-
* The merchant account ID used to create a transaction.
40-
* Currency is also determined by merchant account ID.
41-
* If no merchant account ID is specified, Braintree will use your default merchant account.
39+
* @deprecated
40+
* @see \Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder
4241
*/
4342
const MERCHANT_ACCOUNT_ID = 'merchantAccountId';
4443

@@ -47,25 +46,18 @@ class PaymentDataBuilder implements BuilderInterface
4746
*/
4847
const ORDER_ID = 'orderId';
4948

50-
/**
51-
* @var Config
52-
*/
53-
private $config;
54-
5549
/**
5650
* @var SubjectReader
5751
*/
5852
private $subjectReader;
5953

6054
/**
61-
* Constructor
62-
*
6355
* @param Config $config
6456
* @param SubjectReader $subjectReader
57+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
6558
*/
6659
public function __construct(Config $config, SubjectReader $subjectReader)
6760
{
68-
$this->config = $config;
6961
$this->subjectReader = $subjectReader;
7062
}
7163

@@ -87,11 +79,6 @@ public function build(array $buildSubject)
8779
self::ORDER_ID => $order->getOrderIncrementId()
8880
];
8981

90-
$merchantAccountId = $this->config->getMerchantAccountId($order->getStoreId());
91-
if (!empty($merchantAccountId)) {
92-
$result[self::MERCHANT_ACCOUNT_ID] = $merchantAccountId;
93-
}
94-
9582
return $result;
9683
}
9784
}

app/code/Magento/Braintree/Test/Unit/Gateway/Request/PaymentDataBuilderTest.php

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,27 @@
55
*/
66
namespace Magento\Braintree\Test\Unit\Gateway\Request;
77

8-
use Magento\Braintree\Gateway\Config\Config;
9-
use Magento\Braintree\Gateway\SubjectReader;
108
use Magento\Braintree\Gateway\Request\PaymentDataBuilder;
9+
use Magento\Braintree\Gateway\SubjectReader;
1110
use Magento\Braintree\Observer\DataAssignObserver;
1211
use Magento\Payment\Gateway\Data\OrderAdapterInterface;
1312
use Magento\Payment\Gateway\Data\PaymentDataObjectInterface;
1413
use Magento\Sales\Model\Order\Payment;
1514
use PHPUnit_Framework_MockObject_MockObject as MockObject;
15+
use Magento\Braintree\Gateway\Config\Config;
1616

1717
/**
1818
* Tests \Magento\Braintree\Gateway\Request\PaymentDataBuilder.
1919
*/
2020
class PaymentDataBuilderTest extends \PHPUnit\Framework\TestCase
2121
{
2222
const PAYMENT_METHOD_NONCE = 'nonce';
23-
const MERCHANT_ACCOUNT_ID = '245345';
2423

2524
/**
2625
* @var PaymentDataBuilder
2726
*/
2827
private $builder;
2928

30-
/**
31-
* @var Config|MockObject
32-
*/
33-
private $configMock;
34-
3529
/**
3630
* @var Payment|MockObject
3731
*/
@@ -52,12 +46,12 @@ class PaymentDataBuilderTest extends \PHPUnit\Framework\TestCase
5246
*/
5347
private $orderMock;
5448

49+
/**
50+
* @inheritdoc
51+
*/
5552
protected function setUp()
5653
{
5754
$this->paymentDOMock = $this->createMock(PaymentDataObjectInterface::class);
58-
$this->configMock = $this->getMockBuilder(Config::class)
59-
->disableOriginalConstructor()
60-
->getMock();
6155
$this->paymentMock = $this->getMockBuilder(Payment::class)
6256
->disableOriginalConstructor()
6357
->getMock();
@@ -66,13 +60,19 @@ protected function setUp()
6660
->getMock();
6761
$this->orderMock = $this->createMock(OrderAdapterInterface::class);
6862

69-
$this->builder = new PaymentDataBuilder($this->configMock, $this->subjectReaderMock);
63+
/** @var Config $config */
64+
$config = $this->getMockBuilder(Config::class)
65+
->disableOriginalConstructor()
66+
->getMock();
67+
68+
$this->builder = new PaymentDataBuilder($config, $this->subjectReaderMock);
7069
}
7170

7271
/**
72+
* @return void
7373
* @expectedException \InvalidArgumentException
7474
*/
75-
public function testBuildReadPaymentException()
75+
public function testBuildReadPaymentException(): void
7676
{
7777
$buildSubject = [];
7878

@@ -85,9 +85,10 @@ public function testBuildReadPaymentException()
8585
}
8686

8787
/**
88+
* @return void
8889
* @expectedException \InvalidArgumentException
8990
*/
90-
public function testBuildReadAmountException()
91+
public function testBuildReadAmountException(): void
9192
{
9293
$buildSubject = [
9394
'payment' => $this->paymentDOMock,
@@ -106,7 +107,10 @@ public function testBuildReadAmountException()
106107
$this->builder->build($buildSubject);
107108
}
108109

109-
public function testBuild()
110+
/**
111+
* @return void
112+
*/
113+
public function testBuild(): void
110114
{
111115
$additionalData = [
112116
[
@@ -118,8 +122,7 @@ public function testBuild()
118122
$expectedResult = [
119123
PaymentDataBuilder::AMOUNT => 10.00,
120124
PaymentDataBuilder::PAYMENT_METHOD_NONCE => self::PAYMENT_METHOD_NONCE,
121-
PaymentDataBuilder::ORDER_ID => '000000101',
122-
PaymentDataBuilder::MERCHANT_ACCOUNT_ID => self::MERCHANT_ACCOUNT_ID,
125+
PaymentDataBuilder::ORDER_ID => '000000101'
123126
];
124127

125128
$buildSubject = [
@@ -131,10 +134,6 @@ public function testBuild()
131134
->method('getAdditionalInformation')
132135
->willReturnMap($additionalData);
133136

134-
$this->configMock->expects(self::once())
135-
->method('getMerchantAccountId')
136-
->willReturn(self::MERCHANT_ACCOUNT_ID);
137-
138137
$this->paymentDOMock->expects(self::once())
139138
->method('getPayment')
140139
->willReturn($this->paymentMock);

app/code/Magento/Braintree/etc/adminhtml/di.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<item name="vault" xsi:type="string">Magento\Braintree\Gateway\Request\VaultDataBuilder</item>
3030
<item name="dynamic_descriptor" xsi:type="string">Magento\Braintree\Gateway\Request\DescriptorDataBuilder</item>
3131
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
32+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
3233
</argument>
3334
</arguments>
3435
</virtualType>
@@ -41,6 +42,7 @@
4142
<item name="address" xsi:type="string">Magento\Braintree\Gateway\Request\AddressDataBuilder</item>
4243
<item name="dynamic_descriptor" xsi:type="string">Magento\Braintree\Gateway\Request\DescriptorDataBuilder</item>
4344
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
45+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
4446
</argument>
4547
</arguments>
4648
</virtualType>

app/code/Magento/Braintree/etc/di.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@
233233
<item name="device_data" xsi:type="string">Magento\Braintree\Gateway\Request\KountPaymentDataBuilder</item>
234234
<item name="dynamic_descriptor" xsi:type="string">Magento\Braintree\Gateway\Request\DescriptorDataBuilder</item>
235235
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
236+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
236237
</argument>
237238
</arguments>
238239
</virtualType>
@@ -291,6 +292,7 @@
291292
<item name="device_data" xsi:type="string">Magento\Braintree\Gateway\Request\KountPaymentDataBuilder</item>
292293
<item name="dynamic_descriptor" xsi:type="string">Magento\Braintree\Gateway\Request\DescriptorDataBuilder</item>
293294
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
295+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
294296
</argument>
295297
</arguments>
296298
</virtualType>
@@ -325,6 +327,7 @@
325327
<item name="vault_capture" xsi:type="string">Magento\Braintree\Gateway\Request\VaultCaptureDataBuilder</item>
326328
<item name="settlement" xsi:type="string">Magento\Braintree\Gateway\Request\SettlementDataBuilder</item>
327329
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
330+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
328331
</argument>
329332
</arguments>
330333
</virtualType>
@@ -347,6 +350,7 @@
347350
<item name="device_data" xsi:type="string">Magento\Braintree\Gateway\Request\PayPal\DeviceDataBuilder</item>
348351
<item name="dynamic_descriptor" xsi:type="string">Magento\Braintree\Gateway\Request\DescriptorDataBuilder</item>
349352
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
353+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
350354
</argument>
351355
</arguments>
352356
</virtualType>
@@ -380,6 +384,7 @@
380384
<item name="address" xsi:type="string">Magento\Braintree\Gateway\Request\AddressDataBuilder</item>
381385
<item name="dynamic_descriptor" xsi:type="string">Magento\Braintree\Gateway\Request\DescriptorDataBuilder</item>
382386
<item name="store" xsi:type="string">Magento\Braintree\Gateway\Request\StoreConfigBuilder</item>
387+
<item name="merchant_account" xsi:type="string">Magento\Braintree\Gateway\Request\MerchantAccountDataBuilder</item>
383388
</argument>
384389
</arguments>
385390
</virtualType>

app/code/Magento/Catalog/Model/Product/Attribute/Repository.php

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -119,39 +119,18 @@ public function save(\Magento\Catalog\Api\Data\ProductAttributeInterface $attrib
119119
$attribute->setIsUserDefined($existingModel->getIsUserDefined());
120120
$attribute->setFrontendInput($existingModel->getFrontendInput());
121121

122-
if (is_array($attribute->getFrontendLabels())) {
123-
$defaultFrontendLabel = $attribute->getDefaultFrontendLabel();
124-
$frontendLabel[0] = !empty($defaultFrontendLabel)
125-
? $defaultFrontendLabel
126-
: $existingModel->getDefaultFrontendLabel();
127-
foreach ($attribute->getFrontendLabels() as $item) {
128-
$frontendLabel[$item->getStoreId()] = $item->getLabel();
129-
}
130-
$attribute->setDefaultFrontendLabel($frontendLabel);
131-
}
122+
$this->updateDefaultFrontendLabel($attribute, $existingModel);
132123
} else {
133124
$attribute->setAttributeId(null);
134125

135126
if (!$attribute->getFrontendLabels() && !$attribute->getDefaultFrontendLabel()) {
136127
throw InputException::requiredField('frontend_label');
137128
}
138129

139-
$frontendLabels = [];
140-
if ($attribute->getDefaultFrontendLabel()) {
141-
$frontendLabels[0] = $attribute->getDefaultFrontendLabel();
142-
}
143-
if ($attribute->getFrontendLabels() && is_array($attribute->getFrontendLabels())) {
144-
foreach ($attribute->getFrontendLabels() as $label) {
145-
$frontendLabels[$label->getStoreId()] = $label->getLabel();
146-
}
147-
if (!isset($frontendLabels[0]) || !$frontendLabels[0]) {
148-
throw InputException::invalidFieldValue('frontend_label', null);
149-
}
130+
$frontendLabel = $this->updateDefaultFrontendLabel($attribute, null);
150131

151-
$attribute->setDefaultFrontendLabel($frontendLabels);
152-
}
153132
$attribute->setAttributeCode(
154-
$attribute->getAttributeCode() ?: $this->generateCode($frontendLabels[0])
133+
$attribute->getAttributeCode() ?: $this->generateCode($frontendLabel)
155134
);
156135
$this->validateCode($attribute->getAttributeCode());
157136
$this->validateFrontendInput($attribute->getFrontendInput());
@@ -275,4 +254,52 @@ protected function validateFrontendInput($frontendInput)
275254
throw InputException::invalidFieldValue('frontend_input', $frontendInput);
276255
}
277256
}
257+
258+
/**
259+
* This method sets default frontend value using given default frontend value or frontend value from admin store
260+
* if default frontend value is not presented.
261+
* If both default frontend label and admin store frontend label are not given it throws exception
262+
* for attribute creation process or sets existing attribute value for attribute update action.
263+
*
264+
* @param \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute
265+
* @param \Magento\Catalog\Api\Data\ProductAttributeInterface|null $existingModel
266+
* @return string|null
267+
* @throws InputException
268+
*/
269+
private function updateDefaultFrontendLabel($attribute, $existingModel)
270+
{
271+
$frontendLabel = $attribute->getDefaultFrontendLabel();
272+
if (empty($frontendLabel)) {
273+
$frontendLabel = $this->extractAdminStoreFrontendLabel($attribute);
274+
if (empty($frontendLabel)) {
275+
if ($existingModel) {
276+
$frontendLabel = $existingModel->getDefaultFrontendLabel();
277+
} else {
278+
throw InputException::invalidFieldValue('frontend_label', null);
279+
}
280+
}
281+
$attribute->setDefaultFrontendLabel($frontendLabel);
282+
}
283+
return $frontendLabel;
284+
}
285+
286+
/**
287+
* This method extracts frontend label from FrontendLabel object for admin store.
288+
*
289+
* @param \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute
290+
* @return string|null
291+
*/
292+
private function extractAdminStoreFrontendLabel($attribute)
293+
{
294+
$frontendLabel = [];
295+
$frontendLabels = $attribute->getFrontendLabels();
296+
if (isset($frontendLabels[0])
297+
&& $frontendLabels[0] instanceof \Magento\Eav\Api\Data\AttributeFrontendLabelInterface
298+
) {
299+
foreach ($attribute->getFrontendLabels() as $label) {
300+
$frontendLabel[$label->getStoreId()] = $label->getLabel();
301+
}
302+
}
303+
return $frontendLabel[0] ?? null;
304+
}
278305
}

0 commit comments

Comments
 (0)