Back to Top

Create Order Programmatically According To Store Currency Magento 2

Updated 9 January 2023

Create Order Programmatically According To Store Currency Magento 2 : when we create order Programmatically it is created according to base currency. but sometime we need to create order according to specific store currency.
So here i am explaining how you can do it.

 <?php   
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Directory\Model\CurrencyFactory $currencyFactory,
        \Magento\Catalog\Model\ProductFactory $productFactory,
        \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry,
        \Magento\Customer\Model\CustomerFactory $customerFactory,
        \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
        \Magento\Backend\Model\Session $backendSession,
        \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
        \Magento\Quote\Api\CartManagementInterface $cartManagementInterface,
        \Magento\Quote\Model\Quote\Address\Rate $shippingRate,
        \Magento\Sales\Model\Order $order,
    ) {
        $this->storeManager = $storeManager;
        $this->productFactory = $productFactory;
        $this->stockRegistry = $stockRegistry;
        $this->customerFactory = $customerFactory;
        $this->customerRepository = $customerRepository;
        $this->backendSession = $backendSession;
        $this->cartRepositoryInterface = $cartRepositoryInterface;
        $this->cartManagementInterface = $cartManagementInterface;
        $this->shippingRate = $shippingRate;
        $this->order = $order;
        $this->currencyFactory = $currencyFactory;
        parent::__construct($context);
    }
     /**
     * Execute
     *
     * @return void
     */
     public function execute(){
        $orderData =[
            'currency_id'  => 'USD',
            'email'        => '[email protected]', //customer email id
            'shipping_address' =>[
                'firstname'    => 'demo',
                'lastname'     => 'demo',
                'prefix' => '',
                'suffix' => '',
                'street' => 'B1 Abcd street',
                'city' => 'Los Angeles',
                'country_id' => 'US',
                'region' => 'California',
                'region_id' => '12', // State region id
                'postcode' => '45454',
                'telephone' => '1234512345',
                'fax' => '12345',
                'save_in_address_book' => 1
            ],
            'items'=>
                [
                    ['product_id'=>'50','qty'=>1]
                ]
        ];
        $this->createOrderAtMage($orderData);
    }
    /**
     * Create order on magento
     * 
     * @param  array $orderData
     * @return array
     */
    public function createOrderAtMage($orderData)
    {
        $store = $this->storeManager->getStore();
        $storeId = $store->getStoreId();
        $websiteId = $this->storeManager->getStore($storeId)->getWebsiteId();
        $customer = $this->customerFactory->create();
        $customer->setWebsiteId($websiteId);
        $customer->loadByEmail($orderData['email']);
        if (!$customer->getEntityId()) {
            $customer->setWebsiteId($websiteId)
                    ->setStore($store)
                    ->setFirstname($orderData['shipping_address']['firstname'])
                    ->setLastname($orderData['shipping_address']['lastname'])
                    ->setEmail($orderData['email'])
                    ->setPassword($orderData['email']);
            $customer->save();
        }
        $cartId = $this->cartManagementInterface->createEmptyCart();
        $quote = $this->cartRepositoryInterface->get($cartId);
        $quote->setStore($store);
        // make change here.
        $currencyCode = 'USD';
        // make change here.
        $currency =  $this->currencyFactory->create()->load($currencyCode);
        $this->storeManager->getStore($storeId)->setCurrentCurrency($currency);
        $customer = $this->customerRepository->getById($customer->getEntityId());
        
        $quote->setCurrency();
        $quote->assignCustomer($customer);
        foreach ($orderData['items'] as $item) {
            $product = $this->productFactory->create()->load($item['product_id']);
            $quote->addProduct(
                $product,
                (int)$item['qty']
            );
        }
        
        //Set Address to quote
        $quote->getBillingAddress()->addData($orderData['shipping_address']);
        $quote->getShippingAddress()->addData($orderData['shipping_address']);
        // Collect Rates and Set Shipping & Payment Method
        $shipmethod = "flatrate_flatrate"; //change according to your need
        // Collect Rates and Set Shipping & Payment Method
        $this->shippingRate
            ->setCode($shipmethod)
            ->getPrice(1);
        //store shipping data in session
        $shippingAddress = $quote->getShippingAddress();
        $shippingAddress->setCollectShippingRates(true)
                        ->collectShippingRates()
                        ->setShippingMethod($shipmethod);
        $quote->getShippingAddress()->addShippingRate($this->shippingRate);
        $quote->setPaymentMethod(/** payment method code */);
        $quote->setInventoryProcessed(false);
        $paymentCode = "checkmo"; //change according to your need

        // Set Sales Order Payment
        $quote->getPayment()->importData(['method' => $paymentCode]);
        $quote->save();
        // Collect Totals & Save Quote
        $quote->collectTotals();
        // Create Order From Quote
        $quote = $this->cartRepositoryInterface->get($quote->getId());
        $orderId = $this->cartManagementInterface->placeOrder($quote->getId());
        echo $orderId;die;
    }

Hope so it will help.

Searching for an experienced
Magento 2 Company ?
Find out More
. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home