diff --git a/app/code/Magento/Checkout/view/frontend/web/js/model/shipping-rates-validator.js b/app/code/Magento/Checkout/view/frontend/web/js/model/shipping-rates-validator.js index b32ec5faec9e3d8db71033a1c2a530a6095071a4..558b7d6585b91aad264a95389f12ea999463182a 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/model/shipping-rates-validator.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/model/shipping-rates-validator.js @@ -11,9 +11,19 @@ define( '../model/address-converter', '../action/select-shipping-address', './postcode-validator', - 'mage/translate' + 'mage/translate', + 'uiRegistry' ], - function ($, ko, shippingRatesValidationRules, addressConverter, selectShippingAddress, postcodeValidator, $t) { + function ( + $, + ko, + shippingRatesValidationRules, + addressConverter, + selectShippingAddress, + postcodeValidator, + $t, + uiRegistry + ) { 'use strict'; var checkoutConfig = window.checkoutConfig, @@ -45,26 +55,52 @@ define( }); }, + /** + * Perform postponed binding for fieldset elements + * + * @param {String} formPath + */ + initFields: function (formPath) { + var self = this, + elements = shippingRatesValidationRules.getObservableFields(); + + $.each(elements, function (index, field) { + uiRegistry.async(formPath + '.' + field)(self.doElementBinding.bind(self)); + }); + }, + + /** + * Bind shipping rates request to form element + * + * @param {Object} element + * @param {Boolean} force + * @param {Number} delay + */ + doElementBinding: function (element, force, delay) { + var observableFields = shippingRatesValidationRules.getObservableFields(); + + if (element && (observableFields.indexOf(element.index) !== -1 || force)) { + if (element.index !== 'postcode') { + this.bindHandler(element, delay); + } + } + + if (element.index === 'postcode') { + this.bindHandler(element, delay); + postcodeElement = element; + } + }, + /** * @param {*} elements * @param {Boolean} force * @param {Number} delay */ bindChangeHandlers: function (elements, force, delay) { - var self = this, - observableFields = shippingRatesValidationRules.getObservableFields(); + var self = this; $.each(elements, function (index, elem) { - if (elem && (observableFields.indexOf(elem.index) !== -1 || force)) { - if (elem.index !== 'postcode') { - self.bindHandler(elem, delay); - } - } - - if (elem.index === 'postcode') { - self.bindHandler(elem, delay); - postcodeElement = elem; - } + self.doElementBinding(elem, force, delay); }); }, diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js index 7392072a37667632271911d1b6315c45405e20c2..5ca6c2bd5d87a8bcebff956eab09dc9a01e04cb2 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js @@ -75,9 +75,11 @@ define( */ initialize: function () { var self = this, - hasNewAddress; + hasNewAddress, + fieldsetName = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset'; this._super(); + shippingRatesValidator.initFields(fieldsetName); if (!quote.isVirtual()) { stepNavigator.registerStep( @@ -130,15 +132,6 @@ define( //load data from server for shipping step }, - /** - * @param {Object} element - */ - initElement: function (element) { - if (element.index === 'shipping-address-fieldset') { - shippingRatesValidator.bindChangeHandlers(element.elems(), false); - } - }, - /** * @return {*} */ diff --git a/app/code/Magento/CheckoutAgreements/Model/Checkout/Plugin/Validation.php b/app/code/Magento/CheckoutAgreements/Model/Checkout/Plugin/Validation.php index 648a53388bdd623d900860a230f738b6e9912d68..ca520a6a0acafcf06033ec0b727439423fd8cc1a 100644 --- a/app/code/Magento/CheckoutAgreements/Model/Checkout/Plugin/Validation.php +++ b/app/code/Magento/CheckoutAgreements/Model/Checkout/Plugin/Validation.php @@ -32,7 +32,6 @@ class Validation * @param \Magento\Checkout\Api\AgreementsValidatorInterface $agreementsValidator * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfiguration * @param \Magento\CheckoutAgreements\Api\CheckoutAgreementsRepositoryInterface $checkoutAgreementsRepository - * @codeCoverageIgnore */ public function __construct( \Magento\Checkout\Api\AgreementsValidatorInterface $agreementsValidator, @@ -48,7 +47,7 @@ class Validation * @param \Magento\Checkout\Api\PaymentInformationManagementInterface $subject * @param int $cartId * @param \Magento\Quote\Api\Data\PaymentInterface $paymentMethod - * @param \Magento\Quote\Api\Data\AddressInterface $billingAddress + * @param \Magento\Quote\Api\Data\AddressInterface|null $billingAddress * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ @@ -56,7 +55,7 @@ class Validation \Magento\Checkout\Api\PaymentInformationManagementInterface $subject, $cartId, \Magento\Quote\Api\Data\PaymentInterface $paymentMethod, - \Magento\Quote\Api\Data\AddressInterface $billingAddress + \Magento\Quote\Api\Data\AddressInterface $billingAddress = null ) { if ($this->isAgreementEnabled()) { $this->validateAgreements($paymentMethod->getExtensionAttributes()->getAgreementIds()); @@ -67,7 +66,7 @@ class Validation * @param \Magento\Checkout\Api\PaymentInformationManagementInterface $subject * @param int $cartId * @param \Magento\Quote\Api\Data\PaymentInterface $paymentMethod - * @param \Magento\Quote\Api\Data\AddressInterface $billingAddress + * @param \Magento\Quote\Api\Data\AddressInterface|null $billingAddress * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ @@ -75,7 +74,7 @@ class Validation \Magento\Checkout\Api\PaymentInformationManagementInterface $subject, $cartId, \Magento\Quote\Api\Data\PaymentInterface $paymentMethod, - \Magento\Quote\Api\Data\AddressInterface $billingAddress + \Magento\Quote\Api\Data\AddressInterface $billingAddress = null ) { if ($this->isAgreementEnabled()) { $this->validateAgreements($paymentMethod->getExtensionAttributes()->getAgreementIds()); diff --git a/app/code/Magento/Quote/Model/QuoteRepository/SaveHandler.php b/app/code/Magento/Quote/Model/QuoteRepository/SaveHandler.php index a3d0507c394850f171d312467e4b5757a905bb02..f09195d0a34d650250dd4db2e84e7173b8ae9ac6 100644 --- a/app/code/Magento/Quote/Model/QuoteRepository/SaveHandler.php +++ b/app/code/Magento/Quote/Model/QuoteRepository/SaveHandler.php @@ -62,7 +62,7 @@ class SaveHandler /** @var \Magento\Quote\Model\Quote $quote */ // Quote Item processing $items = $quote->getItems(); - if ($items) { + if ($items && $quote->getIsActive()) { foreach ($items as $item) { /** @var \Magento\Quote\Model\Quote\Item $item */ if (!$item->isDeleted()) { diff --git a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepository/SaveHandlerTest.php b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepository/SaveHandlerTest.php index 76504b5064a2b987219c7df8dcf0ca61a18e9246..da6154bc9c1a69e9f454977442304069421e6872 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepository/SaveHandlerTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepository/SaveHandlerTest.php @@ -120,7 +120,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase ->willReturn($this->itemMock); $this->quoteMock->expects($this->once())->method('setLastAddedItem')->with($this->itemMock); $this->quoteMock->expects($this->once())->method('getBillingAddress')->willReturn($this->billingAddressMock); - $this->quoteMock->expects($this->once())->method('getIsActive')->willReturn(true); + $this->quoteMock->expects($this->exactly(2))->method('getIsActive')->willReturn(true); $this->billingAddressPersister ->expects($this->once()) ->method('save') diff --git a/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteManagementTest.php b/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteManagementTest.php index a52cd4430228423831af97f368198c2179285361..65bba35bfa986566fdb7d0012181235b255fd5fe 100644 --- a/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteManagementTest.php +++ b/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteManagementTest.php @@ -17,7 +17,6 @@ class QuoteManagementTest extends \PHPUnit_Framework_TestCase */ public function testSubmit() { - $this->markTestSkipped('MAGETWO-50989'); /** * Preconditions: * Load quote with Bundle product that has at least to child products