Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/2.3-develop' into issue/479-test…
Browse files Browse the repository at this point in the history
…-coverage-apply-coupon-to-cart
  • Loading branch information
naydav committed Apr 8, 2019
2 parents 2131a21 + 5a8ef03 commit 8c6ea9f
Show file tree
Hide file tree
Showing 44 changed files with 1,610 additions and 173 deletions.
177 changes: 177 additions & 0 deletions app/code/Magento/Braintree/Model/Multishipping/PlaceOrder.php
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;
}
}
3 changes: 2 additions & 1 deletion app/code/Magento/Braintree/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
"magento/module-quote": "*",
"magento/module-sales": "*",
"magento/module-ui": "*",
"magento/module-vault": "*"
"magento/module-vault": "*",
"magento/module-multishipping": "*"
},
"suggest": {
"magento/module-checkout-agreements": "*",
Expand Down
8 changes: 4 additions & 4 deletions app/code/Magento/Braintree/etc/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
<paymentInfoKeys>cc_type,cc_number,avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision</paymentInfoKeys>
<avs_ems_adapter>Magento\Braintree\Model\AvsEmsCodeMapper</avs_ems_adapter>
<cvv_ems_adapter>Magento\Braintree\Model\CvvEmsCodeMapper</cvv_ems_adapter>
<group>braintree</group>
<group>braintree_group</group>
</braintree>
<braintree_paypal>
<model>BraintreePayPalFacade</model>
Expand All @@ -68,7 +68,7 @@
<privateInfoKeys>processorResponseCode,processorResponseText,paymentId</privateInfoKeys>
<paymentInfoKeys>processorResponseCode,processorResponseText,paymentId,payerEmail</paymentInfoKeys>
<supported_locales>en_US,en_GB,en_AU,da_DK,fr_FR,fr_CA,de_DE,zh_HK,it_IT,nl_NL,no_NO,pl_PL,es_ES,sv_SE,tr_TR,pt_BR,ja_JP,id_ID,ko_KR,pt_PT,ru_RU,th_TH,zh_CN,zh_TW</supported_locales>
<group>braintree</group>
<group>braintree_group</group>
</braintree_paypal>
<braintree_cc_vault>
<model>BraintreeCreditCardVaultFacade</model>
Expand All @@ -78,7 +78,7 @@
<tokenFormat>Magento\Braintree\Model\InstantPurchase\CreditCard\TokenFormatter</tokenFormat>
<additionalInformation>Magento\Braintree\Model\InstantPurchase\PaymentAdditionalInformationProvider</additionalInformation>
</instant_purchase>
<group>braintree</group>
<group>braintree_group</group>
</braintree_cc_vault>
<braintree_paypal_vault>
<model>BraintreePayPalVaultFacade</model>
Expand All @@ -88,7 +88,7 @@
<tokenFormat>Magento\Braintree\Model\InstantPurchase\PayPal\TokenFormatter</tokenFormat>
<additionalInformation>Magento\Braintree\Model\InstantPurchase\PaymentAdditionalInformationProvider</additionalInformation>
</instant_purchase>
<group>braintree</group>
<group>braintree_group</group>
</braintree_paypal_vault>
</payment>
</default>
Expand Down
8 changes: 8 additions & 0 deletions app/code/Magento/Braintree/etc/frontend/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,12 @@
<argument name="resolver" xsi:type="object">Magento\Braintree\Model\LocaleResolver</argument>
</arguments>
</type>
<type name="Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderPool">
<arguments>
<argument name="services" xsi:type="array">
<item name="braintree" xsi:type="string">Magento\Braintree\Model\Multishipping\PlaceOrder</item>
<item name="braintree_paypal" xsi:type="string">Magento\Braintree\Model\Multishipping\PlaceOrder</item>
</argument>
</arguments>
</type>
</config>
10 changes: 9 additions & 1 deletion app/code/Magento/Braintree/etc/payment.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,16 @@
<payment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Payment:etc/payment.xsd">
<groups>
<group id="braintree">
<group id="braintree_group">
<label>Braintree</label>
</group>
</groups>
<methods>
<method name="braintree">
<allow_multiple_address>1</allow_multiple_address>
</method>
<method name="braintree_paypal">
<allow_multiple_address>1</allow_multiple_address>
</method>
</methods>
</payment>
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>
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 -->
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 -->
Loading

0 comments on commit 8c6ea9f

Please sign in to comment.