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);
}
}
}