Обновление итогов заказа во внешнем оформлении заказа / просмотр заказа администратора — M2

#magento #magento2 #checkout

#magento #magento2 #Оформить покупку

Вопрос:

На странице оформления заказа мне нужно обновить итоги заказа и удалить НДС из итога после проверки поля НДС (проверка выполняется в контроллере). Также цены необходимо сохранить в представлении заказа в бэкэнде.

Я уже пытался выполнить обновление с помощью пользовательского js, и оно отлично работает во внешнем интерфейсе, но не экономит при просмотре заказа в серверной части

 define([
    'jquery',
    'Magento_Checkout/js/model/quote',
    'Magento_Checkout/js/model/resource-url-manager',
    'mage/storage',
    'Magento_Checkout/js/action/get-payment-information',
    'Magento_Checkout/js/model/totals',
    'Magento_Checkout/js/model/full-screen-loader',

    'Magento_Checkout/js/action/get-totals',
    'Magento_Checkout/js/model/cart/totals-processor/default'
], function ($, quote, urlManager,storage, getPaymentInformationAction, totals, fullscreenLoader, 
    getTotalsAction) {
    'use strict';

    return function (removeTax, tax) {
        var payload = {
            addressInformation: {
                shipping_address: quote.shippingAddress(),
                billing_address: quote.billingAddress(),
                shipping_method_code: quote.shippingMethod().method_code,
                shipping_carrier_code: quote.shippingMethod().carrier_code
                }
            };

        fullscreenLoader.startLoader();

        return storage.post(
            urlManager.getUrlForSetShippingInformation(quote),
            JSON.stringify(payload)
        ).done(function (response) {

            if(removeTax) {
                response.totals.total_segments[2].value = -tax;
                response.totals.total_segments[4].value -= tax;
            } else {
                response.totals.total_segments[2].value = tax;
                response.totals.total_segments[4].value  = tax;
            }

            var deferred = $.Deferred();
            totals.isLoading(true);

            getTotalsAction([], deferred);

            $.when(deferred).done(function () {
                quote.setTotals(response.totals);
                totals.isLoading(false);
                fullscreenLoader.stopLoader();
            });


        }).fail(function (response) {
            console.log('fail');
            totals.isLoading(false);
            fullScreenLoader.stopLoader();            
        });

    };
});
 

С другой стороны, я попытался также изменить итоги заказа на etc/sales.xml . Здесь мне удается обновить как внешний интерфейс, так и представление заказа администратора, но мне не удается внести эти корректировки только после проверки поля НДС. Вот моя функция сбора модели:

 public function collect(
        MagentoQuoteModelQuote $quote,
        MagentoQuoteApiDataShippingAssignmentInterface $shippingAssignment,
        MagentoQuoteModelQuoteAddressTotal $total
    ) {
        parent::collect($quote, $shippingAssignment, $total);
                $currentTax = $total->getTaxAmount();

                $total->setTaxAmount(-$currentTax);
                $total->setBaseTaxAmount(-$currentTax);

                $total->setGrandTotal($total->getGrandTotal() - $currentTax);
                $total->setBaseGrandTotal($total->getBaseGrandTotal() - $currentTax);


        return $this;
    }
 

Итак, я попытался установить сообщение сеанса следующим образом: $this-> session-> setMySession («Действительный НДС»); в контроллере, где я выполняю проверку НДС, а затем в модели, чтобы вносить изменения, только если:

 if($this->session->getMySession() == "Valid VAT" ){ 
               .........
}
 

но это не устанавливает сообщение сеанса, потому что модель загружается один раз при первой загрузке страницы, и мне не удается перезагрузить ее после проверки.

Может кто-нибудь помочь или подсказать, как я могу внести изменения в цены только после проверки в контроллере?

Заранее спасибо

Комментарии:

1. Почему бы не использовать наблюдателя для проверки правильности поля и изменения итогов до или после сохранения заказа?

2. Я пытался использовать наблюдателя, но когда я пытаюсь обновить итоговые данные, вызывая метод сбора класса Magento Quote Model Quote Address Total AbstractTotal, он не работает нормально