Observer to set backorder on adding products to the cart

Observser

    <event name="checkout_cart_product_add_after">
        <observer name="customPriceInCart" instance="JJ\Backorder\Observer\CustomPrice" />
    </event>

Code to Update the backorder to the custom field and checkout page
Also setting the price of the products to Zero if the item is not committed

<?php
namespace JJ\Backorder\Observer;

use Magento\CatalogInventory\Api\StockRegistryInterface;
use Magento\Framework\Event\ObserverInterface;
use Magento\InventorySalesApi\Api\GetProductSalableQtyInterface;
use Magento\Quote\Api\CartItemRepositoryInterface;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Catalog\Model\Product\Type\PriceFactory;
use Magento\Customer\Model\Session;

class CustomPrice implements ObserverInterface
{
    protected $getProductSalableQty;
    protected $stockRegistry;
    protected $cartItemRepository;
    protected $quoteRepository;

    public function __construct(
        GetProductSalableQtyInterface $getProductSalableQty,
        StockRegistryInterface $stockRegistry,
        CartItemRepositoryInterface $cartItemRepository,
        CartRepositoryInterface $quoteRepository,
        \Magento\Quote\Model\QuoteFactory $quoteFactory,
        PriceFactory $priceModelFactory,
        Session $customerSession
    ) {
        $this->getProductSalableQty = $getProductSalableQty;
        $this->stockRegistry = $stockRegistry;
        $this->cartItemRepository = $cartItemRepository;
        $this->quoteRepository = $quoteRepository;
        $this->quoteFactory = $quoteFactory;
        $this->priceModelFactory = $priceModelFactory;
        $this->customerSession = $customerSession;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $writer = new \Zend_Log_Writer_Stream(BP . '/var/log/backorder.log');
        $logger = new \Zend_Log();
        $logger->addWriter($writer);
        //get the item just added to cart
        $item = $observer->getEvent()->getData('quote_item');
        $quoteItem = $observer->getEvent()->getQuoteItem();
        $productinfo = $quoteItem->getProduct();
        $customerGroupId = $this->customerSession->getCustomerGroupId();
        $priceModel = $this->priceModelFactory->create();
        $productPrice = $priceModel->getFinalPrice($customerGroupId, $productinfo);
        $logger->info("final price" . $productPrice);
        $cartId = $item->getQuoteId();
        $product = $observer->getEvent()->getData('product');
        $productstock = $product->getQty();
        $sku = $product->getSku();
        $qty = $item->getQty();
        $logger->info("default qty:" . $qty);
        $stockItem = $this->stockRegistry->getStockItemBySku($sku);
        $defaultStockQty = $stockItem->getQty();
        $salableQty = $this->getProductSalableQty->execute($sku, 2); // Calling '2' as the id of the stock to get the stock collection from Netsuite ($stockItem->getStockId()));
        $item = ($item->getParentItem() ? $item->getParentItem() : $item);
        $defaultQty = $stockItem->getQty();
        $logger->info("stock qty:" . $salableQty);
        $reducedQty = $defaultQty - $qty;
        $this->getProductSalableQty->execute($product->getSku(), $stockItem->getStockId(), $reducedQty);
        $logger->info("reducedqty" . $reducedQty);
//        Checking if there is salable Qty for the product
//        if ($reducedQty < 0) {
        $logger->info("reducedqty" . $reducedQty);
        if ($salableQty <= 0) {
            $backorder = -$item->getQty();
        } else {
            $backorder = $salableQty - $item->getQty();
        }
        $logger->info($backorder . "backorder");
        $item->setStockQty($item->getQty());
//        Calculating the Backorder total price and qty
        if ($backorder < 0) {
            $qty = $item->getQty() - abs($backorder);
//             Checks if the product has no qty to order and sets the price to zero
            if ($qty == 0) {
                $price = 0;
                $item->setQty(1);
                $item->setStockQty($qty);
                $logger->info("qty");

                $item->setCustomPrice($price);
                $item->setOriginalCustomPrice($price);
                if ($backorder == -1) {
                    $item->setBackorderQty($backorder + $item->getBackorderQty());
                }
                if ($item->getBackorderQty() == null) {
                    $item->setBackorderQty($backorder);
                } else {
                    $item->setBackorderQty($backorder + $item->getBackorderQty() + 1);
                }
                $backordertotal = $productPrice * ($item->getBackorderQty());
                $item->setBackorderTotal($backordertotal);
            } else {
                $logger->info($backorder . "1 qty");
                $price = $item->getPrice() * $qty;
                $backordertotal = $productPrice * ($backorder + $item->getBackorderQty());
                $item->setBackorderQty($backorder + $item->getBackorderQty());
                $item->setBackorderTotal($backordertotal);
                $item->setQty($qty);
                $item->setStockQty($qty);
            }
            $item->getProduct()->setIsSuperMode(true);
        }
    }
}

Leave a comment

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