Magento 2: Измените код валюты котировки перед размещением заказа в Observer


Я пытаюсь изменить валюту котировки перед размещением любого ордера.

Для этого я использовал приведенное ниже событие.

Vendor\Module\etc\frontend\events.xml

<event name="sales_model_service_quote_submit_before">
    <observer name="change_currency_before_place_order" instance="Vendor\Module\Observer\BeforePlaceOrder" />
</event>

Vendor\Module\Observer\BeforePlaceOrder.php

<?php

namespace Vendor\Module\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class BeforePlaceOrder implements ObserverInterface
{    

 protected $_checkoutSession;
 private $logger;
/**
 * @var \Magento\Catalog\Model\Session
 */
 protected $catalogSession;

public function __construct(
    \Magento\Checkout\Model\Session $checkoutSession,
    \Magento\Catalog\Model\Session $catalogSession,
    \Psr\Log\LoggerInterface $logger
)
{   
    $this->_checkoutSession = $checkoutSession;
    $this->catalogSession = $catalogSession;
    $this->logger = $logger;
}

public function execute(\Magento\Framework\Event\Observer $observer)
{   
   $quote = $observer->getEvent()->getQuote(); 
   $this->logger->info('inside place order observer');
   //$this->storeManager->getStore()->setCurrentCurrencyCode('EUR'); 
   $quote->setQuoteCurrencyCode("EUR"); 
   $quote->collectTotals();
  }
}

Вышеупомянутое событие не срабатывает для меня, есть ли другой способ реализовать эту функциональность?

Примечание: Принятый ответ работает хорошо, но как только счет-фактура будет создана, его снова переход на валюту по умолчанию.

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

Author: Balwant Singh, 2019-08-29

2 answers

Попробуйте использовать приведенный ниже код.

Events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_order_save_commit_after">
    <observer name="sumit_custom_order_currency" instance="Vendor\Module\Observer\OrderSaveCommitAfter" />
</event>
</config>

OrderSaveCommitAfter.php

namespace Vendor\Module\Observer;

use Magento\Framework\Event\ObserverInterface;

class OrderSaveCommitAfter implements ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var $order Order */
        $order = $observer->getEvent()->getOrder();

        if (!$order->getId()) {
            //order not saved in the database
            return;
        }
        $order->setBaseCurrencyCode('EUR');
        $order->setGlobalCurrencyCode('EUR');
        $order->setOrderCurrencyCode('EUR');
        $order->setStoreCurrencyCode('EUR');
        $order->save();
    }
}

Надеюсь, это поможет!!!

 1
Author: Sumit, 2019-08-29 12:02:12

Это обходной путь использования плагина вместо наблюдателя.

Vendor/Module/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

<type name="Magento\Sales\Api\OrderRepositoryInterface">
    <plugin name="Module_OrderAfterSave" type="Vendor\Module\Plugin\OrderAfterSave" sortOrder="10" disabled="false" />
</type>

Затем Vendor\Module\Plugin\OrderAfterSave.php

<?php
namespace Vendor\Module\Plugin;

use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Framework\ObjectManagerInterface;

class OrderAfterSave
{
private $logger;
protected $objectManager;
protected $orderRepositoryInterface;
protected $_coreSession;

public function __construct(
    ObjectManagerInterface $objectManager,
    OrderRepositoryInterface $orderRepositoryInterface,
    \Psr\Log\LoggerInterface $logger,
    \Magento\Framework\Session\SessionManagerInterface $coreSession
) {
    $this->objectManager = $objectManager;
    $this->orderRepositoryInterface = $orderRepositoryInterface;
    $this->logger = $logger;
    $this->_coreSession = $coreSession;
}

public function afterSave(\Magento\Sales\Api\OrderRepositoryInterface $orderRepo, $order)
{
    $currencyCode = 'EUR';

    $order->setBaseCurrencyCode($currencyCode);
    $order->setGlobalCurrencyCode($currencyCode);
    $order->setOrderCurrencyCode($currencyCode);
    $order->setStoreCurrencyCode($currencyCode);
    $order->save();

    return $order;
}

Я надеюсь, что это поможет вам!!

 2
Author: jafar pinjar, 2019-09-27 14:08:04