-
Notifications
You must be signed in to change notification settings - Fork 9.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'origin/2.3-develop' into issue/479-test…
…-coverage-apply-coupon-to-cart
- Loading branch information
Showing
44 changed files
with
1,610 additions
and
173 deletions.
There are no files selected for viewing
177 changes: 177 additions & 0 deletions
177
app/code/Magento/Braintree/Model/Multishipping/PlaceOrder.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
declare(strict_types=1); | ||
|
||
namespace Magento\Braintree\Model\Multishipping; | ||
|
||
use Magento\Braintree\Gateway\Command\GetPaymentNonceCommand; | ||
use Magento\Braintree\Model\Ui\ConfigProvider; | ||
use Magento\Braintree\Observer\DataAssignObserver; | ||
use Magento\Braintree\Model\Ui\PayPal\ConfigProvider as PaypalConfigProvider; | ||
use Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderInterface; | ||
use Magento\Sales\Api\Data\OrderInterface; | ||
use Magento\Sales\Api\Data\OrderPaymentExtensionInterface; | ||
use Magento\Sales\Api\Data\OrderPaymentExtensionInterfaceFactory; | ||
use Magento\Sales\Api\Data\OrderPaymentInterface; | ||
use Magento\Sales\Api\OrderManagementInterface; | ||
use Magento\Vault\Api\Data\PaymentTokenInterface; | ||
|
||
/** | ||
* Order payments processing for multishipping checkout flow. | ||
* | ||
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) | ||
*/ | ||
class PlaceOrder implements PlaceOrderInterface | ||
{ | ||
/** | ||
* @var OrderManagementInterface | ||
*/ | ||
private $orderManagement; | ||
|
||
/** | ||
* @var OrderPaymentExtensionInterfaceFactory | ||
*/ | ||
private $paymentExtensionFactory; | ||
|
||
/** | ||
* @var GetPaymentNonceCommand | ||
*/ | ||
private $getPaymentNonceCommand; | ||
|
||
/** | ||
* @param OrderManagementInterface $orderManagement | ||
* @param OrderPaymentExtensionInterfaceFactory $paymentExtensionFactory | ||
* @param GetPaymentNonceCommand $getPaymentNonceCommand | ||
*/ | ||
public function __construct( | ||
OrderManagementInterface $orderManagement, | ||
OrderPaymentExtensionInterfaceFactory $paymentExtensionFactory, | ||
GetPaymentNonceCommand $getPaymentNonceCommand | ||
) { | ||
$this->orderManagement = $orderManagement; | ||
$this->paymentExtensionFactory = $paymentExtensionFactory; | ||
$this->getPaymentNonceCommand = $getPaymentNonceCommand; | ||
} | ||
|
||
/** | ||
* @inheritdoc | ||
*/ | ||
public function place(array $orderList): array | ||
{ | ||
if (empty($orderList)) { | ||
return []; | ||
} | ||
|
||
$errorList = []; | ||
$firstOrder = $this->orderManagement->place(array_shift($orderList)); | ||
// get payment token from first placed order | ||
$paymentToken = $this->getPaymentToken($firstOrder); | ||
|
||
foreach ($orderList as $order) { | ||
try { | ||
/** @var OrderInterface $order */ | ||
$orderPayment = $order->getPayment(); | ||
$this->setVaultPayment($orderPayment, $paymentToken); | ||
$this->orderManagement->place($order); | ||
} catch (\Exception $e) { | ||
$incrementId = $order->getIncrementId(); | ||
$errorList[$incrementId] = $e; | ||
} | ||
} | ||
|
||
return $errorList; | ||
} | ||
|
||
/** | ||
* Sets vault payment method. | ||
* | ||
* @param OrderPaymentInterface $orderPayment | ||
* @param PaymentTokenInterface $paymentToken | ||
* @return void | ||
*/ | ||
private function setVaultPayment(OrderPaymentInterface $orderPayment, PaymentTokenInterface $paymentToken): void | ||
{ | ||
$vaultMethod = $this->getVaultPaymentMethod( | ||
$orderPayment->getMethod() | ||
); | ||
$orderPayment->setMethod($vaultMethod); | ||
|
||
$publicHash = $paymentToken->getPublicHash(); | ||
$customerId = $paymentToken->getCustomerId(); | ||
$result = $this->getPaymentNonceCommand->execute( | ||
['public_hash' => $publicHash, 'customer_id' => $customerId] | ||
) | ||
->get(); | ||
|
||
$orderPayment->setAdditionalInformation( | ||
DataAssignObserver::PAYMENT_METHOD_NONCE, | ||
$result['paymentMethodNonce'] | ||
); | ||
$orderPayment->setAdditionalInformation( | ||
PaymentTokenInterface::PUBLIC_HASH, | ||
$publicHash | ||
); | ||
$orderPayment->setAdditionalInformation( | ||
PaymentTokenInterface::CUSTOMER_ID, | ||
$customerId | ||
); | ||
} | ||
|
||
/** | ||
* Returns vault payment method. | ||
* | ||
* For placing sequence of orders, we need to replace the original method on the vault method. | ||
* | ||
* @param string $method | ||
* @return string | ||
*/ | ||
private function getVaultPaymentMethod(string $method): string | ||
{ | ||
$vaultPaymentMap = [ | ||
ConfigProvider::CODE => ConfigProvider::CC_VAULT_CODE, | ||
PaypalConfigProvider::PAYPAL_CODE => PaypalConfigProvider::PAYPAL_VAULT_CODE | ||
]; | ||
|
||
return $vaultPaymentMap[$method] ?? $method; | ||
} | ||
|
||
/** | ||
* Returns payment token. | ||
* | ||
* @param OrderInterface $order | ||
* @return PaymentTokenInterface | ||
* @throws \BadMethodCallException | ||
*/ | ||
private function getPaymentToken(OrderInterface $order): PaymentTokenInterface | ||
{ | ||
$orderPayment = $order->getPayment(); | ||
$extensionAttributes = $this->getExtensionAttributes($orderPayment); | ||
$paymentToken = $extensionAttributes->getVaultPaymentToken(); | ||
|
||
if ($paymentToken === null) { | ||
throw new \BadMethodCallException('Vault Payment Token should be defined for placed order payment.'); | ||
} | ||
|
||
return $paymentToken; | ||
} | ||
|
||
/** | ||
* Gets payment extension attributes. | ||
* | ||
* @param OrderPaymentInterface $payment | ||
* @return OrderPaymentExtensionInterface | ||
*/ | ||
private function getExtensionAttributes(OrderPaymentInterface $payment): OrderPaymentExtensionInterface | ||
{ | ||
$extensionAttributes = $payment->getExtensionAttributes(); | ||
if (null === $extensionAttributes) { | ||
$extensionAttributes = $this->paymentExtensionFactory->create(); | ||
$payment->setExtensionAttributes($extensionAttributes); | ||
} | ||
|
||
return $extensionAttributes; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
app/code/Magento/Braintree/view/frontend/layout/multishipping_checkout_billing.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
<?xml version="1.0"?> | ||
<!-- | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
--> | ||
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> | ||
<body> | ||
<referenceBlock name="checkout_billing"> | ||
<arguments> | ||
<argument name="form_templates" xsi:type="array"> | ||
<item name="braintree" xsi:type="string">Magento_Braintree::multishipping/form.phtml</item> | ||
<item name="braintree_paypal" xsi:type="string">Magento_Braintree::multishipping/form_paypal.phtml</item> | ||
</argument> | ||
</arguments> | ||
</referenceBlock> | ||
</body> | ||
</page> |
29 changes: 29 additions & 0 deletions
29
app/code/Magento/Braintree/view/frontend/templates/multishipping/form.phtml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
?> | ||
<script> | ||
require([ | ||
'uiLayout', | ||
'jquery' | ||
], function (layout, $) { | ||
$(function () { | ||
var paymentMethodData = { | ||
method: 'braintree' | ||
}; | ||
layout([ | ||
{ | ||
component: 'Magento_Braintree/js/view/payment/method-renderer/multishipping/hosted-fields', | ||
name: 'payment_method_braintree', | ||
method: paymentMethodData.method, | ||
item: paymentMethodData | ||
} | ||
]); | ||
|
||
$('body').trigger('contentUpdated'); | ||
}) | ||
}) | ||
</script> | ||
<!-- ko template: getTemplate() --><!-- /ko --> |
29 changes: 29 additions & 0 deletions
29
app/code/Magento/Braintree/view/frontend/templates/multishipping/form_paypal.phtml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
?> | ||
<script> | ||
require([ | ||
'uiLayout', | ||
'jquery' | ||
], function (layout, $) { | ||
$(function () { | ||
var paymentMethodData = { | ||
method: 'braintree_paypal' | ||
}; | ||
layout([ | ||
{ | ||
component: 'Magento_Braintree/js/view/payment/method-renderer/multishipping/paypal', | ||
name: 'payment_method_braintree_paypal', | ||
method: paymentMethodData.method, | ||
item: paymentMethodData | ||
} | ||
]); | ||
|
||
$('body').trigger('contentUpdated'); | ||
}) | ||
}) | ||
</script> | ||
<!-- ko template: getTemplate() --><!-- /ko --> |
Oops, something went wrong.